Autopsy  4.10.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-2018 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.Cursor;
23 import java.io.File;
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.Collection;
27 import java.util.logging.Level;
28 import javax.swing.JDialog;
29 import javax.swing.JFileChooser;
30 import javax.swing.JFrame;
31 import javax.swing.JOptionPane;
32 import javax.swing.JTextField;
33 import javax.swing.SwingUtilities;
34 import javax.swing.event.DocumentEvent;
35 import javax.swing.event.DocumentListener;
36 import javax.swing.filechooser.FileFilter;
37 import org.netbeans.spi.options.OptionsPanelController;
38 import org.openide.util.NbBundle.Messages;
39 import org.openide.windows.WindowManager;
48 
52 @SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
53 public class EamDbSettingsDialog extends JDialog {
54 
55  private static final Logger logger = Logger.getLogger(EamDbSettingsDialog.class.getName());
56  private static final String CENTRAL_REPO_DB_NAME = "central_repository";
57  private static final String CENTRAL_REPO_SQLITE_EXT = ".db";
58  private static final long serialVersionUID = 1L;
59  private final Collection<JTextField> textBoxes;
61 
66  private boolean configurationChanged = false;
67 
71  @Messages({"EamDbSettingsDialog.title.text=Central Repository Database Configuration",
72  "EamDbSettingsDialog.lbSingleUserSqLite.text=SQLite should only be used by one examiner at a time.",
73  "EamDbSettingsDialog.lbDatabaseType.text=Database Type :",
74  "EamDbSettingsDialog.fcDatabasePath.title=Select location for central_repository.db"})
75 
77  super((JFrame) WindowManager.getDefault().getMainWindow(),
78  Bundle.EamDbSettingsDialog_title_text(),
79  true);
80 
81  textBoxes = new ArrayList<>();
82  textBoxChangedListener = new TextBoxChangedListener();
83  dbSettingsPostgres = new PostgresEamDbSettings();
84  dbSettingsSqlite = new SqliteEamDbSettings();
85  selectedPlatform = EamDbPlatformEnum.getSelectedPlatform();
86  if (selectedPlatform == null || selectedPlatform.equals(EamDbPlatformEnum.DISABLED)) {
87  selectedPlatform = EamDbPlatformEnum.POSTGRESQL;
88  }
89 
90  initComponents();
91  fcDatabasePath.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
92  fcDatabasePath.setAcceptAllFileFilterUsed(false);
93  fcDatabasePath.setDialogTitle(Bundle.EamDbSettingsDialog_fcDatabasePath_title());
94  fcDatabasePath.setFileFilter(new FileFilter() {
95  @Override
96  public boolean accept(File pathname) {
97  if (pathname.isDirectory()) {
98  return true;
99  }
100  return pathname.getName().toLowerCase().equals((CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT).toLowerCase());
101  }
102 
103  @Override
104  public String getDescription() {
105  return "Directories and Central Repository databases";
106  }
107  });
108  cbDatabaseType.setSelectedItem(selectedPlatform);
109  customizeComponents();
110  valid();
111  display();
112 
113  }
114 
120  @SuppressWarnings("unchecked")
121  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
122  private void initComponents() {
123 
124  bnGrpDatabasePlatforms = new javax.swing.ButtonGroup();
125  fcDatabasePath = new javax.swing.JFileChooser();
126  pnButtons = new javax.swing.JPanel();
127  bnCancel = new javax.swing.JButton();
128  bnOk = new javax.swing.JButton();
129  pnSQLiteSettings = new javax.swing.JPanel();
130  lbDatabasePath = new javax.swing.JLabel();
131  tfDatabasePath = new javax.swing.JTextField();
132  bnDatabasePathFileOpen = new javax.swing.JButton();
133  lbHostName = new javax.swing.JLabel();
134  tbDbHostname = new javax.swing.JTextField();
135  lbPort = new javax.swing.JLabel();
136  tbDbPort = new javax.swing.JTextField();
137  lbUserName = new javax.swing.JLabel();
138  tbDbUsername = new javax.swing.JTextField();
139  lbUserPassword = new javax.swing.JLabel();
140  jpDbPassword = new javax.swing.JPasswordField();
141  cbDatabaseType = new javax.swing.JComboBox<>();
142  lbSingleUserSqLite = new javax.swing.JLabel();
143  lbDatabaseType = new javax.swing.JLabel();
144  lbDatabaseDesc = new javax.swing.JLabel();
145  lbFullDbPath = new javax.swing.JLabel();
146  filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767));
147 
148  setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
149 
150  org.openide.awt.Mnemonics.setLocalizedText(bnCancel, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnCancel.text")); // NOI18N
151  bnCancel.addActionListener(new java.awt.event.ActionListener() {
152  public void actionPerformed(java.awt.event.ActionEvent evt) {
153  bnCancelActionPerformed(evt);
154  }
155  });
156 
157  org.openide.awt.Mnemonics.setLocalizedText(bnOk, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnOk.text")); // NOI18N
158  bnOk.addActionListener(new java.awt.event.ActionListener() {
159  public void actionPerformed(java.awt.event.ActionEvent evt) {
160  bnOkActionPerformed(evt);
161  }
162  });
163 
164  javax.swing.GroupLayout pnButtonsLayout = new javax.swing.GroupLayout(pnButtons);
165  pnButtons.setLayout(pnButtonsLayout);
166  pnButtonsLayout.setHorizontalGroup(
167  pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
168  .addGroup(pnButtonsLayout.createSequentialGroup()
169  .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
170  .addComponent(bnOk)
171  .addGap(11, 11, 11)
172  .addComponent(bnCancel)
173  .addContainerGap())
174  );
175  pnButtonsLayout.setVerticalGroup(
176  pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
177  .addGroup(pnButtonsLayout.createSequentialGroup()
178  .addGap(0, 0, 0)
179  .addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
180  .addComponent(bnOk)
181  .addComponent(bnCancel))
182  .addGap(0, 0, 0))
183  );
184 
185  pnSQLiteSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder());
186 
187  org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabasePath.text")); // NOI18N
188 
189  tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N
190  tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N
191 
192  org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N
193  bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() {
194  public void actionPerformed(java.awt.event.ActionEvent evt) {
195  bnDatabasePathFileOpenActionPerformed(evt);
196  }
197  });
198 
199  org.openide.awt.Mnemonics.setLocalizedText(lbHostName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbHostName.text")); // NOI18N
200 
201  org.openide.awt.Mnemonics.setLocalizedText(lbPort, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbPort.text")); // NOI18N
202 
203  org.openide.awt.Mnemonics.setLocalizedText(lbUserName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserName.text")); // NOI18N
204 
205  org.openide.awt.Mnemonics.setLocalizedText(lbUserPassword, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserPassword.text")); // NOI18N
206 
207  cbDatabaseType.setModel(new javax.swing.DefaultComboBoxModel<>(new EamDbPlatformEnum[]{EamDbPlatformEnum.POSTGRESQL, EamDbPlatformEnum.SQLITE}));
208  cbDatabaseType.addActionListener(new java.awt.event.ActionListener() {
209  public void actionPerformed(java.awt.event.ActionEvent evt) {
210  cbDatabaseTypeActionPerformed(evt);
211  }
212  });
213 
214  org.openide.awt.Mnemonics.setLocalizedText(lbSingleUserSqLite, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbSingleUserSqLite.text")); // NOI18N
215 
216  org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseType.text")); // NOI18N
217 
218  org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseDesc, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseDesc.text")); // NOI18N
219 
220  org.openide.awt.Mnemonics.setLocalizedText(lbFullDbPath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbFullDbPath.text")); // NOI18N
221 
222  javax.swing.GroupLayout pnSQLiteSettingsLayout = new javax.swing.GroupLayout(pnSQLiteSettings);
223  pnSQLiteSettings.setLayout(pnSQLiteSettingsLayout);
224  pnSQLiteSettingsLayout.setHorizontalGroup(
225  pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
226  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
227  .addContainerGap()
228  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
229  .addComponent(lbHostName)
230  .addComponent(lbPort)
231  .addComponent(lbUserName)
232  .addComponent(lbDatabaseType)
233  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
234  .addComponent(lbDatabasePath, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
235  .addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
236  .addComponent(lbDatabaseDesc))
237  .addGap(10, 10, 10)
238  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
239  .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
240  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
241  .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
242  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
243  .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE)
244  .addGap(9, 9, 9))
245  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
246  .addComponent(tfDatabasePath)
247  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
248  .addComponent(bnDatabasePathFileOpen)
249  .addGap(11, 11, 11))
250  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnSQLiteSettingsLayout.createSequentialGroup()
251  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
252  .addComponent(tbDbHostname, javax.swing.GroupLayout.Alignment.LEADING)
253  .addComponent(jpDbPassword, javax.swing.GroupLayout.Alignment.LEADING)
254  .addComponent(tbDbUsername)
255  .addComponent(tbDbPort, javax.swing.GroupLayout.Alignment.LEADING))
256  .addGap(10, 10, 10))))
257  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
258  .addGap(55, 55, 55)
259  .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
260  .addGap(0, 0, Short.MAX_VALUE))
261  );
262  pnSQLiteSettingsLayout.setVerticalGroup(
263  pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
264  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
265  .addGap(6, 6, 6)
266  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
267  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
268  .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
269  .addComponent(lbSingleUserSqLite))
270  .addComponent(lbDatabaseType, javax.swing.GroupLayout.Alignment.TRAILING))
271  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
272  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
273  .addComponent(lbDatabasePath)
274  .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
275  .addComponent(bnDatabasePathFileOpen))
276  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
277  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
278  .addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
279  .addComponent(lbHostName))
280  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
281  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
282  .addComponent(tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
283  .addComponent(lbPort))
284  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
285  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
286  .addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
287  .addComponent(lbUserName))
288  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
289  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
290  .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
291  .addComponent(lbUserPassword))
292  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
293  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
294  .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
295  .addComponent(lbDatabaseDesc, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
296  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
297  .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
298  .addContainerGap())
299  );
300 
301  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
302  getContentPane().setLayout(layout);
303  layout.setHorizontalGroup(
304  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
305  .addGroup(layout.createSequentialGroup()
306  .addContainerGap()
307  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
308  .addComponent(pnButtons, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
309  .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
310  .addContainerGap())
311  );
312  layout.setVerticalGroup(
313  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
314  .addGroup(layout.createSequentialGroup()
315  .addGap(10, 10, 10)
316  .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
317  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
318  .addComponent(pnButtons, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
319  .addGap(10, 10, 10))
320  );
321 
322  pack();
323  }// </editor-fold>//GEN-END:initComponents
324 
325  private void customizeComponents() {
326  setTextPrompts();
327  setTextBoxListeners();
328  switch (selectedPlatform) {
329  case SQLITE:
330  testingStatus = DatabaseTestResult.UNTESTED;
331  updatePostgresFields(false);
332  updateSqliteFields(true);
333  break;
334  default:
335  POSTGRESQL:
336  testingStatus = DatabaseTestResult.UNTESTED;
337  updatePostgresFields(true);
338  updateSqliteFields(false);
339  break;
340 
341  }
342  displayDatabaseSettings(selectedPlatform.equals(EamDbPlatformEnum.POSTGRESQL));
343  }
344 
345  private void display() {
346  this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
347  setVisible(true);
348  }
349 
350  @Messages({"EamDbSettingsDialog.chooserPath.failedToGetDbPathMsg=Selected database path is invalid. Try again."})
351  private void bnDatabasePathFileOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDatabasePathFileOpenActionPerformed
352  fcDatabasePath.setSelectedFile(new File(dbSettingsSqlite.getDbDirectory()));
353  if (fcDatabasePath.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
354  File databaseFile = fcDatabasePath.getSelectedFile();
355  if (databaseFile.isFile()) {
356  databaseFile = fcDatabasePath.getCurrentDirectory();
357  }
358  try {
359  tfDatabasePath.setText(databaseFile.getCanonicalPath());
360  valid();
361  } catch (IOException ex) {
362  logger.log(Level.SEVERE, "Failed to get path of selected database file", ex); // NON-NLS
363  }
364  }
365  }//GEN-LAST:event_bnDatabasePathFileOpenActionPerformed
366 
367  private void testDbSettings() {
368  switch (selectedPlatform) {
369  case POSTGRESQL:
370  if (dbSettingsPostgres.verifyConnection()) {
371  if (dbSettingsPostgres.verifyDatabaseExists()) {
372  if (dbSettingsPostgres.verifyDatabaseSchema()) {
373  testingStatus = DatabaseTestResult.TESTEDOK;
374  } else {
375  testingStatus = DatabaseTestResult.SCHEMA_INVALID;
376  }
377  } else {
378  testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST;
379  }
380  } else {
381  testingStatus = DatabaseTestResult.CONNECTION_FAILED;
382  }
383  break;
384  case SQLITE:
385  if (dbSettingsSqlite.dbFileExists()) {
386  if (dbSettingsSqlite.verifyConnection()) {
387  if (dbSettingsSqlite.verifyDatabaseSchema()) {
388  testingStatus = DatabaseTestResult.TESTEDOK;
389  } else {
390  testingStatus = DatabaseTestResult.SCHEMA_INVALID;
391  }
392  } else {
393  testingStatus = DatabaseTestResult.SCHEMA_INVALID;
394  }
395  } else {
396  testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST;
397  }
398  break;
399  }
400 
401  valid();
402  }
403 
404  @Messages({"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database",
405  "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.",
406  "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."})
407  private void createDb() {
408  boolean result = false;
409  boolean dbCreated = true;
410  switch (selectedPlatform) {
411  case POSTGRESQL:
412  if (!dbSettingsPostgres.verifyDatabaseExists()) {
413  dbCreated = dbSettingsPostgres.createDatabase();
414  }
415  if (dbCreated) {
416  result = dbSettingsPostgres.initializeDatabaseSchema()
417  && dbSettingsPostgres.insertDefaultDatabaseContent();
418  }
419  if (!result) {
420  // Remove the incomplete database
421  if (dbCreated) {
422  dbSettingsPostgres.deleteDatabase();
423  }
424 
425  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
426  Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(),
427  Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
428  JOptionPane.WARNING_MESSAGE);
429  logger.severe("Unable to initialize database schema or insert contents into central repository.");
430  return;
431  }
432  break;
433  case SQLITE:
434  if (!dbSettingsSqlite.dbDirectoryExists()) {
435  dbCreated = dbSettingsSqlite.createDbDirectory();
436  }
437  if (dbCreated) {
438  result = dbSettingsSqlite.initializeDatabaseSchema()
439  && dbSettingsSqlite.insertDefaultDatabaseContent();
440  }
441  if (!result) {
442  if (dbCreated) {
443  dbSettingsSqlite.deleteDatabase();
444  }
445 
446  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
447  Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(),
448  Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
449  JOptionPane.WARNING_MESSAGE);
450  logger.severe("Unable to initialize database schema or insert contents into central repository.");
451  return;
452  }
453  break;
454  }
455  testingStatus = DatabaseTestResult.TESTEDOK;
456  valid();
457  }
458 
466  boolean wasConfigurationChanged() {
467  return configurationChanged;
468  }
469 
470  @Messages({"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.",
471  "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.",
472  "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to central repository database.",
473  "EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database",
474  "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path (if applicable).",
475  "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist",
476  "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?",
477  "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed",
478  "EamDbSettingsDialog.okButton.databaseConnectionFailed.message=Unable to connect to database please check your settings and try again."})
479  private void bnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOkActionPerformed
480  setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
481  testDbSettings();
482  if (testingStatus == DatabaseTestResult.CONNECTION_FAILED) {
483  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
484  Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_message(),
485  Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_title(),
486  JOptionPane.WARNING_MESSAGE);
487  } else if (testingStatus == DatabaseTestResult.SCHEMA_INVALID) {
488  // There's an existing database or file, but it's not in our format.
489  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
490  Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_message(),
491  Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_title(),
492  JOptionPane.WARNING_MESSAGE);
493  } else if (testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST) {
494  //database doesn't exist do you want to create
495  if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(),
496  Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(),
497  Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(),
498  JOptionPane.YES_NO_OPTION)) {
499  createDb();
500  }
501  }
502 
503  if (testingStatus != DatabaseTestResult.TESTEDOK) {
504  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
505  return;
506  }
507 
516  try {
517  EamDb previousDbManager = EamDb.getInstance();
518  if (null != previousDbManager) {
519  // NOTE: do not set/save the seleted platform before calling this.
521  }
522  } catch (EamDbException ex) {
523  logger.log(Level.SEVERE, "Failed to close database connections in previously selected platform.", ex); // NON-NLS
524  SwingUtilities.invokeLater(() -> {
525  JOptionPane.showMessageDialog(this,
526  Bundle.EamDbSettingsDialog_okButton_errorMsg_text(),
527  Bundle.EamDbSettingsDialog_okButton_errorTitle_text(),
528  JOptionPane.WARNING_MESSAGE);
529  });
530  }
531 
532  // Even if we fail to close the existing connections, make sure that we
533  // save the new connection settings, so an Autopsy restart will correctly
534  // start with the new settings.
535  EamDbPlatformEnum.setSelectedPlatform(selectedPlatform.name());
537 
538  switch (selectedPlatform) {
539  case POSTGRESQL:
540  // save the new PostgreSQL settings
541  dbSettingsPostgres.saveSettings();
542  // Load those newly saved settings into the postgres db manager instance
543  // in case we are still using the same instance.
544  try {
546  configurationChanged = true;
547  } catch (EamDbException ex) {
548  logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS
549  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
550  return;
551  }
552 
553  break;
554  case SQLITE:
555  // save the new SQLite settings
556  dbSettingsSqlite.saveSettings();
557  // Load those newly saved settings into the sqlite db manager instance
558  // in case we are still using the same instance.
559  try {
561  configurationChanged = true;
562  } catch (EamDbException ex) {
563  logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS
564  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
565  return;
566  }
567  break;
568  case DISABLED:
569  break;
570  }
571 
572  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
573  dispose();
574  }//GEN-LAST:event_bnOkActionPerformed
575 
576  private void bnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelActionPerformed
577  dispose();
578  }//GEN-LAST:event_bnCancelActionPerformed
579 
580 
581  private void cbDatabaseTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDatabaseTypeActionPerformed
582  selectedPlatform = (EamDbPlatformEnum) cbDatabaseType.getSelectedItem();
583  customizeComponents();
584  }//GEN-LAST:event_cbDatabaseTypeActionPerformed
585 
586  private void updateFullDbPath() {
587  lbFullDbPath.setText(tfDatabasePath.getText() + File.separator + CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT);
588  }
589 
590  private void displayDatabaseSettings(boolean isPostgres) {
591  lbDatabasePath.setVisible(!isPostgres);
592  tfDatabasePath.setVisible(!isPostgres);
593  lbDatabaseDesc.setVisible(!isPostgres);
594  lbFullDbPath.setVisible(!isPostgres);
595  lbSingleUserSqLite.setVisible(!isPostgres);
596  bnDatabasePathFileOpen.setVisible(!isPostgres);
597  lbHostName.setVisible(isPostgres);
598  tbDbHostname.setVisible(isPostgres);
599  lbPort.setVisible(isPostgres);
600  tbDbPort.setVisible(isPostgres);
601  lbUserName.setVisible(isPostgres);
602  tbDbUsername.setVisible(isPostgres);
603  lbUserPassword.setVisible(isPostgres);
604  jpDbPassword.setVisible(isPostgres);
605  }
606 
610  @Messages({"EamDbSettingsDialog.textPrompt.hostnameOrIP=Hostname or IP Address",
611  "EamDbSettingsDialog.textPrompt.port=Port Number",
612  "EamDbSettingsDialog.textPrompt.dbName=Database Name",
613  "EamDbSettingsDialog.textPrompt.user=Database User",
614  "EamDbSettingsDialog.textPrompt.password=Database User's Password"})
615  private void setTextPrompts() {
616  Collection<TextPrompt> textPrompts = new ArrayList<>();
617  textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_hostnameOrIP(), tbDbHostname));
618  textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_port(), tbDbPort));
619  textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_user(), tbDbUsername));
620  configureTextPrompts(textPrompts);
621  }
622 
623  private void updatePostgresFields(boolean enabled) {
624  tbDbHostname.setText(enabled ? dbSettingsPostgres.getHost() : "");
625  tbDbHostname.setEnabled(enabled);
626  tbDbPort.setText(enabled ? Integer.toString(dbSettingsPostgres.getPort()) : "");
627  tbDbPort.setEnabled(enabled);
628  tbDbUsername.setText(enabled ? dbSettingsPostgres.getUserName() : "");
629  tbDbUsername.setEnabled(enabled);
630  jpDbPassword.setText(enabled ? dbSettingsPostgres.getPassword() : "");
631  jpDbPassword.setEnabled(enabled);
632  }
633 
640  private void updateSqliteFields(boolean enabled) {
641  tfDatabasePath.setText(enabled ? dbSettingsSqlite.getDbDirectory() : "");
642  tfDatabasePath.setEnabled(enabled);
643  bnDatabasePathFileOpen.setEnabled(enabled);
644  }
645 
649  private void setTextBoxListeners() {
650  textBoxes.add(tfDatabasePath);
651  textBoxes.add(tbDbHostname);
652  textBoxes.add(tbDbPort);
653  // textBoxes.add(tbDbName);
654  textBoxes.add(tbDbUsername);
655  textBoxes.add(jpDbPassword);
656  addDocumentListeners(textBoxes, textBoxChangedListener);
657  }
658 
665  private static void configureTextPrompts(Collection<TextPrompt> textPrompts) {
666  float alpha = 0.9f; // Mostly opaque
667  for (TextPrompt textPrompt : textPrompts) {
668  textPrompt.setForeground(Color.LIGHT_GRAY);
669  textPrompt.changeAlpha(alpha);
670  }
671  }
672 
679  private static void addDocumentListeners(Collection<JTextField> textFields, TextBoxChangedListener listener) {
680  textFields.forEach((textField) -> {
681  textField.getDocument().addDocumentListener(listener);
682  });
683  }
684 
691  @Messages({"EamDbSettingsDialog.validation.incompleteFields=Fill in all values for the selected database."})
692  private boolean databaseFieldsArePopulated() {
693  boolean result = true;
694  switch (selectedPlatform) {
695  case POSTGRESQL:
696  result = !tbDbHostname.getText().trim().isEmpty()
697  && !tbDbPort.getText().trim().isEmpty()
698  // && !tbDbName.getText().trim().isEmpty()
699  && !tbDbUsername.getText().trim().isEmpty()
700  && 0 < jpDbPassword.getPassword().length;
701 
702  break;
703 
704  case SQLITE:
705  result = !tfDatabasePath.getText().trim().isEmpty();
706  break;
707  }
708 
709  if (!result) {
710  }
711 
712  return result;
713  }
714 
720  private boolean checkFields() {
721  return databaseFieldsArePopulated()
722  && databaseSettingsAreValid();
723  }
724 
730  private boolean databaseSettingsAreValid() {
731  boolean result = true;
732  StringBuilder guidanceText = new StringBuilder();
733 
734  switch (selectedPlatform) {
735  case POSTGRESQL:
736  try {
737  dbSettingsPostgres.setHost(tbDbHostname.getText().trim());
738  } catch (EamDbException ex) {
739  guidanceText.append(ex.getMessage());
740  result = false;
741  }
742 
743  try {
744  dbSettingsPostgres.setPort(Integer.valueOf(tbDbPort.getText().trim()));
745  } catch (NumberFormatException | EamDbException ex) {
746  guidanceText.append(ex.getMessage());
747  result = false;
748  }
749 
750  try {
751  dbSettingsPostgres.setDbName(CENTRAL_REPO_DB_NAME);
752  } catch (EamDbException ex) {
753  guidanceText.append(ex.getMessage());
754  result = false;
755  }
756 
757  try {
758  dbSettingsPostgres.setUserName(tbDbUsername.getText().trim());
759  } catch (EamDbException ex) {
760  guidanceText.append(ex.getMessage());
761  result = false;
762  }
763 
764  try {
765  dbSettingsPostgres.setPassword(new String(jpDbPassword.getPassword()));
766  } catch (EamDbException ex) {
767  guidanceText.append(ex.getMessage());
768  result = false;
769  }
770  break;
771  case SQLITE:
772  try {
773  File databasePath = new File(tfDatabasePath.getText());
774  dbSettingsSqlite.setDbName(CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT);
775  dbSettingsSqlite.setDbDirectory(databasePath.getPath());
776  } catch (EamDbException ex) {
777  guidanceText.append(ex.getMessage());
778  result = false;
779  }
780  break;
781  }
782 
783  return result;
784  }
785 
791  private boolean valid() {
792  return enableOkButton(checkFields());
793  }
794 
801  @Messages({"EamDbSettingsDialog.validation.finished=Click OK to save your database settings and return to the Options. Or select a different database type."})
802  private boolean enableOkButton(boolean isValidInput) {
803  if (isValidInput) {
804  bnOk.setEnabled(true);
805  } else {
806  bnOk.setEnabled(false);
807  }
808  return true;
809 
810  }
811 
816  private class TextBoxChangedListener implements DocumentListener {
817 
818  @Override
819  public void changedUpdate(DocumentEvent e) {
820  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
821  testingStatus = DatabaseTestResult.UNTESTED;
822  updateFullDbPath();
823  valid();
824  }
825 
826  @Override
827  public void insertUpdate(DocumentEvent e) {
828  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
829  testingStatus = DatabaseTestResult.UNTESTED;
830  updateFullDbPath();
831  valid();
832  }
833 
834  @Override
835  public void removeUpdate(DocumentEvent e) {
836  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
837  testingStatus = DatabaseTestResult.UNTESTED;
838  updateFullDbPath();
839  valid();
840 
841  }
842  }
843 
844  private enum DatabaseTestResult {
850  }
851 
852  // Variables declaration - do not modify//GEN-BEGIN:variables
853  private javax.swing.JButton bnCancel;
854  private javax.swing.JButton bnDatabasePathFileOpen;
855  private javax.swing.ButtonGroup bnGrpDatabasePlatforms;
856  private javax.swing.JButton bnOk;
857  private javax.swing.JComboBox<EamDbPlatformEnum> cbDatabaseType;
858  private javax.swing.JFileChooser fcDatabasePath;
859  private javax.swing.Box.Filler filler1;
860  private javax.swing.JPasswordField jpDbPassword;
861  private javax.swing.JLabel lbDatabaseDesc;
862  private javax.swing.JLabel lbDatabasePath;
863  private javax.swing.JLabel lbDatabaseType;
864  private javax.swing.JLabel lbFullDbPath;
865  private javax.swing.JLabel lbHostName;
866  private javax.swing.JLabel lbPort;
867  private javax.swing.JLabel lbSingleUserSqLite;
868  private javax.swing.JLabel lbUserName;
869  private javax.swing.JLabel lbUserPassword;
870  private javax.swing.JPanel pnButtons;
871  private javax.swing.JPanel pnSQLiteSettings;
872  private javax.swing.JTextField tbDbHostname;
873  private javax.swing.JTextField tbDbPort;
874  private javax.swing.JTextField tbDbUsername;
875  private javax.swing.JTextField tfDatabasePath;
876  // End of variables declaration//GEN-END:variables
877 }
static void addDocumentListeners(Collection< JTextField > textFields, TextBoxChangedListener listener)
static void configureTextPrompts(Collection< TextPrompt > textPrompts)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124

Copyright © 2012-2018 Basis Technology. Generated on: Fri Mar 22 2019
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.