19 package org.sleuthkit.autopsy.modules.hashdatabase;
21 import java.awt.Dimension;
22 import java.awt.Toolkit;
24 import java.io.IOException;
25 import java.util.logging.Level;
27 import org.openide.util.NbBundle;
29 import javax.swing.JFileChooser;
30 import javax.swing.JOptionPane;
31 import javax.swing.JFrame;
32 import org.apache.commons.io.FilenameUtils;
44 final class HashDbCreateDatabaseDialog
extends javax.swing.JDialog {
46 private static final String DEFAULT_FILE_NAME = NbBundle
47 .getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.defaultFileName");
48 private JFileChooser fileChooser = null;
49 private HashDb newHashDb = null;
50 private final static String LAST_FILE_PATH_KEY =
"HashDbCreate_Path";
57 HashDbCreateDatabaseDialog() {
58 super(
new JFrame(), NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.createHashDbMsg"),
true);
69 HashDb getHashDatabase() {
73 private void initFileChooser() {
74 fileChooser =
new JFileChooser() {
76 public void approveSelection() {
77 File selectedFile = getSelectedFile();
78 if (!FilenameUtils.getExtension(selectedFile.getName()).equalsIgnoreCase(HashDbManager.getHashDatabaseFileExtension())) {
79 if (JOptionPane.showConfirmDialog(
this,
80 NbBundle.getMessage(
this.getClass(),
81 "HashDbCreateDatabaseDialog.hashDbMustHaveFileExtensionMsg",
82 HashDbManager.getHashDatabaseFileExtension()),
83 NbBundle.getMessage(
this.getClass(),
84 "HashDbCreateDatabaseDialog.fileNameErr"),
85 JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
90 if (selectedFile.exists()) {
91 if (JOptionPane.showConfirmDialog(
this,
92 NbBundle.getMessage(
this.getClass(),
93 "HashDbCreateDatabaseDialog.fileNameAlreadyExistsMsg"),
94 NbBundle.getMessage(
this.getClass(),
95 "HashDbCreateDatabaseDialog.fileExistsErr"),
96 JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
101 super.approveSelection();
104 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
105 fileChooser.setDragEnabled(
false);
106 fileChooser.setMultiSelectionEnabled(
false);
109 private void display() {
110 Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
111 setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2);
120 @SuppressWarnings(
"unchecked")
122 private
void initComponents() {
124 buttonGroup1 =
new javax.swing.ButtonGroup();
125 saveAsButton =
new javax.swing.JButton();
126 cancelButton =
new javax.swing.JButton();
127 knownRadioButton =
new javax.swing.JRadioButton();
128 knownBadRadioButton =
new javax.swing.JRadioButton();
129 jLabel1 =
new javax.swing.JLabel();
130 hashSetNameTextField =
new javax.swing.JTextField();
131 jLabel2 =
new javax.swing.JLabel();
132 sendIngestMessagesCheckbox =
new javax.swing.JCheckBox();
133 jLabel3 =
new javax.swing.JLabel();
134 databasePathTextField =
new javax.swing.JTextField();
135 okButton =
new javax.swing.JButton();
137 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
139 org.openide.awt.Mnemonics.setLocalizedText(saveAsButton,
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.saveAsButton.text"));
140 saveAsButton.addActionListener(
new java.awt.event.ActionListener() {
141 public void actionPerformed(java.awt.event.ActionEvent evt) {
142 saveAsButtonActionPerformed(evt);
146 org.openide.awt.Mnemonics.setLocalizedText(cancelButton,
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.cancelButton.text"));
147 cancelButton.addActionListener(
new java.awt.event.ActionListener() {
148 public void actionPerformed(java.awt.event.ActionEvent evt) {
149 cancelButtonActionPerformed(evt);
153 buttonGroup1.add(knownRadioButton);
154 org.openide.awt.Mnemonics.setLocalizedText(knownRadioButton,
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.knownRadioButton.text"));
155 knownRadioButton.addActionListener(
new java.awt.event.ActionListener() {
156 public void actionPerformed(java.awt.event.ActionEvent evt) {
157 knownRadioButtonActionPerformed(evt);
161 buttonGroup1.add(knownBadRadioButton);
162 knownBadRadioButton.setSelected(
true);
163 org.openide.awt.Mnemonics.setLocalizedText(knownBadRadioButton,
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.knownBadRadioButton.text"));
164 knownBadRadioButton.addActionListener(
new java.awt.event.ActionListener() {
165 public void actionPerformed(java.awt.event.ActionEvent evt) {
166 knownBadRadioButtonActionPerformed(evt);
170 org.openide.awt.Mnemonics.setLocalizedText(jLabel1,
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.jLabel1.text"));
172 hashSetNameTextField.setText(
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.hashSetNameTextField.text"));
174 org.openide.awt.Mnemonics.setLocalizedText(jLabel2,
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.jLabel2.text"));
176 sendIngestMessagesCheckbox.setSelected(
true);
177 org.openide.awt.Mnemonics.setLocalizedText(sendIngestMessagesCheckbox,
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.sendIngestMessagesCheckbox.text"));
178 sendIngestMessagesCheckbox.addActionListener(
new java.awt.event.ActionListener() {
179 public void actionPerformed(java.awt.event.ActionEvent evt) {
180 sendIngestMessagesCheckboxActionPerformed(evt);
184 org.openide.awt.Mnemonics.setLocalizedText(jLabel3,
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.jLabel3.text"));
186 databasePathTextField.setEditable(
false);
187 databasePathTextField.setText(
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.databasePathTextField.text"));
189 org.openide.awt.Mnemonics.setLocalizedText(okButton,
org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class,
"HashDbCreateDatabaseDialog.okButton.text"));
190 okButton.addActionListener(
new java.awt.event.ActionListener() {
191 public void actionPerformed(java.awt.event.ActionEvent evt) {
192 okButtonActionPerformed(evt);
196 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
197 getContentPane().setLayout(layout);
198 layout.setHorizontalGroup(
199 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
200 .addGroup(layout.createSequentialGroup()
202 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
203 .addComponent(sendIngestMessagesCheckbox)
204 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
205 .addGap(0, 0, Short.MAX_VALUE)
206 .addComponent(okButton)
207 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
208 .addComponent(cancelButton))
209 .addComponent(jLabel2)
210 .addGroup(layout.createSequentialGroup()
212 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
213 .addComponent(knownRadioButton)
214 .addComponent(knownBadRadioButton)))
215 .addGroup(layout.createSequentialGroup()
216 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING,
false)
217 .addGroup(layout.createSequentialGroup()
218 .addComponent(jLabel1)
219 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
220 .addComponent(databasePathTextField))
221 .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
222 .addComponent(jLabel3)
223 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
224 .addComponent(hashSetNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE)))
225 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
226 .addComponent(saveAsButton)))
230 layout.linkSize(javax.swing.SwingConstants.HORIZONTAL,
new java.awt.Component[] {cancelButton, okButton});
232 layout.setVerticalGroup(
233 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
234 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
236 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
237 .addComponent(jLabel3)
238 .addComponent(hashSetNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
239 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
240 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
241 .addComponent(databasePathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
242 .addComponent(saveAsButton)
243 .addComponent(jLabel1))
245 .addComponent(jLabel2)
246 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
247 .addComponent(knownRadioButton)
248 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
249 .addComponent(knownBadRadioButton)
250 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
251 .addComponent(sendIngestMessagesCheckbox)
253 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
254 .addComponent(cancelButton)
255 .addComponent(okButton))
256 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
262 private void knownRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {
263 sendIngestMessagesCheckbox.setSelected(
false);
264 sendIngestMessagesCheckbox.setEnabled(
false);
267 private void knownBadRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {
268 sendIngestMessagesCheckbox.setSelected(
true);
269 sendIngestMessagesCheckbox.setEnabled(
true);
272 private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
276 private void saveAsButtonActionPerformed(java.awt.event.ActionEvent evt) {
278 String lastBaseDirectory =
"";
279 if (ModuleSettings.settingExists(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY)) {
280 lastBaseDirectory = ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY);
282 StringBuilder path =
new StringBuilder();
283 path.append(lastBaseDirectory);
284 if (!hashSetNameTextField.getText().isEmpty()) {
285 path.append(File.separator).append(hashSetNameTextField.getText());
287 path.append(File.separator).append(DEFAULT_FILE_NAME);
289 path.append(
".").append(HashDbManager.getHashDatabaseFileExtension());
290 fileChooser.setSelectedFile(
new File(path.toString()));
291 if (fileChooser.showSaveDialog(
this) == JFileChooser.APPROVE_OPTION) {
292 File databaseFile = fileChooser.getSelectedFile();
293 databasePathTextField.setText(databaseFile.getCanonicalPath());
294 ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY, databaseFile.getParent());
296 }
catch (IOException ex) {
297 Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING,
"Couldn't get selected file path.", ex);
301 private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {
305 if (hashSetNameTextField.getText().isEmpty()) {
306 JOptionPane.showMessageDialog(
this,
307 NbBundle.getMessage(
this.getClass(),
308 "HashDbCreateDatabaseDialog.mustEnterHashSetNameMsg"),
309 NbBundle.getMessage(
this.getClass(),
310 "HashDbCreateDatabaseDialog.createHashDbErr"),
311 JOptionPane.ERROR_MESSAGE);
315 if (databasePathTextField.getText().isEmpty()) {
316 JOptionPane.showMessageDialog(
this,
317 NbBundle.getMessage(
this.getClass(),
318 "HashDbCreateDatabaseDialog.mustEnterHashDbPathMsg"),
319 NbBundle.getMessage(
this.getClass(),
320 "HashDbCreateDatabaseDialog.createHashDbErr"),
321 JOptionPane.ERROR_MESSAGE);
326 if (knownRadioButton.isSelected()) {
327 type = KnownFilesType.KNOWN;
329 type = KnownFilesType.KNOWN_BAD;
332 String errorMessage = NbBundle
333 .getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.errMsg.hashDbCreationErr");
335 newHashDb = HashDbManager.getInstance().addNewHashDatabaseInternal(hashSetNameTextField.getText(), fileChooser.getSelectedFile().getCanonicalPath(),
true, sendIngestMessagesCheckbox.isSelected(), type);
336 }
catch (IOException ex) {
337 Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex);
338 JOptionPane.showMessageDialog(
this,
339 NbBundle.getMessage(
this.getClass(),
340 "HashDbCreateDatabaseDialog.cannotCreateFileAtLocMsg"),
341 NbBundle.getMessage(
this.getClass(),
342 "HashDbCreateDatabaseDialog.createHashDbErr"),
343 JOptionPane.ERROR_MESSAGE);
345 }
catch (HashDbManagerException ex) {
346 Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex);
347 JOptionPane.showMessageDialog(
this,
349 NbBundle.getMessage(this.getClass(),
350 "HashDbCreateDatabaseDialog.createHashDbErr"),
351 JOptionPane.ERROR_MESSAGE);
353 }
catch (TskCoreException ex) {
354 Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.SEVERE, errorMessage, ex);
355 JOptionPane.showMessageDialog(
this,
356 NbBundle.getMessage(
this.getClass(),
357 "HashDbCreateDatabaseDialog.failedToCreateHashDbMsg"),
358 NbBundle.getMessage(
this.getClass(),
359 "HashDbCreateDatabaseDialog.createHashDbErr"),
360 JOptionPane.ERROR_MESSAGE);
367 private void sendIngestMessagesCheckboxActionPerformed(java.awt.event.ActionEvent evt) {
372 private javax.swing.ButtonGroup buttonGroup1;
373 private javax.swing.JButton cancelButton;
374 private javax.swing.JTextField databasePathTextField;
375 private javax.swing.JTextField hashSetNameTextField;
376 private javax.swing.JLabel jLabel1;
377 private javax.swing.JLabel jLabel2;
378 private javax.swing.JLabel jLabel3;
379 private javax.swing.JRadioButton knownBadRadioButton;
380 private javax.swing.JRadioButton knownRadioButton;
381 private javax.swing.JButton okButton;
382 private javax.swing.JButton saveAsButton;
383 private javax.swing.JCheckBox sendIngestMessagesCheckbox;