From d1629da229f9417355841603cbfc425f867684df Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Tue, 22 Apr 2014 12:23:30 -0400 Subject: [PATCH 1/9] Add ingest module settings serialization method stubs to IngestJobLauncher --- .../autopsy/ingest/IngestJobLauncher.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java index 48b75efe83..8a26f94280 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java @@ -84,10 +84,8 @@ public final class IngestJobLauncher { // Create ingest module templates. List moduleTemplates = new ArrayList<>(); for (IngestModuleFactory moduleFactory : moduleFactories) { - // NOTE: In the future, this code will be modified to get the - // module settings for the current context, if available, from - // storage; for now always use the defaults. - IngestModuleTemplate moduleTemplate = new IngestModuleTemplate(moduleFactory, moduleFactory.getDefaultIngestJobSettings()); + String name = moduleFactory.getClass().getCanonicalName(); + IngestModuleTemplate moduleTemplate = new IngestModuleTemplate(moduleFactory, deserializeJobSettings(moduleFactory, launcherContext)); String moduleName = moduleTemplate.getModuleName(); if (enabledModuleNames.contains(moduleName)) { moduleTemplate.setEnabled(true); @@ -151,6 +149,13 @@ public final class IngestJobLauncher { return moduleNames; } + private IngestModuleIngestJobSettings deserializeJobSettings(IngestModuleFactory moduleFactory, String context) { + return moduleFactory.getDefaultIngestJobSettings(); + } + + private void serializeJobSettings(IngestModuleFactory moduleFactory, IngestModuleIngestJobSettings settings) { + } + /** * Gets any warnings generated when the persisted ingest job configuration * for the specified context is retrieved and loaded. @@ -187,7 +192,7 @@ public final class IngestJobLauncher { enabledModuleNames.add(moduleName); } else { disabledModuleNames.add(moduleName); - } + } } ModuleSettings.setConfigSetting(launcherContext, ENABLED_INGEST_MODULES_KEY, makeCommaSeparatedList(enabledModuleNames)); ModuleSettings.setConfigSetting(launcherContext, DISABLED_INGEST_MODULES_KEY, makeCommaSeparatedList(disabledModuleNames)); @@ -195,9 +200,6 @@ public final class IngestJobLauncher { // Save the process unallocated space setting for the current context. String processUnalloc = Boolean.toString(ingestConfigPanel.getProcessUnallocSpace()); ModuleSettings.setConfigSetting(launcherContext, PARSE_UNALLOC_SPACE_KEY, processUnalloc); - - // NOTE: In the future, this code will be modified to persist the ingest - // options for each ingest module for the current launch context. } private static String makeCommaSeparatedList(HashSet input) { From 18a0c62e510347651ae70ad4c402a646f902fae5 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Tue, 22 Apr 2014 13:35:34 -0400 Subject: [PATCH 2/9] Add getVersionNumber() method to IngestModuleIngestJobSettings interface --- .../autopsy/examples/SampleModuleIngestJobSettings.java | 5 +++++ .../org/sleuthkit/autopsy/ingest/IngestJobLauncher.java | 1 - .../autopsy/ingest/IngestModuleIngestJobSettings.java | 7 +++++++ .../autopsy/ingest/NoIngestModuleIngestJobSettings.java | 5 +++++ .../FileExtMismatchDetectorModuleSettings.java | 5 +++++ .../modules/filetypeid/FileTypeIdModuleSettings.java | 7 ++++++- .../autopsy/hashdatabase/HashLookupModuleSettings.java | 5 +++++ .../autopsy/keywordsearch/KeywordSearchJobSettings.java | 5 +++++ 8 files changed, 38 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/examples/SampleModuleIngestJobSettings.java b/Core/src/org/sleuthkit/autopsy/examples/SampleModuleIngestJobSettings.java index 0a7e34d81f..83339dbc6f 100755 --- a/Core/src/org/sleuthkit/autopsy/examples/SampleModuleIngestJobSettings.java +++ b/Core/src/org/sleuthkit/autopsy/examples/SampleModuleIngestJobSettings.java @@ -46,6 +46,11 @@ public class SampleModuleIngestJobSettings implements IngestModuleIngestJobSetti this.skipKnownFiles = skipKnownFiles; } + @Override + public String getVersionNumber() { + return "1.0"; //NON-NLS + } + void setSkipKnownFiles(boolean enabled) { skipKnownFiles = enabled; } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java index 8a26f94280..dfa76487e7 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java @@ -84,7 +84,6 @@ public final class IngestJobLauncher { // Create ingest module templates. List moduleTemplates = new ArrayList<>(); for (IngestModuleFactory moduleFactory : moduleFactories) { - String name = moduleFactory.getClass().getCanonicalName(); IngestModuleTemplate moduleTemplate = new IngestModuleTemplate(moduleFactory, deserializeJobSettings(moduleFactory, launcherContext)); String moduleName = moduleTemplate.getModuleName(); if (enabledModuleNames.contains(moduleName)) { diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleIngestJobSettings.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleIngestJobSettings.java index 06e0f4b725..b68186b17f 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleIngestJobSettings.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleIngestJobSettings.java @@ -26,4 +26,11 @@ import java.io.Serializable; * between invocations of the application. */ public interface IngestModuleIngestJobSettings extends Serializable { + + /** + * Returns the version number of the settings object. + * + * @return A version number string. + */ + String getVersionNumber(); } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/NoIngestModuleIngestJobSettings.java b/Core/src/org/sleuthkit/autopsy/ingest/NoIngestModuleIngestJobSettings.java index da3ad8e5a9..4c92cfc3ee 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/NoIngestModuleIngestJobSettings.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/NoIngestModuleIngestJobSettings.java @@ -26,6 +26,11 @@ public final class NoIngestModuleIngestJobSettings implements IngestModuleIngest private final String setting = "None"; //NON-NLS + @Override + public String getVersionNumber() { + return "1.0"; //NON-NLS + } + /** * Gets the string used as an ingest options placeholder for serialization * purposes. diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java index e01d1856f0..7a88433067 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java @@ -36,6 +36,11 @@ final class FileExtMismatchDetectorModuleSettings implements IngestModuleIngestJ this.skipFilesWithTextPlainMimeType = skipFilesWithTextPlainMimeType; } + @Override + public String getVersionNumber() { + return "1.0"; //NON-NLS + } + void setSkipFilesWithNoExtension(boolean enabled) { skipFilesWithNoExtension = enabled; } diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java index 26caff787d..f62cab64dc 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleSettings.java @@ -33,7 +33,12 @@ public class FileTypeIdModuleSettings implements IngestModuleIngestJobSettings { FileTypeIdModuleSettings(boolean skipKnownFiles) { this.skipKnownFiles = skipKnownFiles; } - + + @Override + public String getVersionNumber() { + return "1.0"; //NON-NLS + } + void setSkipKnownFiles(boolean enabled) { skipKnownFiles = enabled; } diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettings.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettings.java index 38ceaa846b..76edf6c184 100755 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettings.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettings.java @@ -38,6 +38,11 @@ final class HashLookupModuleSettings implements IngestModuleIngestJobSettings { this.namesOfEnabledKnownBadHashSets.addAll(namesOfEnabledKnownBadHashSets); } + @Override + public String getVersionNumber() { + return "1.0"; //NON-NLS + } + boolean shouldCalculateHashes() { return shouldCalculateHashes; } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java index 495d171c77..729c922102 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchJobSettings.java @@ -34,6 +34,11 @@ final class KeywordSearchJobSettings implements IngestModuleIngestJobSettings { this.namesOfEnabledKeywordLists.addAll(namesOfEnabledKeywordLists); } + @Override + public String getVersionNumber() { + return "1.0"; //NON-NLS + } + boolean isKeywordListEnabled(String keywordListName) { return namesOfEnabledKeywordLists.contains(keywordListName); } From 79b87db731da3c09326968a9860d267cbac088a8 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Tue, 22 Apr 2014 15:38:20 -0400 Subject: [PATCH 3/9] Implement serialization of ingest module settings --- .../autopsy/ingest/IngestJobLauncher.java | 77 +++++++++++++++++-- .../autopsy/ingest/IngestModuleTemplate.java | 4 + 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java index dfa76487e7..6b7b88ff92 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java @@ -18,11 +18,20 @@ */ package org.sleuthkit.autopsy.ingest; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import javax.swing.JPanel; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; +import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.datamodel.Content; /** @@ -35,7 +44,11 @@ public final class IngestJobLauncher { private static final String ENABLED_INGEST_MODULES_KEY = "Enabled_Ingest_Modules"; //NON-NLS private static final String DISABLED_INGEST_MODULES_KEY = "Disabled_Ingest_Modules"; //NON-NLS private static final String PARSE_UNALLOC_SPACE_KEY = "Process_Unallocated_Space"; //NON-NLS + private static final String MODULE_SETTINGS_FOLDER_PATH = new StringBuilder(PlatformUtil.getUserConfigDirectory()).append(File.separator).append("IngestModuleSettings").toString(); //NON-NLS + private static final String MODULE_SETTINGS_FILE_EXT = ".settings"; //NON-NLS + private static final Logger logger = Logger.getLogger(IngestJobLauncher.class.getName()); private final String launcherContext; + private String moduleSettingsFolderForContext; private final List warnings = new ArrayList<>(); private IngestJobConfigurationPanel ingestConfigPanel; @@ -49,6 +62,8 @@ public final class IngestJobLauncher { public IngestJobLauncher(String launcherContext) { this.launcherContext = launcherContext; + createModuleSettingsFolderForContext(); // RJCTODO: Need failure case + // Get the ingest module factories discovered by the ingest module // loader. List moduleFactories = IngestModuleFactoryLoader.getInstance().getIngestModuleFactories(); @@ -84,7 +99,7 @@ public final class IngestJobLauncher { // Create ingest module templates. List moduleTemplates = new ArrayList<>(); for (IngestModuleFactory moduleFactory : moduleFactories) { - IngestModuleTemplate moduleTemplate = new IngestModuleTemplate(moduleFactory, deserializeJobSettings(moduleFactory, launcherContext)); + IngestModuleTemplate moduleTemplate = new IngestModuleTemplate(moduleFactory, loadJobSettings(moduleFactory)); String moduleName = moduleTemplate.getModuleName(); if (enabledModuleNames.contains(moduleName)) { moduleTemplate.setEnabled(true); @@ -116,6 +131,20 @@ public final class IngestJobLauncher { ingestConfigPanel = new IngestJobConfigurationPanel(moduleTemplates, processUnallocatedSpace); } + private boolean createModuleSettingsFolderForContext() { + StringBuilder folderPath = new StringBuilder(MODULE_SETTINGS_FOLDER_PATH); + folderPath.append(File.separator); + folderPath.append(launcherContext); + folderPath.append(File.separator); + File folder = new File(folderPath.toString()); + if (!folder.exists()) { + folder.mkdirs(); + // RJCTODO: + } + moduleSettingsFolderForContext = folder.getAbsolutePath(); + return true; + } + private HashSet getModulesNamesFromSetting(String key, String defaultSetting) { // Get the ingest modules setting from the user's config file. // If there is no such setting yet, create the default setting. @@ -147,14 +176,45 @@ public final class IngestJobLauncher { } return moduleNames; } - - private IngestModuleIngestJobSettings deserializeJobSettings(IngestModuleFactory moduleFactory, String context) { - return moduleFactory.getDefaultIngestJobSettings(); + + private IngestModuleIngestJobSettings loadJobSettings(IngestModuleFactory factory) { + IngestModuleIngestJobSettings settings = null; + File settingsFile = new File(getModuleSettingsFilePath(factory)); + if (settingsFile.exists()) { + try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(settingsFile.getAbsolutePath()))) { + settings = (IngestModuleIngestJobSettings) in.readObject(); + } catch (IOException | ClassNotFoundException ex) { + // RJCTODO + } + } + if (settings == null) { + settings = factory.getDefaultIngestJobSettings(); + } + return settings; } - private void serializeJobSettings(IngestModuleFactory moduleFactory, IngestModuleIngestJobSettings settings) { + private void saveJobSettings(IngestModuleFactory moduleFactory, IngestModuleIngestJobSettings settings) { + File settingsFile = new File(getModuleSettingsFilePath(moduleFactory)); + try { + Files.deleteIfExists(settingsFile.toPath()); + } catch (IOException ex) { + // RJCTODO + } + try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(settingsFile.getAbsolutePath()))) { + out.writeObject(settings); + } catch (IOException ex) { + // RJCTODO + } } - + + private String getModuleSettingsFilePath(IngestModuleFactory factory) { + StringBuilder filePath = new StringBuilder(this.moduleSettingsFolderForContext); + filePath.append(File.separator); + filePath.append(factory.getClass().getCanonicalName()); + filePath.append(MODULE_SETTINGS_FILE_EXT); + return filePath.toString(); + } + /** * Gets any warnings generated when the persisted ingest job configuration * for the specified context is retrieved and loaded. @@ -186,12 +246,13 @@ public final class IngestJobLauncher { HashSet enabledModuleNames = new HashSet<>(); HashSet disabledModuleNames = new HashSet<>(); for (IngestModuleTemplate moduleTemplate : moduleTemplates) { + saveJobSettings(moduleTemplate.getModuleFactory(), moduleTemplate.getModuleSettings()); String moduleName = moduleTemplate.getModuleName(); if (moduleTemplate.isEnabled()) { enabledModuleNames.add(moduleName); } else { disabledModuleNames.add(moduleName); - } + } } ModuleSettings.setConfigSetting(launcherContext, ENABLED_INGEST_MODULES_KEY, makeCommaSeparatedList(enabledModuleNames)); ModuleSettings.setConfigSetting(launcherContext, DISABLED_INGEST_MODULES_KEY, makeCommaSeparatedList(disabledModuleNames)); @@ -215,7 +276,7 @@ public final class IngestJobLauncher { csvList.append(list.get(list.size() - 1)); return csvList.toString(); } - + /** * Launches ingest jobs for one or more data sources using the ingest job * configuration for the selected context. diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleTemplate.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleTemplate.java index f536b7916e..23a55a5d01 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleTemplate.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestModuleTemplate.java @@ -33,6 +33,10 @@ final class IngestModuleTemplate { this.settings = settings; } + IngestModuleFactory getModuleFactory() { + return moduleFactory; + } + String getModuleName() { return moduleFactory.getModuleDisplayName(); } From 6cc432947b8ec8e035a3ee1e66c072c7d467b3b1 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Tue, 22 Apr 2014 16:51:27 -0400 Subject: [PATCH 4/9] Improve error handling in IngestJobLauncher --- .../autopsy/ingest/IngestJobLauncher.java | 55 +++++++++++-------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java index 6b7b88ff92..27a4781e7f 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java @@ -28,6 +28,8 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.logging.Level; +import javax.swing.JOptionPane; import javax.swing.JPanel; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; @@ -48,9 +50,9 @@ public final class IngestJobLauncher { private static final String MODULE_SETTINGS_FILE_EXT = ".settings"; //NON-NLS private static final Logger logger = Logger.getLogger(IngestJobLauncher.class.getName()); private final String launcherContext; - private String moduleSettingsFolderForContext; + private String moduleSettingsFolderForContext = null; private final List warnings = new ArrayList<>(); - private IngestJobConfigurationPanel ingestConfigPanel; + private IngestJobConfigurationPanel ingestConfigPanel = null; /** * Constructs an ingest job launcher that creates and persists an ingest job @@ -131,18 +133,21 @@ public final class IngestJobLauncher { ingestConfigPanel = new IngestJobConfigurationPanel(moduleTemplates, processUnallocatedSpace); } - private boolean createModuleSettingsFolderForContext() { - StringBuilder folderPath = new StringBuilder(MODULE_SETTINGS_FOLDER_PATH); - folderPath.append(File.separator); - folderPath.append(launcherContext); - folderPath.append(File.separator); - File folder = new File(folderPath.toString()); - if (!folder.exists()) { - folder.mkdirs(); - // RJCTODO: + private void createModuleSettingsFolderForContext() { + try { + StringBuilder folderPath = new StringBuilder(MODULE_SETTINGS_FOLDER_PATH); + folderPath.append(File.separator); + folderPath.append(launcherContext); + folderPath.append(File.separator); + File folder = new File(folderPath.toString()); + if (!folder.exists()) { + Files.createDirectories(folder.toPath()); + } + moduleSettingsFolderForContext = folder.getAbsolutePath(); + } catch (Exception ex) { + logger.log(Level.SEVERE, "Failed to create ingest module settings directory", ex); + JOptionPane.showMessageDialog(null, "Failed to create ingest module settings folder, cannot save settings.", "Ingest Job Initialization Failure", JOptionPane.ERROR_MESSAGE); } - moduleSettingsFolderForContext = folder.getAbsolutePath(); - return true; } private HashSet getModulesNamesFromSetting(String key, String defaultSetting) { @@ -184,7 +189,10 @@ public final class IngestJobLauncher { try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(settingsFile.getAbsolutePath()))) { settings = (IngestModuleIngestJobSettings) in.readObject(); } catch (IOException | ClassNotFoundException ex) { - // RJCTODO + String logMessage = String.format("Error loading ingest job settings for %s module for %s context, using defaults", factory.getModuleDisplayName(), launcherContext); + logger.log(Level.SEVERE, logMessage, ex); + String userMessage = String.format("Failed to load saved ingest job settings for %s module, using defaults.", factory.getModuleDisplayName()); + JOptionPane.showMessageDialog(null, userMessage, "Ingest Job Settings", JOptionPane.WARNING_MESSAGE); } } if (settings == null) { @@ -193,17 +201,18 @@ public final class IngestJobLauncher { return settings; } - private void saveJobSettings(IngestModuleFactory moduleFactory, IngestModuleIngestJobSettings settings) { - File settingsFile = new File(getModuleSettingsFilePath(moduleFactory)); + private void saveJobSettings(IngestModuleFactory factory, IngestModuleIngestJobSettings settings) { try { + File settingsFile = new File(getModuleSettingsFilePath(factory)); Files.deleteIfExists(settingsFile.toPath()); + try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(settingsFile.getAbsolutePath()))) { + out.writeObject(settings); + } } catch (IOException ex) { - // RJCTODO - } - try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(settingsFile.getAbsolutePath()))) { - out.writeObject(settings); - } catch (IOException ex) { - // RJCTODO + String logMessage = String.format("Error saving ingest job settings for %s module for %s context", factory.getModuleDisplayName(), launcherContext); + logger.log(Level.SEVERE, logMessage, ex); + String userMessage = String.format("Failed to save ingest job settings for %s module.", factory.getModuleDisplayName()); + JOptionPane.showMessageDialog(null, userMessage, "Ingest Job Settings", JOptionPane.WARNING_MESSAGE); } } @@ -246,7 +255,7 @@ public final class IngestJobLauncher { HashSet enabledModuleNames = new HashSet<>(); HashSet disabledModuleNames = new HashSet<>(); for (IngestModuleTemplate moduleTemplate : moduleTemplates) { - saveJobSettings(moduleTemplate.getModuleFactory(), moduleTemplate.getModuleSettings()); + saveJobSettings(moduleTemplate.getModuleFactory(), moduleTemplate.getModuleSettings()); String moduleName = moduleTemplate.getModuleName(); if (moduleTemplate.isEnabled()) { enabledModuleNames.add(moduleName); From 71212a4813bc71cf199b01ed53e9c4ff24a912ae Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 24 Apr 2014 09:25:39 -0400 Subject: [PATCH 5/9] Replace Java lib object stream with NetBeans object streams for ingest module settings serialization --- .../sleuthkit/autopsy/ingest/IngestJobLauncher.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java index 9a7043c219..84f1916f93 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java @@ -22,8 +22,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; import java.nio.file.Files; import java.util.ArrayList; import java.util.HashSet; @@ -31,6 +29,8 @@ import java.util.List; import java.util.logging.Level; import javax.swing.JOptionPane; import javax.swing.JPanel; +import org.openide.util.io.NbObjectInputStream; +import org.openide.util.io.NbObjectOutputStream; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.PlatformUtil; @@ -186,7 +186,7 @@ public final class IngestJobLauncher { IngestModuleIngestJobSettings settings = null; File settingsFile = new File(getModuleSettingsFilePath(factory)); if (settingsFile.exists()) { - try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(settingsFile.getAbsolutePath()))) { + try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(settingsFile.getAbsolutePath()))) { settings = (IngestModuleIngestJobSettings) in.readObject(); } catch (IOException | ClassNotFoundException ex) { String logMessage = String.format("Error loading ingest job settings for %s module for %s context, using defaults", factory.getModuleDisplayName(), launcherContext); @@ -203,9 +203,7 @@ public final class IngestJobLauncher { private void saveJobSettings(IngestModuleFactory factory, IngestModuleIngestJobSettings settings) { try { - File settingsFile = new File(getModuleSettingsFilePath(factory)); - Files.deleteIfExists(settingsFile.toPath()); - try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(settingsFile.getAbsolutePath()))) { + try (NbObjectOutputStream out = new NbObjectOutputStream(new FileOutputStream(getModuleSettingsFilePath(factory)))) { out.writeObject(settings); } } catch (IOException ex) { From 97032953a359e1f753f77a04eca1dab2c7211e09 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 24 Apr 2014 10:14:20 -0400 Subject: [PATCH 6/9] Make hash lookup job settings panel use settings for always calc hashes --- .../autopsy/hashdatabase/HashLookupModuleSettingsPanel.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java index cc0bcb530e..7b66179085 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java @@ -49,7 +49,7 @@ public final class HashLookupModuleSettingsPanel extends IngestModuleIngestJobSe HashLookupModuleSettingsPanel(HashLookupModuleSettings settings) { initializeHashSetModels(settings); initComponents(); - customizeComponents(); + customizeComponents(settings); } private void initializeHashSetModels(HashLookupModuleSettings settings) { @@ -65,10 +65,10 @@ public final class HashLookupModuleSettingsPanel extends IngestModuleIngestJobSe } } - private void customizeComponents() { + private void customizeComponents(HashLookupModuleSettings settings) { customizeHashSetsTable(jScrollPane1, knownHashTable, knownHashSetsTableModel); customizeHashSetsTable(jScrollPane2, knownBadHashTable, knownBadHashSetsTableModel); - alwaysCalcHashesCheckbox.setSelected(hashDbManager.getAlwaysCalculateHashes()); + alwaysCalcHashesCheckbox.setSelected(settings.shouldCalculateHashes()); hashDbManager.addPropertyChangeListener(this); } From 5addef20b4b099c75733eba1c510de28516389b3 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 24 Apr 2014 10:27:29 -0400 Subject: [PATCH 7/9] Remove obsolete HashDbManager always calc hashes code (is ingest job setting) --- .../autopsy/hashdatabase/HashDbManager.java | 35 ------------------- .../hashdatabase/HashLookupModuleFactory.java | 4 +-- .../HashLookupModuleSettingsPanel.form | 3 -- .../HashLookupModuleSettingsPanel.java | 8 ----- 4 files changed, 2 insertions(+), 48 deletions(-) diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java index 32304d47b7..19250cd4a3 100755 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashDbManager.java @@ -74,8 +74,6 @@ public class HashDbManager implements PropertyChangeListener { private static final String CONFIG_FILE_NAME = "hashsets.xml"; //NON-NLS private static final String XSD_FILE_NAME = "HashsetsSchema.xsd"; //NON-NLS private static final String ENCODING = "UTF-8"; //NON-NLS - private static final String ALWAYS_CALCULATE_HASHES_ELEMENT = "hash_calculate"; //NON-NLS - private static final String VALUE_ATTRIBUTE = "value"; //NON-NLS private static final String HASH_DATABASE_FILE_EXTENSON = "kdb"; //NON-NLS private static HashDbManager instance = null; private final String configFilePath = PlatformUtil.getUserConfigDirectory() + File.separator + CONFIG_FILE_NAME; @@ -83,7 +81,6 @@ public class HashDbManager implements PropertyChangeListener { private List knownBadHashSets = new ArrayList<>(); private Set hashSetNames = new HashSet<>(); private Set hashSetPaths = new HashSet<>(); - private boolean alwaysCalculateHashes = true; PropertyChangeSupport changeSupport = new PropertyChangeSupport(HashDbManager.class); private static final Logger logger = Logger.getLogger(HashDbManager.class.getName()); @@ -465,22 +462,6 @@ public class HashDbManager implements PropertyChangeListener { return updateableDbs; } - /** - * Sets the value for the flag that indicates whether hashes should be - * calculated for content even if no hash databases are configured. - */ - synchronized void setAlwaysCalculateHashes(boolean alwaysCalculateHashes) { - this.alwaysCalculateHashes = alwaysCalculateHashes; - } - - /** - * Gets the flag that indicates whether hashes should be calculated for - * content even if no hash databases are configured. - */ - synchronized boolean getAlwaysCalculateHashes() { - return alwaysCalculateHashes; - } - /** * Saves the hash sets configuration. Note that the configuration is only * saved on demand to support cancellation of configuration panels. @@ -529,11 +510,6 @@ public class HashDbManager implements PropertyChangeListener { writeHashDbsToDisk(doc, rootEl, knownHashSets); writeHashDbsToDisk(doc, rootEl, knownBadHashSets); - String calcValue = Boolean.toString(alwaysCalculateHashes); - Element setCalc = doc.createElement(ALWAYS_CALCULATE_HASHES_ELEMENT); - setCalc.setAttribute(VALUE_ATTRIBUTE, calcValue); - rootEl.appendChild(setCalc); - success = XMLUtil.saveDoc(HashDbManager.class, configFilePath, ENCODING, doc); } catch (ParserConfigurationException ex) { Logger.getLogger(HashDbManager.class.getName()).log(Level.SEVERE, "Error saving hash databases", ex); //NON-NLS @@ -691,17 +667,6 @@ public class HashDbManager implements PropertyChangeListener { } } - // Get the element that stores the always calculate hashes flag. - NodeList calcList = root.getElementsByTagName(ALWAYS_CALCULATE_HASHES_ELEMENT); - if (calcList.getLength() > 0) { - Element calcEl = (Element) calcList.item(0); // Shouldn't be more than one. - final String value = calcEl.getAttribute(VALUE_ATTRIBUTE); - alwaysCalculateHashes = Boolean.parseBoolean(value); - } else { - Logger.getLogger(HashDbManager.class.getName()).log(Level.WARNING, " element "); //NON-NLS - alwaysCalculateHashes = true; - } - if (updatedSchema) { String backupFilePath = configFilePath + ".v1_backup"; //NON-NLS String messageBoxTitle = NbBundle.getMessage(this.getClass(), diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java index 554c79ee33..59ed8c7694 100755 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java @@ -59,11 +59,11 @@ public class HashLookupModuleFactory extends IngestModuleFactoryAdapter { @Override public IngestModuleIngestJobSettings getDefaultIngestJobSettings() { - // All available hash sets are enabled by default. + // All available hash sets are enabled and always calculatye hashes is true by default. HashDbManager hashDbManager = HashDbManager.getInstance(); List knownHashSetNames = getHashSetNames(hashDbManager.getKnownFileHashSets()); List knownBadHashSetNames = getHashSetNames(hashDbManager.getKnownBadFileHashSets()); - return new HashLookupModuleSettings(hashDbManager.getAlwaysCalculateHashes(), knownHashSetNames, knownBadHashSetNames); + return new HashLookupModuleSettings(true, knownHashSetNames, knownBadHashSetNames); } private List getHashSetNames(List hashDbs) { diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.form b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.form index dca060b4e9..54962006e2 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.form +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.form @@ -100,9 +100,6 @@ - - - diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java index 7b66179085..414d7a1cb3 100644 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleSettingsPanel.java @@ -280,11 +280,6 @@ public final class HashLookupModuleSettingsPanel extends IngestModuleIngestJobSe knownHashDbsLabel.setText(org.openide.util.NbBundle.getMessage(HashLookupModuleSettingsPanel.class, "HashLookupModuleSettingsPanel.knownHashDbsLabel.text")); // NOI18N alwaysCalcHashesCheckbox.setText(org.openide.util.NbBundle.getMessage(HashLookupModuleSettingsPanel.class, "HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.text")); // NOI18N - alwaysCalcHashesCheckbox.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - alwaysCalcHashesCheckboxActionPerformed(evt); - } - }); jScrollPane2.setBorder(javax.swing.BorderFactory.createEtchedBorder()); @@ -336,9 +331,6 @@ public final class HashLookupModuleSettingsPanel extends IngestModuleIngestJobSe ); }// //GEN-END:initComponents - private void alwaysCalcHashesCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_alwaysCalcHashesCheckboxActionPerformed - hashDbManager.setAlwaysCalculateHashes(alwaysCalcHashesCheckbox.isSelected()); - }//GEN-LAST:event_alwaysCalcHashesCheckboxActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox alwaysCalcHashesCheckbox; private javax.swing.JScrollPane jScrollPane1; From 18a2e7b42f303dfcc3ba04c46f31d30027f3fd55 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 24 Apr 2014 10:32:51 -0400 Subject: [PATCH 8/9] Fix comment spelling error in HashLookupModuleFactory --- .../sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java index 59ed8c7694..d593c452e7 100755 --- a/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java +++ b/HashDatabase/src/org/sleuthkit/autopsy/hashdatabase/HashLookupModuleFactory.java @@ -59,7 +59,7 @@ public class HashLookupModuleFactory extends IngestModuleFactoryAdapter { @Override public IngestModuleIngestJobSettings getDefaultIngestJobSettings() { - // All available hash sets are enabled and always calculatye hashes is true by default. + // All available hash sets are enabled and always calculate hashes is true by default. HashDbManager hashDbManager = HashDbManager.getInstance(); List knownHashSetNames = getHashSetNames(hashDbManager.getKnownFileHashSets()); List knownBadHashSetNames = getHashSetNames(hashDbManager.getKnownBadFileHashSets()); From 04e2a16daf7eb5ebe332f0b8331da03242a631c9 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Thu, 24 Apr 2014 10:35:55 -0400 Subject: [PATCH 9/9] Remove obsolete TODO comment from IngestJobLauncher --- Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java index 84f1916f93..23ab80d231 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestJobLauncher.java @@ -64,7 +64,7 @@ public final class IngestJobLauncher { public IngestJobLauncher(String launcherContext) { this.launcherContext = launcherContext; - createModuleSettingsFolderForContext(); // RJCTODO: Need failure case + createModuleSettingsFolderForContext(); // Get the ingest module factories discovered by the ingest module // loader.