19 package org.sleuthkit.autopsy.casemodule;
21 import com.google.common.util.concurrent.ThreadFactoryBuilder;
23 import java.util.Calendar;
24 import java.util.List;
25 import java.util.concurrent.Future;
26 import java.util.concurrent.ScheduledThreadPoolExecutor;
27 import java.util.concurrent.TimeUnit;
28 import java.util.concurrent.locks.ReentrantLock;
29 import java.util.function.Supplier;
30 import java.util.logging.Level;
31 import javax.swing.JFileChooser;
32 import javax.swing.JOptionPane;
33 import javax.swing.JPanel;
34 import javax.swing.JTextField;
35 import javax.swing.event.DocumentEvent;
36 import javax.swing.event.DocumentListener;
37 import javax.swing.filechooser.FileFilter;
38 import org.apache.commons.lang3.StringUtils;
39 import org.openide.util.NbBundle;
56 @SuppressWarnings(
"PMD.SingularField")
61 private static final long serialVersionUID = 1L;
62 private static final String PROP_LASTIMAGE_PATH =
"LBL_LastImage_PATH";
63 private static final String[] SECTOR_SIZE_CHOICES = {
"Auto Detect",
"512",
"1024",
"2048",
"4096"};
69 private static int VALIDATE_TIMEOUT_MILLIS = 1000;
70 static ScheduledThreadPoolExecutor delayedValidationService =
new ScheduledThreadPoolExecutor(1,
new ThreadFactoryBuilder().setNameFormat(
"ImageFilePanel delayed validation").build());
72 private final ReentrantLock validationWaitingLock =
new ReentrantLock();
73 private final ReentrantLock validationLock =
new ReentrantLock();
75 private Runnable validateAction = null;
76 private Future<?> validateFuture = null;
86 private ImageFilePanel(String context, List<FileFilter> fileChooserFilters) {
87 this.contextName = context;
94 for (String choice : SECTOR_SIZE_CHOICES) {
95 sectorSizeComboBox.addItem(choice);
97 sectorSizeComboBox.setSelectedIndex(0);
99 errorLabel.setVisible(
false);
100 loadingLabel.setVisible(
false);
101 this.fileChooserFilters = fileChooserFilters;
110 for (String timeZone : timeZoneList) {
111 timeZoneComboBox.addItem(timeZone);
133 for (JTextField textField: List.of(
139 textField.getDocument().addDocumentListener(delayedValidationListener);
145 return pathTextField;
149 return md5HashTextField;
153 return sha1HashTextField;
157 return sha256HashTextField;
161 return passwordTextField;
165 if(fileChooser == null) {
167 fileChooser.setDragEnabled(
false);
168 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
169 fileChooser.setMultiSelectionEnabled(
false);
170 fileChooserFilters.forEach(fileChooser::addChoosableFileFilter);
171 if (fileChooserFilters.isEmpty() ==
false) {
172 fileChooser.setFileFilter(fileChooserFilters.get(0));
186 java.awt.GridBagConstraints gridBagConstraints;
188 pathLabel =
new javax.swing.JLabel();
189 browseButton =
new javax.swing.JButton();
190 pathTextField =
new javax.swing.JTextField();
191 timeZoneLabel =
new javax.swing.JLabel();
192 timeZoneComboBox =
new javax.swing.JComboBox<>();
193 noFatOrphansCheckbox =
new javax.swing.JCheckBox();
194 errorLabel =
new javax.swing.JLabel();
195 sectorSizeLabel =
new javax.swing.JLabel();
196 sectorSizeComboBox =
new javax.swing.JComboBox<>();
197 sha256HashLabel =
new javax.swing.JLabel();
198 sha256HashTextField =
new javax.swing.JTextField();
199 sha1HashTextField =
new javax.swing.JTextField();
200 md5HashTextField =
new javax.swing.JTextField();
201 sha1HashLabel =
new javax.swing.JLabel();
202 md5HashLabel =
new javax.swing.JLabel();
203 hashValuesLabel =
new javax.swing.JLabel();
204 hashValuesNoteLabel =
new javax.swing.JLabel();
205 passwordLabel =
new javax.swing.JLabel();
206 passwordTextField =
new javax.swing.JTextField();
207 javax.swing.JPanel spacer =
new javax.swing.JPanel();
208 loadingLabel =
new javax.swing.JLabel();
210 setMinimumSize(
new java.awt.Dimension(0, 65));
211 setPreferredSize(
new java.awt.Dimension(403, 65));
212 setLayout(
new java.awt.GridBagLayout());
214 org.openide.awt.Mnemonics.setLocalizedText(pathLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.pathLabel.text"));
215 gridBagConstraints =
new java.awt.GridBagConstraints();
216 gridBagConstraints.gridx = 0;
217 gridBagConstraints.gridy = 0;
218 gridBagConstraints.gridwidth = 3;
219 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
220 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
221 gridBagConstraints.weightx = 1.0;
222 gridBagConstraints.insets =
new java.awt.Insets(5, 5, 5, 5);
223 add(pathLabel, gridBagConstraints);
225 org.openide.awt.Mnemonics.setLocalizedText(browseButton,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.browseButton.text"));
226 browseButton.addActionListener(
new java.awt.event.ActionListener() {
227 public void actionPerformed(java.awt.event.ActionEvent evt) {
228 browseButtonActionPerformed(evt);
231 gridBagConstraints =
new java.awt.GridBagConstraints();
232 gridBagConstraints.gridx = 2;
233 gridBagConstraints.gridy = 1;
234 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
235 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 5, 5);
236 add(browseButton, gridBagConstraints);
238 pathTextField.setText(
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.pathTextField.text"));
239 gridBagConstraints =
new java.awt.GridBagConstraints();
240 gridBagConstraints.gridx = 0;
241 gridBagConstraints.gridy = 1;
242 gridBagConstraints.gridwidth = 2;
243 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
244 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
245 gridBagConstraints.weightx = 1.0;
246 gridBagConstraints.insets =
new java.awt.Insets(0, 5, 5, 5);
247 add(pathTextField, gridBagConstraints);
249 org.openide.awt.Mnemonics.setLocalizedText(timeZoneLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.timeZoneLabel.text"));
250 gridBagConstraints =
new java.awt.GridBagConstraints();
251 gridBagConstraints.gridx = 0;
252 gridBagConstraints.gridy = 3;
253 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
254 gridBagConstraints.insets =
new java.awt.Insets(0, 5, 5, 5);
255 add(timeZoneLabel, gridBagConstraints);
257 timeZoneComboBox.setMaximumRowCount(30);
258 gridBagConstraints =
new java.awt.GridBagConstraints();
259 gridBagConstraints.gridx = 1;
260 gridBagConstraints.gridy = 3;
261 gridBagConstraints.gridwidth = 2;
262 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
263 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
264 gridBagConstraints.weightx = 1.0;
265 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 5, 5);
266 add(timeZoneComboBox, gridBagConstraints);
268 org.openide.awt.Mnemonics.setLocalizedText(noFatOrphansCheckbox,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.noFatOrphansCheckbox.text"));
269 noFatOrphansCheckbox.setToolTipText(
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.noFatOrphansCheckbox.toolTipText"));
270 gridBagConstraints =
new java.awt.GridBagConstraints();
271 gridBagConstraints.gridx = 0;
272 gridBagConstraints.gridy = 2;
273 gridBagConstraints.gridwidth = 3;
274 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
275 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
276 gridBagConstraints.weightx = 1.0;
277 gridBagConstraints.insets =
new java.awt.Insets(0, 5, 5, 5);
278 add(noFatOrphansCheckbox, gridBagConstraints);
280 errorLabel.setForeground(
new java.awt.Color(255, 0, 0));
281 org.openide.awt.Mnemonics.setLocalizedText(errorLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.errorLabel.text"));
282 errorLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
283 errorLabel.setMaximumSize(
new java.awt.Dimension(500, 60));
284 errorLabel.setMinimumSize(
new java.awt.Dimension(200, 20));
285 errorLabel.setPreferredSize(
new java.awt.Dimension(200, 60));
286 gridBagConstraints =
new java.awt.GridBagConstraints();
287 gridBagConstraints.gridx = 0;
288 gridBagConstraints.gridy = 11;
289 gridBagConstraints.gridwidth = 3;
290 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
291 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
292 gridBagConstraints.weightx = 1.0;
293 gridBagConstraints.insets =
new java.awt.Insets(5, 5, 5, 5);
294 add(errorLabel, gridBagConstraints);
296 org.openide.awt.Mnemonics.setLocalizedText(sectorSizeLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.sectorSizeLabel.text"));
297 gridBagConstraints =
new java.awt.GridBagConstraints();
298 gridBagConstraints.gridx = 0;
299 gridBagConstraints.gridy = 4;
300 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
301 gridBagConstraints.insets =
new java.awt.Insets(0, 5, 5, 5);
302 add(sectorSizeLabel, gridBagConstraints);
304 gridBagConstraints =
new java.awt.GridBagConstraints();
305 gridBagConstraints.gridx = 1;
306 gridBagConstraints.gridy = 4;
307 gridBagConstraints.gridwidth = 2;
308 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
309 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
310 gridBagConstraints.weightx = 1.0;
311 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 5, 5);
312 add(sectorSizeComboBox, gridBagConstraints);
314 org.openide.awt.Mnemonics.setLocalizedText(sha256HashLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.sha256HashLabel.text"));
315 sha256HashLabel.setEnabled(
false);
316 gridBagConstraints =
new java.awt.GridBagConstraints();
317 gridBagConstraints.gridx = 0;
318 gridBagConstraints.gridy = 9;
319 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
320 gridBagConstraints.insets =
new java.awt.Insets(0, 5, 5, 5);
321 add(sha256HashLabel, gridBagConstraints);
323 sha256HashTextField.setText(
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.sha256HashTextField.text"));
324 sha256HashTextField.setEnabled(
false);
325 gridBagConstraints =
new java.awt.GridBagConstraints();
326 gridBagConstraints.gridx = 1;
327 gridBagConstraints.gridy = 9;
328 gridBagConstraints.gridwidth = 2;
329 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
330 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
331 gridBagConstraints.weightx = 1.0;
332 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 5, 5);
333 add(sha256HashTextField, gridBagConstraints);
335 sha1HashTextField.setText(
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.sha1HashTextField.text"));
336 sha1HashTextField.setEnabled(
false);
337 gridBagConstraints =
new java.awt.GridBagConstraints();
338 gridBagConstraints.gridx = 1;
339 gridBagConstraints.gridy = 8;
340 gridBagConstraints.gridwidth = 2;
341 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
342 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
343 gridBagConstraints.weightx = 1.0;
344 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 5, 5);
345 add(sha1HashTextField, gridBagConstraints);
347 md5HashTextField.setText(
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.md5HashTextField.text"));
348 md5HashTextField.setEnabled(
false);
349 gridBagConstraints =
new java.awt.GridBagConstraints();
350 gridBagConstraints.gridx = 1;
351 gridBagConstraints.gridy = 7;
352 gridBagConstraints.gridwidth = 2;
353 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
354 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
355 gridBagConstraints.weightx = 1.0;
356 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 5, 5);
357 add(md5HashTextField, gridBagConstraints);
359 org.openide.awt.Mnemonics.setLocalizedText(sha1HashLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.sha1HashLabel.text"));
360 sha1HashLabel.setEnabled(
false);
361 gridBagConstraints =
new java.awt.GridBagConstraints();
362 gridBagConstraints.gridx = 0;
363 gridBagConstraints.gridy = 8;
364 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
365 gridBagConstraints.insets =
new java.awt.Insets(0, 5, 5, 5);
366 add(sha1HashLabel, gridBagConstraints);
368 org.openide.awt.Mnemonics.setLocalizedText(md5HashLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.md5HashLabel.text"));
369 md5HashLabel.setEnabled(
false);
370 gridBagConstraints =
new java.awt.GridBagConstraints();
371 gridBagConstraints.gridx = 0;
372 gridBagConstraints.gridy = 7;
373 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
374 gridBagConstraints.insets =
new java.awt.Insets(0, 5, 5, 5);
375 add(md5HashLabel, gridBagConstraints);
377 org.openide.awt.Mnemonics.setLocalizedText(hashValuesLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.hashValuesLabel.text"));
378 hashValuesLabel.setEnabled(
false);
379 gridBagConstraints =
new java.awt.GridBagConstraints();
380 gridBagConstraints.gridx = 0;
381 gridBagConstraints.gridy = 6;
382 gridBagConstraints.gridwidth = 3;
383 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
384 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
385 gridBagConstraints.weightx = 1.0;
386 gridBagConstraints.insets =
new java.awt.Insets(5, 5, 5, 5);
387 add(hashValuesLabel, gridBagConstraints);
389 org.openide.awt.Mnemonics.setLocalizedText(hashValuesNoteLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.hashValuesNoteLabel.text"));
390 hashValuesNoteLabel.setEnabled(
false);
391 gridBagConstraints =
new java.awt.GridBagConstraints();
392 gridBagConstraints.gridx = 0;
393 gridBagConstraints.gridy = 10;
394 gridBagConstraints.gridwidth = 3;
395 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
396 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
397 gridBagConstraints.weightx = 1.0;
398 gridBagConstraints.insets =
new java.awt.Insets(0, 5, 5, 5);
399 add(hashValuesNoteLabel, gridBagConstraints);
401 org.openide.awt.Mnemonics.setLocalizedText(passwordLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.passwordLabel.text"));
402 gridBagConstraints =
new java.awt.GridBagConstraints();
403 gridBagConstraints.gridx = 0;
404 gridBagConstraints.gridy = 5;
405 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
406 gridBagConstraints.insets =
new java.awt.Insets(0, 5, 5, 5);
407 add(passwordLabel, gridBagConstraints);
409 passwordTextField.setText(
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.passwordTextField.text"));
410 gridBagConstraints =
new java.awt.GridBagConstraints();
411 gridBagConstraints.gridx = 1;
412 gridBagConstraints.gridy = 5;
413 gridBagConstraints.gridwidth = 2;
414 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
415 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
416 gridBagConstraints.weightx = 1.0;
417 gridBagConstraints.insets =
new java.awt.Insets(0, 0, 5, 5);
418 add(passwordTextField, gridBagConstraints);
420 javax.swing.GroupLayout spacerLayout =
new javax.swing.GroupLayout(spacer);
421 spacer.setLayout(spacerLayout);
422 spacerLayout.setHorizontalGroup(
423 spacerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
424 .addGap(0, 0, Short.MAX_VALUE)
426 spacerLayout.setVerticalGroup(
427 spacerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
428 .addGap(0, 0, Short.MAX_VALUE)
431 gridBagConstraints =
new java.awt.GridBagConstraints();
432 gridBagConstraints.gridx = 0;
433 gridBagConstraints.gridy = 12;
434 gridBagConstraints.weighty = 1.0;
435 add(spacer, gridBagConstraints);
437 loadingLabel.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/images/working_spinner.gif")));
438 org.openide.awt.Mnemonics.setLocalizedText(loadingLabel,
org.openide.util.NbBundle.getMessage(
ImageFilePanel.class,
"ImageFilePanel.loadingLabel.text"));
439 loadingLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
440 loadingLabel.setMaximumSize(
new java.awt.Dimension(500, 60));
441 loadingLabel.setMinimumSize(
new java.awt.Dimension(200, 20));
442 loadingLabel.setPreferredSize(
new java.awt.Dimension(200, 60));
443 gridBagConstraints =
new java.awt.GridBagConstraints();
444 gridBagConstraints.gridx = 0;
445 gridBagConstraints.gridy = 11;
446 gridBagConstraints.gridwidth = 3;
447 gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
448 gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
449 gridBagConstraints.weightx = 1.0;
450 gridBagConstraints.insets =
new java.awt.Insets(5, 5, 5, 5);
451 add(loadingLabel, gridBagConstraints);
454 @NbBundle.Messages({
"ImageFilePanel.000.confirmationMessage=The selected file"
455 +
" has extenson .001 but there is a .000 file in the sequence of raw images."
456 +
"\nShould the .000 file be used as the start, instead of the selected .001 file?\n"})
458 String oldText = getContentPaths();
460 File currentDir =
new File(oldText);
461 JFileChooser chooser = getChooser();
462 if (currentDir.exists()) {
463 chooser.setCurrentDirectory(currentDir);
466 if (chooser.showOpenDialog(
this) == JFileChooser.APPROVE_OPTION) {
467 String path = chooser.getSelectedFile().getPath();
468 if (path.endsWith(
".001")) {
469 String zeroX3_path = StringUtils.removeEnd(path,
".001") +
".000";
470 if (
new File(zeroX3_path).exists()) {
471 int showConfirmDialog = JOptionPane.showConfirmDialog(
this,
472 Bundle.ImageFilePanel_000_confirmationMessage(),
473 "Choose .001 file?", JOptionPane.YES_NO_OPTION);
474 if (showConfirmDialog == JOptionPane.YES_OPTION) {
480 setContentPath(path);
486 if (!oldText.equals(getContentPaths())) {
487 md5HashTextField.setText(null);
488 sha1HashTextField.setText(null);
489 sha256HashTextField.setText(null);
525 hashValuesLabel.setEnabled(enabled);
526 hashValuesNoteLabel.setEnabled(enabled);
528 md5HashLabel.setEnabled(enabled);
529 md5HashTextField.setEnabled(enabled);
531 sha1HashLabel.setEnabled(enabled);
532 sha1HashTextField.setEnabled(enabled);
534 sha256HashLabel.setEnabled(enabled);
535 sha256HashTextField.setEnabled(enabled);
544 return pathTextField.getText();
553 pathTextField.setText(s);
562 int sectorSizeSelectionIndex = sectorSizeComboBox.getSelectedIndex();
564 if (sectorSizeSelectionIndex == 0) {
568 return Integer.valueOf((String) sectorSizeComboBox.getSelectedItem());
572 String tz = timeZoneComboBox.getSelectedItem().toString();
573 return tz.substring(tz.indexOf(
')') + 2).trim();
577 return noFatOrphansCheckbox.isSelected();
581 return this.md5HashTextField.getText();
585 return this.sha1HashTextField.getText();
589 return this.sha256HashTextField.getText();
592 String getPassword() {
593 return this.passwordTextField.getText();
598 pathTextField.setText(null);
599 this.md5HashTextField.setText(null);
600 this.sha1HashTextField.setText(null);
601 this.sha256HashTextField.setText(null);
602 this.passwordTextField.setText(null);
611 this.browseButton.setEnabled(enabled);
612 this.noFatOrphansCheckbox.setEnabled(enabled);
613 this.passwordTextField.setEnabled(enabled);
614 this.pathTextField.setEnabled(enabled);
615 this.sectorSizeComboBox.setEnabled(enabled);
616 this.md5HashTextField.setEnabled(enabled && validNonE01);
617 this.sha1HashTextField.setEnabled(enabled && validNonE01);
618 this.sha256HashTextField.setEnabled(enabled && validNonE01);
619 this.timeZoneComboBox.setEnabled(enabled);
628 "ImageFilePanel.validatePanel.dataSourceOnCDriveError=Warning: Path to multi-user data source is on \"C:\" drive",
629 "ImageFilePanel.validatePanel.invalidMD5=Invalid MD5 hash",
630 "ImageFilePanel.validatePanel.invalidSHA1=Invalid SHA1 hash",
631 "ImageFilePanel.validatePanel.invalidSHA256=Invalid SHA256 hash",
632 "# {0} - imageOpenError",
633 "ImageFilePanel_validatePanel_imageOpenError=<html><body><p>An error occurred while opening the image:{0}</p></body></html>",
634 "ImageFilePanel_validatePanel_unknownErrorMsg=<unknown>",
635 "ImageFilePanel_validatePanel_unknownError=<html><body><p>An unknown error occurred while attempting to validate the image</p></body></html>"
638 return runWithLock(this.validationLock, () -> {
639 boolean validNonE01 =
true;
643 String path = getContentPaths();
645 validNonE01 = isValidNonE01(path);
646 setUIEnabled(
false, validNonE01);
648 String md5 = getMd5();
649 String sha1 = getSha1();
650 String sha256 = getSha256();
651 String password = getPassword();
653 if (!isImagePathValid(path)) {
659 showError(Bundle.ImageFilePanel_validatePanel_invalidMD5());
664 showError(Bundle.ImageFilePanel_validatePanel_invalidSHA1());
669 showError(Bundle.ImageFilePanel_validatePanel_invalidSHA256());
676 showError(Bundle.ImageFilePanel_validatePanel_imageOpenError(
677 StringUtils.defaultIfBlank(
679 Bundle.ImageFilePanel_validatePanel_unknownErrorMsg())));
682 }
catch (Throwable t) {
683 logger.log(Level.SEVERE,
"An unknown error occurred test opening image: " + path, t);
684 showError(Bundle.ImageFilePanel_validatePanel_unknownError());
689 showError(Bundle.ImageFilePanel_validatePanel_dataSourceOnCDriveError());
695 setUIEnabled(
true, validNonE01);
707 loadingLabel.setVisible(
false);
708 if (StringUtils.isNotBlank(errorMessage)) {
709 errorLabel.setVisible(
true);
710 errorLabel.setText(errorMessage);
712 errorLabel.setVisible(
false);
713 errorLabel.setText(
"");
737 return StringUtils.isNotBlank(path) && isImagePathValid(path) && !path.toLowerCase().endsWith(
".e01");
741 String imagePathName = getContentPaths();
742 if (null != imagePathName) {
743 String imagePath = imagePathName.substring(0, imagePathName.lastIndexOf(File.separator) + 1);
750 if (StringUtils.isNotBlank(lastImagePath)) {
751 setContentPath(lastImagePath);
761 @NbBundle.Messages({
"ImageFilePanel.moduleErr=Module Error",
762 "ImageFilePanel.moduleErr.msg=A module caused an error listening to ImageFilePanel updates."
763 +
" See log to determine which module. Some data could be incomplete.\n"})
765 String path = getContentPaths();
766 if (isValidNonE01(path)) {
767 setHashValuesComponentsEnabled(
true);
769 setHashValuesComponentsEnabled(
false);
779 pathTextField.requestFocusInWindow();
791 private <T> T runWithLock(ReentrantLock lock, Supplier<T> action) {
805 return runWithLock(this.validationWaitingLock, () -> this.validateFuture != null
806 && !this.validateFuture.isCancelled()
807 && !this.validateFuture.isDone());
837 boolean triggerUpdate = runWithLock(validationWaitingLock, () -> {
839 boolean toRetTriggerUpdate =
false;
840 if (isValidationLoading()) {
841 validateFuture.cancel(
true);
842 toRetTriggerUpdate =
true;
847 validateFuture = delayedValidationService.schedule(
849 VALIDATE_TIMEOUT_MILLIS,
850 TimeUnit.MILLISECONDS);
852 return toRetTriggerUpdate;
855 errorLabel.setVisible(
false);
856 loadingLabel.setVisible(
true);
873 boolean isRunningAction = runWithLock(validationWaitingLock, () -> {
874 if (validateAction !=
this) {
879 validateAction = null;
880 validateFuture = null;
885 if (!isRunningAction) {
887 }
else if (Thread.interrupted()) {
static synchronized String getConfigSetting(String moduleName, String settingName)
void showError(String errorMessage)
final List< FileFilter > fileChooserFilters
void changedUpdate(DocumentEvent e)
static boolean isPhysicalDrive(String path)
javax.swing.JLabel hashValuesNoteLabel
boolean getNoFatOrphans()
JTextField getSha256TextField()
javax.swing.JLabel timeZoneLabel
static List< String > createTimeZoneList()
javax.swing.JLabel pathLabel
JTextField getSha1TextField()
javax.swing.JTextField sha256HashTextField
javax.swing.JComboBox< String > sectorSizeComboBox
static synchronized ImageFilePanel createInstance(String context, List< FileFilter > fileChooserFilters)
javax.swing.JTextField passwordTextField
javax.swing.JLabel sha1HashLabel
javax.swing.JTextField sha1HashTextField
javax.swing.JLabel sha256HashLabel
static boolean isValidForCaseType(String path, Case.CaseType caseType)
void removeUpdate(DocumentEvent e)
JTextField getMd5TextFieldField()
boolean isImagePathValid(String path)
void createTimeZoneList()
static String createTimeZoneString(TimeZone timeZone)
javax.swing.JLabel passwordLabel
void setContentPath(String s)
void browseButtonActionPerformed(java.awt.event.ActionEvent evt)
javax.swing.JLabel sectorSizeLabel
static TestOpenImageResult testOpenImage(String imagePath, String password)
static synchronized void setConfigSetting(String moduleName, String settingName, String settingVal)
javax.swing.JLabel hashValuesLabel
javax.swing.JTextField md5HashTextField
javax.swing.JLabel md5HashLabel
ImageFilePanel(String context, List< FileFilter > fileChooserFilters)
JFileChooser getChooser()
javax.swing.JComboBox< String > timeZoneComboBox
javax.swing.JLabel loadingLabel
void setHashValuesComponentsEnabled(boolean enabled)
JTextField getPasswordTextField()
static boolean isValidSha256Hash(String sha256Hash)
JTextField getPathTextField()
void setUIEnabled(boolean enabled, boolean validNonE01)
javax.swing.JButton browseButton
boolean isValidationLoading()
static boolean isPartition(String path)
javax.swing.JTextField pathTextField
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
void insertUpdate(DocumentEvent e)
static boolean isValidSha1Hash(String sha1Hash)
javax.swing.JLabel errorLabel
javax.swing.JCheckBox noFatOrphansCheckbox
boolean isValidNonE01(String path)
static boolean isValidMd5Hash(String md5Hash)
JFileChooser getChooser()