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