From d9b605af5065fb56b51a5b57bbe0a1e7efeab60c Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Tue, 24 Oct 2017 13:29:48 -0400 Subject: [PATCH] Importing dialog cancellation done --- .../ImportCentralRepoDatabaseDialog.java | 4 +- .../modules/hashdatabase/Bundle.properties | 10 +- .../modules/hashdatabase/HashDbManager.java | 12 +- .../hashdatabase/HashLookupSettings.java | 15 +- .../hashdatabase/HashLookupSettingsPanel.form | 125 ++++++++--- .../hashdatabase/HashLookupSettingsPanel.java | 161 ++++++++++---- .../ImportCentralRepoDbProgressDialog.form | 77 +++---- .../ImportCentralRepoDbProgressDialog.java | 201 +++++++++++------- 8 files changed, 418 insertions(+), 187 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportCentralRepoDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportCentralRepoDatabaseDialog.java index c47b598e68..4223b4b359 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportCentralRepoDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/ImportCentralRepoDatabaseDialog.java @@ -489,7 +489,7 @@ final public class ImportCentralRepoDatabaseDialog extends javax.swing.JDialog { private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed // Note that the error handlers in this method call return without disposing of the // dialog to allow the user to try again, if desired. - String selectedFilePath = tfFilePath.getText(); + /*String selectedFilePath = tfFilePath.getText(); // have valid file path if (selectedFilePath.isEmpty()) { @@ -517,7 +517,7 @@ final public class ImportCentralRepoDatabaseDialog extends javax.swing.JDialog { } finally { dispose(); - } + }*/ /* // create global set int globalSetID; diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties index b09e1f7e20..d2e97172b9 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties @@ -242,7 +242,13 @@ ImportHashDatabaseDialog.tfDatabaseName.tooltip=Name for this database ImportHashDatabaseDialog.tfDatabaseVersion.tooltip.text=Database Version Number ImportHashDatabaseDialog.tfDatabaseName.tooltip=Name for this database ImportHashDatabaseDialog.tfDatabaseVersion.tooltip.text=Database Version Number -ImportCentralRepoDbProgressDialog.jButton1.text=jButton1 -ImportCentralRepoDbProgressDialog.lbProgress.text=jLabel1 +ImportCentralRepoDbProgressDialog.lbProgress.text=Starting import... ImportCentralRepoDbProgressDialog.bnOk.text=OK ImportCentralRepoDbProgressDialog.bnCancel.text=Cancel +HashLookupSettingsPanel.versionLabel.text_1=Version: +HashLookupSettingsPanel.hashDbVersionLabel.text_1=No database selected +HashLookupSettingsPanel.orgLabel.text_1=Organization: +HashLookupSettingsPanel.hashDbOrgLabel.text_1=No database selected +HashLookupSettingsPanel.readOnlyLabel.text_1=Read only: +HashLookupSettingsPanel.hashDbReadOnlyLabel.text_1=No database selected +ImportCentralRepoDbProgressDialog.jLabel1.text=Importing hash set into the central repository diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbManager.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbManager.java index 648dc7b7ec..8ade7d699e 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbManager.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbManager.java @@ -329,7 +329,7 @@ public class HashDbManager implements PropertyChangeListener { return db; } - + /* public CentralRepoHashDb importCentralRepoHashSet(String hashSetName, String version, int orgId, boolean searchDuringIngest, boolean sendIngestMessages, HashDb.KnownFilesType knownFilesType, String importFile) throws TskCoreException { @@ -415,7 +415,7 @@ public class HashDbManager implements PropertyChangeListener { ex.printStackTrace(); throw new TskCoreException(ex.getLocalizedMessage()); } - } + }*/ synchronized void indexHashDatabase(HashDb hashDb) { hashDb.addPropertyChangeListener(this); @@ -703,7 +703,8 @@ public class HashDbManager implements PropertyChangeListener { allDatabasesLoadedCorrectly = false; } } else { - addExistingCentralRepoHashSet(hashDbInfo.getHashSetName(), hashDbInfo.getVersion(), hashDbInfo.getCentralRepoIndex(), + addExistingCentralRepoHashSet(hashDbInfo.getHashSetName(), hashDbInfo.getVersion(), + hashDbInfo.getCentralRepoIndex(), hashDbInfo.getSearchDuringIngest(), hashDbInfo.getSendIngestMessages(), hashDbInfo.getKnownFilesType()); } } catch (TskCoreException ex) { @@ -1168,6 +1169,7 @@ public class HashDbManager implements PropertyChangeListener { private final HashDb.KnownFilesType knownFilesType; private final int centralRepoIndex; private final String version; + private final String orgName = ""; private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); private CentralRepoHashDb(String hashSetName, String version, int centralRepoIndex, @@ -1215,6 +1217,10 @@ public class HashDbManager implements PropertyChangeListener { return version; } + public String getOrgName(){ + return "org name"; + } + public int getCentralRepoIndex(){ return centralRepoIndex; } diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettings.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettings.java index 00bac6cf4e..3307ee2c09 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettings.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettings.java @@ -307,6 +307,7 @@ final class HashLookupSettings implements Serializable { private final boolean sendIngestMessages; private final String path; private final String version; + private final String orgName; private final int centralRepoIndex; private DatabaseType dbType; @@ -328,12 +329,14 @@ final class HashLookupSettings implements Serializable { this.path = path; this.centralRepoIndex = -1; this.version = ""; + this.orgName = ""; this.dbType = DatabaseType.FILE; } - HashDbInfo(String hashSetName, String version, int centralRepoIndex, HashDbManager.HashDb.KnownFilesType knownFilesType, boolean searchDuringIngest, boolean sendIngestMessages){ + HashDbInfo(String hashSetName, String version, String orgName, int centralRepoIndex, HashDbManager.HashDb.KnownFilesType knownFilesType, boolean searchDuringIngest, boolean sendIngestMessages){ this.hashSetName = hashSetName; this.version = version; + this.orgName = orgName; this.centralRepoIndex = centralRepoIndex; this.knownFilesType = knownFilesType; this.searchDuringIngest = searchDuringIngest; @@ -351,6 +354,7 @@ final class HashLookupSettings implements Serializable { this.sendIngestMessages = fileTypeDb.getSendIngestMessages(); this.centralRepoIndex = -1; this.version = ""; + this.orgName = ""; this.dbType = DatabaseType.FILE; if (fileTypeDb.hasIndexOnly()) { this.path = fileTypeDb.getIndexPath(); @@ -361,6 +365,7 @@ final class HashLookupSettings implements Serializable { HashDbManager.CentralRepoHashDb centralRepoDb = (HashDbManager.CentralRepoHashDb)db; this.hashSetName = centralRepoDb.getHashSetName(); this.version = centralRepoDb.getVersion(); + this.orgName = centralRepoDb.getOrgName(); this.knownFilesType = centralRepoDb.getKnownFilesType(); this.searchDuringIngest = centralRepoDb.getSearchDuringIngest(); this.sendIngestMessages = centralRepoDb.getSendIngestMessages(); @@ -388,6 +393,14 @@ final class HashLookupSettings implements Serializable { String getVersion(){ return version; } + + /** + * Get the organization name for the hash set + * @return org name + */ + String getOrgName(){ + return orgName; + } /** * Gets the known files type setting. diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.form index b472445216..a78094dc79 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.form @@ -94,7 +94,7 @@ - + @@ -102,29 +102,24 @@ - - - - - - - - + + + - + - - - + + + @@ -132,25 +127,48 @@ + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + - + @@ -202,6 +220,21 @@ + + + + + + + + + + + + + + + @@ -211,12 +244,12 @@ - + - + @@ -597,6 +630,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java index 36aa535567..b3eb556184 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import javax.swing.JComponent; +import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; @@ -45,6 +46,7 @@ import org.sleuthkit.autopsy.events.AutopsyEvent; import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb; +import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.CentralRepoHashDb; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb.KnownFilesType; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDatabase; @@ -120,7 +122,11 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan hashDbNameLabel.setText(NO_SELECTION_TEXT); hashDbTypeLabel.setText(NO_SELECTION_TEXT); hashDbLocationLabel.setText(NO_SELECTION_TEXT); + hashDbVersionLabel.setText(NO_SELECTION_TEXT); + hashDbOrgLabel.setText(NO_SELECTION_TEXT); + hashDbReadOnlyLabel.setText(NO_SELECTION_TEXT); indexPathLabel.setText(NO_SELECTION_TEXT); + // Update indexing components. hashDbIndexStatusLabel.setText(NO_SELECTION_TEXT); @@ -144,18 +150,26 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan ingestWarningLabel.setVisible(ingestIsRunning); } + @NbBundle.Messages({"HashLookupSettingsPanel.readOnly=Read only", + "HashLookupSettingsPanel.editable=Editable", + "HashLookupSettingsPanel.updateStatusError=Error reading status", + "HashLookupSettingsPanel.notApplicable=N/A", + "HashLookupSettingsPanel.centralRepo=Central Repository" + }) private void updateComponentsForSelection(HashDatabase db) { boolean ingestIsRunning = IngestManager.getInstance().isIngestRunning(); // Update descriptive labels. hashDbNameLabel.setText(db.getHashSetName()); - hashDbTypeLabel.setText(db.getKnownFilesType().getDisplayName()); - - try { - hashDbLocationLabel.setText(shortenPath(db.getDatabasePath())); - } catch (TskCoreException ex) { - Logger.getLogger(HashLookupSettingsPanel.class.getName()).log(Level.SEVERE, "Error getting database path of " + db.getHashSetName() + " hash database", ex); //NON-NLS - hashDbLocationLabel.setText(ERROR_GETTING_PATH_TEXT); + hashDbTypeLabel.setText(db.getKnownFilesType().getDisplayName()); + try{ + if(db.isUpdateable()){ + hashDbReadOnlyLabel.setText(Bundle.HashLookupSettingsPanel_editable()); + } else { + hashDbReadOnlyLabel.setText(Bundle.HashLookupSettingsPanel_readOnly()); + } + } catch (TskCoreException ex){ + hashDbReadOnlyLabel.setText(Bundle.HashLookupSettingsPanel_updateStatusError()); } try { @@ -167,6 +181,21 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan if(db instanceof HashDb){ HashDb hashDb = (HashDb)db; + + // Disable the central repo fields + hashDbVersionLabel.setText(Bundle.HashLookupSettingsPanel_notApplicable()); + hashDbOrgLabel.setText(Bundle.HashLookupSettingsPanel_notApplicable()); + + // Enable the delete button if ingest is not running + deleteDatabaseButton.setEnabled(!ingestIsRunning); + + try { + hashDbLocationLabel.setText(shortenPath(db.getDatabasePath())); + } catch (TskCoreException ex) { + Logger.getLogger(HashLookupSettingsPanel.class.getName()).log(Level.SEVERE, "Error getting database path of " + db.getHashSetName() + " hash database", ex); //NON-NLS + hashDbLocationLabel.setText(ERROR_GETTING_PATH_TEXT); + } + try { indexPathLabel.setText(shortenPath(hashDb.getIndexPath())); } catch (TskCoreException ex) { @@ -214,6 +243,19 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan indexButton.setText(NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexButtonText.index")); indexButton.setEnabled(false); } + } else { + + // Disable the file type fields/buttons + indexPathLabel.setText(Bundle.HashLookupSettingsPanel_notApplicable()); + hashDbIndexStatusLabel.setText(Bundle.HashLookupSettingsPanel_notApplicable()); + hashDbLocationLabel.setText(Bundle.HashLookupSettingsPanel_centralRepo()); + indexButton.setEnabled(false); + deleteDatabaseButton.setEnabled(false); + + CentralRepoHashDb crDb = (CentralRepoHashDb)db; + + hashDbVersionLabel.setText(crDb.getVersion()); + hashDbOrgLabel.setText(crDb.getOrgName()); } // Disable the indexing button if ingest is in progress. @@ -230,7 +272,6 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan // Update database action buttons. createDatabaseButton.setEnabled(true); importDatabaseButton.setEnabled(true); - deleteDatabaseButton.setEnabled(!ingestIsRunning); // Update ingest in progress warning label. ingestWarningLabel.setVisible(ingestIsRunning); @@ -380,7 +421,7 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan // Give the user a visual indication of any hash sets with a hash // database that needs to be indexed by displaying the hash set name // in red. - if (hashSetTableModel.indexExists(row)) { + if (hashSetTableModel.isValid(row)) { cellRenderer.setForeground(Color.black); } else { cellRenderer.setForeground(Color.red); @@ -437,12 +478,9 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan return hashSets.get(rowIndex).getHashSetName(); } - private boolean indexExists(int rowIndex) { + private boolean isValid(int rowIndex) { try { - if(hashSets.get(rowIndex) instanceof HashDb){ - return ((HashDb)(hashSets.get(rowIndex))).hasIndex(); - } - return false; + return hashSets.get(rowIndex).isValid(); } catch (TskCoreException ex) { Logger.getLogger(HashSetTableModel.class.getName()).log(Level.SEVERE, "Error getting index info for hash database", ex); //NON-NLS return false; @@ -541,6 +579,12 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan indexPathLabel = new javax.swing.JLabel(); addHashesToDatabaseButton = new javax.swing.JButton(); jButton1 = new javax.swing.JButton(); + versionLabel = new javax.swing.JLabel(); + hashDbVersionLabel = new javax.swing.JLabel(); + orgLabel = new javax.swing.JLabel(); + hashDbOrgLabel = new javax.swing.JLabel(); + readOnlyLabel = new javax.swing.JLabel(); + hashDbReadOnlyLabel = new javax.swing.JLabel(); jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.jLabel2.text")); // NOI18N @@ -686,6 +730,18 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan } }); + org.openide.awt.Mnemonics.setLocalizedText(versionLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.versionLabel.text_1")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(hashDbVersionLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbVersionLabel.text_1")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(orgLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.orgLabel.text_1")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(hashDbOrgLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbOrgLabel.text_1")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(readOnlyLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.readOnlyLabel.text_1")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(hashDbReadOnlyLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbReadOnlyLabel.text_1")); // NOI18N + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( @@ -703,43 +759,56 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan .addGap(309, 309, 309)) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() - .addComponent(optionsLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(optionsSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 334, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(10, 10, 10) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(locationLabel) - .addComponent(indexButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(typeLabel) - .addComponent(indexLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(indexPathLabelLabel)) - .addGap(10, 10, 10) + .addComponent(versionLabel) + .addComponent(orgLabel) + .addComponent(readOnlyLabel)) + .addGap(55, 55, 55) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(hashDbTypeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(hashDbLocationLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(indexPathLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(hashDbIndexStatusLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(addHashesToDatabaseButton))) + .addComponent(hashDbVersionLabel) + .addComponent(hashDbOrgLabel) + .addComponent(hashDbReadOnlyLabel))) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(nameLabel) .addGap(53, 53, 53) - .addComponent(hashDbNameLabel)))) + .addComponent(hashDbNameLabel)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(indexLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(indexPathLabelLabel)) + .addGap(64, 64, 64) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(indexPathLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(hashDbIndexStatusLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(indexButton, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(10, 10, 10) + .addComponent(addHashesToDatabaseButton)))) .addGroup(jPanel1Layout.createSequentialGroup() .addGap(70, 70, 70) .addComponent(informationSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 305, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGap(25, 25, 25) - .addComponent(sendIngestMessagesCheckBox)) - .addGroup(jPanel1Layout.createSequentialGroup() - .addGap(10, 10, 10) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(ingestWarningLabel) - .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE)))) - .addGap(50, 50, 50)))) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + .addComponent(optionsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(optionsSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 334, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(25, 25, 25) + .addComponent(sendIngestMessagesCheckBox)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(10, 10, 10) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(ingestWarningLabel) + .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE))))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) .addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(hashDatabasesLabel) @@ -777,6 +846,18 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan .addComponent(locationLabel) .addComponent(hashDbLocationLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(versionLabel) + .addComponent(hashDbVersionLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(orgLabel) + .addComponent(hashDbOrgLabel)) + .addGap(7, 7, 7) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(readOnlyLabel) + .addComponent(hashDbReadOnlyLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(indexPathLabelLabel) .addComponent(indexPathLabel)) @@ -784,11 +865,11 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(indexLabel) .addComponent(hashDbIndexStatusLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(indexButton) .addComponent(addHashesToDatabaseButton)) - .addGap(18, 18, 18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(optionsLabel) .addComponent(optionsSeparator, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) @@ -946,7 +1027,10 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan private javax.swing.JLabel hashDbIndexStatusLabel; private javax.swing.JLabel hashDbLocationLabel; private javax.swing.JLabel hashDbNameLabel; + private javax.swing.JLabel hashDbOrgLabel; + private javax.swing.JLabel hashDbReadOnlyLabel; private javax.swing.JLabel hashDbTypeLabel; + private javax.swing.JLabel hashDbVersionLabel; private javax.swing.JTable hashSetTable; private javax.swing.JButton importDatabaseButton; private javax.swing.JButton indexButton; @@ -968,7 +1052,10 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan private javax.swing.JLabel nameLabel; private javax.swing.JLabel optionsLabel; private javax.swing.JSeparator optionsSeparator; + private javax.swing.JLabel orgLabel; + private javax.swing.JLabel readOnlyLabel; private javax.swing.JCheckBox sendIngestMessagesCheckBox; private javax.swing.JLabel typeLabel; + private javax.swing.JLabel versionLabel; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ImportCentralRepoDbProgressDialog.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ImportCentralRepoDbProgressDialog.form index 30e4a099d5..4d2ada136b 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ImportCentralRepoDbProgressDialog.form +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ImportCentralRepoDbProgressDialog.form @@ -24,49 +24,45 @@ - + - - - - - - + + + - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + - - + @@ -81,16 +77,6 @@ - - - - - - - - - - @@ -111,5 +97,12 @@ + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ImportCentralRepoDbProgressDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ImportCentralRepoDbProgressDialog.java index c5ceb255d5..54ab545820 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ImportCentralRepoDbProgressDialog.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/ImportCentralRepoDbProgressDialog.java @@ -33,12 +33,16 @@ import java.util.logging.Level; import javax.swing.JFrame; import javax.swing.JProgressBar; import javax.swing.SwingWorker; +import javax.swing.WindowConstants; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.Executors; import org.openide.util.NbBundle; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamGlobalFileInstance; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.datamodel.TskCoreException; @@ -49,9 +53,7 @@ import org.sleuthkit.datamodel.TskData; */ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements PropertyChangeListener{ - - long totalHashes; - private SwingWorker worker; + private CentralRepoImportWorker worker; /** @@ -70,8 +72,14 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P super((JFrame) WindowManager.getDefault().getMainWindow(), Bundle.ImportCentralRepoDbProgressDialog_title_text(), true); - - initComponents(); + + initComponents(); + customizeComponents(); + } + + private void customizeComponents(){ + setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + bnOk.setEnabled(false); } void importFile(String hashSetName, String version, int orgId, @@ -81,8 +89,7 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P File importFile = new File(importFileName); worker = new ImportIDXWorker(hashSetName, version, orgId, searchDuringIngest, sendIngestMessages, - knownFilesType, importFile, totalHashes); - totalHashes = ((ImportIDXWorker)worker).getEstimatedTotalHashes(); + knownFilesType, importFile); worker.addPropertyChangeListener(this); worker.execute(); @@ -91,16 +98,16 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P this.setVisible(true); } + @NbBundle.Messages({"ImportCentralRepoDbProgressDialog.linesProcessed= lines processed"}) @Override public void propertyChange(PropertyChangeEvent evt) { System.out.println("### Evt type: " + evt.getPropertyName()); System.out.println(" newValue: " + evt.getNewValue().toString()); - System.out.println("### Setting progress to " + worker.getProgress()); + System.out.println("### Setting progress to " + worker.getProgressPercentage()); if("progress".equals(evt.getPropertyName())){ - progressBar.setValue(worker.getProgress()); - String mes = "Count: " + worker.getProgress(); - lbProgress.setText(mes); + progressBar.setValue(worker.getProgressPercentage()); + lbProgress.setText(getProgressString()); } else if ("state".equals(evt.getPropertyName()) && (SwingWorker.StateValue.DONE.equals(evt.getNewValue()))) { // Disable cancel and enable ok @@ -108,12 +115,24 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P bnOk.setEnabled(true); progressBar.setValue(progressBar.getMaximum()); - String mes = "Count: " + worker.getProgress(); - lbProgress.setText(mes); + lbProgress.setText(getProgressString()); } } - class ImportIDXWorker extends SwingWorker{ + private String getProgressString(){ + return worker.getLinesProcessed() + Bundle.ImportCentralRepoDbProgressDialog_linesProcessed(); + } + + private interface CentralRepoImportWorker{ + + void execute(); + boolean cancel(boolean mayInterruptIfRunning); + void addPropertyChangeListener(PropertyChangeListener dialog); + int getProgressPercentage(); + long getLinesProcessed(); + } + + class ImportIDXWorker extends SwingWorker implements CentralRepoImportWorker{ private final int HASH_IMPORT_THRESHOLD = 10000; private final String hashSetName; @@ -125,10 +144,11 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P private final File importFile; private final long totalLines; private int crIndex = -1; + private AtomicLong numLines = new AtomicLong(); ImportIDXWorker(String hashSetName, String version, int orgId, boolean searchDuringIngest, boolean sendIngestMessages, HashDbManager.HashDb.KnownFilesType knownFilesType, - File importFile, long totalLines){ + File importFile){ this.hashSetName = hashSetName; this.version = version; @@ -137,7 +157,9 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P this.sendIngestMessages = sendIngestMessages; this.knownFilesType = knownFilesType; this.importFile = importFile; - this.totalLines = totalLines; + this.numLines.set(0); + + this.totalLines = getEstimatedTotalHashes(); } /** @@ -146,11 +168,31 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P * progress bar. * @return Approximate number of hashes in the file */ - long getEstimatedTotalHashes(){ + final long getEstimatedTotalHashes(){ long fileSize = importFile.length(); return (fileSize / 0x33); // IDX file lines are generally 0x33 bytes long } + @Override + public long getLinesProcessed(){ + return numLines.get(); + } + + @Override + public int getProgressPercentage(){ + return this.getProgress(); + } + + //@Override + //public void addPropertyChangeListener(PropertyChangeListener dialog){ + // super.addPropertyChangeListener(dialog); + //} + + //@Override + //public void run(){ + // this.execute(); + //} + @Override protected Void doInBackground() throws Exception { @@ -176,8 +218,10 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P String line; Set globalInstances = new HashSet<>(); - long numLines = 0; while ((line = reader.readLine()) != null) { + if(isCancelled()){ + return null; + } String[] parts = line.split("\\|"); @@ -193,13 +237,13 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P ""); globalInstances.add(eamGlobalFileInstance); - numLines++; + numLines.incrementAndGet(); - if(numLines % HASH_IMPORT_THRESHOLD == 0){ + if(numLines.get() % HASH_IMPORT_THRESHOLD == 0){ dbManager.bulkInsertReferenceTypeEntries(globalInstances, contentType); globalInstances.clear(); - int progress = (int)(numLines * 100 / totalLines); + int progress = (int)(numLines.get() * 100 / totalLines); if(progress < 100){ this.setProgress(progress); } else { @@ -218,28 +262,40 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P ex.printStackTrace(); throw new TskCoreException(ex.getLocalizedMessage()); } + } + + private void deleteIncompleteSet(int crIndex){ + if(crIndex >= 0){ + System.out.println("Deleting incomplete reference set"); + + // This can be slow on large reference sets + Executors.newSingleThreadExecutor().execute(new Runnable() { + @Override + public void run() { + try{ + EamDb.getInstance().deleteReferenceSet(crIndex); + } catch (EamDbException ex2){ - - // Let any external listeners know that there's a new set - //try { - // changeSupport.firePropertyChange(HashDbManager.SetEvt.DB_ADDED.toString(), null, hashSetName); - //} catch (Exception e) { - // logger.log(Level.SEVERE, "HashDbManager listener threw exception", e); //NON-NLS - // MessageNotifyUtil.Notify.show( - // NbBundle.getMessage(this.getClass(), "HashDbManager.moduleErr"), - // NbBundle.getMessage(this.getClass(), "HashDbManager.moduleErrorListeningToUpdatesMsg"), - // MessageNotifyUtil.MessageType.ERROR); - //} - //return hashDb; + } + } + }); + } } @Override protected void done() { + if(isCancelled()){ + // If the user hit cancel, delete this incomplete hash set from the central repo + deleteIncompleteSet(crIndex); + return; + } + try { get(); try{ System.out.println("### Finished - adding hashDb object"); - HashDbManager.CentralRepoHashDb hashDb = HashDbManager.getInstance().addExistingCentralRepoHashSet(hashSetName, version, crIndex, + HashDbManager.CentralRepoHashDb hashDb = HashDbManager.getInstance().addExistingCentralRepoHashSet(hashSetName, version, + crIndex, searchDuringIngest, sendIngestMessages, knownFilesType); } catch (TskCoreException ex){ System.out.println("\n### Error!"); @@ -248,7 +304,7 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P System.out.println("\n### Interrupted!"); - // If the user hit cancel, delete this incomplete hash set from the central repo + // Delete this incomplete hash set from the central repo if(crIndex >= 0){ try{ EamDb.getInstance().deleteReferenceSet(crIndex); @@ -257,7 +313,12 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P } } } - } + } + + //@Override + //public boolean cancel(boolean mayInterruptIfRunning) { + // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + //} } /** @@ -271,21 +332,14 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P progressBar = new javax.swing.JProgressBar(); lbProgress = new javax.swing.JLabel(); - jButton1 = new javax.swing.JButton(); bnOk = new javax.swing.JButton(); bnCancel = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); org.openide.awt.Mnemonics.setLocalizedText(lbProgress, org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class, "ImportCentralRepoDbProgressDialog.lbProgress.text")); // NOI18N - org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class, "ImportCentralRepoDbProgressDialog.jButton1.text")); // NOI18N - jButton1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jButton1ActionPerformed(evt); - } - }); - org.openide.awt.Mnemonics.setLocalizedText(bnOk, org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class, "ImportCentralRepoDbProgressDialog.bnOk.text")); // NOI18N bnOk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -300,55 +354,52 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P } }); + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ImportCentralRepoDbProgressDialog.class, "ImportCentralRepoDbProgressDialog.jLabel1.text")); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addGap(27, 27, 27) + .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jButton1) - .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 346, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap(27, Short.MAX_VALUE)) + .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) .addGroup(layout.createSequentialGroup() - .addComponent(lbProgress) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(bnOk) - .addGap(18, 18, 18) - .addComponent(bnCancel) - .addGap(24, 24, 24)))) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1) + .addComponent(lbProgress)) + .addGap(0, 172, Short.MAX_VALUE)))) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(bnOk, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnCancel) + .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(112, 112, 112) - .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbProgress) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 89, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(bnOk) - .addComponent(bnCancel)) - .addGap(72, 72, 72))) - .addComponent(jButton1) - .addGap(42, 42, 42)) + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(lbProgress) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(bnCancel) + .addComponent(bnOk)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); pack(); }// //GEN-END:initComponents - private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed - this.dispose(); - }//GEN-LAST:event_jButton1ActionPerformed - private void bnCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelActionPerformed this.worker.cancel(true); + this.dispose(); }//GEN-LAST:event_bnCancelActionPerformed private void bnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOkActionPerformed @@ -359,7 +410,7 @@ class ImportCentralRepoDbProgressDialog extends javax.swing.JDialog implements P // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton bnCancel; private javax.swing.JButton bnOk; - private javax.swing.JButton jButton1; + private javax.swing.JLabel jLabel1; private javax.swing.JLabel lbProgress; private javax.swing.JProgressBar progressBar; // End of variables declaration//GEN-END:variables