Autopsy  4.13.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  filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767));
146  dataBaseFileScrollPane = new javax.swing.JScrollPane();
147  dataBaseFileTextArea = new javax.swing.JTextArea();
148 
149  setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
150  setResizable(false);
151 
152  org.openide.awt.Mnemonics.setLocalizedText(bnCancel, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnCancel.text")); // NOI18N
153  bnCancel.setMaximumSize(new java.awt.Dimension(79, 23));
154  bnCancel.setMinimumSize(new java.awt.Dimension(79, 23));
155  bnCancel.setPreferredSize(new java.awt.Dimension(79, 23));
156  bnCancel.addActionListener(new java.awt.event.ActionListener() {
157  public void actionPerformed(java.awt.event.ActionEvent evt) {
158  bnCancelActionPerformed(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, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
178  .addContainerGap())
179  );
180 
181  pnButtonsLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnCancel, bnOk});
182 
183  pnButtonsLayout.setVerticalGroup(
184  pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
185  .addGroup(pnButtonsLayout.createSequentialGroup()
186  .addGap(0, 0, 0)
187  .addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
188  .addComponent(bnOk)
189  .addComponent(bnCancel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
190  .addGap(0, 0, 0))
191  );
192 
193  pnSQLiteSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder());
194 
195  org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabasePath.text")); // NOI18N
196  lbDatabasePath.setPreferredSize(new java.awt.Dimension(80, 14));
197 
198  tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N
199  tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N
200  tfDatabasePath.setPreferredSize(new java.awt.Dimension(420, 23));
201 
202  org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N
203  bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() {
204  public void actionPerformed(java.awt.event.ActionEvent evt) {
205  bnDatabasePathFileOpenActionPerformed(evt);
206  }
207  });
208 
209  org.openide.awt.Mnemonics.setLocalizedText(lbHostName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbHostName.text")); // NOI18N
210  lbHostName.setPreferredSize(new java.awt.Dimension(80, 14));
211 
212  tbDbHostname.setPreferredSize(new java.awt.Dimension(509, 20));
213 
214  org.openide.awt.Mnemonics.setLocalizedText(lbPort, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbPort.text")); // NOI18N
215  lbPort.setPreferredSize(new java.awt.Dimension(80, 14));
216 
217  tbDbPort.setPreferredSize(new java.awt.Dimension(509, 20));
218 
219  org.openide.awt.Mnemonics.setLocalizedText(lbUserName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserName.text")); // NOI18N
220  lbUserName.setPreferredSize(new java.awt.Dimension(80, 14));
221 
222  tbDbUsername.setPreferredSize(new java.awt.Dimension(509, 20));
223 
224  org.openide.awt.Mnemonics.setLocalizedText(lbUserPassword, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserPassword.text")); // NOI18N
225  lbUserPassword.setPreferredSize(new java.awt.Dimension(80, 14));
226 
227  jpDbPassword.setPreferredSize(new java.awt.Dimension(509, 20));
228 
229  cbDatabaseType.setModel(new javax.swing.DefaultComboBoxModel<>(new EamDbPlatformEnum[]{EamDbPlatformEnum.POSTGRESQL, EamDbPlatformEnum.SQLITE}));
230  cbDatabaseType.setPreferredSize(new java.awt.Dimension(120, 20));
231  cbDatabaseType.addActionListener(new java.awt.event.ActionListener() {
232  public void actionPerformed(java.awt.event.ActionEvent evt) {
233  cbDatabaseTypeActionPerformed(evt);
234  }
235  });
236 
237  org.openide.awt.Mnemonics.setLocalizedText(lbSingleUserSqLite, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbSingleUserSqLite.text")); // NOI18N
238  lbSingleUserSqLite.setPreferredSize(new java.awt.Dimension(381, 14));
239 
240  org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseType.text")); // NOI18N
241  lbDatabaseType.setMaximumSize(new java.awt.Dimension(80, 14));
242  lbDatabaseType.setMinimumSize(new java.awt.Dimension(80, 14));
243  lbDatabaseType.setPreferredSize(new java.awt.Dimension(80, 14));
244 
245  org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseDesc, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseDesc.text")); // NOI18N
246  lbDatabaseDesc.setPreferredSize(new java.awt.Dimension(80, 14));
247 
248  dataBaseFileScrollPane.setBorder(null);
249 
250  dataBaseFileTextArea.setEditable(false);
251  dataBaseFileTextArea.setBackground(new java.awt.Color(240, 240, 240));
252  dataBaseFileTextArea.setColumns(20);
253  dataBaseFileTextArea.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N
254  dataBaseFileTextArea.setLineWrap(true);
255  dataBaseFileTextArea.setRows(3);
256  dataBaseFileScrollPane.setViewportView(dataBaseFileTextArea);
257 
258  javax.swing.GroupLayout pnSQLiteSettingsLayout = new javax.swing.GroupLayout(pnSQLiteSettings);
259  pnSQLiteSettings.setLayout(pnSQLiteSettingsLayout);
260  pnSQLiteSettingsLayout.setHorizontalGroup(
261  pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
262  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
263  .addContainerGap()
264  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
265  .addComponent(lbHostName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
266  .addComponent(lbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
267  .addComponent(lbDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
268  .addComponent(lbUserName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
269  .addComponent(lbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
270  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
271  .addComponent(lbDatabaseDesc, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
272  .addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
273  .addGap(10, 10, 10)
274  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
275  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
276  .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
277  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
278  .addComponent(bnDatabasePathFileOpen))
279  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
280  .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
281  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
282  .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
283  .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
284  .addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
285  .addComponent(tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
286  .addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
287  .addComponent(dataBaseFileScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 509, javax.swing.GroupLayout.PREFERRED_SIZE))
288  .addContainerGap())
289  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
290  .addGap(55, 55, 55)
291  .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
292  .addGap(0, 0, Short.MAX_VALUE))
293  );
294  pnSQLiteSettingsLayout.setVerticalGroup(
295  pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
296  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
297  .addGap(6, 6, 6)
298  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
299  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
300  .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
301  .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
302  .addComponent(lbDatabaseType, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
303  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
304  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
305  .addComponent(lbDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
306  .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
307  .addComponent(bnDatabasePathFileOpen))
308  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
309  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
310  .addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
311  .addComponent(lbHostName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
312  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
313  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
314  .addComponent(tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
315  .addComponent(lbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
316  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
317  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
318  .addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
319  .addComponent(lbUserName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
320  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
321  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
322  .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
323  .addComponent(lbUserPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
324  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
325  .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
326  .addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
327  .addComponent(lbDatabaseDesc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
328  .addGap(18, 18, 18)
329  .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
330  .addComponent(dataBaseFileScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
331  .addContainerGap())
332  );
333 
334  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
335  getContentPane().setLayout(layout);
336  layout.setHorizontalGroup(
337  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
338  .addGroup(layout.createSequentialGroup()
339  .addContainerGap()
340  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
341  .addComponent(pnButtons, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
342  .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
343  .addContainerGap())
344  );
345  layout.setVerticalGroup(
346  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
347  .addGroup(layout.createSequentialGroup()
348  .addContainerGap()
349  .addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
350  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
351  .addComponent(pnButtons, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
352  .addContainerGap())
353  );
354 
355  pack();
356  }// </editor-fold>//GEN-END:initComponents
357 
358  private void customizeComponents() {
359  setTextPrompts();
360  setTextBoxListeners();
361  switch (selectedPlatform) {
362  case SQLITE:
363  testingStatus = DatabaseTestResult.UNTESTED;
364  updatePostgresFields(false);
365  updateSqliteFields(true);
366  break;
367  default:
368  POSTGRESQL:
369  testingStatus = DatabaseTestResult.UNTESTED;
370  updatePostgresFields(true);
371  updateSqliteFields(false);
372  break;
373 
374  }
375  displayDatabaseSettings(selectedPlatform.equals(EamDbPlatformEnum.POSTGRESQL));
376  }
377 
378  private void display() {
379  this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
380  setVisible(true);
381  }
382 
383  @Messages({"EamDbSettingsDialog.chooserPath.failedToGetDbPathMsg=Selected database path is invalid. Try again."})
384  private void bnDatabasePathFileOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDatabasePathFileOpenActionPerformed
385  fcDatabasePath.setSelectedFile(new File(dbSettingsSqlite.getDbDirectory()));
386  if (fcDatabasePath.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
387  File databaseFile = fcDatabasePath.getSelectedFile();
388  if (databaseFile.isFile()) {
389  databaseFile = fcDatabasePath.getCurrentDirectory();
390  }
391  try {
392  tfDatabasePath.setText(databaseFile.getCanonicalPath());
393  tfDatabasePath.setCaretPosition(tfDatabasePath.getText().length());
394  valid();
395  } catch (IOException ex) {
396  logger.log(Level.SEVERE, "Failed to get path of selected database file", ex); // NON-NLS
397  }
398  }
399  }//GEN-LAST:event_bnDatabasePathFileOpenActionPerformed
400 
401  private void testDbSettings() {
402  switch (selectedPlatform) {
403  case POSTGRESQL:
404  if (dbSettingsPostgres.verifyConnection()) {
405  if (dbSettingsPostgres.verifyDatabaseExists()) {
406  if (dbSettingsPostgres.verifyDatabaseSchema()) {
407  testingStatus = DatabaseTestResult.TESTEDOK;
408  } else {
409  testingStatus = DatabaseTestResult.SCHEMA_INVALID;
410  }
411  } else {
412  testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST;
413  }
414  } else {
415  testingStatus = DatabaseTestResult.CONNECTION_FAILED;
416  }
417  break;
418  case SQLITE:
419  if (dbSettingsSqlite.dbFileExists()) {
420  if (dbSettingsSqlite.verifyConnection()) {
421  if (dbSettingsSqlite.verifyDatabaseSchema()) {
422  testingStatus = DatabaseTestResult.TESTEDOK;
423  } else {
424  testingStatus = DatabaseTestResult.SCHEMA_INVALID;
425  }
426  } else {
427  testingStatus = DatabaseTestResult.SCHEMA_INVALID;
428  }
429  } else {
430  testingStatus = DatabaseTestResult.DB_DOES_NOT_EXIST;
431  }
432  break;
433  }
434 
435  valid();
436  }
437 
438  @Messages({"EamDbSettingsDialog.okButton.createDbError.title=Unable to Create Database",
439  "EamDbSettingsDialog.okButton.createSQLiteDbError.message=Unable to create SQLite Database, please ensure location exists and you have write permissions and try again.",
440  "EamDbSettingsDialog.okButton.createPostgresDbError.message=Unable to create Postgres Database, please ensure address, port, and login credentials are correct for Postgres server and try again."})
441  private void createDb() {
442  boolean result = false;
443  boolean dbCreated = true;
444  switch (selectedPlatform) {
445  case POSTGRESQL:
446  if (!dbSettingsPostgres.verifyDatabaseExists()) {
447  dbCreated = dbSettingsPostgres.createDatabase();
448  }
449  if (dbCreated) {
450  result = dbSettingsPostgres.initializeDatabaseSchema()
451  && dbSettingsPostgres.insertDefaultDatabaseContent();
452  }
453  if (!result) {
454  // Remove the incomplete database
455  if (dbCreated) {
456  dbSettingsPostgres.deleteDatabase();
457  }
458 
459  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
460  Bundle.EamDbSettingsDialog_okButton_createPostgresDbError_message(),
461  Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
462  JOptionPane.WARNING_MESSAGE);
463  logger.severe("Unable to initialize database schema or insert contents into central repository.");
464  return;
465  }
466  break;
467  case SQLITE:
468  if (!dbSettingsSqlite.dbDirectoryExists()) {
469  dbCreated = dbSettingsSqlite.createDbDirectory();
470  }
471  if (dbCreated) {
472  result = dbSettingsSqlite.initializeDatabaseSchema()
473  && dbSettingsSqlite.insertDefaultDatabaseContent();
474  }
475  if (!result) {
476  if (dbCreated) {
477  dbSettingsSqlite.deleteDatabase();
478  }
479 
480  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
481  Bundle.EamDbSettingsDialog_okButton_createSQLiteDbError_message(),
482  Bundle.EamDbSettingsDialog_okButton_createDbError_title(),
483  JOptionPane.WARNING_MESSAGE);
484  logger.severe("Unable to initialize database schema or insert contents into central repository.");
485  return;
486  }
487  break;
488  }
489  testingStatus = DatabaseTestResult.TESTEDOK;
490  valid();
491  }
492 
500  boolean wasConfigurationChanged() {
501  return configurationChanged;
502  }
503 
504  @Messages({"EamDbSettingsDialog.okButton.errorTitle.text=Restart Required.",
505  "EamDbSettingsDialog.okButton.errorMsg.text=Please restart Autopsy to begin using the new database platform.",
506  "EamDbSettingsDialog.okButton.connectionErrorMsg.text=Failed to connect to central repository database.",
507  "EamDbSettingsDialog.okButton.corruptDatabaseExists.title=Error Loading Database",
508  "EamDbSettingsDialog.okButton.corruptDatabaseExists.message=Database exists but is not the right format. Manually delete it or choose a different path (if applicable).",
509  "EamDbSettingsDialog.okButton.createDbDialog.title=Database Does Not Exist",
510  "EamDbSettingsDialog.okButton.createDbDialog.message=Database does not exist, would you like to create it?",
511  "EamDbSettingsDialog.okButton.databaseConnectionFailed.title=Database Connection Failed",
512  "EamDbSettingsDialog.okButton.databaseConnectionFailed.message=Unable to connect to database please check your settings and try again."})
513  private void bnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOkActionPerformed
514  setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
515  testDbSettings();
516  if (testingStatus == DatabaseTestResult.CONNECTION_FAILED) {
517  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
518  Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_message(),
519  Bundle.EamDbSettingsDialog_okButton_databaseConnectionFailed_title(),
520  JOptionPane.WARNING_MESSAGE);
521  } else if (testingStatus == DatabaseTestResult.SCHEMA_INVALID) {
522  // There's an existing database or file, but it's not in our format.
523  JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
524  Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_message(),
525  Bundle.EamDbSettingsDialog_okButton_corruptDatabaseExists_title(),
526  JOptionPane.WARNING_MESSAGE);
527  } else if (testingStatus == DatabaseTestResult.DB_DOES_NOT_EXIST) {
528  //database doesn't exist do you want to create
529  if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(WindowManager.getDefault().getMainWindow(),
530  Bundle.EamDbSettingsDialog_okButton_createDbDialog_message(),
531  Bundle.EamDbSettingsDialog_okButton_createDbDialog_title(),
532  JOptionPane.YES_NO_OPTION)) {
533  createDb();
534  }
535  }
536 
537  if (testingStatus != DatabaseTestResult.TESTEDOK) {
538  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
539  return;
540  }
541 
550  try {
551  EamDb previousDbManager = EamDb.getInstance();
552  if (null != previousDbManager) {
553  // NOTE: do not set/save the seleted platform before calling this.
555  }
556  } catch (EamDbException ex) {
557  logger.log(Level.SEVERE, "Failed to close database connections in previously selected platform.", ex); // NON-NLS
558  SwingUtilities.invokeLater(() -> {
559  JOptionPane.showMessageDialog(this,
560  Bundle.EamDbSettingsDialog_okButton_errorMsg_text(),
561  Bundle.EamDbSettingsDialog_okButton_errorTitle_text(),
562  JOptionPane.WARNING_MESSAGE);
563  });
564  }
565 
566  // Even if we fail to close the existing connections, make sure that we
567  // save the new connection settings, so an Autopsy restart will correctly
568  // start with the new settings.
569  EamDbPlatformEnum.setSelectedPlatform(selectedPlatform.name());
571 
572  switch (selectedPlatform) {
573  case POSTGRESQL:
574  // save the new PostgreSQL settings
575  dbSettingsPostgres.saveSettings();
576  // Load those newly saved settings into the postgres db manager instance
577  // in case we are still using the same instance.
578  try {
580  configurationChanged = true;
581  } catch (EamDbException ex) {
582  logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS
583  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
584  return;
585  }
586 
587  break;
588  case SQLITE:
589  // save the new SQLite settings
590  dbSettingsSqlite.saveSettings();
591  // Load those newly saved settings into the sqlite db manager instance
592  // in case we are still using the same instance.
593  try {
595  configurationChanged = true;
596  } catch (EamDbException ex) {
597  logger.log(Level.SEVERE, Bundle.EamDbSettingsDialog_okButton_connectionErrorMsg_text(), ex); //NON-NLS
598  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
599  return;
600  }
601  break;
602  case DISABLED:
603  break;
604  }
605 
606  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
607  dispose();
608  }//GEN-LAST:event_bnOkActionPerformed
609 
610  private void bnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelActionPerformed
611  dispose();
612  }//GEN-LAST:event_bnCancelActionPerformed
613 
614 
615  private void cbDatabaseTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDatabaseTypeActionPerformed
616  selectedPlatform = (EamDbPlatformEnum) cbDatabaseType.getSelectedItem();
617  customizeComponents();
618  }//GEN-LAST:event_cbDatabaseTypeActionPerformed
619 
620  private void updateFullDbPath() {
621  dataBaseFileTextArea.setText(tfDatabasePath.getText() + File.separator + CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT);
622  dataBaseFileTextArea.setCaretPosition(dataBaseFileTextArea.getText().length());
623  }
624 
625  private void displayDatabaseSettings(boolean isPostgres) {
626  lbDatabasePath.setVisible(!isPostgres);
627  tfDatabasePath.setVisible(!isPostgres);
628  lbDatabaseDesc.setVisible(!isPostgres);
629  dataBaseFileTextArea.setVisible(!isPostgres);
630  lbSingleUserSqLite.setVisible(!isPostgres);
631  bnDatabasePathFileOpen.setVisible(!isPostgres);
632  lbHostName.setVisible(isPostgres);
633  tbDbHostname.setVisible(isPostgres);
634  lbPort.setVisible(isPostgres);
635  tbDbPort.setVisible(isPostgres);
636  lbUserName.setVisible(isPostgres);
637  tbDbUsername.setVisible(isPostgres);
638  lbUserPassword.setVisible(isPostgres);
639  jpDbPassword.setVisible(isPostgres);
640  }
641 
645  @Messages({"EamDbSettingsDialog.textPrompt.hostnameOrIP=Hostname or IP Address",
646  "EamDbSettingsDialog.textPrompt.port=Port Number",
647  "EamDbSettingsDialog.textPrompt.dbName=Database Name",
648  "EamDbSettingsDialog.textPrompt.user=Database User",
649  "EamDbSettingsDialog.textPrompt.password=Database User's Password"})
650  private void setTextPrompts() {
651  Collection<TextPrompt> textPrompts = new ArrayList<>();
652  textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_hostnameOrIP(), tbDbHostname));
653  textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_port(), tbDbPort));
654  textPrompts.add(new TextPrompt(Bundle.EamDbSettingsDialog_textPrompt_user(), tbDbUsername));
655  configureTextPrompts(textPrompts);
656  }
657 
658  private void updatePostgresFields(boolean enabled) {
659  tbDbHostname.setText(enabled ? dbSettingsPostgres.getHost() : "");
660  tbDbHostname.setEnabled(enabled);
661  tbDbPort.setText(enabled ? Integer.toString(dbSettingsPostgres.getPort()) : "");
662  tbDbPort.setEnabled(enabled);
663  tbDbUsername.setText(enabled ? dbSettingsPostgres.getUserName() : "");
664  tbDbUsername.setEnabled(enabled);
665  jpDbPassword.setText(enabled ? dbSettingsPostgres.getPassword() : "");
666  jpDbPassword.setEnabled(enabled);
667  }
668 
675  private void updateSqliteFields(boolean enabled) {
676  tfDatabasePath.setText(enabled ? dbSettingsSqlite.getDbDirectory() : "");
677  tfDatabasePath.setEnabled(enabled);
678  bnDatabasePathFileOpen.setEnabled(enabled);
679  }
680 
684  private void setTextBoxListeners() {
685  textBoxes.add(tfDatabasePath);
686  textBoxes.add(tbDbHostname);
687  textBoxes.add(tbDbPort);
688  // textBoxes.add(tbDbName);
689  textBoxes.add(tbDbUsername);
690  textBoxes.add(jpDbPassword);
691  addDocumentListeners(textBoxes, textBoxChangedListener);
692  }
693 
700  private static void configureTextPrompts(Collection<TextPrompt> textPrompts) {
701  float alpha = 0.9f; // Mostly opaque
702  for (TextPrompt textPrompt : textPrompts) {
703  textPrompt.setForeground(Color.LIGHT_GRAY);
704  textPrompt.changeAlpha(alpha);
705  }
706  }
707 
714  private static void addDocumentListeners(Collection<JTextField> textFields, TextBoxChangedListener listener) {
715  textFields.forEach((textField) -> {
716  textField.getDocument().addDocumentListener(listener);
717  });
718  }
719 
726  @Messages({"EamDbSettingsDialog.validation.incompleteFields=Fill in all values for the selected database."})
727  private boolean databaseFieldsArePopulated() {
728  boolean result = true;
729  switch (selectedPlatform) {
730  case POSTGRESQL:
731  result = !tbDbHostname.getText().trim().isEmpty()
732  && !tbDbPort.getText().trim().isEmpty()
733  // && !tbDbName.getText().trim().isEmpty()
734  && !tbDbUsername.getText().trim().isEmpty()
735  && 0 < jpDbPassword.getPassword().length;
736 
737  break;
738 
739  case SQLITE:
740  result = !tfDatabasePath.getText().trim().isEmpty();
741  break;
742  }
743 
744  if (!result) {
745  }
746 
747  return result;
748  }
749 
755  private boolean checkFields() {
756  return databaseFieldsArePopulated()
757  && databaseSettingsAreValid();
758  }
759 
765  private boolean databaseSettingsAreValid() {
766  boolean result = true;
767  StringBuilder guidanceText = new StringBuilder();
768 
769  switch (selectedPlatform) {
770  case POSTGRESQL:
771  try {
772  dbSettingsPostgres.setHost(tbDbHostname.getText().trim());
773  } catch (EamDbException ex) {
774  guidanceText.append(ex.getMessage());
775  result = false;
776  }
777 
778  try {
779  dbSettingsPostgres.setPort(Integer.valueOf(tbDbPort.getText().trim()));
780  } catch (NumberFormatException | EamDbException ex) {
781  guidanceText.append(ex.getMessage());
782  result = false;
783  }
784 
785  try {
786  dbSettingsPostgres.setDbName(CENTRAL_REPO_DB_NAME);
787  } catch (EamDbException ex) {
788  guidanceText.append(ex.getMessage());
789  result = false;
790  }
791 
792  try {
793  dbSettingsPostgres.setUserName(tbDbUsername.getText().trim());
794  } catch (EamDbException ex) {
795  guidanceText.append(ex.getMessage());
796  result = false;
797  }
798 
799  try {
800  dbSettingsPostgres.setPassword(new String(jpDbPassword.getPassword()));
801  } catch (EamDbException ex) {
802  guidanceText.append(ex.getMessage());
803  result = false;
804  }
805  break;
806  case SQLITE:
807  try {
808  File databasePath = new File(tfDatabasePath.getText());
809  dbSettingsSqlite.setDbName(CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT);
810  dbSettingsSqlite.setDbDirectory(databasePath.getPath());
811  } catch (EamDbException ex) {
812  guidanceText.append(ex.getMessage());
813  result = false;
814  }
815  break;
816  }
817 
818  return result;
819  }
820 
826  private boolean valid() {
827  return enableOkButton(checkFields());
828  }
829 
836  @Messages({"EamDbSettingsDialog.validation.finished=Click OK to save your database settings and return to the Options. Or select a different database type."})
837  private boolean enableOkButton(boolean isValidInput) {
838  if (isValidInput) {
839  bnOk.setEnabled(true);
840  } else {
841  bnOk.setEnabled(false);
842  }
843  return true;
844 
845  }
846 
851  private class TextBoxChangedListener implements DocumentListener {
852 
853  @Override
854  public void changedUpdate(DocumentEvent e) {
855  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
856  testingStatus = DatabaseTestResult.UNTESTED;
857  updateFullDbPath();
858  valid();
859  }
860 
861  @Override
862  public void insertUpdate(DocumentEvent e) {
863  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
864  testingStatus = DatabaseTestResult.UNTESTED;
865  updateFullDbPath();
866  valid();
867  }
868 
869  @Override
870  public void removeUpdate(DocumentEvent e) {
871  firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
872  testingStatus = DatabaseTestResult.UNTESTED;
873  updateFullDbPath();
874  valid();
875 
876  }
877  }
878 
879  private enum DatabaseTestResult {
885  }
886 
887  // Variables declaration - do not modify//GEN-BEGIN:variables
888  private javax.swing.JButton bnCancel;
889  private javax.swing.JButton bnDatabasePathFileOpen;
890  private javax.swing.ButtonGroup bnGrpDatabasePlatforms;
891  private javax.swing.JButton bnOk;
892  private javax.swing.JComboBox<EamDbPlatformEnum> cbDatabaseType;
893  private javax.swing.JScrollPane dataBaseFileScrollPane;
894  private javax.swing.JTextArea dataBaseFileTextArea;
895  private javax.swing.JFileChooser fcDatabasePath;
896  private javax.swing.Box.Filler filler1;
897  private javax.swing.JPasswordField jpDbPassword;
898  private javax.swing.JLabel lbDatabaseDesc;
899  private javax.swing.JLabel lbDatabasePath;
900  private javax.swing.JLabel lbDatabaseType;
901  private javax.swing.JLabel lbHostName;
902  private javax.swing.JLabel lbPort;
903  private javax.swing.JLabel lbSingleUserSqLite;
904  private javax.swing.JLabel lbUserName;
905  private javax.swing.JLabel lbUserPassword;
906  private javax.swing.JPanel pnButtons;
907  private javax.swing.JPanel pnSQLiteSettings;
908  private javax.swing.JTextField tbDbHostname;
909  private javax.swing.JTextField tbDbPort;
910  private javax.swing.JTextField tbDbUsername;
911  private javax.swing.JTextField tfDatabasePath;
912  // End of variables declaration//GEN-END:variables
913 }
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-2019 Basis Technology. Generated on: Tue Jan 7 2020
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.