Autopsy  4.6.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 
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 
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  } else if (pathname.getName().toLowerCase().equals((CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT).toLowerCase())) {
100  return true;
101  } else {
102  return false;
103  }
104  }
105 
106  @Override
107  public String getDescription() {
108  return "Directories and central repository databases";
109  }
110  });
111  cbDatabaseType.setSelectedItem(selectedPlatform);
113  valid();
114  display();
115 
116  }
117 
123  @SuppressWarnings("unchecked")
124  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
125  private void initComponents() {
126 
127  bnGrpDatabasePlatforms = new javax.swing.ButtonGroup();
128  fcDatabasePath = new javax.swing.JFileChooser();
129  pnButtons = new javax.swing.JPanel();
130  bnCancel = new javax.swing.JButton();
131  bnOk = new javax.swing.JButton();
132  pnSQLiteSettings = new javax.swing.JPanel();
133  lbDatabasePath = new javax.swing.JLabel();
134  tfDatabasePath = new javax.swing.JTextField();
135  bnDatabasePathFileOpen = new javax.swing.JButton();
136  lbHostName = new javax.swing.JLabel();
137  tbDbHostname = new javax.swing.JTextField();
138  lbPort = new javax.swing.JLabel();
139  tbDbPort = new javax.swing.JTextField();
140  lbUserName = new javax.swing.JLabel();
141  tbDbUsername = new javax.swing.JTextField();
142  lbUserPassword = new javax.swing.JLabel();
143  jpDbPassword = new javax.swing.JPasswordField();
144  cbDatabaseType = new javax.swing.JComboBox<>();
145  lbSingleUserSqLite = new javax.swing.JLabel();
146  lbDatabaseType = new javax.swing.JLabel();
147  lbDatabaseDesc = new javax.swing.JLabel();
148  lbFullDbPath = new javax.swing.JLabel();
149  filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767));
150 
151  setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
152 
153  org.openide.awt.Mnemonics.setLocalizedText(bnCancel, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnCancel.text")); // NOI18N
154  bnCancel.addActionListener(new java.awt.event.ActionListener() {
155  public void actionPerformed(java.awt.event.ActionEvent evt) {
157  }
158  });
159 
160  org.openide.awt.Mnemonics.setLocalizedText(bnOk, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnOk.text")); // NOI18N
161  bnOk.addActionListener(new java.awt.event.ActionListener() {
162  public void actionPerformed(java.awt.event.ActionEvent evt) {
163  bnOkActionPerformed(evt);
164  }
165  });
166 
167  javax.swing.GroupLayout pnButtonsLayout = new javax.swing.GroupLayout(pnButtons);
168  pnButtons.setLayout(pnButtonsLayout);
169  pnButtonsLayout.setHorizontalGroup(
170  pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
171  .addGroup(pnButtonsLayout.createSequentialGroup()
172  .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
173  .addComponent(bnOk)
174  .addGap(11, 11, 11)
175  .addComponent(bnCancel)
176  .addContainerGap())
177  );
178  pnButtonsLayout.setVerticalGroup(
179  pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
180  .addGroup(pnButtonsLayout.createSequentialGroup()
181  .addGap(0, 0, 0)
182  .addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
183  .addComponent(bnOk)
184  .addComponent(bnCancel))
185  .addGap(0, 0, 0))
186  );
187 
188  pnSQLiteSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder());
189 
190  org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabasePath.text")); // NOI18N
191 
192  tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N
193  tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N
194 
195  org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N
196  bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() {
197  public void actionPerformed(java.awt.event.ActionEvent evt) {
199  }
200  });
201 
202  org.openide.awt.Mnemonics.setLocalizedText(lbHostName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbHostName.text")); // NOI18N
203 
204  org.openide.awt.Mnemonics.setLocalizedText(lbPort, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbPort.text")); // NOI18N
205 
206  org.openide.awt.Mnemonics.setLocalizedText(lbUserName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserName.text")); // NOI18N
207 
208  org.openide.awt.Mnemonics.setLocalizedText(lbUserPassword, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserPassword.text")); // NOI18N
209 
210  cbDatabaseType.setModel(new javax.swing.DefaultComboBoxModel<>(new EamDbPlatformEnum[]{EamDbPlatformEnum.POSTGRESQL, EamDbPlatformEnum.SQLITE}));
211  cbDatabaseType.addActionListener(new java.awt.event.ActionListener() {
212  public void actionPerformed(java.awt.event.ActionEvent evt) {
214  }
215  });
216 
217  org.openide.awt.Mnemonics.setLocalizedText(lbSingleUserSqLite, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbSingleUserSqLite.text")); // NOI18N
218 
219  org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseType.text")); // NOI18N
220 
221  org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseDesc, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseDesc.text")); // NOI18N
222 
223  org.openide.awt.Mnemonics.setLocalizedText(lbFullDbPath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbFullDbPath.text")); // NOI18N
224 
225  javax.swing.GroupLayout pnSQLiteSettingsLayout = new javax.swing.GroupLayout(pnSQLiteSettings);
226  pnSQLiteSettings.setLayout(pnSQLiteSettingsLayout);
227  pnSQLiteSettingsLayout.setHorizontalGroup(
228  pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
229  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
230  .addContainerGap()
231  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
232  .addComponent(lbHostName)
233  .addComponent(lbPort)
234  .addComponent(lbUserName)
235  .addComponent(lbDatabaseType)
236  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
237  .addComponent(lbDatabasePath, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
238  .addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
239  .addComponent(lbDatabaseDesc))
240  .addGap(10, 10, 10)
241  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
242  .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
243  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
244  .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
245  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
246  .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE)
247  .addGap(9, 9, 9))
248  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
249  .addComponent(tfDatabasePath)
250  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
251  .addComponent(bnDatabasePathFileOpen)
252  .addGap(11, 11, 11))
253  .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnSQLiteSettingsLayout.createSequentialGroup()
254  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
255  .addComponent(tbDbHostname, javax.swing.GroupLayout.Alignment.LEADING)
256  .addComponent(jpDbPassword, javax.swing.GroupLayout.Alignment.LEADING)
257  .addComponent(tbDbUsername)
258  .addComponent(tbDbPort, javax.swing.GroupLayout.Alignment.LEADING))
259  .addGap(10, 10, 10))))
260  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
261  .addGap(55, 55, 55)
262  .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
263  .addGap(0, 0, Short.MAX_VALUE))
264  );
265  pnSQLiteSettingsLayout.setVerticalGroup(
266  pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
267  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
268  .addGap(6, 6, 6)
269  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
270  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
271  .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
272  .addComponent(lbSingleUserSqLite))
273  .addComponent(lbDatabaseType, javax.swing.GroupLayout.Alignment.TRAILING))
274  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
275  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
276  .addComponent(lbDatabasePath)
277  .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
278  .addComponent(bnDatabasePathFileOpen))
279  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
280  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
281  .addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
282  .addComponent(lbHostName))
283  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
284  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
285  .addComponent(tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
286  .addComponent(lbPort))
287  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
288  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
289  .addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
290  .addComponent(lbUserName))
291  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
292  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
293  .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
294  .addComponent(lbUserPassword))
295  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
296  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
297  .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
298  .addComponent(lbDatabaseDesc, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
299  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
300  .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
301  .addContainerGap())
302  );
303 
304  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
305  getContentPane().setLayout(layout);
306  layout.setHorizontalGroup(
307  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
308  .addGroup(layout.createSequentialGroup()
309  .addContainerGap()
310  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
311  .addComponent(pnButtons, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
312  .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
313  .addContainerGap())
314  );
315  layout.setVerticalGroup(
316  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
317  .addGroup(layout.createSequentialGroup()
318  .addGap(10, 10, 10)
319  .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
320  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
321  .addComponent(pnButtons, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
322  .addGap(10, 10, 10))
323  );
324 
325  pack();
326  }// </editor-fold>//GEN-END:initComponents
327 
328  private void customizeComponents() {
329  setTextPrompts();
331  switch (selectedPlatform) {
332  case SQLITE:
333  testingStatus = DatabaseTestResult.UNTESTED;
334  updatePostgresFields(false);
335  updateSqliteFields(true);
336  break;
337  default:
338  POSTGRESQL:
339  testingStatus = DatabaseTestResult.UNTESTED;
340  updatePostgresFields(true);
341  updateSqliteFields(false);
342  break;
343 
344  }
345  displayDatabaseSettings(selectedPlatform.equals(EamDbPlatformEnum.POSTGRESQL));
346  }
347 
348  private void display() {
349  this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
350  setVisible(true);
351  }
352 
353  @Messages({"EamDbSettingsDialog.chooserPath.failedToGetDbPathMsg=Selected database path is invalid. Try again."})
354  private void bnDatabasePathFileOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDatabasePathFileOpenActionPerformed
355  fcDatabasePath.setSelectedFile(new File(dbSettingsSqlite.getDbDirectory()));
356  if (fcDatabasePath.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
357  File databaseFile = fcDatabasePath.getSelectedFile();
358  if (databaseFile.isFile()) {
359  databaseFile = fcDatabasePath.getCurrentDirectory();
360  }
361  try {
362  tfDatabasePath.setText(databaseFile.getCanonicalPath());
363  valid();
364  } catch (IOException ex) {
365  logger.log(Level.SEVERE, "Failed to get path of selected database file", ex); // NON-NLS
366  }
367  }
368  }//GEN-LAST:event_bnDatabasePathFileOpenActionPerformed
369 
370  private void testDbSettings() {
371  switch (selectedPlatform) {
372  case POSTGRESQL:
373  if (dbSettingsPostgres.verifyConnection()) {
374  if (dbSettingsPostgres.verifyDatabaseExists()) {
375  if( dbSettingsPostgres.verifyDatabaseSchema()) {
376  testingStatus = DatabaseTestResult.TESTEDOK;
377  } else {
378  testingStatus = DatabaseTestResult.SCHEMA_INVALID;
379  }
380  } else {
381  testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST;
382  }
383  } else {
384  testingStatus = DatabaseTestResult.CONNECTION_FAILED;
385  }
386  break;
387  case SQLITE:
388  if (dbSettingsSqlite.dbFileExists()){
389  if(dbSettingsSqlite.verifyConnection()) {
390  if (dbSettingsSqlite.verifyDatabaseSchema()) {
391  testingStatus = DatabaseTestResult.TESTEDOK;
392  } else {
393  testingStatus = DatabaseTestResult.SCHEMA_INVALID;
394  }
395  } else {
396  testingStatus = DatabaseTestResult.SCHEMA_INVALID;
397  }
398  } else {
399  testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST;
400  }
401  break;
402  }
403 
404  valid();
405  }
406 
407  @Messages({"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database",
408  "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.",
409  "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."})
410  private void createDb() {
411  boolean result = false;
412  boolean dbCreated = true;
413  switch (selectedPlatform) {
414  case POSTGRESQL:
415  if (!dbSettingsPostgres.verifyDatabaseExists()) {
416  dbCreated = dbSettingsPostgres.createDatabase();
417  }
418  if (dbCreated) {
419  result = dbSettingsPostgres.initializeDatabaseSchema()
420  && dbSettingsPostgres.insertDefaultDatabaseContent();
421  }
422  if (!result) {
423  // Remove the incomplete database
424  if(dbCreated){
425  dbSettingsPostgres.deleteDatabase();
426  }
427 
428  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
429  Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(),
430  Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
431  JOptionPane.WARNING_MESSAGE);
432  logger.severe("Unable to initialize database schema or insert contents into central repository.");
433  return;
434  }
435  break;
436  case SQLITE:
437  if (!dbSettingsSqlite.dbDirectoryExists()) {
438  dbCreated = dbSettingsSqlite.createDbDirectory();
439  }
440  if (dbCreated) {
441  result = dbSettingsSqlite.initializeDatabaseSchema()
442  && dbSettingsSqlite.insertDefaultDatabaseContent();
443  }
444  if (!result) {
445  if(dbCreated){
446  dbSettingsSqlite.deleteDatabase();
447  }
448 
449  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
450  Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(),
451  Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
452  JOptionPane.WARNING_MESSAGE);
453  logger.severe("Unable to initialize database schema or insert contents into central repository.");
454  return;
455  }
456  break;
457  }
458  testingStatus = DatabaseTestResult.TESTEDOK;
459  valid();
460  }
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();
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() {
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;
823  valid();
824  }
825 
826  @Override
827  public void insertUpdate(DocumentEvent e) {
828  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
829  testingStatus = DatabaseTestResult.UNTESTED;
831  valid();
832  }
833 
834  @Override
835  public void removeUpdate(DocumentEvent e) {
836  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
837  testingStatus = DatabaseTestResult.UNTESTED;
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-2016 Basis Technology. Generated on: Mon May 7 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.