Autopsy  4.15.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
EamDbSettingsDialog.java
Go to the documentation of this file.
1 /*
2  * Central Repository
3  *
4  * Copyright 2015-2020 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.centralrepository.optionspanel;
20 
21 import java.awt.Color;
22 import java.awt.Component;
23 import java.awt.Cursor;
24 import java.awt.HeadlessException;
25 import java.io.File;
26 import java.io.IOException;
27 import java.io.Serializable;
28 import java.util.ArrayList;
29 import java.util.Arrays;
30 import java.util.Collection;
31 import java.util.logging.Level;
32 import javax.swing.JDialog;
33 import javax.swing.JFileChooser;
34 import javax.swing.JFrame;
35 import javax.swing.JLabel;
36 import javax.swing.JList;
37 import javax.swing.JOptionPane;
38 import javax.swing.JTextField;
39 import javax.swing.ListCellRenderer;
40 import javax.swing.SwingUtilities;
41 import javax.swing.event.DocumentEvent;
42 import javax.swing.event.DocumentListener;
43 import javax.swing.filechooser.FileFilter;
44 import org.openide.util.NbBundle;
45 import org.openide.util.NbBundle.Messages;
46 import org.openide.windows.WindowManager;
55 
59 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
60 public class EamDbSettingsDialog extends JDialog {
61 
62  private static final Logger logger = Logger.getLogger(EamDbSettingsDialog.class.getName());
63 
64  private static final long serialVersionUID = 1L;
65 
70  private class DbChoiceRenderer extends JLabel implements ListCellRenderer<CentralRepoDbChoice>, Serializable {
71 
72  private static final long serialVersionUID = 1L;
73 
74  @Override
75  public Component getListCellRendererComponent(
76  JList<? extends CentralRepoDbChoice> list, CentralRepoDbChoice value,
77  int index, boolean isSelected, boolean cellHasFocus) {
78 
79  // disable cell if it is the db connection from multi user settings
80  // and that option is not enabled in multi user settings
81  setText(value.getTitle());
82  setEnabled(isDbChoiceSelectable(value));
83  return this;
84  }
85  }
86 
87  private final Collection<JTextField> textBoxes;
89  private final CentralRepoDbManager manager = new CentralRepoDbManager();
90  private final DbChoiceRenderer DB_CHOICE_RENDERER = new DbChoiceRenderer();
91 
93  this(null);
94  }
95 
96  private boolean isDbChoiceSelectable(CentralRepoDbChoice item) {
98  }
99 
103  @Messages({"EamDbSettingsDialog.title.text=Central Repository Database Configuration",
104  "EamDbSettingsDialog.lbSingleUserSqLite.text=SQLite should only be used by one examiner at a time.",
105  "EamDbSettingsDialog.lbDatabaseType.text=Database Type :",
106  "EamDbSettingsDialog.fcDatabasePath.title=Select location for central_repository.db"})
107  public EamDbSettingsDialog(CentralRepoDbChoice initialMenuItem) {
108  super((JFrame) WindowManager.getDefault().getMainWindow(),
109  Bundle.EamDbSettingsDialog_title_text(),
110  true);
111 
112  textBoxes = new ArrayList<>();
113  textBoxChangedListener = new TextBoxChangedListener();
114 
115  initComponents();
116  fcDatabasePath.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
117  fcDatabasePath.setAcceptAllFileFilterUsed(false);
118  fcDatabasePath.setDialogTitle(Bundle.EamDbSettingsDialog_fcDatabasePath_title());
119  fcDatabasePath.setFileFilter(new FileFilter() {
120  @Override
121  public boolean accept(File pathname) {
122  if (pathname.isDirectory()) {
123  return true;
124  }
125  return pathname.getName().equalsIgnoreCase(SqliteCentralRepoSettings.DEFAULT_DBNAME);
126  }
127 
128  @Override
129  public String getDescription() {
130  return "Directories and Central Repository databases";
131  }
132  });
133 
134  setupDbChoice(initialMenuItem);
135  valid();
136  display();
137  }
138 
139  private void setupDbChoice(CentralRepoDbChoice initialMenuItem) {
140  // setup initially selected item
141  CentralRepoDbChoice toSelect = (initialMenuItem == null)
142  ? (Arrays.asList(CentralRepoDbChoice.DB_CHOICES).contains(manager.getSelectedDbChoice()))
143  ? manager.getSelectedDbChoice()
145  : initialMenuItem;
146 
147  cbDatabaseType.setRenderer(DB_CHOICE_RENDERER);
148  changeDbSelection(toSelect);
149  }
150 
162  @NbBundle.Messages({"EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Central Repository Database",
163  "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Central Repository Database exists but is not the right format. Manually delete it or choose a different path (if applicable).",
164  "EamDbSettingsDialog.okButton.createDbDialog.title=Central Repository Database Does Not Exist",
165  "EamDbSettingsDialog.okButton.createDbDialog.message=Central Repository Database does not exist, would you like to create it?",
166  "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Central Repository Database Connection Failed",
167  "EamDbSettingsDialog.okButton.databaseConnectionFailed.message=Unable to connect to Central Repository Database. Please check your settings and try again.",
168  "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Central Repository Database, please ensure location exists and you have write permissions and try again.",
169  "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Central Repository Database, please ensure address, port, and login credentials are correct for Postgres server and try again.",
170  "EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Central Repository Database"})
171  private static boolean promptTestStatusWarnings(CentralRepoDbManager manager, EamDbSettingsDialog dialog) {
173  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
174  Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_message(),
175  Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_title(),
176  JOptionPane.WARNING_MESSAGE);
177  } else if (manager.getStatus() == DatabaseTestResult.SCHEMA_INVALID) {
178  // There's an existing database or file, but it's not in our format.
179  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
180  Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_message(),
181  Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_title(),
182  JOptionPane.WARNING_MESSAGE);
183  } else if (manager.getStatus() == DatabaseTestResult.DB_DOES_NOT_EXIST) {
184  promptCreateDatabase(manager, dialog);
185  }
186 
187  return (manager.getStatus() == DatabaseTestResult.TESTED_OK);
188  }
189 
200  public static boolean promptCreateDatabase(CentralRepoDbManager manager, EamDbSettingsDialog dialog) {
201  //database doesn't exist. do you want to create?
202  if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(),
203  Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(),
204  Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(),
205  JOptionPane.YES_NO_OPTION)) {
206  try {
207  manager.createDb();
208 
209  } catch (CentralRepoException e) {
210  onPromptStatusError(manager);
211  return false;
212  }
213 
214  if (dialog != null) {
215  dialog.valid();
216  }
217  return true;
218  }
219 
220  return manager.testStatus() == DatabaseTestResult.TESTED_OK;
221  }
222 
231  private static void onPromptStatusError(CentralRepoDbManager manager1) {
232  // in the event that there is a failure to connect, notify user with corresponding message
233  String errorMessage = "";
234  if (manager1 == null || manager1.getSelectedDbChoice() == null) {
235  errorMessage = "";
237  errorMessage = Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message();
238  } else if (manager1.getSelectedDbChoice().getDbPlatform() == CentralRepoPlatforms.SQLITE) {
239  errorMessage = Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message();
240  }
241  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
242  errorMessage,
243  Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
244  JOptionPane.WARNING_MESSAGE);
245  }
246 
252  @SuppressWarnings("unchecked")
253  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
254  private void initComponents() {
255  java.awt.GridBagConstraints gridBagConstraints;
256 
257  fcDatabasePath = new javax.swing.JFileChooser();
258  pnButtons = new javax.swing.JPanel();
259  pnSQLiteSettings = new javax.swing.JPanel();
260  lbDatabasePath = new javax.swing.JLabel();
261  lbHostName = new javax.swing.JLabel();
262  tbDbHostname = new javax.swing.JTextField();
263  lbPort = new javax.swing.JLabel();
264  tbDbPort = new javax.swing.JTextField();
265  lbUserName = new javax.swing.JLabel();
266  tbDbUsername = new javax.swing.JTextField();
267  lbUserPassword = new javax.swing.JLabel();
268  jpDbPassword = new javax.swing.JPasswordField();
269  lbDatabaseType = new javax.swing.JLabel();
270  lbDatabaseDesc = new javax.swing.JLabel();
271  filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767));
272  dataBaseFileScrollPane = new javax.swing.JScrollPane();
273  dataBaseFileTextArea = new javax.swing.JTextArea();
274  pathPanel = new javax.swing.JPanel();
275  tfDatabasePath = new javax.swing.JTextField();
276  bnDatabasePathFileOpen = new javax.swing.JButton();
277  typePanel = new javax.swing.JPanel();
278  lbSingleUserSqLite = new javax.swing.JLabel();
279  cbDatabaseType = new javax.swing.JComboBox<>();
280  bnCancel = new javax.swing.JButton();
281  bnOk = new javax.swing.JButton();
282 
283  setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
284  setResizable(false);
285 
286  javax.swing.GroupLayout pnButtonsLayout = new javax.swing.GroupLayout(pnButtons);
287  pnButtons.setLayout(pnButtonsLayout);
288  pnButtonsLayout.setHorizontalGroup(
289  pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
290  .addGap(0, 0, Short.MAX_VALUE)
291  );
292  pnButtonsLayout.setVerticalGroup(
293  pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
294  .addGap(0, 25, Short.MAX_VALUE)
295  );
296 
297  pnSQLiteSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder());
298  pnSQLiteSettings.setLayout(new java.awt.GridBagLayout());
299 
300  org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabasePath.text")); // NOI18N
301  lbDatabasePath.setMaximumSize(new java.awt.Dimension(191, 16));
302  lbDatabasePath.setPreferredSize(new java.awt.Dimension(100, 14));
303  gridBagConstraints = new java.awt.GridBagConstraints();
304  gridBagConstraints.gridx = 0;
305  gridBagConstraints.gridy = 1;
306  gridBagConstraints.gridwidth = 2;
307  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
308  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
309  gridBagConstraints.insets = new java.awt.Insets(7, 14, 0, 0);
310  pnSQLiteSettings.add(lbDatabasePath, gridBagConstraints);
311 
312  org.openide.awt.Mnemonics.setLocalizedText(lbHostName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbHostName.text")); // NOI18N
313  lbHostName.setMaximumSize(new java.awt.Dimension(195, 16));
314  lbHostName.setPreferredSize(new java.awt.Dimension(110, 14));
315  gridBagConstraints = new java.awt.GridBagConstraints();
316  gridBagConstraints.gridx = 0;
317  gridBagConstraints.gridy = 3;
318  gridBagConstraints.gridwidth = 2;
319  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
320  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
321  gridBagConstraints.insets = new java.awt.Insets(7, 14, 0, 0);
322  pnSQLiteSettings.add(lbHostName, gridBagConstraints);
323 
324  tbDbHostname.setPreferredSize(new java.awt.Dimension(519, 20));
325  gridBagConstraints = new java.awt.GridBagConstraints();
326  gridBagConstraints.gridx = 2;
327  gridBagConstraints.gridy = 3;
328  gridBagConstraints.gridheight = 2;
329  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
330  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
331  gridBagConstraints.insets = new java.awt.Insets(7, 10, 0, 6);
332  pnSQLiteSettings.add(tbDbHostname, gridBagConstraints);
333 
334  org.openide.awt.Mnemonics.setLocalizedText(lbPort, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbPort.text")); // NOI18N
335  lbPort.setMaximumSize(new java.awt.Dimension(132, 16));
336  lbPort.setPreferredSize(new java.awt.Dimension(90, 14));
337  gridBagConstraints = new java.awt.GridBagConstraints();
338  gridBagConstraints.gridx = 0;
339  gridBagConstraints.gridy = 5;
340  gridBagConstraints.gridwidth = 2;
341  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
342  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
343  gridBagConstraints.insets = new java.awt.Insets(7, 14, 0, 0);
344  pnSQLiteSettings.add(lbPort, gridBagConstraints);
345 
346  tbDbPort.setPreferredSize(new java.awt.Dimension(519, 20));
347  gridBagConstraints = new java.awt.GridBagConstraints();
348  gridBagConstraints.gridx = 2;
349  gridBagConstraints.gridy = 5;
350  gridBagConstraints.gridheight = 2;
351  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
352  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
353  gridBagConstraints.insets = new java.awt.Insets(7, 10, 0, 6);
354  pnSQLiteSettings.add(tbDbPort, gridBagConstraints);
355 
356  org.openide.awt.Mnemonics.setLocalizedText(lbUserName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserName.text")); // NOI18N
357  lbUserName.setMaximumSize(new java.awt.Dimension(172, 16));
358  lbUserName.setPreferredSize(new java.awt.Dimension(100, 14));
359  gridBagConstraints = new java.awt.GridBagConstraints();
360  gridBagConstraints.gridx = 0;
361  gridBagConstraints.gridy = 7;
362  gridBagConstraints.gridwidth = 2;
363  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
364  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
365  gridBagConstraints.insets = new java.awt.Insets(7, 14, 0, 0);
366  pnSQLiteSettings.add(lbUserName, gridBagConstraints);
367 
368  tbDbUsername.setPreferredSize(new java.awt.Dimension(519, 20));
369  gridBagConstraints = new java.awt.GridBagConstraints();
370  gridBagConstraints.gridx = 2;
371  gridBagConstraints.gridy = 7;
372  gridBagConstraints.gridheight = 2;
373  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
374  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
375  gridBagConstraints.insets = new java.awt.Insets(7, 10, 0, 6);
376  pnSQLiteSettings.add(tbDbUsername, gridBagConstraints);
377 
378  org.openide.awt.Mnemonics.setLocalizedText(lbUserPassword, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserPassword.text")); // NOI18N
379  lbUserPassword.setMaximumSize(new java.awt.Dimension(194, 16));
380  lbUserPassword.setPreferredSize(new java.awt.Dimension(110, 14));
381  gridBagConstraints = new java.awt.GridBagConstraints();
382  gridBagConstraints.gridx = 0;
383  gridBagConstraints.gridy = 9;
384  gridBagConstraints.gridwidth = 2;
385  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
386  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
387  gridBagConstraints.insets = new java.awt.Insets(7, 14, 0, 0);
388  pnSQLiteSettings.add(lbUserPassword, gridBagConstraints);
389 
390  jpDbPassword.setPreferredSize(new java.awt.Dimension(519, 20));
391  gridBagConstraints = new java.awt.GridBagConstraints();
392  gridBagConstraints.gridx = 2;
393  gridBagConstraints.gridy = 9;
394  gridBagConstraints.gridheight = 2;
395  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
396  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
397  gridBagConstraints.insets = new java.awt.Insets(7, 10, 0, 6);
398  pnSQLiteSettings.add(jpDbPassword, gridBagConstraints);
399 
400  org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseType.text")); // NOI18N
401  lbDatabaseType.setMaximumSize(new java.awt.Dimension(180, 14));
402  lbDatabaseType.setMinimumSize(new java.awt.Dimension(80, 14));
403  lbDatabaseType.setPreferredSize(new java.awt.Dimension(100, 14));
404  gridBagConstraints = new java.awt.GridBagConstraints();
405  gridBagConstraints.gridx = 0;
406  gridBagConstraints.gridy = 0;
407  gridBagConstraints.gridwidth = 2;
408  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
409  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
410  gridBagConstraints.insets = new java.awt.Insets(12, 14, 0, 0);
411  pnSQLiteSettings.add(lbDatabaseType, gridBagConstraints);
412 
413  org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseDesc, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseDesc.text")); // NOI18N
414  lbDatabaseDesc.setMaximumSize(new java.awt.Dimension(182, 16));
415  lbDatabaseDesc.setPreferredSize(new java.awt.Dimension(100, 14));
416  gridBagConstraints = new java.awt.GridBagConstraints();
417  gridBagConstraints.gridx = 0;
418  gridBagConstraints.gridy = 11;
419  gridBagConstraints.gridwidth = 2;
420  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
421  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
422  gridBagConstraints.insets = new java.awt.Insets(7, 14, 0, 0);
423  pnSQLiteSettings.add(lbDatabaseDesc, gridBagConstraints);
424  gridBagConstraints = new java.awt.GridBagConstraints();
425  gridBagConstraints.gridx = 0;
426  gridBagConstraints.gridy = 12;
427  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
428  pnSQLiteSettings.add(filler1, gridBagConstraints);
429 
430  dataBaseFileScrollPane.setBorder(null);
431 
432  dataBaseFileTextArea.setEditable(false);
433  dataBaseFileTextArea.setBackground(new java.awt.Color(240, 240, 240));
434  dataBaseFileTextArea.setColumns(20);
435  dataBaseFileTextArea.setLineWrap(true);
436  dataBaseFileTextArea.setRows(3);
437  dataBaseFileScrollPane.setViewportView(dataBaseFileTextArea);
438 
439  gridBagConstraints = new java.awt.GridBagConstraints();
440  gridBagConstraints.gridx = 2;
441  gridBagConstraints.gridy = 11;
442  gridBagConstraints.gridheight = 3;
443  gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
444  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
445  gridBagConstraints.weightx = 1.0;
446  gridBagConstraints.weighty = 1.0;
447  gridBagConstraints.insets = new java.awt.Insets(7, 10, 15, 6);
448  pnSQLiteSettings.add(dataBaseFileScrollPane, gridBagConstraints);
449 
450  tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N
451  tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N
452  tfDatabasePath.setPreferredSize(new java.awt.Dimension(420, 23));
453 
454  org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N
455  bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() {
456  public void actionPerformed(java.awt.event.ActionEvent evt) {
457  bnDatabasePathFileOpenActionPerformed(evt);
458  }
459  });
460 
461  javax.swing.GroupLayout pathPanelLayout = new javax.swing.GroupLayout(pathPanel);
462  pathPanel.setLayout(pathPanelLayout);
463  pathPanelLayout.setHorizontalGroup(
464  pathPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
465  .addGroup(pathPanelLayout.createSequentialGroup()
466  .addGap(0, 0, 0)
467  .addComponent(tfDatabasePath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
468  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
469  .addComponent(bnDatabasePathFileOpen)
470  .addGap(0, 0, 0))
471  );
472  pathPanelLayout.setVerticalGroup(
473  pathPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
474  .addGroup(pathPanelLayout.createSequentialGroup()
475  .addGap(0, 0, 0)
476  .addGroup(pathPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
477  .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
478  .addComponent(bnDatabasePathFileOpen))
479  .addGap(0, 0, 0))
480  );
481 
482  gridBagConstraints = new java.awt.GridBagConstraints();
483  gridBagConstraints.gridx = 2;
484  gridBagConstraints.gridy = 1;
485  gridBagConstraints.gridheight = 2;
486  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
487  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
488  gridBagConstraints.insets = new java.awt.Insets(7, 10, 0, 6);
489  pnSQLiteSettings.add(pathPanel, gridBagConstraints);
490 
491  org.openide.awt.Mnemonics.setLocalizedText(lbSingleUserSqLite, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbSingleUserSqLite.text")); // NOI18N
492  lbSingleUserSqLite.setPreferredSize(new java.awt.Dimension(381, 14));
493 
494  cbDatabaseType.setModel(new javax.swing.DefaultComboBoxModel<>(org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoDbChoice.DB_CHOICES));
495  cbDatabaseType.setPreferredSize(new java.awt.Dimension(120, 20));
496  cbDatabaseType.addActionListener(new java.awt.event.ActionListener() {
497  public void actionPerformed(java.awt.event.ActionEvent evt) {
498  cbDatabaseTypeActionPerformed(evt);
499  }
500  });
501 
502  javax.swing.GroupLayout typePanelLayout = new javax.swing.GroupLayout(typePanel);
503  typePanel.setLayout(typePanelLayout);
504  typePanelLayout.setHorizontalGroup(
505  typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
506  .addGroup(typePanelLayout.createSequentialGroup()
507  .addGap(0, 0, 0)
508  .addComponent(cbDatabaseType, 0, 210, Short.MAX_VALUE)
509  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
510  .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 303, Short.MAX_VALUE)
511  .addGap(0, 0, 0))
512  );
513  typePanelLayout.setVerticalGroup(
514  typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
515  .addGroup(typePanelLayout.createSequentialGroup()
516  .addGap(0, 0, 0)
517  .addGroup(typePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
518  .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
519  .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
520  .addGap(0, 0, 0))
521  );
522 
523  gridBagConstraints = new java.awt.GridBagConstraints();
524  gridBagConstraints.gridx = 2;
525  gridBagConstraints.gridy = 0;
526  gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
527  gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
528  gridBagConstraints.insets = new java.awt.Insets(12, 10, 2, 0);
529  pnSQLiteSettings.add(typePanel, gridBagConstraints);
530 
531  org.openide.awt.Mnemonics.setLocalizedText(bnCancel, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnCancel.text")); // NOI18N
532  bnCancel.setMaximumSize(new java.awt.Dimension(79, 23));
533  bnCancel.setMinimumSize(new java.awt.Dimension(79, 23));
534  bnCancel.setPreferredSize(new java.awt.Dimension(79, 23));
535  bnCancel.addActionListener(new java.awt.event.ActionListener() {
536  public void actionPerformed(java.awt.event.ActionEvent evt) {
537  bnCancelActionPerformed(evt);
538  }
539  });
540 
541  org.openide.awt.Mnemonics.setLocalizedText(bnOk, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnOk.text")); // NOI18N
542  bnOk.addActionListener(new java.awt.event.ActionListener() {
543  public void actionPerformed(java.awt.event.ActionEvent evt) {
544  bnOkActionPerformed(evt);
545  }
546  });
547 
548  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
549  getContentPane().setLayout(layout);
550  layout.setHorizontalGroup(
551  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
552  .addGroup(layout.createSequentialGroup()
553  .addContainerGap()
554  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
555  .addGroup(layout.createSequentialGroup()
556  .addComponent(pnButtons, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
557  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
558  .addComponent(bnOk)
559  .addGap(11, 11, 11)
560  .addComponent(bnCancel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
561  .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, 648, Short.MAX_VALUE))
562  .addContainerGap())
563  );
564 
565  layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnCancel, bnOk});
566 
567  layout.setVerticalGroup(
568  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
569  .addGroup(layout.createSequentialGroup()
570  .addContainerGap()
571  .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
572  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
573  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
574  .addComponent(pnButtons, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
575  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
576  .addComponent(bnOk)
577  .addComponent(bnCancel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
578  .addContainerGap())
579  );
580 
581  pack();
582  }// </editor-fold>//GEN-END:initComponents
583 
584  private void customizeComponents() {
585  setTextPrompts();
586  setTextBoxListeners();
587  manager.clearStatus();
589  updatePostgresFields(false);
590  updateSqliteFields(true);
592  updatePostgresFields(true);
593  updateSqliteFields(false);
594  } else {
595  updatePostgresFields(false);
596  updateSqliteFields(false);
597  }
598 
599  displayDatabaseSettings(manager.getSelectedDbChoice());
600  }
601 
602  private void display() {
603  this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
604  setVisible(true);
605  }
606 
607  @Messages({"EamDbSettingsDialog.chooserPath.failedToGetDbPathMsg=Selected database path is invalid. Try again."})
608  private void bnDatabasePathFileOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDatabasePathFileOpenActionPerformed
609  fcDatabasePath.setSelectedFile(new File(manager.getDbSettingsSqlite().getDbDirectory()));
610  if (fcDatabasePath.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
611  File databaseFile = fcDatabasePath.getSelectedFile();
612  if (databaseFile.isFile()) {
613  databaseFile = fcDatabasePath.getCurrentDirectory();
614  }
615  try {
616  tfDatabasePath.setText(databaseFile.getCanonicalPath());
617  tfDatabasePath.setCaretPosition(tfDatabasePath.getText().length());
618  valid();
619  } catch (IOException ex) {
620  logger.log(Level.SEVERE, "Failed to get path of selected database file", ex); // NON-NLS
621  }
622  }
623  }//GEN-LAST:event_bnDatabasePathFileOpenActionPerformed
624 
625  @NbBundle.Messages({"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.",
626  "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.",
627  "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to central repository database."})
628  private void bnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOkActionPerformed
629  if (testStatusAndCreate(this, manager, this)) {
630  dispose();
631  }
632  }//GEN-LAST:event_bnOkActionPerformed
633 
645  public static boolean testStatusAndCreate(Component parent, CentralRepoDbManager manager) {
646  return testStatusAndCreate(parent, manager, null);
647  }
648 
662  private static boolean testStatusAndCreate(Component parent, CentralRepoDbManager manager, EamDbSettingsDialog dialog) {
663  parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
664  manager.testStatus();
665 
666  if (dialog != null) {
667  dialog.valid();
668  }
669 
670  boolean testedOk = promptTestStatusWarnings(manager, dialog);
671  if (!testedOk) {
672  parent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
673  return false;
674  }
675 
676  try {
677  manager.saveNewCentralRepo();
678  } catch (CentralRepoException e) {
679  SwingUtilities.invokeLater(() -> {
680  JOptionPane.showMessageDialog(parent,
681  Bundle.EamDbSettingsDialog_okButton_errorMsg_text(),
682  Bundle.EamDbSettingsDialog_okButton_errorTitle_text(),
683  JOptionPane.WARNING_MESSAGE);
684  });
685 
686  parent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
687  return false;
688  }
689 
690  parent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
691  return true;
692  }
693 
701  public boolean wasConfigurationChanged() {
702  return manager.wasConfigurationChanged();
703  }
704 
705  private void bnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelActionPerformed
706  dispose();
707  }//GEN-LAST:event_bnCancelActionPerformed
708 
709 
710  private void cbDatabaseTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDatabaseTypeActionPerformed
711  CentralRepoDbChoice selectedItem = (CentralRepoDbChoice) cbDatabaseType.getSelectedItem();
712  changeDbSelection(selectedItem);
713  }//GEN-LAST:event_cbDatabaseTypeActionPerformed
714 
715  private void changeDbSelection(CentralRepoDbChoice selectedItem) {
716  if (isDbChoiceSelectable(selectedItem)) {
717  manager.setSelctedDbChoice(selectedItem);
718  cbDatabaseType.setSelectedItem(selectedItem);
719  } else {
720  cbDatabaseType.setSelectedItem(manager.getSelectedDbChoice());
721  }
722 
723  customizeComponents();
724  }
725 
726  private void updateFullDbPath() {
727  dataBaseFileTextArea.setText(tfDatabasePath.getText() + File.separator + SqliteCentralRepoSettings.DEFAULT_DBNAME);
728  dataBaseFileTextArea.setCaretPosition(dataBaseFileTextArea.getText().length());
729  }
730 
732  boolean isSqlite = choice == CentralRepoDbChoice.SQLITE;
733  boolean isPostgres = choice == CentralRepoDbChoice.POSTGRESQL_CUSTOM;
734 
735  lbDatabasePath.setVisible(isSqlite);
736  tfDatabasePath.setVisible(isSqlite);
737  lbDatabaseDesc.setVisible(isSqlite);
738  dataBaseFileTextArea.setVisible(isSqlite);
739  lbSingleUserSqLite.setVisible(isSqlite);
740  bnDatabasePathFileOpen.setVisible(isSqlite);
741 
742  lbHostName.setVisible(isPostgres);
743  tbDbHostname.setVisible(isPostgres);
744  lbPort.setVisible(isPostgres);
745  tbDbPort.setVisible(isPostgres);
746  lbUserName.setVisible(isPostgres);
747  tbDbUsername.setVisible(isPostgres);
748  lbUserPassword.setVisible(isPostgres);
749  jpDbPassword.setVisible(isPostgres);
750  }
751 
755  @Messages({"EamDbSettingsDialog.textPrompt.hostnameOrIP=Hostname or IP Address",
756  "EamDbSettingsDialog.textPrompt.port=Port Number",
757  "EamDbSettingsDialog.textPrompt.dbName=Database Name",
758  "EamDbSettingsDialog.textPrompt.user=Database User",
759  "EamDbSettingsDialog.textPrompt.password=Database User's Password"})
760  private void setTextPrompts() {
761  Collection<TextPrompt> textPrompts = new ArrayList<>();
762  textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_hostnameOrIP(), tbDbHostname));
763  textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_port(), tbDbPort));
764  textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_user(), tbDbUsername));
765  configureTextPrompts(textPrompts);
766  }
767 
768  private void updatePostgresFields(boolean enabled) {
769  tbDbHostname.setText(enabled ? manager.getDbSettingsPostgres().getHost() : "");
770  tbDbHostname.setEnabled(enabled);
771  tbDbPort.setText(enabled ? Integer.toString(manager.getDbSettingsPostgres().getPort()) : "");
772  tbDbPort.setEnabled(enabled);
773  tbDbUsername.setText(enabled ? manager.getDbSettingsPostgres().getUserName() : "");
774  tbDbUsername.setEnabled(enabled);
775  jpDbPassword.setText(enabled ? manager.getDbSettingsPostgres().getPassword() : "");
776  jpDbPassword.setEnabled(enabled);
777  }
778 
785  private void updateSqliteFields(boolean enabled) {
786  tfDatabasePath.setText(enabled ? manager.getDbSettingsSqlite().getDbDirectory() : "");
787  tfDatabasePath.setEnabled(enabled);
788  bnDatabasePathFileOpen.setEnabled(enabled);
789  }
790 
794  private void setTextBoxListeners() {
795  textBoxes.add(tfDatabasePath);
796  textBoxes.add(tbDbHostname);
797  textBoxes.add(tbDbPort);
798  // textBoxes.add(tbDbName);
799  textBoxes.add(tbDbUsername);
800  textBoxes.add(jpDbPassword);
801  addDocumentListeners(textBoxes, textBoxChangedListener);
802  }
803 
810  private static void configureTextPrompts(Collection<TextPrompt> textPrompts) {
811  float alpha = 0.9f; // Mostly opaque
812  for (TextPrompt textPrompt : textPrompts) {
813  textPrompt.setForeground(Color.LIGHT_GRAY);
814  textPrompt.changeAlpha(alpha);
815  }
816  }
817 
824  private static void addDocumentListeners(Collection<JTextField> textFields, TextBoxChangedListener listener) {
825  textFields.forEach((textField) -> {
826  textField.getDocument().addDocumentListener(listener);
827  });
828  }
829 
836  @Messages({"EamDbSettingsDialog.validation.incompleteFields=Fill in all values for the selected database."})
837  private boolean databaseFieldsArePopulated() {
838  boolean result = true;
840  result = !tbDbHostname.getText().trim().isEmpty()
841  && !tbDbPort.getText().trim().isEmpty()
842  // && !tbDbName.getText().trim().isEmpty()
843  && !tbDbUsername.getText().trim().isEmpty()
844  && 0 < jpDbPassword.getPassword().length;
845  } else if (manager.getSelectedDbChoice() == CentralRepoDbChoice.SQLITE) {
846  result = !tfDatabasePath.getText().trim().isEmpty();
847  }
848 
849  return result;
850  }
851 
857  private boolean checkFields() {
858  return databaseFieldsArePopulated()
859  && databaseSettingsAreValid();
860  }
861 
867  private boolean valid() {
868  return enableOkButton(checkFields());
869  }
870 
877  @Messages({"EamDbSettingsDialog.validation.finished=Click OK to save your database settings and return to the Options. Or select a different database type."})
878  private boolean enableOkButton(boolean isValidInput) {
879  if (isValidInput) {
880  bnOk.setEnabled(true);
881  } else {
882  bnOk.setEnabled(false);
883  }
884  return true;
885 
886  }
887 
893  private boolean databaseSettingsAreValid() {
894  try {
896  tbDbHostname.getText().trim(),
897  tbDbPort.getText().trim(),
898  tbDbUsername.getText().trim(),
899  tfDatabasePath.getText().trim(),
900  new String(jpDbPassword.getPassword()));
901  } catch (CentralRepoException | NumberFormatException | IllegalStateException e) {
902  return false;
903  }
904 
905  return true;
906  }
907 
912  private class TextBoxChangedListener implements DocumentListener {
913 
914  @Override
915  public void changedUpdate(DocumentEvent e) {
916  manager.clearStatus();
917  updateFullDbPath();
918  valid();
919  }
920 
921  @Override
922  public void insertUpdate(DocumentEvent e) {
923  manager.clearStatus();
924  updateFullDbPath();
925  valid();
926  }
927 
928  @Override
929  public void removeUpdate(DocumentEvent e) {
930  manager.clearStatus();
931  updateFullDbPath();
932  valid();
933 
934  }
935  }
936 
937 
938  // Variables declaration - do not modify//GEN-BEGIN:variables
939  private javax.swing.JButton bnCancel;
940  private javax.swing.JButton bnDatabasePathFileOpen;
941  private javax.swing.JButton bnOk;
943  private javax.swing.JScrollPane dataBaseFileScrollPane;
944  private javax.swing.JTextArea dataBaseFileTextArea;
945  private javax.swing.JFileChooser fcDatabasePath;
946  private javax.swing.Box.Filler filler1;
947  private javax.swing.JPasswordField jpDbPassword;
948  private javax.swing.JLabel lbDatabaseDesc;
949  private javax.swing.JLabel lbDatabasePath;
950  private javax.swing.JLabel lbDatabaseType;
951  private javax.swing.JLabel lbHostName;
952  private javax.swing.JLabel lbPort;
953  private javax.swing.JLabel lbSingleUserSqLite;
954  private javax.swing.JLabel lbUserName;
955  private javax.swing.JLabel lbUserPassword;
956  private javax.swing.JPanel pathPanel;
957  private javax.swing.JPanel pnButtons;
958  private javax.swing.JPanel pnSQLiteSettings;
959  private javax.swing.JTextField tbDbHostname;
960  private javax.swing.JTextField tbDbPort;
961  private javax.swing.JTextField tbDbUsername;
962  private javax.swing.JTextField tfDatabasePath;
963  private javax.swing.JPanel typePanel;
964  // End of variables declaration//GEN-END:variables
965 }
static boolean testStatusAndCreate(Component parent, CentralRepoDbManager manager, EamDbSettingsDialog dialog)
Component getListCellRendererComponent(JList<?extends CentralRepoDbChoice > list, CentralRepoDbChoice value, int index, boolean isSelected, boolean cellHasFocus)
static void addDocumentListeners(Collection< JTextField > textFields, TextBoxChangedListener listener)
static boolean promptTestStatusWarnings(CentralRepoDbManager manager, EamDbSettingsDialog dialog)
boolean testDatabaseSettingsAreValid(String tbDbHostname, String tbDbPort, String tbDbUsername, String tfDatabasePath, String jpDbPassword)
static void configureTextPrompts(Collection< TextPrompt > textPrompts)
static boolean promptCreateDatabase(CentralRepoDbManager manager, EamDbSettingsDialog dialog)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
static boolean testStatusAndCreate(Component parent, CentralRepoDbManager manager)
javax.swing.JComboBox< org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoDbChoice > cbDatabaseType

Copyright © 2012-2020 Basis Technology. Generated on: Mon Jul 6 2020
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.