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

Copyright © 2012-2016 Basis Technology. Generated on: Fri Sep 29 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.