diff --git a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties index 43e42e16eb..c67ff8aa08 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties @@ -61,5 +61,6 @@ FileSearchPanel.includeRadioButton.text=Include FileSearchPanel.excludeRadioButton.text=Exclude FileSearchPanel.knownFilesCheckbox.toolTipText= FileSearchPanel.knownFilesCheckbox.text=Hide known files -FileSearchPanel.imagesButton.text=Images -FileSearchPanel.videosButton.text=Videos +GroupListPanel.groupKeyList.border.title=Groups +DiscoveryTopComponent.imagesButton.text=Images +DiscoveryTopComponent.videosButton.text=Videos diff --git a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED index d73b05ed0d..891965ef46 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED @@ -181,8 +181,9 @@ FileSearchPanel.includeRadioButton.text=Include FileSearchPanel.excludeRadioButton.text=Exclude FileSearchPanel.knownFilesCheckbox.toolTipText= FileSearchPanel.knownFilesCheckbox.text=Hide known files -FileSearchPanel.imagesButton.text=Images -FileSearchPanel.videosButton.text=Videos +GroupListPanel.groupKeyList.border.title=Groups +DiscoveryTopComponent.imagesButton.text=Images +DiscoveryTopComponent.videosButton.text=Videos ResultsPanel.viewFileInDir.name=View File in Directory SearchNode.getName.text=Search Result # {0} - numberOfInstances diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form index 3e1b796825..38e9c012a0 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form @@ -71,5 +71,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java index 40c7793498..8c7cea2392 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.java @@ -61,18 +61,11 @@ public final class DiscoveryTopComponent extends TopComponent { DiscoveryTopComponent() { initComponents(); // Load the central repository database. - EamDb centralRepoDb = null; - if (EamDb.isEnabled()) { - try { - centralRepoDb = EamDb.getInstance(); - } catch (EamDbException ex) { - logger.log(Level.SEVERE, "Error loading central repository database, no central repository options will be available for File Discovery", ex); - } - } + setName(Bundle.DiscoveryTopComponent_name()); - fileSearchPanel = new FileSearchPanel(Case.getCurrentCase().getSleuthkitCase(), centralRepoDb); + fileSearchPanel = new FileSearchPanel(); dataContentPanel = DataContentPanel.createInstance(); - resultsPanel = new ResultsPanel(centralRepoDb); + resultsPanel = new ResultsPanel(); groupListPanel = new GroupListPanel(); leftSplitPane.setLeftComponent(fileSearchPanel); leftSplitPane.setRightComponent(groupListPanel); @@ -110,8 +103,10 @@ public final class DiscoveryTopComponent extends TopComponent { mode.dockInto(tc); } tc.open(); + tc.updateSearchSettings(); } tc.toFront(); + } } @@ -120,13 +115,17 @@ public final class DiscoveryTopComponent extends TopComponent { } /** - * Reset the top component so it isn't displaying any results. + * Reset the top component so it isn't displaying any results. */ public void resetTopComponent() { resultsPanel.resetResultViewer(); groupListPanel.resetGroupList(); } + void updateSearchSettings() { + fileSearchPanel.resetPanel(); + } + @Override public void componentOpened() { super.componentOpened(); @@ -157,6 +156,9 @@ public final class DiscoveryTopComponent extends TopComponent { javax.swing.JSplitPane mainSplitPane = new javax.swing.JSplitPane(); leftSplitPane = new javax.swing.JSplitPane(); rightSplitPane = new javax.swing.JSplitPane(); + toolBarPanel = new javax.swing.JPanel(); + imagesButton = new javax.swing.JButton(); + videosButton = new javax.swing.JButton(); setPreferredSize(new java.awt.Dimension(1100, 700)); setLayout(new java.awt.BorderLayout()); @@ -176,12 +178,60 @@ public final class DiscoveryTopComponent extends TopComponent { mainSplitPane.setRightComponent(rightSplitPane); add(mainSplitPane, java.awt.BorderLayout.CENTER); + + org.openide.awt.Mnemonics.setLocalizedText(imagesButton, org.openide.util.NbBundle.getMessage(DiscoveryTopComponent.class, "DiscoveryTopComponent.imagesButton.text")); // NOI18N + imagesButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + imagesButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(videosButton, org.openide.util.NbBundle.getMessage(DiscoveryTopComponent.class, "DiscoveryTopComponent.videosButton.text")); // NOI18N + videosButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + videosButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout toolBarPanelLayout = new javax.swing.GroupLayout(toolBarPanel); + toolBarPanel.setLayout(toolBarPanelLayout); + toolBarPanelLayout.setHorizontalGroup( + toolBarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(toolBarPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(imagesButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(videosButton) + .addContainerGap(954, Short.MAX_VALUE)) + ); + toolBarPanelLayout.setVerticalGroup( + toolBarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(toolBarPanelLayout.createSequentialGroup() + .addGap(5, 5, 5) + .addGroup(toolBarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(imagesButton) + .addComponent(videosButton)) + .addGap(6, 6, 6)) + ); + + add(toolBarPanel, java.awt.BorderLayout.PAGE_START); }// //GEN-END:initComponents + private void imagesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_imagesButtonActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_imagesButtonActionPerformed + + private void videosButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_videosButtonActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_videosButtonActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton imagesButton; private javax.swing.JSplitPane leftSplitPane; private javax.swing.JSplitPane rightSplitPane; + private javax.swing.JPanel toolBarPanel; + private javax.swing.JButton videosButton; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java index db77b76f0b..4126f23c3f 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearch.java @@ -63,6 +63,7 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.ContentTag; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.TskData; /** * Main class to perform the file search. @@ -1029,30 +1030,37 @@ class FileSearch { @Override void addAttributeToResultFiles(List files, SleuthkitCase caseDb, EamDb centralRepoDb) throws FileSearchException { - if (centralRepoDb == null) { - throw new FileSearchException("Central Repository is not enabled - can not add frequency data"); // NON-NLS - } - - // Set frequency in batches - Set hashesToLookUp = new HashSet<>(); - List currentFiles = new ArrayList<>(); - for (ResultFile file : files) { - if (file.getFrequency() == Frequency.UNKNOWN - && file.getFirstInstance().getMd5Hash() != null - && !file.getFirstInstance().getMd5Hash().isEmpty()) { - hashesToLookUp.add(file.getFirstInstance().getMd5Hash()); - currentFiles.add(file); + for (ResultFile file : files) { + if (file.getFrequency() == Frequency.UNKNOWN) { + if (file.getFirstInstance().getKnown() == TskData.FileKnown.KNOWN) { + file.setFrequency(Frequency.KNOWN); + } + } } + } else { + // Set frequency in batches + List currentFiles = new ArrayList<>(); + Set hashesToLookUp = new HashSet<>(); + for (ResultFile file : files) { + if (file.getFirstInstance().getKnown() == TskData.FileKnown.KNOWN) { + file.setFrequency(Frequency.KNOWN); + } + if (file.getFrequency() == Frequency.UNKNOWN + && file.getFirstInstance().getMd5Hash() != null + && !file.getFirstInstance().getMd5Hash().isEmpty()) { + hashesToLookUp.add(file.getFirstInstance().getMd5Hash()); + currentFiles.add(file); + } + if (hashesToLookUp.size() >= BATCH_SIZE) { + computeFrequency(hashesToLookUp, currentFiles, centralRepoDb); - if (hashesToLookUp.size() >= BATCH_SIZE) { - computeFrequency(hashesToLookUp, currentFiles, centralRepoDb); - - hashesToLookUp.clear(); - currentFiles.clear(); + hashesToLookUp.clear(); + currentFiles.clear(); + } } + computeFrequency(hashesToLookUp, currentFiles, centralRepoDb); } - computeFrequency(hashesToLookUp, currentFiles, centralRepoDb); } } @@ -1816,7 +1824,7 @@ class FileSearch { AttributeType getAttributeType() { return attributeType; } - + /** * Get the list of enums that are valid for grouping images. * diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchData.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchData.java index b0cc38fc52..cef6becf8f 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchData.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchData.java @@ -53,7 +53,8 @@ class FileSearchData { COUNT_50(4, 50, Bundle.FileSearchData_Frequency_count_50_displayName()), COUNT_100(5, 100, Bundle.FileSearchData_Frequency_count_100_displayName()), COMMON(6, 0, Bundle.FileSearchData_Frequency_common_displayName()), - UNKNOWN(7, 0, Bundle.FileSearchData_Frequency_unknown_displayName()); + KNOWN(7, 0, "Known (NSRL)"), + UNKNOWN(8, 0, Bundle.FileSearchData_Frequency_unknown_displayName()); private final int ranking; private final String displayName; @@ -99,12 +100,23 @@ class FileSearchData { } /** - * Get the list of enums that are valid for filtering. + * Get the list of enums that are valid for filtering when a CR is + * enabled. * - * @return enums that can be used to filter + * @return enums that can be used to filter with a CR. */ - static List getOptionsForFiltering() { - return Arrays.asList(UNIQUE, RARE, COUNT_10, COUNT_20, COUNT_50, COUNT_100, COMMON); + static List getOptionsForFilteringWithCr() { + return Arrays.asList(UNIQUE, RARE, COUNT_10, COUNT_20, COUNT_50, COUNT_100, COMMON, KNOWN); + } + + /** + * Get the list of enums that are valid for filtering when no CR is + * enabled. + * + * @return enums that can be used to filter without a CR. + */ + static List getOptionsForFilteringWithoutCr() { + return Arrays.asList(KNOWN, UNKNOWN); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchDialog.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchDialog.java index 37e7912c4f..186111cef0 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchDialog.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchDialog.java @@ -185,7 +185,7 @@ public class FileSearchDialog extends javax.swing.JDialog implements ActionListe } else { int count = 0; DefaultListModel frequencyListModel = (DefaultListModel)freqList.getModel(); - for (Frequency freq : Frequency.getOptionsForFiltering()) { + for (Frequency freq : Frequency.getOptionsForFilteringWithCr()) { frequencyListModel.add(count, freq); } } diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchFiltering.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchFiltering.java index d0cef928f7..88f6c146b2 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchFiltering.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchFiltering.java @@ -279,7 +279,8 @@ class FileSearchFiltering { "FileSearchFiltering.ParentSearchTerm.fullString= (exact)", "FileSearchFiltering.ParentSearchTerm.subString= (substring)", "FileSearchFiltering.ParentSearchTerm.includeString= (include)", - "FileSearchFiltering.ParentSearchTerm.excludeString= (exclude)",}) + "FileSearchFiltering.ParentSearchTerm.excludeString= (exclude)",} + ) @Override public String toString() { String returnString = searchStr; @@ -308,6 +309,7 @@ class FileSearchFiltering { */ boolean isIncluded() { return isIncluded; + } } @@ -559,10 +561,6 @@ class FileSearchFiltering { List applyAlternateFilter(List currentResults, SleuthkitCase caseDb, EamDb centralRepoDb) throws FileSearchException { - if (centralRepoDb == null) { - throw new FileSearchException("Can not run Frequency filter with null Central Repository DB"); // NON-NLS - } - // We have to have run some kind of SQL filter before getting to this point, // and should have checked afterward to see if the results were empty. if (currentResults.isEmpty()) { diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form index bbc0755e61..ab46ea488b 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.form @@ -34,18 +34,11 @@ - - - - - - - - - + + @@ -67,21 +60,18 @@ - - - - - - - + + - - - - + + + + + + + - @@ -874,44 +864,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java index 49e33d21f2..94c622333f 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java @@ -36,7 +36,9 @@ import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.filequery.FileSearch.GroupingAttributeType; import org.sleuthkit.autopsy.filequery.FileSearchData.FileType; @@ -61,30 +63,23 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener private final static Logger logger = Logger.getLogger(FileSearchPanel.class.getName()); private DefaultListModel parentListModel; - private final SleuthkitCase caseDb; - private final EamDb centralRepoDb; private SearchWorker searchWorker = null; /** * Creates new form FileSearchDialog */ @NbBundle.Messages({"FileSearchPanel.dialogTitle.text=Test file search"}) - FileSearchPanel(SleuthkitCase caseDb, EamDb centralRepoDb) { - this.caseDb = caseDb; - this.centralRepoDb = centralRepoDb; + FileSearchPanel() { initComponents(); - customizeComponents(); - imagesSelected(); - } private void imagesSelected() { - imagesButton.setSelected(true); - imagesButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/tick.png"))); - imagesButton.setBackground(Color.blue); - videosButton.setIcon(null); - videosButton.setSelected(false); - videosButton.setBackground(new Color(240, 240, 240)); +// imagesButton.setSelected(true); +// imagesButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/tick.png"))); +// imagesButton.setBackground(Color.blue); +// videosButton.setIcon(null); +// videosButton.setSelected(false); +// videosButton.setBackground(new Color(240, 240, 240)); dataSourceCheckbox.setVisible(true); dataSourceScrollPane.setVisible(true); dataSourceList.setVisible(true); @@ -127,12 +122,12 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener } private void videosSelected() { - imagesButton.setSelected(false); - imagesButton.setIcon(null); - imagesButton.setBackground(new Color(240, 240, 240)); - videosButton.setSelected(true); - videosButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/tick.png"))); - videosButton.setBackground(Color.blue); +// imagesButton.setSelected(false); +// imagesButton.setIcon(null); +// imagesButton.setBackground(new Color(240, 240, 240)); +// videosButton.setSelected(true); +// videosButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/tick.png"))); +// videosButton.setBackground(Color.blue); dataSourceCheckbox.setVisible(true); dataSourceScrollPane.setVisible(true); dataSourceList.setVisible(true); @@ -177,6 +172,10 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener notableCheckbox.setVisible(false); } + void resetPanel(){ + customizeComponents(); + } + /** * Set up all the UI components */ @@ -196,19 +195,21 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener setUpObjectFilter(); setUpScoreFilter(); + groupByCombobox.removeAllItems(); // Set up the grouping attributes for (FileSearch.GroupingAttributeType type : FileSearch.GroupingAttributeType.getOptionsForGroupingImages()) { if (type != GroupingAttributeType.FREQUENCY || EamDb.isEnabled()) { groupByCombobox.addItem(type); } } - + orderByCombobox.removeAllItems(); // Set up the file order list for (FileSorter.SortingMethod method : FileSorter.SortingMethod.getOptionsForOrderingImages()) { if (method != SortingMethod.BY_FREQUENCY || EamDb.isEnabled()) { orderByCombobox.addItem(method); } } + imagesSelected(); validateFields(); } @@ -226,7 +227,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent evt) { - validateFields(); + if (!evt.getValueIsAdjusting()) { + validateFields(); + } } }); } @@ -239,7 +242,8 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener int count = 0; try { DefaultListModel dsListModel = (DefaultListModel) dataSourceList.getModel(); - for (DataSource ds : caseDb.getDataSources()) { + dsListModel.removeAllElements(); + for (DataSource ds : Case.getCurrentCase().getSleuthkitCase().getDataSources()) { dsListModel.add(count, new DataSourceItem(ds)); } } catch (TskCoreException ex) { @@ -254,13 +258,15 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener * Initialize the frequency filter */ private void setUpFrequencyFilter() { - if (centralRepoDb == null) { - crFrequencyList.setEnabled(false); - crFrequencyCheckbox.setEnabled(false); + int count = 0; + DefaultListModel frequencyListModel = (DefaultListModel) crFrequencyList.getModel(); + frequencyListModel.removeAllElements(); + if (!EamDb.isEnabled()) { + for (FileSearchData.Frequency freq : FileSearchData.Frequency.getOptionsForFilteringWithoutCr()) { + frequencyListModel.add(count, freq); + } } else { - int count = 0; - DefaultListModel frequencyListModel = (DefaultListModel) crFrequencyList.getModel(); - for (FileSearchData.Frequency freq : FileSearchData.Frequency.getOptionsForFiltering()) { + for (FileSearchData.Frequency freq : FileSearchData.Frequency.getOptionsForFilteringWithCr()) { frequencyListModel.add(count, freq); } } @@ -273,6 +279,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener private void setUpSizeFilter() { int count = 0; DefaultListModel sizeListModel = (DefaultListModel) sizeList.getModel(); + sizeListModel.removeAllElements(); for (FileSearchData.FileSize size : FileSearchData.FileSize.values()) { sizeListModel.add(count, size); } @@ -286,7 +293,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener int count = 0; try { DefaultListModel kwListModel = (DefaultListModel) keywordList.getModel(); - + kwListModel.removeAllElements(); List setNames = getSetNames(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME); for (String name : setNames) { @@ -307,7 +314,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener int count = 0; try { DefaultListModel hashListModel = (DefaultListModel) hashSetList.getModel(); - + hashListModel.removeAllElements(); List setNames = getSetNames(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME); for (String name : setNames) { @@ -329,7 +336,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener int count = 0; try { DefaultListModel intListModel = (DefaultListModel) interestingItemsList.getModel(); - + intListModel.removeAllElements(); List setNames = getSetNames(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME); for (String name : setNames) { @@ -351,8 +358,8 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener int count = 0; try { DefaultListModel tagsListModel = (DefaultListModel) tagsList.getModel(); - - List tagNames = caseDb.getTagNamesInUse(); + tagsListModel.removeAllElements(); + List tagNames = Case.getCurrentCase().getSleuthkitCase().getTagNamesInUse(); for (TagName name : tagNames) { tagsListModel.add(count, name); count++; @@ -396,7 +403,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener int count = 0; try { DefaultListModel objListModel = (DefaultListModel) objectsList.getModel(); - + objListModel.removeAllElements(); List setNames = getSetNames(BlackboardArtifact.ARTIFACT_TYPE.TSK_OBJECT_DETECTED, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION); for (String name : setNames) { objListModel.add(count, name); @@ -417,6 +424,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener int count = 0; DefaultListModel scoreListModel = (DefaultListModel) scoreList.getModel(); + scoreListModel.removeAllElements(); for (Score score : Score.getOptionsForFiltering()) { scoreListModel.add(count, score); } @@ -436,7 +444,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener * @throws TskCoreException */ private List getSetNames(BlackboardArtifact.ARTIFACT_TYPE artifactType, BlackboardAttribute.ATTRIBUTE_TYPE setNameAttribute) throws TskCoreException { - List arts = caseDb.getBlackboardArtifacts(artifactType); + List arts = Case.getCurrentCase().getSleuthkitCase().getBlackboardArtifacts(artifactType); List setNames = new ArrayList<>(); for (BlackboardArtifact art : arts) { for (BlackboardAttribute attr : art.getAttributes()) { @@ -456,8 +464,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener * Initialize the parent path filter */ private void setUpParentPathFilter() { - parentPathButtonGroup.add(fullRadioButton); - parentPathButtonGroup.add(substringRadioButton); fullRadioButton.setSelected(true); includeRadioButton.setSelected(true); parentListModel = (DefaultListModel) parentList.getModel(); @@ -472,12 +478,12 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener List getFilters() { List filters = new ArrayList<>(); - // There will always be a file type selected - if (imagesButton.isSelected()) { - filters.add(new FileSearchFiltering.FileTypeFilter(FileType.IMAGE)); - } else if (videosButton.isSelected()) { - filters.add(new FileSearchFiltering.FileTypeFilter(FileType.VIDEO)); - } +// // There will always be a file type selected +// if (imagesButton.isSelected()) { + filters.add(new FileSearchFiltering.FileTypeFilter(FileType.IMAGE)); +// } else if (videosButton.isSelected()) { +// filters.add(new FileSearchFiltering.FileTypeFilter(FileType.VIDEO)); +// } if (parentCheckbox.isSelected()) { // For the parent paths, everything in the box is used (not just the selected entries) @@ -612,11 +618,11 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener * use bundle messages. */ private void validateFields() { - // There must be at least one file type selected - if (imagesButton.isSelected() || videosButton.isSelected()) { - setInvalid("At least one file type must be selected"); - return; - } +// // There must be at least one file type selected +// if (imagesButton.isSelected() || videosButton.isSelected()) { +// setInvalid("At least one file type must be selected"); +// return; +// } // For most enabled filters, there should be something selected if (dataSourceCheckbox.isSelected() && dataSourceList.getSelectedValuesList().isEmpty()) { setInvalid("At least one data source must be selected"); @@ -755,8 +761,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener groupByLabel = new javax.swing.JLabel(); errorLabel = new javax.swing.JLabel(); cancelButton = new javax.swing.JButton(); - imagesButton = new javax.swing.JButton(); - videosButton = new javax.swing.JButton(); setMinimumSize(new java.awt.Dimension(424, 0)); setPreferredSize(new java.awt.Dimension(424, 533)); @@ -1271,42 +1275,15 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener } }); - org.openide.awt.Mnemonics.setLocalizedText(imagesButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.imagesButton.text")); // NOI18N - typeButtonGroup.add(imagesButton); - imagesButton.setMargin(new java.awt.Insets(2, 8, 2, 8)); - imagesButton.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/tick.png"))); // NOI18N - imagesButton.setVerifyInputWhenFocusTarget(false); - imagesButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - imagesButtonActionPerformed(evt); - } - }); - - org.openide.awt.Mnemonics.setLocalizedText(videosButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.videosButton.text")); // NOI18N - typeButtonGroup.add(videosButton); - videosButton.setMargin(new java.awt.Insets(2, 8, 2, 8)); - videosButton.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/tick.png"))); // NOI18N - videosButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - videosButtonActionPerformed(evt); - } - }); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(imagesButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(videosButton) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addGap(4, 4, 4) - .addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap() + .addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 268, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(cancelButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -1325,19 +1302,17 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(8, 8, 8) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(imagesButton) - .addComponent(videosButton)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(filtersScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 307, Short.MAX_VALUE) + .addGap(6, 6, 6) + .addComponent(filtersScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 326, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(sortingPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(cancelButton) - .addComponent(searchButton)) - .addComponent(errorLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(searchButton) + .addGroup(layout.createSequentialGroup() + .addComponent(errorLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(6, 6, 6)))) ); }// //GEN-END:initComponents @@ -1346,9 +1321,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener FileType searchType = FileType.IMAGE; //default to images // There will always be a file type selected - if (videosButton.isSelected()) { - searchType = FileType.VIDEO; - } +// if (videosButton.isSelected()) { +// searchType = FileType.VIDEO; +// } DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchStartedEvent(searchType)); // For testing, allow the user to run different searches in loop @@ -1361,6 +1336,15 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener // Get the file sorting method FileSorter.SortingMethod fileSort = getFileSortingMethod(); + EamDb centralRepoDb = null; + if (EamDb.isEnabled()) { + try { + centralRepoDb = EamDb.getInstance(); + } catch (EamDbException ex) { + centralRepoDb = null; + logger.log(Level.SEVERE, "Error loading central repository database, no central repository options will be available for File Discovery", ex); + } + } searchWorker = new SearchWorker(centralRepoDb, filters, groupingAttr, groupSortAlgorithm, fileSort); searchWorker.execute(); }//GEN-LAST:event_searchButtonActionPerformed @@ -1380,8 +1364,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener } searchButton.setEnabled(enabled); cancelButton.setEnabled(!enabled); - imagesButton.setEnabled(enabled); - videosButton.setEnabled(enabled); orderByCombobox.setEnabled(enabled); groupByCombobox.setEnabled(enabled); attributeRadioButton.setEnabled(enabled); @@ -1538,16 +1520,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener scoreList.setEnabled(scoreCheckbox.isSelected()); }//GEN-LAST:event_scoreCheckboxActionPerformed - private void imagesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_imagesButtonActionPerformed - imagesSelected(); - validateFields(); - }//GEN-LAST:event_imagesButtonActionPerformed - - private void videosButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_videosButtonActionPerformed - videosSelected(); - validateFields(); - }//GEN-LAST:event_videosButtonActionPerformed - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addButton; @@ -1572,7 +1544,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener private javax.swing.JCheckBox hashSetCheckbox; private javax.swing.JList hashSetList; private javax.swing.JScrollPane hashSetScrollPane; - private javax.swing.JButton imagesButton; private javax.swing.JRadioButton includeRadioButton; private javax.swing.JCheckBox interestingItemsCheckbox; private javax.swing.JList interestingItemsList; @@ -1609,7 +1580,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener private javax.swing.JList tagsList; private javax.swing.JScrollPane tagsScrollPane; private javax.swing.ButtonGroup typeButtonGroup; - private javax.swing.JButton videosButton; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.form index c3500a7fa9..e774a0fac7 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.form +++ b/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.form @@ -41,6 +41,13 @@ + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.java index e16622388a..05e27cd462 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.java @@ -90,6 +90,7 @@ class GroupListPanel extends javax.swing.JPanel { groupListScrollPane = new javax.swing.JScrollPane(); groupKeyList = new javax.swing.JList<>(); + groupKeyList.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(GroupListPanel.class, "GroupListPanel.groupKeyList.border.title"))); // NOI18N groupKeyList.setModel(new DefaultListModel()); groupKeyList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); groupKeyList.setCellRenderer(new GroupListRenderer()); diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java index 8fd3ded382..5f83505af8 100644 --- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.logging.Level; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JList; @@ -40,7 +41,9 @@ import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.actions.AddContentTagAction; import org.sleuthkit.autopsy.actions.DeleteFileContentTagAction; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.coreutils.ImageUtils; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.FileNode; import org.sleuthkit.autopsy.directorytree.ExternalViewerAction; import org.sleuthkit.autopsy.directorytree.ViewContextAction; @@ -57,6 +60,7 @@ import org.sleuthkit.datamodel.TskCoreException; public class ResultsPanel extends javax.swing.JPanel { private static final long serialVersionUID = 1L; + private final static Logger logger = Logger.getLogger(ResultsPanel.class.getName()); private final VideoThumbnailViewer videoThumbnailViewer; private final ImageThumbnailViewer imageThumbnailViewer; private List searchFilters; @@ -67,7 +71,6 @@ public class ResultsPanel extends javax.swing.JPanel { private int currentPage = 0; private int previousPageSize = 10; private FileSearchData.FileType resultType; - private final EamDb centralRepo; private int groupSize = 0; private PageWorker pageWorker; private final List> thumbnailWorkers = new ArrayList<>(); @@ -78,9 +81,8 @@ public class ResultsPanel extends javax.swing.JPanel { */ @Messages({"ResultsPanel.viewFileInDir.name=View File in Directory", "ResultsPanel.openInExternalViewer.name=Open in External Viewer"}) - public ResultsPanel(EamDb centralRepo) { + public ResultsPanel() { initComponents(); - this.centralRepo = centralRepo; imageThumbnailViewer = new ImageThumbnailViewer(); videoThumbnailViewer = new VideoThumbnailViewer(); videoThumbnailViewer.addListSelectionListener((e) -> { @@ -299,6 +301,15 @@ public class ResultsPanel extends javax.swing.JPanel { if (pageWorker != null && !pageWorker.isDone()) { pageWorker.cancel(true); } + EamDb centralRepo = null; + if (EamDb.isEnabled()) { + try { + centralRepo = EamDb.getInstance(); + } catch (EamDbException ex) { + centralRepo = null; + logger.log(Level.SEVERE, "Error loading central repository database, no central repository options will be available for File Discovery", ex); + } + } pageWorker = new PageWorker(searchFilters, groupingAttribute, groupSort, fileSortMethod, selectedGroupKey, startingEntry, pageSize, resultType, centralRepo); pageWorker.execute(); }