diff --git a/Core/autopsy-updates.xml b/Core/autopsy-updates.xml new file mode 100644 index 0000000000..48a2898d70 --- /dev/null +++ b/Core/autopsy-updates.xml @@ -0,0 +1,16 @@ + + + + + + + + + + Visit http://sleuthkit.org/autopsy to download the latest version of Autopsy. + + + + + \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java index cdfb561ae0..469b600ac2 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageAction.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.casemodule; +import org.sleuthkit.autopsy.ingest.IngestConfigurator; import java.awt.Component; import java.awt.Dialog; import java.awt.event.ActionEvent; diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel3.java b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel3.java index 98aa035b8a..f8d2529fbf 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel3.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/AddImageWizardPanel3.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.casemodule; +import org.sleuthkit.autopsy.ingest.IngestConfigurator; import java.awt.Color; import java.awt.Component; import java.awt.EventQueue; @@ -28,6 +29,7 @@ import java.util.Collections; import java.util.List; import java.util.logging.Level; import javax.swing.JButton; +import javax.swing.JOptionPane; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; @@ -39,6 +41,7 @@ import org.sleuthkit.autopsy.casemodule.ContentTypePanel.ContentType; import org.sleuthkit.autopsy.casemodule.services.FileManager; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.PlatformUtil; +import org.sleuthkit.autopsy.ingest.IngestDialog; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.Image; @@ -86,7 +89,14 @@ class AddImageWizardPanel3 implements WizardDescriptor.Panel { this.action = action; this.wizPanel = wizPanel; ingestConfig = Lookup.getDefault().lookup(IngestConfigurator.class); - ingestConfig.setContext(AddImageWizardPanel3.class.getCanonicalName()); + List messages = ingestConfig.setContext(AddImageWizardPanel3.class.getCanonicalName()); + if (messages.isEmpty() == false) { + StringBuilder warning = new StringBuilder(); + for (String message : messages) { + warning.append(message).append("\n"); + } + JOptionPane.showMessageDialog(null, warning.toString()); + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/IngestConfigurator.java b/Core/src/org/sleuthkit/autopsy/casemodule/IngestConfigurator.java deleted file mode 100644 index 3b585b2167..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/IngestConfigurator.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2011-2013 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.casemodule; - -import java.util.List; -import javax.swing.JPanel; -import org.sleuthkit.datamodel.Content; - -/** - * Lookup interface for ingest configuration dialog - */ -public interface IngestConfigurator { - /** - * get JPanel container with the configurator - * @return - */ - JPanel getIngestConfigPanel(); - - /** - * set input Content to be configured for ingest - * @param inputContent content to be configured for ingest - */ - void setContent(List inputContent); - - /** - * start ingest enqueing previously set image - */ - void start(); - - /** - * save configuration of lastly selected service - */ - void save(); - - /** - * reload the simple panel - */ - void reload(); - - /** - * find out if ingest is currently running - * - * @return true if ingest process is running, false otherwise - */ - boolean isIngestRunning(); - - /** - * Set the context for the configuration. - * @param context - */ - public void setContext(String context); - -} diff --git a/Core/src/org/sleuthkit/autopsy/core/Bundle.properties b/Core/src/org/sleuthkit/autopsy/core/Bundle.properties index b049fd4d82..1bc91ef607 100644 --- a/Core/src/org/sleuthkit/autopsy/core/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/core/Bundle.properties @@ -8,3 +8,5 @@ OpenIDE-Module-Long-Description=\ For more information, see http://www.sleuthkit.org/autopsy/ OpenIDE-Module-Name=Autopsy-Core OpenIDE-Module-Short-Description=Autopsy Core Module +org_sleuthkit_autopsy_core_update_center=http://sleuthkit.org/autopsy/updates.xml +Services/AutoupdateType/org_sleuthkit_autopsy_core_update_center.settings=Autopsy Update Center diff --git a/Core/src/org/sleuthkit/autopsy/core/layer.xml b/Core/src/org/sleuthkit/autopsy/core/layer.xml index 3b5b8b481e..f43b8285d6 100644 --- a/Core/src/org/sleuthkit/autopsy/core/layer.xml +++ b/Core/src/org/sleuthkit/autopsy/core/layer.xml @@ -270,6 +270,13 @@ Services ====================================================== --> + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/core/org_sleuthkit_autopsy_core_update_centerSettings.xml b/Core/src/org/sleuthkit/autopsy/core/org_sleuthkit_autopsy_core_update_centerSettings.xml new file mode 100644 index 0000000000..c1dbc1e41e --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/core/org_sleuthkit_autopsy_core_update_centerSettings.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/GeneralIngestConfigurator.java b/Core/src/org/sleuthkit/autopsy/ingest/GeneralIngestConfigurator.java similarity index 55% rename from Core/src/org/sleuthkit/autopsy/casemodule/GeneralIngestConfigurator.java rename to Core/src/org/sleuthkit/autopsy/ingest/GeneralIngestConfigurator.java index ba486f33a6..696fe12d02 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/GeneralIngestConfigurator.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/GeneralIngestConfigurator.java @@ -16,8 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -package org.sleuthkit.autopsy.casemodule; +package org.sleuthkit.autopsy.ingest; import java.util.ArrayList; import java.util.List; @@ -25,87 +24,103 @@ import javax.swing.JPanel; import org.openide.util.lookup.ServiceProvider; import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.ingest.IngestDialogPanel; -import static org.sleuthkit.autopsy.ingest.IngestDialogPanel.DISABLED_MOD; -import static org.sleuthkit.autopsy.ingest.IngestDialogPanel.PARSE_UNALLOC; import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestModuleAbstract; import org.sleuthkit.datamodel.Content; @ServiceProvider(service = IngestConfigurator.class) -public class GeneralIngestConfigurator implements IngestConfigurator { +public class GeneralIngestConfigurator implements IngestConfigurator { + + public static final String ENABLED_INGEST_MODULES_KEY = "Enabled_Ingest_Modules"; + public static final String PARSE_UNALLOC_SPACE_KEY = "Process_Unallocated_Space"; private List contentToIngest; private IngestManager manager; private IngestDialogPanel ingestDialogPanel; private String moduleContext; public GeneralIngestConfigurator() { - this.moduleContext = IngestManager.MODULE_PROPERTIES; // Hard-code this for now. + this.moduleContext = IngestManager.MODULE_PROPERTIES; ingestDialogPanel = new IngestDialogPanel(); ingestDialogPanel.setContext(moduleContext); manager = IngestManager.getDefault(); - loadSettings(); } @Override - public void setContext(String context) { + public List setContext(String context) { moduleContext = context; ingestDialogPanel.setContext(moduleContext); - reload(); + return loadSettingsForContext(); } + + private List loadSettingsForContext() { + List messages = new ArrayList<>(); + + // If there is no enabled ingest modules setting for this user, default to enabling all + // of the ingest modules the IngestManager has loaded. + if (ModuleSettings.settingExists(moduleContext, ENABLED_INGEST_MODULES_KEY) == false) { + String defaultSetting = moduleListToCsv(IngestManager.getDefault().enumerateAllModules()); + ModuleSettings.setConfigSetting(moduleContext, ENABLED_INGEST_MODULES_KEY, defaultSetting); + } + + // Get the enabled ingest modules setting, check for missing modules, and pass the setting to + // the UI component. + List allModules = IngestManager.getDefault().enumerateAllModules(); + String[] enabledModuleNames = ModuleSettings.getConfigSetting(moduleContext, ENABLED_INGEST_MODULES_KEY).split(", "); + List enabledModules = new ArrayList<>(); + for (String moduleName : enabledModuleNames) { + IngestModuleAbstract moduleFound = null; + for (IngestModuleAbstract module : allModules) { + if (moduleName.equals(module.getName())) { + moduleFound = module; + break; + } + } + if (moduleFound != null) { + enabledModules.add(moduleFound); + } + else { + messages.add("Unable to load " + moduleName + " module"); + } + } + ingestDialogPanel.setEnabledIngestModules(enabledModules); + + // If there is no process unallocated space flag setting, default it to false. + if (ModuleSettings.settingExists(moduleContext, PARSE_UNALLOC_SPACE_KEY) == false) { + ModuleSettings.setConfigSetting(moduleContext, PARSE_UNALLOC_SPACE_KEY, "false"); + } + + // Get the process unallocated space flag setting and pass it to the UI component. + boolean processUnalloc = Boolean.parseBoolean(ModuleSettings.getConfigSetting(moduleContext, PARSE_UNALLOC_SPACE_KEY)); + ingestDialogPanel.setProcessUnallocSpaceEnabled(processUnalloc); + + return messages; + } + + @Override + public JPanel getIngestConfigPanel() { + // Note that this panel allows for selecting modules for the ingest process, + // specifying the process unallocated space flag, and also specifying settings + // for a selected ingest module. + return ingestDialogPanel; + } @Override - public JPanel getIngestConfigPanel() { - return ingestDialogPanel; - } - - @Override - public void setContent(List inputContent) { - this.contentToIngest = inputContent; - } - - @Override - public void start() { - // Get the list of ingest modules selected by the user. - List modulesToStart = ingestDialogPanel.getModulesToStart(); + public void save() { + // Save the user's configuration of the set of enabled ingest modules. + String enabledModulesCsvList = moduleListToCsv(ingestDialogPanel.getModulesToStart()); + ModuleSettings.setConfigSetting(moduleContext, ENABLED_INGEST_MODULES_KEY, enabledModulesCsvList); - // Get the user's selection of whether or not to process unallocated space. - manager.setProcessUnallocSpace(ingestDialogPanel.processUnallocSpaceEnabled()); - - // Start the ingest. - if (!modulesToStart.isEmpty()) { - manager.execute(modulesToStart, contentToIngest); - } - } - - @Override - public void save() { - // Save the user's configuration of the currently selected module. + // Save the user's setting for the process unallocated space flag. + String processUnalloc = Boolean.toString(ingestDialogPanel.processUnallocSpaceEnabled()); + ModuleSettings.setConfigSetting(moduleContext, PARSE_UNALLOC_SPACE_KEY, processUnalloc); + + // Save the user's configuration of the currently selected ingest module. IngestModuleAbstract currentModule = ingestDialogPanel.getCurrentIngestModule(); if (currentModule != null && currentModule.hasSimpleConfiguration()) { currentModule.saveSimpleConfiguration(); - } - - // Create a list of the modules the user wants to be disabled. - List disabledModules = IngestManager.getDefault().enumerateAllModules(); - disabledModules.removeAll(ingestDialogPanel.getModulesToStart()); - String disabledModulesCsv = moduleListToCsv(disabledModules); - - // Save the user's general ingest configuration. - ModuleSettings.setConfigSetting(moduleContext, DISABLED_MOD, disabledModulesCsv); - String processUnalloc = Boolean.toString(ingestDialogPanel.processUnallocSpaceEnabled()); - ModuleSettings.setConfigSetting(moduleContext, PARSE_UNALLOC, processUnalloc); + } } - @Override - public void reload() { - loadSettings(); - } - - @Override - public boolean isIngestRunning() { - return manager.isIngestRunning(); - } - private static String moduleListToCsv(List lst) { if (lst == null || lst.isEmpty()) { return ""; @@ -121,39 +136,28 @@ public class GeneralIngestConfigurator implements IngestConfigurator { return sb.toString(); } - - private static List csvToModuleList(String csv) { - List modules = new ArrayList<>(); - if (csv == null || csv.isEmpty()) { - return modules; - } - - String[] moduleNames = csv.split(", "); - List allModules = IngestManager.getDefault().enumerateAllModules(); - for (String moduleName : moduleNames) { - for (IngestModuleAbstract module : allModules) { - if (moduleName.equals(module.getName())) { - modules.add(module); - break; - } - } - } - - return modules; + @Override + public void setContent(List inputContent) { + this.contentToIngest = inputContent; } - private void loadSettings() { - // get the csv list of disabled modules - String disabledModulesCsv = ModuleSettings.getConfigSetting(moduleContext, DISABLED_MOD); + @Override + public void start() { + // Get the list of ingest modules selected by the user. + List modulesToStart = ingestDialogPanel.getModulesToStart(); - // create a list of modules from it - List disabledModules = csvToModuleList(disabledModulesCsv); - - // tell the ingestDialogPanel to unselect these modules - ingestDialogPanel.setDisabledModules(disabledModules); - - boolean processUnalloc = Boolean.parseBoolean(ModuleSettings.getConfigSetting(moduleContext, PARSE_UNALLOC)); - ingestDialogPanel.setProcessUnallocSpaceEnabled(processUnalloc); + // Get the user's selection of whether or not to process unallocated space. + manager.setProcessUnallocSpace(ingestDialogPanel.processUnallocSpaceEnabled()); + + if (!modulesToStart.isEmpty() && contentToIngest != null) { + // Queue the ingest process. + manager.execute(modulesToStart, contentToIngest); + } } + + @Override + public boolean isIngestRunning() { + return manager.isIngestRunning(); + } } diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestConfigurator.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestConfigurator.java new file mode 100644 index 0000000000..94ef6924b9 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestConfigurator.java @@ -0,0 +1,84 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2011-2013 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.ingest; + +import java.util.List; +import javax.swing.JPanel; +import org.sleuthkit.datamodel.Content; + +/** + * Instances of this class provide the following services: + * 1. A way to save and load the ingest process configuration settings for a + * given ingest process context. + * 2. A UI component for configuring ingest process settings. + * 3. A way to specify input content and start the ingest process for a + * given ingest process context. + */ +// @@@ This interface needs to be re-designed. An interface for allowing the +// authors of ingest modules to expose context sensitive module configuration +// settings needs to be provided; there also needs to be a way for users to +// configure the ingest process that uses those modules. These are separate +// concerns; likewise, kicking off an ingest process for particular content in +// a particular context is a separate concern. +public interface IngestConfigurator { + /** + * Specifies the ingest process context for the purpose of choosing, saving, + * and loading ingest process configuration settings; also determines what + * configuration settings will be in effect if the setContent() and start() + * methods are called to start the ingest process for some content specified + * using the setContent() method. + * @return A list, possibly empty, of messages describing errors that + * occurred when loading the configuration settings. + */ + public List setContext(String contextName); + + /** + * Provides a UI component for choosing ingest process configuration + * settings for the ingest process context specified using the setContext() + * method. + */ + JPanel getIngestConfigPanel(); + + /** + * Saves the ingest process configuration settings for the ingest process + * context specified using the setContext() method. + */ + void save(); + + /** + * Sets the input content for an ingest process prior to calling start() to + * run the process using the process configuration settings for the context + * specified using setContext(). + */ + void setContent(List inputContent); + + /** + * Starts (queues) the ingest process for the content specified using the + * setContent() method, using the configuration settings corresponding to + * the ingest process context specified using the setContext() method. + */ + void start(); + + /** + * Returns true if any ingest process is running, false otherwise. + * Note that the running process may or may not be the process started + * (queued) by an invocation of the start() method. + */ + boolean isIngestRunning(); +} diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestDialog.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestDialog.java index 5305700839..fb68c15a5e 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestDialog.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestDialog.java @@ -30,11 +30,9 @@ import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; +import javax.swing.JOptionPane; import javax.swing.JPanel; -import org.openide.util.Lookup; -import org.sleuthkit.autopsy.casemodule.GeneralIngestConfigurator; import org.sleuthkit.datamodel.Content; -import org.sleuthkit.autopsy.casemodule.IngestConfigurator; /** * Dialog box that allows ingest modules to be run on an image. @@ -49,8 +47,14 @@ public class IngestDialog extends JDialog { public IngestDialog(JFrame frame, String title, boolean modal) { super(frame, title, modal); ingestConfigurator = new GeneralIngestConfigurator(); - ingestConfigurator.setContext(IngestDialog.class.getCanonicalName()); - ingestConfigurator.reload(); + List messages = ingestConfigurator.setContext(IngestDialog.class.getCanonicalName()); + if (messages.isEmpty() == false) { + StringBuilder warning = new StringBuilder(); + for (String message : messages) { + warning.append(message).append("\n"); + } + JOptionPane.showMessageDialog(null, warning.toString()); + } } public IngestDialog(){ diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestDialogPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestDialogPanel.java index b5308da4ce..331c727576 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestDialogPanel.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestDialogPanel.java @@ -44,8 +44,6 @@ public class IngestDialogPanel extends javax.swing.JPanel { private IngestModuleAbstract currentModule; private ModulesTableModel tableModel; - public static final String DISABLED_MOD = "Disabled_Ingest_Modules"; - public static final String PARSE_UNALLOC = "Process_Unallocated_Space"; private String context; /** @@ -123,8 +121,8 @@ public class IngestDialogPanel extends javax.swing.JPanel { processUnallocCheckbox.setSelected(enabled); } - public void setDisabledModules(List disabledModules) { - tableModel.setUnselectedModules(disabledModules); + public void setEnabledIngestModules(List enabledModules) { + tableModel.setSelectedModules(enabledModules); } /** @@ -407,7 +405,7 @@ public class IngestDialogPanel extends javax.swing.JPanel { } /** - * Custom cell renderer for tooltips with module description + * Custom cell renderer for tool tips with module description */ private class ModulesTableRenderer extends DefaultTableCellRenderer { diff --git a/Timeline/build.xml b/Timeline/build.xml index 0b43f629cf..15db18b5b7 100644 --- a/Timeline/build.xml +++ b/Timeline/build.xml @@ -28,6 +28,6 @@ - +