From ad4e02ed064d25c2652879103a064bb5653da930 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Tue, 7 Nov 2017 09:27:38 -0500 Subject: [PATCH] Add ability to create empty central repo hash sets. --- .../centralrepository/datamodel/EamDb.java | 10 +- .../modules/hashdatabase/Bundle.properties | 11 +- .../modules/hashdatabase/Bundle_ja.properties | 2 +- .../HashDbCreateDatabaseDialog.form | 152 +++++++-- .../HashDbCreateDatabaseDialog.java | 310 +++++++++++++++--- .../HashDbImportDatabaseDialog.form | 3 + .../HashDbImportDatabaseDialog.java | 30 +- .../modules/hashdatabase/HashDbManager.java | 6 +- .../hashdatabase/HashLookupSettingsPanel.java | 7 +- 9 files changed, 440 insertions(+), 91 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java index b87ad47e3c..5759da94ba 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java @@ -96,6 +96,14 @@ public interface EamDb { return EamDbUtil.useCentralRepo() && EamDbPlatformEnum.getSelectedPlatform() != EamDbPlatformEnum.DISABLED; } + + /** + * Placeholder version to use for non-read only databases + * @return The version that will be stored in the database + */ + static String getDefaultVersion() { + return ""; + } /** * Get the list of tags recognized as "Bad" @@ -510,7 +518,7 @@ public interface EamDb { * @throws EamDbException */ void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttribute.Type correlationType) throws EamDbException; - + /** * Insert the bulk collection of Global File Instances * diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties index e802f9f9f5..3ec2961927 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties @@ -32,7 +32,6 @@ ModalNoButtons.GO_GET_COFFEE_LABEL.text=Hash databases are currently being index ModalNoButtons.CANCEL_BUTTON.text=Cancel HashDbImportDatabaseDialog.knownRadioButton.text=Known (NSRL or other) HashDbCreateDatabaseDialog.knownRadioButton.text=Known -HashDbCreateDatabaseDialog.jLabel1.text=Database Path: HashDbCreateDatabaseDialog.saveAsButton.text=Save As... HashDbCreateDatabaseDialog.hashSetNameTextField.text= HashDbImportDatabaseDialog.jLabel3.text=Database Path: @@ -231,6 +230,12 @@ HashDbImportDatabaseDialog.lbOrg.text=Source Organization: HashDbImportDatabaseDialog.readOnlyCheckbox.text=Make database read-only HashDbImportDatabaseDialog.orgButton.text=Manage Organizations HashDbImportDatabaseDialog.versionTextField.text= -HashDbImportDatabaseDialog.fileTypeRadioButton.text=File Type +HashDbImportDatabaseDialog.fileTypeRadioButton.text=File HashDbImportDatabaseDialog.centralRepoRadioButton.text=Central Repository -HashDbImportDatabaseDialog.jLabel4.text=Type: +HashDbImportDatabaseDialog.jLabel4.text=Location: +HashDbCreateDatabaseDialog.jLabel4.text=Location: +HashDbCreateDatabaseDialog.fileTypeRadioButton.text=File +HashDbCreateDatabaseDialog.centralRepoRadioButton.text=Central Repository +HashDbCreateDatabaseDialog.lbOrg.text=Source Organization: +HashDbCreateDatabaseDialog.orgButton.text=Manage Organizations +HashDbCreateDatabaseDialog.databasePathLabel.text=Database Path: diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties index 3a1eac32f4..983b48e2a7 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties @@ -27,7 +27,6 @@ ModalNoButtons.GO_GET_COFFEE_LABEL.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30 ModalNoButtons.CANCEL_BUTTON.text=\u30ad\u30e3\u30f3\u30bb\u30eb HashDbImportDatabaseDialog.knownRadioButton.text=\u65e2\u77e5\uff08NSRL\u307e\u305f\u306f\u305d\u306e\u4ed6\uff09 HashDbCreateDatabaseDialog.knownRadioButton.text=\u65e2\u77e5 -HashDbCreateDatabaseDialog.jLabel1.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a HashDbCreateDatabaseDialog.saveAsButton.text=\u540d\u524d\u3092\u3064\u3051\u3066\u4fdd\u5b58\u2026 HashDbImportDatabaseDialog.jLabel3.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a HashDbCreateDatabaseDialog.sendIngestMessagesCheckbox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b @@ -209,3 +208,4 @@ HashLookupSettingsPanel.hashDbNameLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b HashLookupSettingsPanel.nameLabel.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\uff1a HashLookupSettingsPanel.hashDatabasesLabel.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\uff1a HashLookupSettingsPanel.importDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8 +HashDbCreateDatabaseDialog.databasePathLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.form index 3e40c1861d..368903a9d6 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.form +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.form @@ -4,6 +4,8 @@ + + @@ -27,16 +29,10 @@ - + - - - - - - @@ -48,52 +44,92 @@ - - - + + + + + - - - + + + + + + + + + + + + + + + - + + + + + + + + - - + + + + + + + + + - - + + + + + + + - - - - - + + + + + + + + + + + + - + @@ -146,10 +182,10 @@ - + - + @@ -203,5 +239,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java index ab3efb8afb..9360e45aed 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java @@ -23,6 +23,7 @@ import java.awt.Toolkit; import java.io.File; import java.io.IOException; import java.nio.file.Paths; +import java.util.List; import java.util.logging.Level; import javax.swing.JFileChooser; import javax.swing.JFrame; @@ -30,12 +31,18 @@ import javax.swing.JOptionPane; import org.apache.commons.io.FilenameUtils; import org.openide.util.NbBundle; import org.openide.windows.WindowManager; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; +import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; +import org.sleuthkit.autopsy.centralrepository.optionspanel.ManageOrganizationsDialog; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb.KnownFilesType; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDbManagerException; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDatabase; +import org.sleuthkit.datamodel.TskData; +import org.sleuthkit.datamodel.TskCoreException; /** * Instances of this class allow a user to create a new hash database and add it @@ -49,6 +56,8 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { private JFileChooser fileChooser = null; private HashDatabase newHashDb = null; private final static String LAST_FILE_PATH_KEY = "HashDbCreate_Path"; + private EamOrganization selectedOrg = null; + private List orgs = null; /** * Displays a dialog that allows a user to create a new hash database and @@ -59,6 +68,7 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { super((JFrame) WindowManager.getDefault().getMainWindow(), NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.createHashDbMsg"), true); initFileChooser(); initComponents(); + enableComponents(); display(); } @@ -112,6 +122,46 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { setLocation((screenDimension.width - getSize().width) / 2, (screenDimension.height - getSize().height) / 2); setVisible(true); } + + private void enableComponents(){ + + if(! EamDb.isEnabled()){ + centralRepoRadioButton.setEnabled(false); + fileTypeRadioButton.setSelected(true); + } else { + populateCombobox(); + } + + boolean isFileType = fileTypeRadioButton.isSelected(); + + // Type type only + databasePathLabel.setEnabled(isFileType); + databasePathTextField.setEnabled(isFileType); + saveAsButton.setEnabled(isFileType); + + // Central repo only + lbOrg.setEnabled(! isFileType); + orgButton.setEnabled(! isFileType); + orgComboBox.setEnabled(! isFileType); + } + + @NbBundle.Messages({"HashDbCreateDatabaseDialog.populateOrgsError.message=Failure loading organizations."}) + private void populateCombobox() { + orgComboBox.removeAllItems(); + try { + EamDb dbManager = EamDb.getInstance(); + orgs = dbManager.getOrganizations(); + orgs.forEach((org) -> { + orgComboBox.addItem(org.getName()); + }); + if (!orgs.isEmpty()) { + selectedOrg = orgs.get(0); + } + } catch (EamDbException ex) { + JOptionPane.showMessageDialog(null, Bundle.HashDbCreateDatabaseDialog_populateOrgsError_message()); + Logger.getLogger(ImportCentralRepoDbProgressDialog.class.getName()).log(Level.SEVERE, "Failure loading organizations", ex); + } + } /** * This method is called from within the constructor to initialize the form. @@ -123,17 +173,24 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { private void initComponents() { buttonGroup1 = new javax.swing.ButtonGroup(); + storageTypeButtonGroup = new javax.swing.ButtonGroup(); saveAsButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); knownRadioButton = new javax.swing.JRadioButton(); knownBadRadioButton = new javax.swing.JRadioButton(); - jLabel1 = new javax.swing.JLabel(); + databasePathLabel = new javax.swing.JLabel(); hashSetNameTextField = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); sendIngestMessagesCheckbox = new javax.swing.JCheckBox(); jLabel3 = new javax.swing.JLabel(); databasePathTextField = new javax.swing.JTextField(); okButton = new javax.swing.JButton(); + jLabel4 = new javax.swing.JLabel(); + fileTypeRadioButton = new javax.swing.JRadioButton(); + centralRepoRadioButton = new javax.swing.JRadioButton(); + lbOrg = new javax.swing.JLabel(); + orgComboBox = new javax.swing.JComboBox<>(); + orgButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); @@ -168,7 +225,7 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { } }); - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.jLabel1.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(databasePathLabel, org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.databasePathLabel.text")); // NOI18N hashSetNameTextField.setText(org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.hashSetNameTextField.text")); // NOI18N @@ -194,6 +251,40 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { } }); + org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.jLabel4.text")); // NOI18N + + storageTypeButtonGroup.add(fileTypeRadioButton); + fileTypeRadioButton.setSelected(true); + org.openide.awt.Mnemonics.setLocalizedText(fileTypeRadioButton, org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.fileTypeRadioButton.text")); // NOI18N + fileTypeRadioButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + fileTypeRadioButtonActionPerformed(evt); + } + }); + + storageTypeButtonGroup.add(centralRepoRadioButton); + org.openide.awt.Mnemonics.setLocalizedText(centralRepoRadioButton, org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.centralRepoRadioButton.text")); // NOI18N + centralRepoRadioButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + centralRepoRadioButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(lbOrg, org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.lbOrg.text")); // NOI18N + + orgComboBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + orgComboBoxActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(orgButton, org.openide.util.NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.orgButton.text")); // NOI18N + orgButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + orgButtonActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( @@ -202,11 +293,6 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(sendIngestMessagesCheckbox) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(0, 0, Short.MAX_VALUE) - .addComponent(okButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cancelButton)) .addComponent(jLabel2) .addGroup(layout.createSequentialGroup() .addGap(20, 20, 20) @@ -216,15 +302,32 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addGroup(layout.createSequentialGroup() - .addComponent(jLabel1) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(databasePathTextField)) + .addComponent(lbOrg) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(orgComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(orgButton, javax.swing.GroupLayout.DEFAULT_SIZE, 145, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addComponent(jLabel3) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(hashSetNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel3) + .addComponent(jLabel4) + .addComponent(databasePathLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(layout.createSequentialGroup() + .addComponent(fileTypeRadioButton) + .addGap(22, 22, 22) + .addComponent(centralRepoRadioButton)) + .addComponent(hashSetNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE) + .addComponent(databasePathTextField)))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(saveAsButton))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(okButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cancelButton) .addContainerGap()) ); @@ -232,29 +335,43 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(2, 2, 2) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel4) + .addComponent(fileTypeRadioButton) + .addComponent(centralRepoRadioButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(hashSetNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(databasePathLabel) .addComponent(databasePathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(saveAsButton) - .addComponent(jLabel1)) - .addGap(7, 7, 7) + .addComponent(saveAsButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbOrg) + .addComponent(orgComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(orgButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(knownRadioButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(knownBadRadioButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(sendIngestMessagesCheckbox) - .addGap(26, 26, 26) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(cancelButton) - .addComponent(okButton)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(sendIngestMessagesCheckbox) + .addGap(0, 27, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(cancelButton) + .addComponent(okButton)))) + .addContainerGap()) ); pack(); @@ -304,6 +421,11 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { } }//GEN-LAST:event_saveAsButtonActionPerformed + @NbBundle.Messages({"HashDbCreateDatabaseDialog.missingOrg=An organization must be selected", + "HashDbCreateDatabaseDialog.duplicateName=A hashset with this name and version already exists", + "HashDbCreateDatabaseDialog.databaseLookupError=Error accessing central repository", + "HashDbCreateDatabaseDialog.databaseCreationError=Error creating new hash set" + }) 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. @@ -318,44 +440,100 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { return; } - if (databasePathTextField.getText().isEmpty()) { - JOptionPane.showMessageDialog(this, + if(fileTypeRadioButton.isSelected()){ + if (databasePathTextField.getText().isEmpty()) { + JOptionPane.showMessageDialog(this, + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.mustEnterHashDbPathMsg"), + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.createHashDbErr"), + JOptionPane.ERROR_MESSAGE); + return; + } + } else { + if(selectedOrg == null){ + JOptionPane.showMessageDialog(this, NbBundle.getMessage(this.getClass(), - "HashDbCreateDatabaseDialog.mustEnterHashDbPathMsg"), + "HashDbCreateDatabaseDialog.missingOrg"), NbBundle.getMessage(this.getClass(), "HashDbCreateDatabaseDialog.createHashDbErr"), JOptionPane.ERROR_MESSAGE); - return; + return; + } } KnownFilesType type; + TskData.FileKnown fileKnown; if (knownRadioButton.isSelected()) { type = KnownFilesType.KNOWN; + fileKnown = TskData.FileKnown.KNOWN; } else { type = KnownFilesType.KNOWN_BAD; + fileKnown = TskData.FileKnown.BAD; } String errorMessage = NbBundle .getMessage(this.getClass(), "HashDbCreateDatabaseDialog.errMsg.hashDbCreationErr"); - try { - newHashDb = HashDbManager.getInstance().addNewFileTypeHashDatabase(hashSetNameTextField.getText(), fileChooser.getSelectedFile().getCanonicalPath(), true, sendIngestMessagesCheckbox.isSelected(), type); - } catch (IOException ex) { - Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex); - JOptionPane.showMessageDialog(this, - NbBundle.getMessage(this.getClass(), - "HashDbCreateDatabaseDialog.cannotCreateFileAtLocMsg"), - NbBundle.getMessage(this.getClass(), - "HashDbCreateDatabaseDialog.createHashDbErr"), - JOptionPane.ERROR_MESSAGE); - return; - } catch (HashDbManagerException ex) { - Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex); - JOptionPane.showMessageDialog(this, - ex.getMessage(), - NbBundle.getMessage(this.getClass(), - "HashDbCreateDatabaseDialog.createHashDbErr"), - JOptionPane.ERROR_MESSAGE); - return; + if(fileTypeRadioButton.isSelected()){ + try { + newHashDb = HashDbManager.getInstance().addNewFileTypeHashDatabase(hashSetNameTextField.getText(), fileChooser.getSelectedFile().getCanonicalPath(), true, sendIngestMessagesCheckbox.isSelected(), type); + } catch (IOException ex) { + Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex); + JOptionPane.showMessageDialog(this, + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.cannotCreateFileAtLocMsg"), + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.createHashDbErr"), + JOptionPane.ERROR_MESSAGE); + return; + } catch (HashDbManagerException ex) { + Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex); + JOptionPane.showMessageDialog(this, + ex.getMessage(), + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.createHashDbErr"), + JOptionPane.ERROR_MESSAGE); + return; + } + } else { + // Check if a hash set with the same name/version already exists + try{ + if(EamDb.getInstance().referenceSetExists(hashSetNameTextField.getText(), EamDb.getDefaultVersion())){ + JOptionPane.showMessageDialog(this, + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.duplicateName"), + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.createHashDbErr"), + JOptionPane.ERROR_MESSAGE); + return; + } + } catch (EamDbException ex){ + Logger.getLogger(HashDbImportDatabaseDialog.class.getName()).log(Level.SEVERE, "Error looking up reference set", ex); + JOptionPane.showMessageDialog(this, + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.databaseLookupError"), + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.createHashDbErr"), + JOptionPane.ERROR_MESSAGE); + return; + } + + try{ + int crIndex = EamDb.getInstance().newReferenceSet(selectedOrg.getOrgID(), hashSetNameTextField.getText(), + EamDb.getDefaultVersion(), fileKnown, false); + newHashDb = HashDbManager.getInstance().addExistingCentralRepoHashSet(hashSetNameTextField.getText(), + EamDb.getDefaultVersion(), crIndex, + true, sendIngestMessagesCheckbox.isSelected(), type, false); + } catch (EamDbException | TskCoreException ex){ + Logger.getLogger(HashDbImportDatabaseDialog.class.getName()).log(Level.SEVERE, "Error creating new reference set", ex); + JOptionPane.showMessageDialog(this, + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.databaseCreationError"), + NbBundle.getMessage(this.getClass(), + "HashDbCreateDatabaseDialog.createHashDbErr"), + JOptionPane.ERROR_MESSAGE); + return; + } } dispose(); @@ -365,18 +543,52 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { // TODO add your handling code here: }//GEN-LAST:event_sendIngestMessagesCheckboxActionPerformed + private void orgButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_orgButtonActionPerformed + ManageOrganizationsDialog dialog = new ManageOrganizationsDialog(); + // update the combobox options + if (dialog.isChanged()) { + populateCombobox(); + } + }//GEN-LAST:event_orgButtonActionPerformed + + private void orgComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_orgComboBoxActionPerformed + if (null == orgComboBox.getSelectedItem()) return; + String orgName = this.orgComboBox.getSelectedItem().toString(); + for (EamOrganization org : orgs) { + if (org.getName().equals(orgName)) { + selectedOrg = org; + return; + } + } + }//GEN-LAST:event_orgComboBoxActionPerformed + + private void fileTypeRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileTypeRadioButtonActionPerformed + enableComponents(); + }//GEN-LAST:event_fileTypeRadioButtonActionPerformed + + private void centralRepoRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_centralRepoRadioButtonActionPerformed + enableComponents(); + }//GEN-LAST:event_centralRepoRadioButtonActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup buttonGroup1; private javax.swing.JButton cancelButton; + private javax.swing.JRadioButton centralRepoRadioButton; + private javax.swing.JLabel databasePathLabel; private javax.swing.JTextField databasePathTextField; + private javax.swing.JRadioButton fileTypeRadioButton; private javax.swing.JTextField hashSetNameTextField; - private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; private javax.swing.JRadioButton knownBadRadioButton; private javax.swing.JRadioButton knownRadioButton; + private javax.swing.JLabel lbOrg; private javax.swing.JButton okButton; + private javax.swing.JButton orgButton; + private javax.swing.JComboBox orgComboBox; private javax.swing.JButton saveAsButton; private javax.swing.JCheckBox sendIngestMessagesCheckbox; + private javax.swing.ButtonGroup storageTypeButtonGroup; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.form b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.form index 9a3c6acf89..682ec13c34 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.form +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.form @@ -304,6 +304,9 @@ + + + diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java index 7977360d40..6e05c372b8 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java @@ -25,7 +25,6 @@ import java.io.IOException; import java.nio.file.Paths; import java.util.List; import java.util.logging.Level; -import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; @@ -36,7 +35,6 @@ import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb; import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException; import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization; -import org.sleuthkit.autopsy.centralrepository.optionspanel.AddNewOrganizationDialog; import org.sleuthkit.autopsy.centralrepository.optionspanel.ManageOrganizationsDialog; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; @@ -120,8 +118,9 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog { boolean isFileType = fileTypeRadioButton.isSelected(); // Central repo only - lbVersion.setEnabled(! isFileType); - versionTextField.setEnabled(! isFileType); + lbVersion.setEnabled((! isFileType) && (readOnlyCheckbox.isSelected())); + versionTextField.setEnabled((! isFileType) && (readOnlyCheckbox.isSelected())); + lbOrg.setEnabled(! isFileType); orgButton.setEnabled(! isFileType); orgComboBox.setEnabled(! isFileType); @@ -258,6 +257,11 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog { readOnlyCheckbox.setSelected(true); org.openide.awt.Mnemonics.setLocalizedText(readOnlyCheckbox, org.openide.util.NbBundle.getMessage(HashDbImportDatabaseDialog.class, "HashDbImportDatabaseDialog.readOnlyCheckbox.text")); // NOI18N + readOnlyCheckbox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + readOnlyCheckboxActionPerformed(evt); + } + }); storageTypeButtonGroup.add(fileTypeRadioButton); fileTypeRadioButton.setSelected(true); @@ -534,10 +538,17 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog { return; } + String version; + if(readOnlyCheckbox.isSelected()){ + version = versionTextField.getText(); + } else { + // Editable databases don't have a version + version = EamDb.getDefaultVersion(); + } ImportCentralRepoDbProgressDialog progressDialog = new ImportCentralRepoDbProgressDialog(); - progressDialog.importFile(hashSetNameTextField.getText(), versionTextField.getText(), + progressDialog.importFile(hashSetNameTextField.getText(), version, selectedOrg.getOrgID(), true, sendIngestMessagesCheckbox.isSelected(), type, - this.readOnlyCheckbox.isSelected(), selectedFilePath); + readOnlyCheckbox.isSelected(), selectedFilePath); selectedHashDb = progressDialog.getDatabase(); } @@ -565,9 +576,6 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog { }//GEN-LAST:event_orgButtonActionPerformed private void orgComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_orgComboBoxActionPerformed - //JComboBox cb = (JComboBox)evt.getSource(); - //String orgName = (String)cb.getSelectedItem(); - if (null == orgComboBox.getSelectedItem()) return; String orgName = this.orgComboBox.getSelectedItem().toString(); for (EamOrganization org : orgs) { @@ -578,6 +586,10 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog { } }//GEN-LAST:event_orgComboBoxActionPerformed + private void readOnlyCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_readOnlyCheckboxActionPerformed + enableComponents(); + }//GEN-LAST:event_readOnlyCheckboxActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup buttonGroup1; private javax.swing.JButton cancelButton; diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbManager.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbManager.java index bd5f5b4d1b..c1dd2418ff 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbManager.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbManager.java @@ -1213,7 +1213,11 @@ public class HashDbManager implements PropertyChangeListener { @Override public String getDisplayName(){ - return getHashSetName() + " " + getVersion(); + if(! getVersion().isEmpty()){ + return getHashSetName() + " " + getVersion() + " (remote)"; + } else { + return getHashSetName() + " (remote)"; + } } public String getVersion(){ diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java index fe2e4a5757..b4129e0004 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java @@ -494,7 +494,7 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan @Override public Object getValueAt(int rowIndex, int columnIndex) { - return hashSets.get(rowIndex).getHashSetName(); + return hashSets.get(rowIndex).getDisplayName(); } private boolean isValid(int rowIndex) { @@ -921,6 +921,11 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan private void createDatabaseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createDatabaseButtonActionPerformed HashDatabase hashDb = new HashDbCreateDatabaseDialog().getHashDatabase(); if (null != hashDb) { + if(hashDb instanceof CentralRepoHashDb){ + int newDbIndex = ((CentralRepoHashDb)hashDb).getCentralRepoIndex(); + newCentralRepoIndices.add(newDbIndex); + } + hashSetTableModel.refreshModel(); ((HashSetTable) hashSetTable).selectRowByDatabase(hashDb); firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);