diff --git a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/Bundle.properties b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/Bundle.properties
index 3732b59113..2b35b09fb2 100644
--- a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/Bundle.properties
+++ b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/Bundle.properties
@@ -1,3 +1,9 @@
OpenIDE-Module-Name=FileExtMismatch
FileExtMismatchSimpleConfigPanel.skipKnownCheckBox.text=Skip Known Files
FileExtMismatchSimpleConfigPanel.skipKnownCheckBox.toolTipText=Depending on how many files have known hashes, checking this box will improve the speed of mismatch detection.
+FileExtMismatchConfigPanel.jLabel1.text=Mime Type:
+FileExtMismatchConfigPanel.jLabel2.text=Allowed Extensions:
+FileExtMismatchConfigPanel.jButton1.text=Save
+FileExtMismatchConfigPanel.jTextField1.text=
+FileExtMismatchConfigPanel.jButton2.text=Add
+FileExtMismatchConfigPanel.jButton3.text=Remove Selected
diff --git a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchConfigPanel.form b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchConfigPanel.form
new file mode 100644
index 0000000000..8b1353fb73
--- /dev/null
+++ b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchConfigPanel.form
@@ -0,0 +1,222 @@
+
+
+
diff --git a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchConfigPanel.java b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchConfigPanel.java
new file mode 100644
index 0000000000..4cd218c81b
--- /dev/null
+++ b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchConfigPanel.java
@@ -0,0 +1,225 @@
+/*
+ * 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.fileextmismatch;
+
+import java.util.HashMap;
+import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
+
+/**
+ * Container panel for File Extension Mismatch Ingest Module advanced configuration options
+ */
+public final class FileExtMismatchConfigPanel extends javax.swing.JPanel implements OptionsPanel {
+ private HashMap editableMap = new HashMap<>();
+
+ public FileExtMismatchConfigPanel() {
+ initComponents();
+ customizeComponents();
+ }
+
+ private void customizeComponents() {
+ setName("Advanced File Extension Mismatch Configuration");
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jButton1 = new javax.swing.JButton();
+ jSplitPane1 = new javax.swing.JSplitPane();
+ mimePanel = new javax.swing.JPanel();
+ jLabel1 = new javax.swing.JLabel();
+ jScrollPane2 = new javax.swing.JScrollPane();
+ jTable2 = new javax.swing.JTable();
+ extensionPanel = new javax.swing.JPanel();
+ jTextField1 = new javax.swing.JTextField();
+ jButton2 = new javax.swing.JButton();
+ jScrollPane3 = new javax.swing.JScrollPane();
+ jTable1 = new javax.swing.JTable();
+ jButton3 = new javax.swing.JButton();
+ jLabel2 = new javax.swing.JLabel();
+
+ jButton1.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchConfigPanel.class, "FileExtMismatchConfigPanel.jButton1.text")); // NOI18N
+ jButton1.setEnabled(false);
+
+ jSplitPane1.setDividerLocation(400);
+
+ jLabel1.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchConfigPanel.class, "FileExtMismatchConfigPanel.jLabel1.text")); // NOI18N
+
+ jTable2.setModel(new javax.swing.table.DefaultTableModel(
+ new Object [][] {
+ {null, null, null, null},
+ {null, null, null, null},
+ {null, null, null, null},
+ {null, null, null, null}
+ },
+ new String [] {
+ "Title 1", "Title 2", "Title 3", "Title 4"
+ }
+ ));
+ jScrollPane2.setViewportView(jTable2);
+
+ javax.swing.GroupLayout mimePanelLayout = new javax.swing.GroupLayout(mimePanel);
+ mimePanel.setLayout(mimePanelLayout);
+ mimePanelLayout.setHorizontalGroup(
+ mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(mimePanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
+ .addGroup(mimePanelLayout.createSequentialGroup()
+ .addComponent(jLabel1)
+ .addGap(0, 144, Short.MAX_VALUE)))
+ .addContainerGap())
+ );
+ mimePanelLayout.setVerticalGroup(
+ mimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(mimePanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jLabel1)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 157, Short.MAX_VALUE))
+ );
+
+ jSplitPane1.setLeftComponent(mimePanel);
+
+ jTextField1.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchConfigPanel.class, "FileExtMismatchConfigPanel.jTextField1.text")); // NOI18N
+
+ jButton2.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchConfigPanel.class, "FileExtMismatchConfigPanel.jButton2.text")); // NOI18N
+
+ jTable1.setModel(new javax.swing.table.DefaultTableModel(
+ new Object [][] {
+ {null, null, null, null},
+ {null, null, null, null},
+ {null, null, null, null},
+ {null, null, null, null}
+ },
+ new String [] {
+ "Title 1", "Title 2", "Title 3", "Title 4"
+ }
+ ));
+ jScrollPane3.setViewportView(jTable1);
+
+ jButton3.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchConfigPanel.class, "FileExtMismatchConfigPanel.jButton3.text")); // NOI18N
+
+ jLabel2.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchConfigPanel.class, "FileExtMismatchConfigPanel.jLabel2.text")); // NOI18N
+
+ javax.swing.GroupLayout extensionPanelLayout = new javax.swing.GroupLayout(extensionPanel);
+ extensionPanel.setLayout(extensionPanelLayout);
+ extensionPanelLayout.setHorizontalGroup(
+ extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(extensionPanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
+ .addGroup(extensionPanelLayout.createSequentialGroup()
+ .addGroup(extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(extensionPanelLayout.createSequentialGroup()
+ .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jButton2))
+ .addComponent(jButton3)
+ .addComponent(jLabel2))
+ .addGap(0, 121, Short.MAX_VALUE)))
+ .addContainerGap())
+ );
+ extensionPanelLayout.setVerticalGroup(
+ extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, extensionPanelLayout.createSequentialGroup()
+ .addComponent(jLabel2)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 74, Short.MAX_VALUE)
+ .addGap(18, 18, 18)
+ .addGroup(extensionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jButton2))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jButton3)
+ .addGap(19, 19, 19))
+ );
+
+ jSplitPane1.setRightComponent(extensionPanel);
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addGap(0, 0, Short.MAX_VALUE)
+ .addComponent(jButton1)
+ .addGap(20, 20, 20))
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jSplitPane1)
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jSplitPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 18, Short.MAX_VALUE)
+ .addComponent(jButton1)
+ .addGap(15, 15, 15))
+ );
+ }// //GEN-END:initComponents
+
+ @Override
+ public void load() {
+ // Load the XML into a buffer that the user can modify. They can choose
+ // to save it back to the file after making changes.
+ editableMap = FileExtMismatchXML.getDefault().load();
+ }
+
+ @Override
+ public void store() {
+ //FileExtMismatchXML.getDefault().save(editableMap);
+ //refresh the list viewer/searcher panel
+ //FileExtMismatchXML.getDefault().resync();
+ }
+
+ public void cancel() {
+ //FileExtMismatchXML.getDefault().reload();
+ }
+
+ boolean valid() {
+ // TODO check whether form is consistent and complete
+ return true;
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel extensionPanel;
+ private javax.swing.JButton jButton1;
+ private javax.swing.JButton jButton2;
+ private javax.swing.JButton jButton3;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JScrollPane jScrollPane2;
+ private javax.swing.JScrollPane jScrollPane3;
+ private javax.swing.JSplitPane jSplitPane1;
+ private javax.swing.JTable jTable1;
+ private javax.swing.JTable jTable2;
+ private javax.swing.JTextField jTextField1;
+ private javax.swing.JPanel mimePanel;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchIngestModule.java b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchIngestModule.java
index 9848126823..65dfabd0f8 100644
--- a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchIngestModule.java
+++ b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchIngestModule.java
@@ -68,7 +68,6 @@ public class FileExtMismatchIngestModule extends org.sleuthkit.autopsy.ingest.In
private static final String ART_NAME = "TSK_MISMATCH";
private static final String ATTR_NAME = "TSK_FILE_TYPE_EXT_WRONG";
private static final byte[] ATTR_VALUE_WRONG = {1};
- private static final String CONFIG_FILENAME = "mismatch_config.xml";
private static long processTime = 0;
private static int messageId = 0;
@@ -77,6 +76,7 @@ public class FileExtMismatchIngestModule extends org.sleuthkit.autopsy.ingest.In
private int attrId = -1;
private FileExtMismatchSimpleConfigPanel simpleConfigPanel;
+ private FileExtMismatchConfigPanel advancedConfigPanel;
private IngestServices services;
private HashMap SigTypeToExtMap = new HashMap<>();
@@ -117,8 +117,7 @@ public class FileExtMismatchIngestModule extends org.sleuthkit.autopsy.ingest.In
}
// Load mapping
- final String FILTER_CONFIG_FILE = PlatformUtil.getUserConfigDirectory() + File.separator + CONFIG_FILENAME;
- FileExtMismatchXML xmlLoader = new FileExtMismatchXML(FILTER_CONFIG_FILE);
+ FileExtMismatchXML xmlLoader = FileExtMismatchXML.getDefault();
SigTypeToExtMap = xmlLoader.load();
}
@@ -241,6 +240,11 @@ public class FileExtMismatchIngestModule extends org.sleuthkit.autopsy.ingest.In
return true;
}
+ @Override
+ public boolean hasAdvancedConfiguration() {
+ return true;
+ }
+
@Override
public javax.swing.JPanel getSimpleConfiguration(String context) {
if (simpleConfigPanel == null) {
@@ -250,6 +254,24 @@ public class FileExtMismatchIngestModule extends org.sleuthkit.autopsy.ingest.In
return simpleConfigPanel;
}
+ @Override
+ public javax.swing.JPanel getAdvancedConfiguration(String context) {
+ getPanel().load();
+ return getPanel();
+ }
+
+ private FileExtMismatchConfigPanel getPanel() {
+ if (advancedConfigPanel == null) {
+ advancedConfigPanel = new FileExtMismatchConfigPanel();
+ }
+ return advancedConfigPanel;
+ }
+
+ @Override
+ public void saveAdvancedConfiguration() {
+ getPanel().store();
+ }
+
@Override
public boolean hasBackgroundJobsRunning() {
// we're single threaded...
diff --git a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchOptionsPanelController.java b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchOptionsPanelController.java
new file mode 100644
index 0000000000..6ccff0b999
--- /dev/null
+++ b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchOptionsPanelController.java
@@ -0,0 +1,88 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.sleuthkit.autopsy.fileextmismatch;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import javax.swing.JComponent;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+
+@OptionsPanelController.TopLevelRegistration(
+ categoryName = "#OptionsCategory_Name_FileExtMismatchOptions",
+iconBase = "org/sleuthkit/autopsy/fileextmismatch/options-icon.png",
+position = 4,
+keywords = "#OptionsCategory_FileExtMismatch",
+keywordsCategory = "KeywordSearchOptions")
+@org.openide.util.NbBundle.Messages({"OptionsCategory_Name_FileExtMismatchOptions=File Ext Mismatch", "OptionsCategory_FileExtMismatch=File Ext Mismatch"})
+public final class FileExtMismatchOptionsPanelController extends OptionsPanelController {
+
+ private FileExtMismatchConfigPanel panel;
+ private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
+ private boolean changed;
+
+ @Override
+ public void update() {
+ getPanel().load();
+ changed = false;
+ }
+
+ @Override
+ public void applyChanges() {
+ getPanel().store();
+ changed = false;
+ }
+
+ @Override
+ public void cancel() {
+ getPanel().cancel();
+ }
+
+ @Override
+ public boolean isValid() {
+ return getPanel().valid();
+ }
+
+ @Override
+ public boolean isChanged() {
+ return changed;
+ }
+
+ @Override
+ public HelpCtx getHelpCtx() {
+ return null; // new HelpCtx("...ID") if you have a help set
+ }
+
+ @Override
+ public JComponent getComponent(Lookup masterLookup) {
+ return getPanel();
+ }
+
+ @Override
+ public void addPropertyChangeListener(PropertyChangeListener l) {
+ pcs.addPropertyChangeListener(l);
+ }
+
+ @Override
+ public void removePropertyChangeListener(PropertyChangeListener l) {
+ pcs.removePropertyChangeListener(l);
+ }
+
+ private FileExtMismatchConfigPanel getPanel() {
+ if (panel == null) {
+ panel = new FileExtMismatchConfigPanel();
+ }
+ return panel;
+ }
+
+ void changed() {
+ if (!changed) {
+ changed = true;
+ pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true);
+ }
+ pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null);
+ }
+}
diff --git a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchXML.java b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchXML.java
index 13294c85bb..08109348d8 100644
--- a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchXML.java
+++ b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/FileExtMismatchXML.java
@@ -19,6 +19,7 @@
package org.sleuthkit.autopsy.fileextmismatch;
+import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -37,6 +38,8 @@ import org.w3c.dom.NodeList;
*/
public class FileExtMismatchXML {
private static final Logger logger = Logger.getLogger(FileExtMismatchXML.class.getName());
+ private static FileExtMismatchXML defaultInstance = null;
+
private static final String ENCODING = "UTF-8";
private static final String XSDFILE = "MismatchConfigSchema.xsd";
@@ -45,20 +48,32 @@ public class FileExtMismatchXML {
private static final String EXT_EL = "ext";
private static final String SIG_MIMETYPE_ATTR = "mimetype";
- private static final String CUR_CONFIG_FILE_NAME = "mismatch_config.xml";
-
+ private static final String DEFAULT_CONFIG_FILE_NAME = "mismatch_config.xml";
+
protected String filePath;
FileExtMismatchXML(String filePath) {
this.filePath = filePath;
-
+
try {
- boolean extracted = PlatformUtil.extractResourceToUserConfigDir(FileExtMismatchXML.class, CUR_CONFIG_FILE_NAME);
+ boolean extracted = PlatformUtil.extractResourceToUserConfigDir(FileExtMismatchXML.class, DEFAULT_CONFIG_FILE_NAME);
} catch (IOException ex) {
logger.log(Level.SEVERE, "Error copying default mismatch configuration to user dir ", ex);
}
}
+ /**
+ * Singleton provides default configuration from user's directory; user CAN
+ * modify this file.
+ */
+ public static FileExtMismatchXML getDefault() {
+ if (defaultInstance == null) {
+ final String FILTER_CONFIG_FILE = PlatformUtil.getUserConfigDirectory() + File.separator + DEFAULT_CONFIG_FILE_NAME;
+ defaultInstance = new FileExtMismatchXML(FILTER_CONFIG_FILE);
+ }
+ return defaultInstance;
+ }
+
/**
* Load and parse XML
*
diff --git a/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/options-icon.png b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/options-icon.png
new file mode 100644
index 0000000000..bbe48f31e5
Binary files /dev/null and b/FileExtMismatch/src/org/sleuthkit/autopsy/fileextmismatch/options-icon.png differ