mirror of
https://github.com/elisspace/autopsy.git
synced 2026-09-06 02:24:30 +00:00
Merge branch 'master' of https://github.com/sleuthkit/autopsy
This commit is contained in:
39
BUILDING.txt
39
BUILDING.txt
@@ -1,3 +1,5 @@
|
||||
Last Updated: June 12, 2012
|
||||
|
||||
This file outlines what it takes to build Autopsy from source.
|
||||
|
||||
Note that it currently only works out of the box on Windows. We
|
||||
@@ -5,33 +7,49 @@ are working on getting the process working under non-WIndows systems.
|
||||
It generally works, but needs some custom mangling to find the
|
||||
correct C libraries.
|
||||
|
||||
|
||||
STEPS:
|
||||
1) Download and install 32-bit version of JDK (32-bit is currently
|
||||
1) Get Java Setup
|
||||
1a) Download and install 32-bit version of JDK (32-bit is currently
|
||||
needed even if you have a 64-bit system).
|
||||
|
||||
2) Ensure that JDK_HOME is set to the root JDK directory.
|
||||
1b) Ensure that JDK_HOME is set to the root JDK directory.
|
||||
|
||||
3) Download and install Netbeans IDE 7.0.1 (http://netbeans.org/)
|
||||
1c) Download and install Netbeans IDE 7.0.1 (http://netbeans.org/)
|
||||
|
||||
4) Download and build the release version of Libewf2 (20120304 or later). All you need is the dll file. Note that you will get a launching error if you use libewf 1.
|
||||
|
||||
2) Get Sleuth Kit Setup
|
||||
2a) Download and build the release version of Libewf2 (20120304 or later). All you need is the dll file. Note that you will get a launching error if you use libewf 1.
|
||||
- http://sourceforge.net/projects/libewf/
|
||||
|
||||
5) Set LIBEWF_HOME environment variable to root directory of LIBEWF
|
||||
2b) Set LIBEWF_HOME environment variable to root directory of LIBEWF
|
||||
|
||||
6) Download and build release version of Sleuth Kit (TSK) 4.0. You
|
||||
2c) Download and build release version of Sleuth Kit (TSK) 4.0. You
|
||||
need to build the tsk_jni project.
|
||||
- At the time of this writing, 4.0 is not released. You can get it from either
|
||||
-- GIT: git://github.com/sleuthkit/sleuthkit.git
|
||||
-- SVN: http://svn.github.com/sleuthkit/sleuthkit.git
|
||||
|
||||
7) Build the TSK JAR file by typing 'ant' in bindings/java from a
|
||||
2d) Build the TSK JAR file by typing 'ant' in bindings/java from a
|
||||
command line or by opening the project in NetBeans.
|
||||
|
||||
8) Set TSK_HOME environment variable to the root directory of TSK
|
||||
2e) Set TSK_HOME environment variable to the root directory of TSK
|
||||
|
||||
9) Start NetBean IDE and open the Autopsy project.
|
||||
|
||||
10) Choose to build the Autopsy project / module. It is the highest
|
||||
3) Get gstreamer Setup
|
||||
|
||||
If Autopsy installer is not used, add the following entries to Windows PATH environment variable
|
||||
(replace GSTREAMER_INSTALL_DIR with the location of the gstreamer root directory):
|
||||
GSTREAMER_INSTALL_DIR\bin\;
|
||||
GSTREAMER_INSTALL_DIR\lib\gstreamer-0.10\;
|
||||
If you don't have gstreamer already, you can find a zipped gstreamer distribution in
|
||||
AUTOPSYROOT/thirdparty/gstreamer
|
||||
|
||||
|
||||
4) Compile Autopsy
|
||||
4a) Start NetBean IDE and open the Autopsy project.
|
||||
|
||||
4b) Choose to build the Autopsy project / module. It is the highest
|
||||
level project that will then cause the other modules to be compiled.
|
||||
|
||||
|
||||
@@ -55,5 +73,4 @@ rebuild both the dll and the JAR file.
|
||||
|
||||
---------------
|
||||
Brian Carrier
|
||||
4/6/2012
|
||||
carrier <at> sleuthkit <dot> org
|
||||
|
||||
@@ -71,8 +71,7 @@ public final class AddImageAction extends CallableSystemAction implements Presen
|
||||
static final String LOOKUPFILES_PROP = "lookupFiles";
|
||||
// boolean: whether or not to skip processing orphan files on FAT filesystems
|
||||
static final String NOFATORPHANS_PROP = "nofatorphans";
|
||||
// boolean: whether or not to skip processing of unallocated space
|
||||
static final String NOUNALLOC_PROP = "nounalloc";
|
||||
|
||||
|
||||
static final Logger logger = Logger.getLogger(AddImageAction.class.getName());
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<Dimension value="[559, 328]"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[588, 308]"/>
|
||||
<Dimension value="[588, 328]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
@@ -28,9 +28,13 @@
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="10" pref="10" max="10" attributes="0"/>
|
||||
<Component id="noFatOrphansCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="imgTypeLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="10" pref="10" max="10" attributes="0"/>
|
||||
@@ -43,15 +47,6 @@
|
||||
<Component id="multipleSelectLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="imgInfoLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jLabel2" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="optionsLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="10" pref="10" max="10" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="noFatOrphansCheckbox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="noProcessUnallocSpace" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="103" alignment="0" groupAlignment="1" max="-2" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="1">
|
||||
<Component id="timeZoneLabel" min="-2" max="-2" attributes="0"/>
|
||||
@@ -66,8 +61,10 @@
|
||||
<Component id="imgPathBrowserButton" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Component id="optionsLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jLabel2" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<EmptySpace pref="39" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@@ -92,22 +89,21 @@
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="multipleSelectLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="timeZoneLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="timeZoneComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="optionsLabel1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="noProcessUnallocSpace" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="3" max="-2" attributes="0"/>
|
||||
<Component id="noFatOrphansCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="18" max="32767" attributes="0"/>
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="-2" pref="25" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@@ -245,16 +241,6 @@
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JCheckBox" name="noProcessUnallocSpace">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="AddImageVisualPanel1.noProcessUnallocSpace.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="noProcessUnallocSpaceActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="optionsLabel1">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
|
||||
@@ -116,14 +116,6 @@ final class AddImageVisualPanel1 extends JPanel implements DocumentListener {
|
||||
return noFatOrphansCheckbox.isSelected();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return true if no unalloc space processing is selected
|
||||
*/
|
||||
boolean getNoUnallocSpaceProcess() {
|
||||
return noProcessUnallocSpace.isSelected();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@@ -221,11 +213,10 @@ final class AddImageVisualPanel1 extends JPanel implements DocumentListener {
|
||||
timeZoneLabel = new javax.swing.JLabel();
|
||||
jLabel2 = new javax.swing.JLabel();
|
||||
noFatOrphansCheckbox = new javax.swing.JCheckBox();
|
||||
noProcessUnallocSpace = new javax.swing.JCheckBox();
|
||||
optionsLabel1 = new javax.swing.JLabel();
|
||||
|
||||
setMinimumSize(new java.awt.Dimension(559, 328));
|
||||
setPreferredSize(new java.awt.Dimension(588, 308));
|
||||
setPreferredSize(new java.awt.Dimension(588, 328));
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(rawSingle, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.rawSingle.text")); // NOI18N
|
||||
rawSingle.setRequestFocusEnabled(false);
|
||||
@@ -281,13 +272,6 @@ final class AddImageVisualPanel1 extends JPanel implements DocumentListener {
|
||||
org.openide.awt.Mnemonics.setLocalizedText(noFatOrphansCheckbox, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.noFatOrphansCheckbox.text")); // NOI18N
|
||||
noFatOrphansCheckbox.setToolTipText(org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.noFatOrphansCheckbox.toolTipText")); // NOI18N
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(noProcessUnallocSpace, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.noProcessUnallocSpace.text")); // NOI18N
|
||||
noProcessUnallocSpace.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
noProcessUnallocSpaceActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(optionsLabel1, org.openide.util.NbBundle.getMessage(AddImageVisualPanel1.class, "AddImageVisualPanel1.optionsLabel1.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
@@ -297,6 +281,9 @@ final class AddImageVisualPanel1 extends JPanel implements DocumentListener {
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(10, 10, 10)
|
||||
.addComponent(noFatOrphansCheckbox))
|
||||
.addComponent(imgTypeLabel)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(10, 10, 10)
|
||||
@@ -307,13 +294,6 @@ final class AddImageVisualPanel1 extends JPanel implements DocumentListener {
|
||||
.addComponent(multipleSelectLabel)
|
||||
.addComponent(imgInfoLabel)
|
||||
.addComponent(jLabel1)
|
||||
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(optionsLabel1)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(10, 10, 10)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(noFatOrphansCheckbox)
|
||||
.addComponent(noProcessUnallocSpace)))
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
|
||||
.addComponent(timeZoneLabel)
|
||||
@@ -324,8 +304,10 @@ final class AddImageVisualPanel1 extends JPanel implements DocumentListener {
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(imgPathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 389, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(imgPathBrowserButton))))
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addComponent(imgPathBrowserButton)))
|
||||
.addComponent(optionsLabel1)
|
||||
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addContainerGap(39, Short.MAX_VALUE))
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
@@ -347,21 +329,19 @@ final class AddImageVisualPanel1 extends JPanel implements DocumentListener {
|
||||
.addComponent(imgPathBrowserButton))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(multipleSelectLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(timeZoneLabel)
|
||||
.addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(optionsLabel1)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(noProcessUnallocSpace)
|
||||
.addGap(3, 3, 3)
|
||||
.addComponent(noFatOrphansCheckbox)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(jLabel1)
|
||||
.addContainerGap())
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 18, Short.MAX_VALUE)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(jLabel1)
|
||||
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addGap(25, 25, 25))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
@@ -473,10 +453,6 @@ final class AddImageVisualPanel1 extends JPanel implements DocumentListener {
|
||||
this.wizPanel.moveFocusToNext();
|
||||
}//GEN-LAST:event_imgPathBrowserButtonActionPerformed
|
||||
|
||||
private void noProcessUnallocSpaceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_noProcessUnallocSpaceActionPerformed
|
||||
// TODO add your handling code here:
|
||||
}//GEN-LAST:event_noProcessUnallocSpaceActionPerformed
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.ButtonGroup buttonGroup1;
|
||||
private javax.swing.JRadioButton encase;
|
||||
@@ -489,7 +465,6 @@ private void noProcessUnallocSpaceActionPerformed(java.awt.event.ActionEvent evt
|
||||
private javax.swing.JLabel jLabel2;
|
||||
private javax.swing.JLabel multipleSelectLabel;
|
||||
private javax.swing.JCheckBox noFatOrphansCheckbox;
|
||||
private javax.swing.JCheckBox noProcessUnallocSpace;
|
||||
private javax.swing.JLabel optionsLabel1;
|
||||
private static javax.swing.JRadioButton rawSingle;
|
||||
private javax.swing.JRadioButton rawSplit;
|
||||
|
||||
@@ -214,7 +214,6 @@ class AddImageWizardPanel1 implements WizardDescriptor.Panel<WizardDescriptor>,
|
||||
settings.putProperty(AddImageAction.IMGPATHS_PROP, getComponent().getImagePaths());
|
||||
settings.putProperty(AddImageAction.TIMEZONE_PROP, getComponent().getSelectedTimezone()); // store the timezone
|
||||
settings.putProperty(AddImageAction.NOFATORPHANS_PROP, Boolean.valueOf(getComponent().getNoFatOrphans()));
|
||||
settings.putProperty(AddImageAction.NOUNALLOC_PROP, Boolean.valueOf(getComponent().getNoUnallocSpaceProcess()));
|
||||
//settings.putProperty(AddImageAction.LOOKUPFILES_PROP, getComponent().getLookupFilesCheckboxChecked());
|
||||
//settings.putProperty(AddImageAction.SOLR_PROP, getComponent().getIndexImageCheckboxChecked());
|
||||
|
||||
|
||||
@@ -55,8 +55,6 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel<WizardDescriptor> {
|
||||
private String timeZone;
|
||||
//whether to not process FAT filesystem orphans
|
||||
private boolean noFatOrphans;
|
||||
//whether to not process unalloc space
|
||||
private boolean noUnallocSpace;
|
||||
// task that will clean up the created database file if the wizard is cancelled before it finishes
|
||||
private AddImageAction.CleanupTask cleanupImage; // initialized to null in readSettings()
|
||||
// flag to control the availiablity of next action
|
||||
@@ -195,7 +193,6 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel<WizardDescriptor> {
|
||||
imgPaths = (String[]) settings.getProperty(AddImageAction.IMGPATHS_PROP);
|
||||
timeZone = settings.getProperty(AddImageAction.TIMEZONE_PROP).toString();
|
||||
noFatOrphans = ((Boolean) settings.getProperty(AddImageAction.NOFATORPHANS_PROP)).booleanValue();
|
||||
noUnallocSpace = ((Boolean) settings.getProperty(AddImageAction.NOUNALLOC_PROP)).booleanValue();
|
||||
|
||||
component.changeProgressBarTextAndColor("", 0, Color.black);
|
||||
|
||||
@@ -278,7 +275,7 @@ class AddImageWizardPanel2 implements WizardDescriptor.Panel<WizardDescriptor> {
|
||||
}
|
||||
|
||||
|
||||
process = currentCase.makeAddImageProcess(timeZone, !noUnallocSpace, noFatOrphans);
|
||||
process = currentCase.makeAddImageProcess(timeZone, true, noFatOrphans);
|
||||
cancelledWhileRunning.enable();
|
||||
try {
|
||||
process.run(imgPaths);
|
||||
|
||||
@@ -126,5 +126,4 @@ NewCaseVisualPanel2.examinerTextField.text=
|
||||
NewCaseVisualPanel2.optionalLabel.text=Optional: Set Case Number and Examiner
|
||||
AddImageVisualPanel1.noFatOrphansCheckbox.toolTipText=
|
||||
AddImageVisualPanel1.noFatOrphansCheckbox.text=Ignore orphan files in FAT file systems
|
||||
AddImageVisualPanel1.noProcessUnallocSpace.text=Ignore unallocated space
|
||||
AddImageVisualPanel1.optionsLabel1.text=Options to produce results faster (although some data will not be searched):
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
OpenIDE-Module-Name=HashDatabase
|
||||
HashDatabaseManagementPanel.okayButton.text=Okay
|
||||
HashDbPanel.fileSelectButton.text=Select...\n
|
||||
HashDbSimplePanel.knownLabel.text=Known files database:
|
||||
HashDbSimplePanel.notableLabel.text=Notable files database:
|
||||
HashDbSimplePanel.knownLabel.text=NSRL Database:
|
||||
HashDbSimplePanel.notableLabel.text=Known Bad Database(s):
|
||||
HashDbSimplePanel.knownValLabel.text=-
|
||||
HashDbSimplePanel.notableValLabel.text=-
|
||||
HashDbMgmtPanel.addNotableButton.text=Add Notable Database
|
||||
HashDbMgmtPanel.addNotableButton.text=Add Known Bad Database
|
||||
HashDbMgmtPanel.removeNotableButton.text=Remove Selected
|
||||
HashDbSimplePanel.jLabel1.text=Notable Hash Databases:
|
||||
HashDbSimplePanel.jLabel2.text=NSRL Hash Database:
|
||||
HashDbMgmtPanel.nsrlNameLabel.text=No NSRL Hashset
|
||||
HashDbSimplePanel.jLabel1.text=Known Bad Database(s):
|
||||
HashDbSimplePanel.jLabel2.text=NSRL Database:
|
||||
HashDbMgmtPanel.nsrlNameLabel.text=Not Configured
|
||||
HashDbMgmtPanel.setNSRLButton.text=Change
|
||||
HashDbSimplePanel.nsrlNameLabel.text=No NSRL database set.
|
||||
HashDbMgmtPanel.jLabel1.text=Notable Hash Databases:
|
||||
HashDbMgmtPanel.jLabel1.text=Known Bad Database(s):
|
||||
HashDbMgmtPanel.jLabel2.text=NSRL Database:
|
||||
HashDbMgmtPanel.indexNSRLButton.text=Index
|
||||
HashDbMgmtPanel.removeNSRLButton.text=Remove
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="257" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="405" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
@@ -27,7 +27,7 @@
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
|
||||
<Component id="nsrlNameLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="63" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="218" max="32767" attributes="0"/>
|
||||
<Component id="indexNSRLButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="setNSRLButton" min="-2" max="-2" attributes="0"/>
|
||||
@@ -38,17 +38,17 @@
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="jScrollPane1" alignment="0" pref="389" max="32767" attributes="1"/>
|
||||
<Component id="jScrollPane1" alignment="0" pref="534" max="32767" attributes="1"/>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="addNotableButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="113" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="242" max="32767" attributes="0"/>
|
||||
<Component id="removeNotableButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="ingestRunningLabel" pref="369" max="32767" attributes="0"/>
|
||||
<Component id="ingestRunningLabel" pref="514" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
|
||||
@@ -28,9 +28,7 @@ import java.awt.Component;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.AbstractAction;
|
||||
@@ -95,9 +93,20 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
|
||||
fc.setMultiSelectionEnabled(false);
|
||||
|
||||
TableColumn column1 = null;
|
||||
final int width1 = jScrollPane1.getPreferredSize().width;
|
||||
for (int i = 0; i < notableHashSetTable.getColumnCount(); i++) {
|
||||
column1 = notableHashSetTable.getColumnModel().getColumn(i);
|
||||
if (i == 0) {
|
||||
column1.setPreferredWidth((int) (width1*.20));
|
||||
}
|
||||
if (i == 1) {
|
||||
column1.setPreferredWidth((int) (width1*.57));
|
||||
}
|
||||
if (i == 2) {
|
||||
column1.setPreferredWidth((int) (width1*.15));
|
||||
}
|
||||
if (i == 3) {
|
||||
column1.setPreferredWidth((int) (width1*.07));
|
||||
column1.setCellRenderer(new CheckBoxRenderer());
|
||||
}
|
||||
}
|
||||
@@ -223,14 +232,14 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jLabel1)
|
||||
.addContainerGap(257, Short.MAX_VALUE))
|
||||
.addContainerGap(405, Short.MAX_VALUE))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(10, 10, 10)
|
||||
.addComponent(nsrlNameLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 63, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 218, Short.MAX_VALUE)
|
||||
.addComponent(indexNSRLButton)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(setNSRLButton)
|
||||
@@ -238,16 +247,16 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
|
||||
.addComponent(removeNSRLButton))
|
||||
.addComponent(jLabel2))
|
||||
.addContainerGap())
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 389, Short.MAX_VALUE)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 534, Short.MAX_VALUE)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(addNotableButton)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 113, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 242, Short.MAX_VALUE)
|
||||
.addComponent(removeNotableButton)
|
||||
.addContainerGap())
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(ingestRunningLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 369, Short.MAX_VALUE)
|
||||
.addComponent(ingestRunningLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
@@ -443,7 +452,7 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
|
||||
case 2:
|
||||
return "Status";
|
||||
default:
|
||||
return "Use For Ingest";
|
||||
return "Ingest";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -559,7 +568,7 @@ public class HashDbMgmtPanel extends javax.swing.JPanel {
|
||||
theButton.setEnabled(false);
|
||||
break;
|
||||
default:
|
||||
theButton.setText("No DB");
|
||||
theButton.setText("Index");
|
||||
theButton.setEnabled(false);
|
||||
}
|
||||
if (ingestRunning) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.1" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.4" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
@@ -18,32 +18,28 @@
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="142" max="32767" attributes="0"/>
|
||||
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="51" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="jScrollPane1" alignment="1" pref="274" max="32767" attributes="1"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="159" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="-2" pref="53" max="-2" attributes="0"/>
|
||||
<Component id="nsrlNameLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="110" max="32767" attributes="0"/>
|
||||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="jScrollPane1" alignment="1" pref="139" max="32767" attributes="1"/>
|
||||
<Component id="jScrollPane2" alignment="0" pref="139" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="nsrlNameLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane2" min="-2" pref="20" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane1" pref="106" max="32767" attributes="0"/>
|
||||
<Component id="jScrollPane1" pref="98" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@@ -88,12 +84,30 @@
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="nsrlNameLabel">
|
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane2">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/hashdatabase/Bundle.properties" key="HashDbSimplePanel.nsrlNameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
|
||||
<EmptyBorder/>
|
||||
</Border>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTable" name="jTable1">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="f0" green="f0" red="f0" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="showHorizontalLines" type="boolean" value="false"/>
|
||||
<Property name="showVerticalLines" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
</Form>
|
||||
|
||||
@@ -24,8 +24,6 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.hashdatabase;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.table.AbstractTableModel;
|
||||
@@ -39,12 +37,14 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(HashDbSimplePanel.class.getName());
|
||||
private HashTableModel knownBadTableModel;
|
||||
private NSRLTableModel nsrlTableModel;
|
||||
private HashDb nsrl;
|
||||
private static boolean ingestRunning = false;
|
||||
|
||||
/** Creates new form HashDbSimplePanel */
|
||||
public HashDbSimplePanel() {
|
||||
knownBadTableModel = new HashTableModel();
|
||||
nsrlTableModel = new NSRLTableModel();
|
||||
initComponents();
|
||||
customizeComponents();
|
||||
}
|
||||
@@ -55,18 +55,26 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
|
||||
|
||||
private void customizeComponents() {
|
||||
notableHashTable.setModel(knownBadTableModel);
|
||||
jTable1.setModel(nsrlTableModel);
|
||||
|
||||
notableHashTable.setTableHeader(null);
|
||||
jTable1.setTableHeader(null);
|
||||
notableHashTable.setRowSelectionAllowed(false);
|
||||
jTable1.setRowSelectionAllowed(false);
|
||||
//customize column witdhs
|
||||
final int width1 = jScrollPane1.getPreferredSize().width;
|
||||
final int width2 = jScrollPane2.getPreferredSize().width;
|
||||
TableColumn column1 = null;
|
||||
TableColumn column2 = null;
|
||||
for (int i = 0; i < notableHashTable.getColumnCount(); i++) {
|
||||
column1 = notableHashTable.getColumnModel().getColumn(i);
|
||||
column2 = jTable1.getColumnModel().getColumn(i);
|
||||
if (i == 0) {
|
||||
column1.setPreferredWidth(((int) (width1 * 0.15)));
|
||||
column2.setPreferredWidth(((int) (width2 * 0.15)));
|
||||
} else {
|
||||
column1.setPreferredWidth(((int) (width1 * 0.84)));
|
||||
column2.setPreferredWidth(((int) (width2 * 0.84)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +94,8 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
|
||||
notableHashTable = new javax.swing.JTable();
|
||||
jLabel1 = new javax.swing.JLabel();
|
||||
jLabel2 = new javax.swing.JLabel();
|
||||
nsrlNameLabel = new javax.swing.JLabel();
|
||||
jScrollPane2 = new javax.swing.JScrollPane();
|
||||
jTable1 = new javax.swing.JTable();
|
||||
|
||||
jScrollPane1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
|
||||
|
||||
@@ -99,7 +108,12 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
|
||||
|
||||
jLabel2.setText(org.openide.util.NbBundle.getMessage(HashDbSimplePanel.class, "HashDbSimplePanel.jLabel2.text")); // NOI18N
|
||||
|
||||
nsrlNameLabel.setText(org.openide.util.NbBundle.getMessage(HashDbSimplePanel.class, "HashDbSimplePanel.nsrlNameLabel.text")); // NOI18N
|
||||
jScrollPane2.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
|
||||
|
||||
jTable1.setBackground(new java.awt.Color(240, 240, 240));
|
||||
jTable1.setShowHorizontalLines(false);
|
||||
jTable1.setShowVerticalLines(false);
|
||||
jScrollPane2.setViewportView(jTable1);
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
this.setLayout(layout);
|
||||
@@ -107,28 +121,25 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jLabel1)
|
||||
.addContainerGap(142, Short.MAX_VALUE))
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE)
|
||||
.addComponent(jLabel2)
|
||||
.addContainerGap(51, Short.MAX_VALUE))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jLabel2)
|
||||
.addContainerGap(159, Short.MAX_VALUE))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(53, 53, 53)
|
||||
.addComponent(nsrlNameLabel)
|
||||
.addContainerGap(110, Short.MAX_VALUE))
|
||||
.addComponent(jLabel1)
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE)
|
||||
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE)
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(jLabel2)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(nsrlNameLabel)
|
||||
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jLabel1)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 106, Short.MAX_VALUE))
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 98, Short.MAX_VALUE))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
@@ -136,19 +147,46 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
|
||||
private javax.swing.JLabel jLabel1;
|
||||
private javax.swing.JLabel jLabel2;
|
||||
private javax.swing.JScrollPane jScrollPane1;
|
||||
private javax.swing.JScrollPane jScrollPane2;
|
||||
private javax.swing.JTable jTable1;
|
||||
private javax.swing.JTable notableHashTable;
|
||||
private javax.swing.JLabel nsrlNameLabel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
private void reloadSets() {
|
||||
nsrl = HashDbXML.getCurrent().getNSRLSet();
|
||||
if(nsrl == null) {
|
||||
nsrlNameLabel.setText("No NSRL database set.");
|
||||
} else {
|
||||
nsrlNameLabel.setText(nsrl.getName());
|
||||
}
|
||||
nsrlTableModel.resync();
|
||||
knownBadTableModel.resync();
|
||||
}
|
||||
|
||||
private class NSRLTableModel extends AbstractTableModel {
|
||||
|
||||
private void resync() {
|
||||
fireTableDataChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
||||
if (columnIndex == 0) {
|
||||
return "";
|
||||
} else {
|
||||
if(nsrl == null) {
|
||||
return "Not Configured";
|
||||
} else {
|
||||
return nsrl.getName();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class HashTableModel extends AbstractTableModel {
|
||||
|
||||
@@ -175,7 +213,7 @@ public class HashDbSimplePanel extends javax.swing.JPanel {
|
||||
if (columnIndex == 0) {
|
||||
return "";
|
||||
} else {
|
||||
return "No notable databases set.";
|
||||
return "Not Configured";
|
||||
}
|
||||
} else {
|
||||
HashDb db = xmlHandle.getKnownBadSets().get(rowIndex);
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="servicesScrollPane" pref="173" max="32767" attributes="1"/>
|
||||
<Component id="servicesScrollPane" pref="169" max="32767" attributes="1"/>
|
||||
<Component id="timePanel" alignment="0" max="32767" attributes="1"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
@@ -44,7 +44,7 @@
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="jPanel1" alignment="0" pref="235" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="servicesScrollPane" pref="90" max="32767" attributes="0"/>
|
||||
<Component id="servicesScrollPane" pref="82" max="32767" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="timePanel" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
@@ -175,34 +175,30 @@
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="timeLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="68" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="timeRadioButton2" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="timeRadioButton3" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="timeLabel" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="processUnallocCheckbox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="timeRadioButton1" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="timeRadioButton3" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="timeRadioButton2" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="timeRadioButton1" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="processUnallocCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="10" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="processUnallocCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="15" max="32767" attributes="0"/>
|
||||
<Component id="timeLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="timeRadioButton1" min="-2" max="-2" attributes="0"/>
|
||||
@@ -210,7 +206,9 @@
|
||||
<Component id="timeRadioButton2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="timeRadioButton3" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="processUnallocCheckbox" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="8" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
||||
@@ -289,27 +289,25 @@ public class IngestDialogPanel extends javax.swing.JPanel implements IngestConfi
|
||||
timePanelLayout.setHorizontalGroup(
|
||||
timePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(timePanelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(timeLabel)
|
||||
.addContainerGap(68, Short.MAX_VALUE))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, timePanelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(timePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(timePanelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(timePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(timeRadioButton2)
|
||||
.addComponent(timeRadioButton3)))
|
||||
.addGroup(timePanelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(timeLabel))
|
||||
.addComponent(processUnallocCheckbox)
|
||||
.addGroup(timePanelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(timeRadioButton1)))
|
||||
.addComponent(timeRadioButton3)
|
||||
.addComponent(timeRadioButton2)
|
||||
.addComponent(timeRadioButton1))
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addGroup(timePanelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(processUnallocCheckbox)
|
||||
.addContainerGap(10, Short.MAX_VALUE))
|
||||
);
|
||||
timePanelLayout.setVerticalGroup(
|
||||
timePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, timePanelLayout.createSequentialGroup()
|
||||
.addGroup(timePanelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(processUnallocCheckbox)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 15, Short.MAX_VALUE)
|
||||
.addComponent(timeLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(timeRadioButton1)
|
||||
@@ -317,7 +315,9 @@ public class IngestDialogPanel extends javax.swing.JPanel implements IngestConfi
|
||||
.addComponent(timeRadioButton2)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(timeRadioButton3)
|
||||
.addContainerGap())
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(processUnallocCheckbox)
|
||||
.addContainerGap(8, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||
@@ -327,7 +327,7 @@ public class IngestDialogPanel extends javax.swing.JPanel implements IngestConfi
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(servicesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 173, Short.MAX_VALUE)
|
||||
.addComponent(servicesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 169, Short.MAX_VALUE)
|
||||
.addComponent(timePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
@@ -340,7 +340,7 @@ public class IngestDialogPanel extends javax.swing.JPanel implements IngestConfi
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(servicesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 90, Short.MAX_VALUE)
|
||||
.addComponent(servicesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 82, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(timePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||
.addContainerGap())
|
||||
|
||||
@@ -960,15 +960,9 @@ public class IngestManager {
|
||||
stats.start();
|
||||
|
||||
//notify main thread services started
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
for (IngestServiceAbstractFile s : AbstractFileServices) {
|
||||
IngestManager.fireServiceEvent(SERVICE_STARTED_EVT, s.getName());
|
||||
}
|
||||
}
|
||||
});
|
||||
for (IngestServiceAbstractFile s : AbstractFileServices) {
|
||||
IngestManager.fireServiceEvent(SERVICE_STARTED_EVT, s.getName());
|
||||
}
|
||||
|
||||
final String displayName = "File Ingest";
|
||||
progress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
|
||||
@@ -1041,7 +1035,10 @@ public class IngestManager {
|
||||
@Override
|
||||
protected void done() {
|
||||
try {
|
||||
Date d1 = new Date();
|
||||
super.get(); //block and get all exceptions thrown while doInBackground()
|
||||
Date d2 = new Date();
|
||||
logger.log(Level.INFO, "File ingest get() took: " + (d2.getTime()-d1.getTime()) );
|
||||
//notify services of completion
|
||||
if (!this.isCancelled()) {
|
||||
for (IngestServiceAbstractFile s : AbstractFileServices) {
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
<Property name="displayName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/ingest/Bundle.properties" key="IngestMessageTopComponent.displayName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="name" type="java.lang.String" value="Ingest Inbox" noResource="true"/>
|
||||
<Property name="name" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<PlainString value="Ingest Inbox"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||
|
||||
@@ -145,6 +145,7 @@ public final class IngestMessageTopComponent extends TopComponent implements Ing
|
||||
for (int i = 0; i < tcs.length; ++i) {
|
||||
if (tcs[i] == this) //already floating
|
||||
{
|
||||
this.open();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
Known issues and limitations
|
||||
Known Issues
|
||||
|
||||
We plan to address the following issues in future releases.
|
||||
Last Reviewed: June 12, 2012
|
||||
|
||||
General:
|
||||
- Only a single instance of the application can be started at once.
|
||||
There is no check if another instance is already running. Running a second instance will cause issues.
|
||||
- Only a single case can be opened at a time.
|
||||
|
||||
Keyword search module:
|
||||
- Keyword search maximum size of files of known types to be indexed and searched is 100MB.
|
||||
There is no limit on size of unknown file types indexed using string extraction.
|
||||
- Currently we extract only English strings from files of unknown types.
|
||||
This lists the bugs and issues thare are known and could effect
|
||||
investigation results. There are other minor interface bugs that
|
||||
are not listed here.
|
||||
|
||||
Installation:
|
||||
- Installer version currently supports only Windows OS (XP or newer),
|
||||
- Currently only 32 bit version of Autopsy is provided with the installer (works on 64 bit Windows OS)
|
||||
Keyword Search module:
|
||||
- Slack space of files is not added to the index and therefore will
|
||||
not be searched.
|
||||
- Files larger than 100MB AND that are file types that are supported
|
||||
by Tika (word docs, PDF, HTML, JPEG, etc.) are not being added to
|
||||
the index.
|
||||
- For unknown file types, we extract UTF-8 (Ascii) and UTF-16 English
|
||||
strings. No non-English strings are extracted.
|
||||
- Comments and java script in HTML files are not being added to index.
|
||||
|
||||
@@ -37,6 +37,8 @@ import org.apache.commons.lang.StringEscapeUtils;
|
||||
import org.sleuthkit.autopsy.datamodel.HighlightLookup;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
import org.sleuthkit.datamodel.Content;
|
||||
import org.sleuthkit.datamodel.ContentVisitor;
|
||||
import org.sleuthkit.datamodel.Directory;
|
||||
|
||||
/**
|
||||
* Displays marked-up (HTML) content for a Node. The sources are all the
|
||||
@@ -312,6 +314,19 @@ public class ExtractedContentViewer implements DataContentViewer {
|
||||
panel.setSources(sources);
|
||||
}
|
||||
}
|
||||
|
||||
private class IsDirVisitor extends ContentVisitor.Default<Boolean> {
|
||||
|
||||
@Override
|
||||
protected Boolean defaultVisit(Content cntnt) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean visit(Directory d) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Solr has extracted content for a given node
|
||||
@@ -323,10 +338,17 @@ public class ExtractedContentViewer implements DataContentViewer {
|
||||
if (content == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
final Server solrServer = KeywordSearch.getServer();
|
||||
|
||||
boolean isDir = content.accept(new IsDirVisitor());
|
||||
if (isDir)
|
||||
return false;
|
||||
|
||||
final long contentID = content.getId();
|
||||
|
||||
|
||||
|
||||
try {
|
||||
return solrServer.queryIsIndexed(contentID);
|
||||
|
||||
@@ -114,6 +114,7 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
if (lsm.isSelectionEmpty() || currentKeywordList.isLocked()) {
|
||||
deleteWordButton.setEnabled(false);
|
||||
return;
|
||||
} else {
|
||||
deleteWordButton.setEnabled(true);
|
||||
}
|
||||
@@ -529,6 +530,7 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
|
||||
|
||||
//add & reset checkbox
|
||||
tableModel.addKeyword(keyword);
|
||||
KeywordSearchListsXML.getCurrent().addList(currentKeywordList);
|
||||
chRegex.setSelected(false);
|
||||
addWordField.setText("");
|
||||
|
||||
@@ -584,6 +586,7 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
|
||||
|
||||
private void deleteWordButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteWordButtonActionPerformed
|
||||
tableModel.deleteSelected(keywordTable.getSelectedRows());
|
||||
KeywordSearchListsXML.getCurrent().addList(currentKeywordList);
|
||||
initButtons();
|
||||
}//GEN-LAST:event_deleteWordButtonActionPerformed
|
||||
|
||||
@@ -693,11 +696,12 @@ private void useForIngestCheckboxActionPerformed(java.awt.event.ActionEvent evt)
|
||||
listSelectionModel.setSelectionInterval(index, index);
|
||||
KeywordSearchListsXML loader = KeywordSearchListsXML.getCurrent();
|
||||
|
||||
currentKeywordList = loader.getListsL().get(index);
|
||||
currentKeywordList = loader.getListsL(false).get(index);
|
||||
tableModel.resync();
|
||||
initButtons();
|
||||
} else {
|
||||
currentKeywordList = null;
|
||||
tableModel.resync();
|
||||
initButtons();
|
||||
}
|
||||
}
|
||||
@@ -737,6 +741,9 @@ private void useForIngestCheckboxActionPerformed(java.awt.event.ActionEvent evt)
|
||||
@Override
|
||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
||||
Object ret = null;
|
||||
if(currentKeywordList == null) {
|
||||
return "";
|
||||
}
|
||||
Keyword word = currentKeywordList.getKeywords().get(rowIndex);
|
||||
switch (columnIndex) {
|
||||
case 0:
|
||||
|
||||
@@ -88,7 +88,7 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
private volatile boolean searcherDone = true;
|
||||
private Map<Keyword, List<ContentHit>> currentResults;
|
||||
private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(true); //use fairness policy
|
||||
private static final Lock searcherLock = rwLock.writeLock();
|
||||
private static final Lock searcherLock = rwLock.writeLock();
|
||||
private volatile int messageID = 0;
|
||||
private boolean processedFiles;
|
||||
private volatile boolean finalSearcherDone = true;
|
||||
@@ -99,7 +99,8 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
|
||||
private enum IngestStatus {
|
||||
|
||||
INGESTED, EXTRACTED_INGESTED, SKIPPED,};
|
||||
INGESTED, EXTRACTED_INGESTED, SKIPPED,
|
||||
};
|
||||
private Map<Long, IngestStatus> ingestStatus;
|
||||
|
||||
/**
|
||||
@@ -161,18 +162,19 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
|
||||
//logger.log(Level.INFO, "complete()");
|
||||
commitTimer.stop();
|
||||
|
||||
|
||||
//handle case if previous search running
|
||||
//cancel it, will re-run after final commit
|
||||
//note: cancellation of Searcher worker is graceful (between keywords)
|
||||
if (currentSearcher != null) {
|
||||
currentSearcher.cancel(false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//cancel searcher timer, ensure unwanted searcher does not start
|
||||
//before we start the final one
|
||||
if (searchTimer.isRunning())
|
||||
if (searchTimer.isRunning()) {
|
||||
searchTimer.stop();
|
||||
}
|
||||
runSearcher = false;
|
||||
|
||||
logger.log(Level.INFO, "Running final index commit and search");
|
||||
@@ -181,7 +183,6 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
|
||||
postIndexSummary();
|
||||
|
||||
updateKeywords();
|
||||
//run one last search as there are probably some new files committed
|
||||
if (keywords != null && !keywords.isEmpty() && processedFiles == true) {
|
||||
finalSearcher = new Searcher(keywords, true); //final searcher run
|
||||
@@ -208,10 +209,11 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
if (currentSearcher != null) {
|
||||
currentSearcher.cancel(true);
|
||||
}
|
||||
|
||||
|
||||
//cancel searcher timer, ensure unwanted searcher does not start
|
||||
if (searchTimer.isRunning())
|
||||
if (searchTimer.isRunning()) {
|
||||
searchTimer.stop();
|
||||
}
|
||||
runSearcher = false;
|
||||
finalSearcherDone = true;
|
||||
|
||||
@@ -324,8 +326,8 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
*/
|
||||
@Override
|
||||
public boolean hasBackgroundJobsRunning() {
|
||||
if ( (currentSearcher != null && searcherDone == false)
|
||||
|| (finalSearcherDone == false)) {
|
||||
if ((currentSearcher != null && searcherDone == false)
|
||||
|| (finalSearcherDone == false)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
@@ -416,34 +418,10 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the updated keyword search lists from the XML loader
|
||||
*/
|
||||
private void updateKeywords() {
|
||||
KeywordSearchListsXML loader = KeywordSearchListsXML.getCurrent();
|
||||
|
||||
searcherLock.lock();
|
||||
try {
|
||||
keywords.clear();
|
||||
keywordToList.clear();
|
||||
|
||||
for (String name : keywordLists) {
|
||||
KeywordSearchList list = loader.getList(name);
|
||||
for (Keyword k : list.getKeywords()) {
|
||||
keywords.add(k);
|
||||
keywordToList.put(k.getQuery(), list);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
searcherLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
List<String> getKeywordLists() {
|
||||
return keywordLists == null ? new ArrayList<String>() : keywordLists;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if time to commit, if so, run commit.
|
||||
* Then run search if search timer is also set.
|
||||
@@ -458,7 +436,6 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
//NOTE commit/searcher timings don't need to align
|
||||
//in worst case, we will run search next time after commit timer goes off, or at the end of ingest
|
||||
if (searcherDone && runSearcher) {
|
||||
updateKeywords();
|
||||
//start search if previous not running
|
||||
if (keywords != null && !keywords.isEmpty()) {
|
||||
currentSearcher = new Searcher(keywords);
|
||||
@@ -483,7 +460,7 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* SearchTimerAction to run by searchTimer
|
||||
* Sets a flag to indicate we are ready to search
|
||||
*/
|
||||
@@ -590,7 +567,6 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
this(keywords);
|
||||
this.finalRun = finalRun;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected Object doInBackground() throws Exception {
|
||||
@@ -621,10 +597,13 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
//make sure other searchers are not spawned
|
||||
searcherDone = false;
|
||||
runSearcher = false;
|
||||
if (searchTimer.isRunning())
|
||||
if (searchTimer.isRunning()) {
|
||||
searchTimer.stop();
|
||||
}
|
||||
|
||||
int numSearched = 0;
|
||||
|
||||
updateKeywords();
|
||||
progress.switchToDeterminate(keywords.size());
|
||||
|
||||
for (Keyword keywordQuery : keywords) {
|
||||
@@ -822,21 +801,37 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
} //end try block
|
||||
catch (Exception ex) {
|
||||
logger.log(Level.WARNING, "searcher exception occurred", ex);
|
||||
}
|
||||
finally {
|
||||
} finally {
|
||||
finalizeSearcher();
|
||||
searcherLock.unlock();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve the updated keyword search lists from the XML loader
|
||||
*/
|
||||
private void updateKeywords() {
|
||||
KeywordSearchListsXML loader = KeywordSearchListsXML.getCurrent();
|
||||
|
||||
keywords.clear();
|
||||
keywordToList.clear();
|
||||
|
||||
for (String name : keywordLists) {
|
||||
KeywordSearchList list = loader.getList(name);
|
||||
for (Keyword k : list.getKeywords()) {
|
||||
keywords.add(k);
|
||||
keywordToList.put(k.getQuery(), list);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
//perform all essential cleanup that needs to be done right AFTER doInBackground() returns
|
||||
//without relying on done() method that is not guaranteed to run after background thread completes
|
||||
//NEED to call this method always right before doInBackground() returns
|
||||
|
||||
/**
|
||||
* Performs the cleanup that needs to be done right AFTER doInBackground() returns
|
||||
* without relying on done() method that is not guaranteed to run after background thread completes
|
||||
@@ -864,12 +859,12 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
currentResults = new HashMap<Keyword, List<ContentHit>>();
|
||||
|
||||
managerProxy.postMessage(IngestMessage.createMessage(++messageID, MessageType.INFO, KeywordSearchIngestService.instance, "Completed"));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
//start counting time for a new searcher to start
|
||||
//unless final searcher is pending
|
||||
if (finalSearcher != null)
|
||||
searchTimer.start();
|
||||
if (finalSearcher != null) {
|
||||
searchTimer.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -899,7 +894,7 @@ public final class KeywordSearchIngestService implements IngestServiceAbstractFi
|
||||
void setSkipKnown(boolean skip) {
|
||||
this.skipKnown = skip;
|
||||
}
|
||||
|
||||
|
||||
boolean getSkipKnown() {
|
||||
return skipKnown;
|
||||
}
|
||||
|
||||
@@ -127,14 +127,40 @@ public abstract class KeywordSearchListsAbstract {
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
List<KeywordSearchList> getListsL(boolean locked) {
|
||||
List<KeywordSearchList> ret = new ArrayList<KeywordSearchList>();
|
||||
for (KeywordSearchList list : theLists.values()) {
|
||||
if(list.isLocked().equals(locked)) {
|
||||
ret.add(list);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* get list of all loaded keyword list names
|
||||
* Get list names of all loaded keyword list names
|
||||
* @return List of keyword list names
|
||||
*/
|
||||
List<String> getListNames() {
|
||||
return new ArrayList<String>(theLists.keySet());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list names of all locked or unlocked loaded keyword list names
|
||||
* @param locked true if look for locked lists, false otherwise
|
||||
* @return List of keyword list names
|
||||
*/
|
||||
List<String> getListNames(boolean locked) {
|
||||
ArrayList<String> lists = new ArrayList<String>();
|
||||
for (String listName : theLists.keySet()) {
|
||||
KeywordSearchList list = theLists.get(listName);
|
||||
if (locked == list.isLocked())
|
||||
lists.add(listName);
|
||||
}
|
||||
|
||||
return lists;
|
||||
}
|
||||
|
||||
/**
|
||||
* return first list that contains the keyword
|
||||
@@ -175,6 +201,21 @@ public abstract class KeywordSearchListsAbstract {
|
||||
int getNumberLists() {
|
||||
return theLists.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* get number of unlocked or locked lists currently stored
|
||||
* @param locked true if look for locked lists, false otherwise
|
||||
* @return number of unlocked lists currently stored
|
||||
*/
|
||||
int getNumberLists(boolean locked) {
|
||||
int numLists = 0;
|
||||
for (String listName : theLists.keySet()) {
|
||||
KeywordSearchList list = theLists.get(listName);
|
||||
if (locked == list.isLocked())
|
||||
++ numLists;
|
||||
}
|
||||
return numLists;
|
||||
}
|
||||
|
||||
/**
|
||||
* get list by name or null
|
||||
@@ -231,6 +272,10 @@ public abstract class KeywordSearchListsAbstract {
|
||||
boolean addList(String name, List<Keyword> newList) {
|
||||
return addList(name, newList, true, true);
|
||||
}
|
||||
|
||||
boolean addList(KeywordSearchList list) {
|
||||
return addList(list.getName(), list.getKeywords(), list.getUseForIngest(), list.getIngestMessages(), list.isLocked());
|
||||
}
|
||||
|
||||
/**
|
||||
* write out multiple lists
|
||||
|
||||
@@ -93,8 +93,6 @@ class KeywordSearchListsManagementPanel extends javax.swing.JPanel {
|
||||
listsTable.getSelectionModel().setSelectionInterval(0, 0);
|
||||
else
|
||||
listsTable.getSelectionModel().clearSelection();
|
||||
} else if (evt.getPropertyName().equals(KeywordSearchListsXML.ListsEvt.LIST_UPDATED.toString())) {
|
||||
tableModel.resync(); //changed list name
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -192,9 +190,18 @@ class KeywordSearchListsManagementPanel extends javax.swing.JPanel {
|
||||
}
|
||||
boolean shouldAdd = false;
|
||||
if (writer.listExists(listName)) {
|
||||
boolean replace = KeywordSearchUtil.displayConfirmDialog("New Keyword List", "Keyword List <" + listName + "> already exists, do you want to replace it?", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);
|
||||
if (replace) {
|
||||
shouldAdd = true;
|
||||
if (writer.getList(listName).isLocked() ) {
|
||||
boolean replace = KeywordSearchUtil.displayConfirmDialog("New Keyword List", "Keyword List <" + listName
|
||||
+ "> already exists as a read-only list. Do you want to replace it for the duration of the program (the change will not be persistent).", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);
|
||||
if (replace) {
|
||||
shouldAdd = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
boolean replace = KeywordSearchUtil.displayConfirmDialog("New Keyword List", "Keyword List <" + listName + "> already exists, do you want to replace it?", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);
|
||||
if (replace) {
|
||||
shouldAdd = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
shouldAdd = true;
|
||||
@@ -323,7 +330,7 @@ class KeywordSearchListsManagementPanel extends javax.swing.JPanel {
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return listsHandle.getNumberLists();
|
||||
return listsHandle.getNumberLists(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -333,7 +340,7 @@ class KeywordSearchListsManagementPanel extends javax.swing.JPanel {
|
||||
|
||||
@Override
|
||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
||||
return listsHandle.getListNames().get(rowIndex);
|
||||
return listsHandle.getListNames(false).get(rowIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
6
NEWS.txt
6
NEWS.txt
@@ -1,7 +1,7 @@
|
||||
3.0.0b3 (June X, 2012)
|
||||
New Features:
|
||||
3.0.0b3 (June 12, 2012)
|
||||
New Features (Funded by US Army Intelligence Center of Excellence (USAICoE)):
|
||||
- Ingest manager runs triage/ingest task after disk is added.
|
||||
- Keyword search (indexed via SOLR)
|
||||
- Basic keyword search (indexed via SOLR)
|
||||
- Recent activity extract (web artifacts, recent documents, devices, etc.)
|
||||
- Improved UI
|
||||
|
||||
|
||||
92
README.txt
92
README.txt
@@ -21,61 +21,71 @@ There is no need for manual installation of additional dependencies if the insta
|
||||
|
||||
Refer to the next section for additional info on third-party software requirements to run Autopsy without installer.
|
||||
|
||||
Refer to the KNOWN_ISSUES.txt file for known bugs that could cause investigation problems.
|
||||
|
||||
|
||||
SUPPORT
|
||||
|
||||
There is a built-in help system in Autopsy once you get it started. There is also a QuickStart Guide that came
|
||||
with the installer.
|
||||
|
||||
Send any bug reports or feature requests to the sleuthkit-users e-mail list.
|
||||
http://www.sleuthkit.org/support.php
|
||||
|
||||
|
||||
LICENSE
|
||||
|
||||
The Autopsy code is released under the Apache License, Version 2. See LICENSE-2.0.txt for details.
|
||||
|
||||
|
||||
EMBEDDED SOFTWARE
|
||||
|
||||
Autopsy (core) utilizes the following third-party software tools.
|
||||
The tools are bundled with the installer, unless specified otherwise.
|
||||
This section lists the software components and libraries that are used inside of
|
||||
Autopsy. These tools are bundled with the installer, unless specified otherwise.
|
||||
|
||||
* JRE (Java Runtime Environment) 1.6, 32 bit
|
||||
JRE (Java Runtime Environment) 1.6, 32 bit
|
||||
- Web page: http://www.oracle.com/technetwork/java/index.html
|
||||
- License: http://www.oracle.com/technetwork/java/javase/terms/license/index.html
|
||||
|
||||
Web page: http://www.oracle.com/technetwork/java/index.html
|
||||
Oracle license: http://www.oracle.com/technetwork/java/javase/terms/license/index.html
|
||||
|
||||
JRE needs to be manually installed on the system if Autopsy installer is not used.
|
||||
|
||||
* Netbeans 7.0.1 RCP platform and .jar files bundled with the platform
|
||||
|
||||
Web page: http://netbeans.org/features/platform/
|
||||
License:
|
||||
Netbeans 7.0.1 RCP platform and .jar files bundled with the platform
|
||||
- Web page: http://netbeans.org/features/platform/
|
||||
- License:
|
||||
http://services.netbeans.org/downloads/licence/nb-7.0-final-2011-04-20-license.txt
|
||||
|
||||
* Solr (including Lucene and TIKA)
|
||||
Web page: http://projects.apache.org/projects/solr.html
|
||||
Apache license: http://www.apache.org/licenses/LICENSE-2.0
|
||||
Sleuth Kit for analyzing disk images.
|
||||
- Web page: http://www.sleuthkit.org/sleuthkit/
|
||||
- License: http://sleuthkit.org/sleuthkit/licenses.php
|
||||
|
||||
* GStreamer
|
||||
Web page: http://gstreamer.freedesktop.org/
|
||||
License: http://www.gnu.org/licenses/lgpl.html
|
||||
Libewf for opening E01 files
|
||||
- Web page: http://sourceforge.net/projects/libewf/
|
||||
- License: http://www.gnu.org/licenses/lgpl.html
|
||||
|
||||
If Autopsy installer is not used, add the following entries to Windows PATH environment variable
|
||||
(replace GSTREAMER_INSTALL_DIR with the location of gstreamer install root directory):
|
||||
zlib for opening E01 files
|
||||
- Web page: http://zlib.net/
|
||||
- License: http://zlib.net/zlib_license.html
|
||||
|
||||
GSTREAMER_INSTALL_DIR\bin\;
|
||||
GSTREAMER_INSTALL_DIR\lib\gstreamer-0.10\;
|
||||
Solr (including Lucene and TIKA) for keyword search
|
||||
- Web page: http://projects.apache.org/projects/solr.html
|
||||
- License: http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
GStreamer for viewing video files
|
||||
- Web page: http://gstreamer.freedesktop.org/
|
||||
- License: http://www.gnu.org/licenses/lgpl.html
|
||||
|
||||
* GStreamer-java
|
||||
Web page: http://code.google.com/p/gstreamer-java/
|
||||
License: http://www.gnu.org/licenses/lgpl.html
|
||||
GStreamer-java for viewing video files
|
||||
- Web page: http://code.google.com/p/gstreamer-java/
|
||||
- License: http://www.gnu.org/licenses/lgpl.html
|
||||
|
||||
Regripper for pulling recently activity
|
||||
(Including custom plugins)
|
||||
- Web page: http://regripper.wordpress.com/
|
||||
- License: http://www.gnu.org/licenses/gpl.html
|
||||
|
||||
* Regripper
|
||||
(regripper and custom plugins found in autopsy/thirdparty)
|
||||
Web page: http://regripper.wordpress.com/
|
||||
License: http://www.gnu.org/licenses/gpl.html
|
||||
Pasco2 for pulling Internet Explorer activity
|
||||
- Web page: http://sourceforge.net/projects/pasco2/
|
||||
- License: http://www.gnu.org/licenses/gpl.html
|
||||
|
||||
* Pasco
|
||||
Web page: http://sourceforge.net/projects/odessa/files/Pasco/
|
||||
|
||||
* Advanced installer 9.0 (Freeware)
|
||||
Advanced installer 9.0 (Freeware)
|
||||
(not embedded in Autopsy, but used to generate Autopsy installer.)
|
||||
If you want to generate Autopsy installer, you will need to install the freeware version of Advanced Installer software)
|
||||
- Web page: http://www.advancedinstaller.com/
|
||||
|
||||
Web page: http://www.advancedinstaller.com/
|
||||
|
||||
|
||||
FEEDBACK
|
||||
|
||||
Send any bug reports or feature requests to the sleuthkit-users e-mail list.
|
||||
http://www.sleuthkit.org/support.php
|
||||
@@ -1,11 +1,28 @@
|
||||
<project name="AutopsyTSKTargets">
|
||||
<target name="copyTSKLibs">
|
||||
<property environment="env"/>
|
||||
<copy file="${env.TSK_HOME}/bindings/java/jni/.libs/libtsk_jni.dylib" tofile="${basedir}/DataModel/release/modules/lib/libtsk_jni.dylib"/>
|
||||
<!-- <copy file="${env.TSK_HOME}/win32/libewf/msvscpp/Release/libewf.dll" tofile="${basedir}/DataModel/release/modules/lib/libewf.dll"/>
|
||||
<copy file="${env.TSK_HOME}/win32/libewf/msvscpp/zlib/zlib1.dll" tofile="${basedir}/DataModel/release/modules/lib/zlib1.dll"/> -->
|
||||
<target name="testTSKLibs">
|
||||
<property environment="env"/>
|
||||
<available file="${env.TSK_HOME}/bindings/java/jni/.libs/libtsk_jni.dylib" property="tsk_dylib.present"/>
|
||||
<available file="${env.TSK_HOME}/bindings/java/jni/.libs/libtsk_jni.so" property="tsk_so.present"/>
|
||||
</target>
|
||||
<target name="copyExternalLibs">
|
||||
|
||||
<!-- OS X -->
|
||||
<target name="copyTskLibs_dylib" depends="testTSKLibs" if="tsk_dylib.present">
|
||||
<property environment="env"/>
|
||||
<copy file="${env.TSK_HOME}/bindings/java/jni/.libs/libtsk_jni.dylib" tofile="${basedir}/DataModel/release/modules/lib/libtsk_jni.jnilib"/>
|
||||
</target>
|
||||
|
||||
<!-- Non-OS X -->
|
||||
<target name="copyTskLibs_so" depends="testTSKLibs" if="tsk_so.present">
|
||||
<property environment="env"/>
|
||||
<copy file="${env.TSK_HOME}/bindings/java/jni/.libs/libtsk_jni.so" tofile="${basedir}/DataModel/release/modules/lib/libtsk_jni.so"/>
|
||||
</target>
|
||||
|
||||
<target name="copyTSKLibsToRelease" depends="copyTskLibs_so,copyTskLibs_dylib">
|
||||
<!-- depends targets take care of the actual copying since the file differs on OS X and Linux -->
|
||||
<!-- This assumes that TSK, libewf, and zlib have been installed on the system and those libraries will be with normal loading approaches -->
|
||||
</target>
|
||||
|
||||
<target name="copyExternalLibsToZip">
|
||||
</target>
|
||||
|
||||
<target name="build-installer-unix">
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<!-- Need a way to specify TSK Debug versus Release -->
|
||||
<property name="TSK_BUILD_TYPE">Release</property>
|
||||
|
||||
<target name="copyTSKLibs">
|
||||
<target name="copyTSKLibsToRelease">
|
||||
<property environment="env"/>
|
||||
<condition property="ewfFound">
|
||||
<isset property="env.LIBEWF_HOME"/>
|
||||
@@ -15,7 +15,7 @@
|
||||
<copy file="${env.LIBEWF_HOME}/msvscpp/Release/zlib.dll" tofile="${basedir}/DataModel/release/modules/lib/zlib.dll"/>
|
||||
</target>
|
||||
|
||||
<target name="copyExternalLibs">
|
||||
<target name="copyExternalLibsToZip">
|
||||
|
||||
<!-- Find CRT version we linked against from libtsk_jni manifest -->
|
||||
<property name="libtsk.manifest.path">${env.TSK_HOME}/win32/tsk_jni/${TSK_BUILD_TYPE}/libtsk_jni.dll.intermediate.manifest</property>
|
||||
@@ -44,9 +44,9 @@
|
||||
</target>
|
||||
|
||||
<target name="autoAIPath" >
|
||||
<available file="C:\Program Files (x86)\Caphyon\Advanced Installer 9.0.1\bin\x86\AdvancedInstaller.com"
|
||||
<available file="C:\Program Files (x86)\Caphyon\Advanced Installer 9.2\bin\x86\AdvancedInstaller.com"
|
||||
property="aiPath"
|
||||
value="C:\Program Files (x86)\Caphyon\Advanced Installer 9.0.1\bin\x86\AdvancedInstaller.com"/>
|
||||
value="C:\Program Files (x86)\Caphyon\Advanced Installer 9.2\bin\x86\AdvancedInstaller.com"/>
|
||||
</target>
|
||||
|
||||
<target name="inputAIPath" unless="aiPath">
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
<fail unless="jreFound" message="JRE_HOME must be set as an environment variable."/>
|
||||
</target>
|
||||
|
||||
<target name="getExternals" depends="findTSK,copyTSKLibs">
|
||||
<target name="getExternals" depends="findTSK,copyTSKLibsToRelease">
|
||||
<property environment="env"/>
|
||||
<copy file="${env.TSK_HOME}/bindings/java/dist/Tsk_DataModel.jar" tofile="${basedir}/DataModel/release/modules/ext/Tsk_DataModel.jar"/>
|
||||
<copy file="${env.TSK_HOME}/bindings/java/lib/sqlite-jdbc-3.7.2.jar" tofile="${basedir}/DataModel/release/modules/ext/sqlite-jdbc-3.7.2.jar"/>
|
||||
@@ -77,7 +77,7 @@
|
||||
<copy file="${basedir}/LICENSE-2.0.txt" tofile="${zip-tmp}/${app.name}/LICENSE-2.0.txt"/>
|
||||
<copy file="${basedir}/NEWS.txt" tofile="${zip-tmp}/${app.name}/NEWS.txt"/>
|
||||
<copy file="${basedir}/KNOWN_ISSUES.txt" tofile="${zip-tmp}/${app.name}/KNOWN_ISSUES.txt"/>
|
||||
<antcall target="copyExternalLibs"></antcall>
|
||||
<antcall target="copyExternalLibsToZip"></antcall>
|
||||
|
||||
<!-- step (4) zip again, but with the version numbers in the dir -->
|
||||
<zip destfile="${nbdist.dir}/${app.name}-${app.version}.zip">
|
||||
|
||||
@@ -883,7 +883,7 @@ GENERATE_HTML = YES
|
||||
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
|
||||
# put in front of it. If left blank `html' will be used as the default path.
|
||||
|
||||
HTML_OUTPUT =
|
||||
HTML_OUTPUT = api-docs
|
||||
|
||||
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
|
||||
# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user