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()