Merge branch 'develop' of https://github.com/sleuthkit/autopsy into 2462-UnableToDeleteCases

This commit is contained in:
William Schaefer 2017-04-07 18:36:22 -04:00
commit 8b868d028e
957 changed files with 4804 additions and 35642 deletions

17
.gitignore vendored
View File

@ -3,8 +3,7 @@
/*/build/ /*/build/
*/nbproject/private/* */nbproject/private/*
/nbproject/private/* /nbproject/private/*
/Core/release/modules/lib/ /Core/release/
/Core/release/modules/ext/
/Core/src/org/sleuthkit/autopsy/coreutils/Version.properties /Core/src/org/sleuthkit/autopsy/coreutils/Version.properties
/Core/build/ /Core/build/
/Core/dist/ /Core/dist/
@ -18,11 +17,7 @@
/CoreLibs/nbproject/* /CoreLibs/nbproject/*
!/CoreLibs/nbproject/project.xml !/CoreLibs/nbproject/project.xml
!/CoreLibs/nbproject/project.properties !/CoreLibs/nbproject/project.properties
/KeywordSearch/release/modules/ext/ /KeywordSearch/release/
/KeywordSearch/release/solr/lib/
/KeywordSearch/release/solr/solr/lib/
/KeywordSearch/release/solr/start.jar
/KeywordSearch/release/solr/webapps/solr.war
/KeywordSearch/build/ /KeywordSearch/build/
/KeywordSearch/dist/ /KeywordSearch/dist/
/KeywordSearch/nbproject/* /KeywordSearch/nbproject/*
@ -72,10 +67,14 @@ genfiles.properties
hs_err_pid*.log hs_err_pid*.log
Core/src/org/sleuthkit/autopsy/casemodule/docs/QuickStart.html Core/src/org/sleuthkit/autopsy/casemodule/docs/QuickStart.html
Core/src/org/sleuthkit/autopsy/casemodule/docs/screenshot.png Core/src/org/sleuthkit/autopsy/casemodule/docs/screenshot.png
Core/src/org/sleuthkit/autopsy/datamodel/ranges.csv
/test/script/myconfig.xml /test/script/myconfig.xml
/test/script/*/*.xml /test/script/*/*.xml
.DS_Store .DS_Store
.*.swp .*.swp
Core/src/org/sleuthkit/autopsy/datamodel/ranges.csv
thunderbirdparser/release/modules/ext
/ImageGallery/release/
/thunderbirdparser/release/
/Experimental/release/

30
BootstrapIvy.xml Normal file
View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="BootstrapIvy" default="all" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
<property name="ivy.install.version" value="2.3.0-rc2" />
<condition property="ivy.home" value="${env.IVY_HOME}">
<isset property="env.IVY_HOME" />
</condition>
<property name="ivy.home" value="${user.home}/.ant" />
<property name="ivy.jar.dir" value="${ivy.home}/lib" />
<property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
<target name="download-ivy" unless="offline">
<available file="${ivy.jar.file}" property="ivy.available"/>
<antcall target="-download-ivy" />
</target>
<target name="-download-ivy" unless="ivy.available">
<mkdir dir="${ivy.jar.dir}"/>
<get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
dest="${ivy.jar.file}" usetimestamp="true"/>
</target>
<!-- init-ivy will bootstrap Ivy if the user doesn't have it already -->
<target name="init-ivy" depends="download-ivy" unless="ivy.lib.path">
<path id="ivy.lib.path">
<fileset dir="${ivy.jar.dir}" includes="*.jar"/>
</path>
<taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
</target>
</project>

View File

@ -2,9 +2,42 @@
<!-- You may freely edit this file. See harness/README in the NetBeans platform --> <!-- You may freely edit this file. See harness/README in the NetBeans platform -->
<!-- for some information on what you could do (e.g. targets to override). --> <!-- for some information on what you could do (e.g. targets to override). -->
<!-- If you delete this file and reopen the project it will be recreated. --> <!-- If you delete this file and reopen the project it will be recreated. -->
<project name="org.sleuthkit.autopsy.core" default="netbeans" basedir="."> <project name="org.sleuthkit.autopsy.core" default="netbeans" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant" >
<description>Builds, tests, and runs the project org.sleuthkit.autopsy.core</description> <description>Builds, tests, and runs the project org.sleuthkit.autopsy.core</description>
<import file="nbproject/build-impl.xml"/> <import file="nbproject/build-impl.xml"/>
<import file="../BootstrapIvy.xml"/>
<property name="thirdparty.dir" value="${basedir}/../thirdparty" />
<property name="release.dir" value="${basedir}/release" />
<property name="modules.dir" value="${release.dir}/modules/" />
<property name="ext.dir" value="${modules.dir}/ext" />
<target name="get-InternalPythonModules" description="get internal python modules">
<copy todir="${release.dir}/InternalPythonModules" >
<fileset dir="{basedir}/../../InternalPythonModules"/>
</copy>
</target>
<target name="get-thirdparty-dependencies" description="get third-party dependencies">
<!--Copy openCV dependencies to release-->
<copy todir="${modules.dir}" >
<fileset dir="${thirdparty.dir}/opencv" />
</copy>
<!--Copy photorec to release-->
<copy todir="${release.dir}/photorec_exec" >
<fileset dir="${thirdparty.dir}/photorec_exec"/>
</copy>
<!--Copy other jars-->
<copy file="${thirdparty.dir}/rejistry/Rejistry-1.0-SNAPSHOT.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/sevenzip/sevenzipjbinding.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/sevenzip/sevenzipjbinding-AllPlatforms.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/stix/StixLib.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/jdom/jdom-2.0.5.jar" todir="${ext.dir}" />
<copy file="${thirdparty.dir}/jdom/jdom-2.0.5-contrib.jar" todir="${ext.dir}" />
</target>
<!-- Verify that the TSK_HOME env variable is set --> <!-- Verify that the TSK_HOME env variable is set -->
<target name="findTSK"> <target name="findTSK">
@ -18,25 +51,51 @@
<target name="getTSKJars" depends="findTSK"> <target name="getTSKJars" depends="findTSK">
<property environment="env"/> <property environment="env"/>
<copy file="${env.TSK_HOME}/bindings/java/dist/Tsk_DataModel_PostgreSQL.jar" tofile="${basedir}/release/modules/ext/Tsk_DataModel_PostgreSQL.jar"/> <copy file="${env.TSK_HOME}/bindings/java/dist/Tsk_DataModel_PostgreSQL.jar"
<copy file="${env.TSK_HOME}/bindings/java/lib/sqlite-jdbc-3.8.11.jar" tofile="${basedir}/release/modules/ext/sqlite-jdbc-3.8.11.jar"/> tofile="${basedir}/release/modules/ext/Tsk_DataModel_PostgreSQL.jar"/>
<copy file="${env.TSK_HOME}/bindings/java/lib/postgresql-9.4.1211.jre7.jar" tofile="${basedir}/release/modules/ext/postgresql-9.4.1211.jre7.jar"/> <copy file="${env.TSK_HOME}/bindings/java/lib/sqlite-jdbc-3.8.11.jar"
<copy file="${env.TSK_HOME}/bindings/java/lib/mchange-commons-java-0.2.9.jar" tofile="${basedir}/release/modules/ext/mchange-commons-java-0.2.9.jar"/> tofile="${basedir}/release/modules/ext/sqlite-jdbc-3.8.11.jar"/>
<copy file="${env.TSK_HOME}/bindings/java/lib/c3p0-0.9.5.jar" tofile="${basedir}/release/modules/ext/c3p0-0.9.5.jar"/> <copy file="${env.TSK_HOME}/bindings/java/lib/postgresql-9.4.1211.jre7.jar"
<copy file="${env.TSK_HOME}/bindings/java/lib/sqlite-jdbc-3.8.11.jar" tofile="${basedir}/release/modules/ext/sqlite-jdbc-3.8.11.jar"/> tofile="${basedir}/release/modules/ext/postgresql-9.4.1211.jre7.jar"/>
<copy file="${env.TSK_HOME}/bindings/java/lib/mchange-commons-java-0.2.9.jar"
tofile="${basedir}/release/modules/ext/mchange-commons-java-0.2.9.jar"/>
<copy file="${env.TSK_HOME}/bindings/java/lib/c3p0-0.9.5.jar"
tofile="${basedir}/release/modules/ext/c3p0-0.9.5.jar"/>
</target> </target>
<target name="download-binlist">
<target name="download-binlist" description="Download the din list data file used to enrich credit card numbers">
<get src="https://raw.githubusercontent.com/binlist/data/master/ranges.csv" <get src="https://raw.githubusercontent.com/binlist/data/master/ranges.csv"
dest="src\org\sleuthkit\autopsy\datamodel" dest="src\org\sleuthkit\autopsy\datamodel"
ignoreerrors="true" ignoreerrors="true"
verbose="true"/> verbose="true"/>
</target> </target>
<target name="init" depends="basic-init,files-init,build-init,-javac-init"> <target name="init" depends="basic-init,files-init,build-init,-javac-init,init-ivy">
<antcall target="download-binlist" /> <mkdir dir="${ext.dir}"/>
<copy file="${thirdparty.dir}/LICENSE-2.0.txt" todir="${ext.dir}" />
<!-- fetch all the dependencies from Ivy and stick them in the right places -->
<ivy:resolve/>
<ivy:retrieve conf="core" sync="true" pattern="release/modules/ext/[artifact]-[revision](-[classifier]).[ext]" />
<!-- get additional deps --> <!-- get additional deps -->
<antcall target="getTSKJars" /> <antcall target="getTSKJars" />
<antcall target="get-thirdparty-dependencies" />
<antcall target="get-InternalPythonModules"/>
<!--Donwload the bin list used for credit card number enrichment-->
<antcall target="download-binlist" />
</target>
<target name="clean" depends="projectized-common.clean">
<!--Override clean to delete jars, etc downloaded with Ivy
or copied in from thirdparty folder. This way we don't end up with
out-of-date/unneeded stuff in the installer-->
<mkdir dir="${release.dir}"/>
<delete includeemptydirs="true" >
<fileset dir="${release.dir}" includes="**/*"/>
</delete>
</target> </target>
</project> </project>

25
Core/ivy.xml Normal file
View File

@ -0,0 +1,25 @@
<ivy-module version="2.0">
<info organisation="org.sleuthkit.autopsy" module="emailparser"/>
<configurations >
<!-- module dependencies -->
<conf name="core"/>
</configurations>
<dependencies >
<dependency conf="core->default" org="org.apache.activemq" name="activemq-all" rev="5.11.1"/>
<dependency conf="core->default" org="org.apache.curator" name="curator-client" rev="2.8.0"/>
<dependency conf="core->default" org="org.apache.curator" name="curator-framework" rev="2.8.0"/>
<dependency conf="core->default" org="org.apache.curator" name="curator-recipes" rev="2.8.0"/>
<dependency conf="core->default" org="org.python" name="jython-standalone" rev="2.7.0" />
<dependency conf="core->default" org="com.drewnoakes" name="metadata-extractor" rev="2.8.1"/>
<dependency conf="core->default" org="org.apache.tika" name="tika-core" rev="1.5"/>
<dependency conf="core->default" org="com.adobe.xmp" name="xmpcore" rev="5.1.2"/>
<dependency conf="core->default" org="org.apache.zookeeper" name="zookeeper" rev="3.4.6"/>
</dependencies>
</ivy-module>

9
Core/ivysettings.xml Normal file
View File

@ -0,0 +1,9 @@
<ivysettings>
<settings defaultResolver="main"/>
<resolvers>
<chain name="main">
<ibiblio name="central" m2compatible="true"/>
<ibiblio name="maven.restlet.org" root="http://maven.restlet.com" m2compatible="true" />
</chain>
</resolvers>
</ivysettings>

Binary file not shown.

View File

@ -1,18 +0,0 @@
Copyright 2002-2012 Drew Noakes
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.
More information about this project is available at:
http://drewnoakes.com/code/exif/
http://code.google.com/p/metadata-extractor/

View File

@ -26,29 +26,23 @@
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="diskLabel" min="-2" max="-2" attributes="0"/>
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="errorLabel" min="-2" max="-2" attributes="0"/> <Group type="102" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="timeZoneLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="timeZoneComboBox" max="32767" attributes="0"/>
</Group>
<Component id="noFatOrphansCheckbox" min="-2" max="-2" attributes="0"/> <Component id="noFatOrphansCheckbox" min="-2" max="-2" attributes="0"/>
<Component id="jScrollPane1" alignment="0" min="-2" pref="461" max="-2" attributes="0"/>
<Group type="103" alignment="0" groupAlignment="1" attributes="0"> <Group type="103" alignment="0" groupAlignment="1" attributes="0">
<Component id="copyImageCheckbox" min="-2" max="-2" attributes="0"/> <Component id="copyImageCheckbox" min="-2" max="-2" attributes="0"/>
<Component id="descLabel" min="-2" max="-2" attributes="0"/> <Component id="descLabel" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace min="21" pref="21" max="-2" attributes="0"/> <EmptySpace min="21" pref="21" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" max="-2" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Component id="pathTextField" min="-2" pref="342" max="-2" attributes="0"/> <Component id="pathTextField" min="-2" pref="342" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="browseButton" pref="0" max="32767" attributes="0"/> <Component id="browseButton" pref="92" max="32767" attributes="0"/>
</Group> </Group>
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
@ -61,9 +55,29 @@
</Group> </Group>
</Group> </Group>
</Group> </Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<Component id="timeZoneLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="timeZoneComboBox" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
<EmptySpace max="32767" attributes="0"/> </Group>
<Component id="jScrollPane1" alignment="1" pref="488" max="32767" attributes="0"/>
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
<Component id="refreshTablebutton" min="-2" pref="129" max="-2" attributes="0"/>
</Group>
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="diskLabel" min="-2" max="-2" attributes="0"/>
<Component id="errorLabel" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -73,14 +87,14 @@
<Component id="diskLabel" min="-2" max="-2" attributes="0"/> <Component id="diskLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="jScrollPane1" min="-2" pref="100" max="-2" attributes="0"/> <Component id="jScrollPane1" min="-2" pref="100" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="errorLabel" min="-2" max="-2" attributes="0"/> <Component id="refreshTablebutton" 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"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="timeZoneLabel" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="timeZoneLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="timeZoneComboBox" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="timeZoneComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<EmptySpace type="separate" max="-2" attributes="0"/> <EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="noFatOrphansCheckbox" min="-2" max="-2" attributes="0"/> <Component id="noFatOrphansCheckbox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="descLabel" min="-2" max="-2" attributes="0"/> <Component id="descLabel" min="-2" max="-2" attributes="0"/>
@ -97,7 +111,9 @@
<Component id="jLabel1" min="-2" max="-2" attributes="0"/> <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="imageWriterErrorLabel" min="-2" max="-2" attributes="0"/> <Component id="imageWriterErrorLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="66" max="32767" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="errorLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="58" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -260,5 +276,15 @@
</Property> </Property>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JButton" name="refreshTablebutton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="LocalDiskPanel.refreshTablebutton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="refreshTablebuttonActionPerformed"/>
</Events>
</Component>
</SubComponents> </SubComponents>
</Form> </Form>

View File

@ -42,6 +42,8 @@ import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.coreutils.PlatformUtil;
import org.sleuthkit.autopsy.imagewriter.ImageWriterSettings; import org.sleuthkit.autopsy.imagewriter.ImageWriterSettings;
@NbBundle.Messages({"LocalDiskPanel.refreshTablebutton.text=Refresh Local Disks"
})
/** /**
* ImageTypePanel for adding a local disk or partition such as PhysicalDrive0 or * ImageTypePanel for adding a local disk or partition such as PhysicalDrive0 or
* C:. * C:.
@ -141,6 +143,7 @@ final class LocalDiskPanel extends JPanel {
jLabel1 = new javax.swing.JLabel(); jLabel1 = new javax.swing.JLabel();
imageWriterErrorLabel = new javax.swing.JLabel(); imageWriterErrorLabel = new javax.swing.JLabel();
changeDatabasePathCheckbox = new javax.swing.JCheckBox(); changeDatabasePathCheckbox = new javax.swing.JCheckBox();
refreshTablebutton = new javax.swing.JButton();
setMinimumSize(new java.awt.Dimension(0, 420)); setMinimumSize(new java.awt.Dimension(0, 420));
setPreferredSize(new java.awt.Dimension(485, 410)); setPreferredSize(new java.awt.Dimension(485, 410));
@ -198,40 +201,56 @@ final class LocalDiskPanel extends JPanel {
org.openide.awt.Mnemonics.setLocalizedText(changeDatabasePathCheckbox, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.changeDatabasePathCheckbox.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(changeDatabasePathCheckbox, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.changeDatabasePathCheckbox.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(refreshTablebutton, org.openide.util.NbBundle.getMessage(LocalDiskPanel.class, "LocalDiskPanel.refreshTablebutton.text")); // NOI18N
refreshTablebutton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
refreshTablebuttonActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout); this.setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(diskLabel)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(errorLabel)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addComponent(timeZoneLabel) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(timeZoneComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(noFatOrphansCheckbox) .addComponent(noFatOrphansCheckbox)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 461, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(copyImageCheckbox) .addComponent(copyImageCheckbox)
.addComponent(descLabel)) .addComponent(descLabel))
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addGap(21, 21, 21) .addGap(21, 21, 21)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 342, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 342, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(browseButton, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addComponent(browseButton, javax.swing.GroupLayout.DEFAULT_SIZE, 92, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(imageWriterErrorLabel) .addComponent(imageWriterErrorLabel)
.addComponent(jLabel1) .addComponent(jLabel1)
.addComponent(changeDatabasePathCheckbox)) .addComponent(changeDatabasePathCheckbox))
.addGap(0, 0, Short.MAX_VALUE))))))) .addGap(0, 0, Short.MAX_VALUE)))))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(0, 0, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addComponent(timeZoneLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(timeZoneComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 488, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(refreshTablebutton, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(diskLabel)
.addComponent(errorLabel))
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
); );
layout.setVerticalGroup( layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -239,13 +258,13 @@ final class LocalDiskPanel extends JPanel {
.addComponent(diskLabel) .addComponent(diskLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(errorLabel) .addComponent(refreshTablebutton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(timeZoneLabel) .addComponent(timeZoneLabel)
.addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(noFatOrphansCheckbox) .addComponent(noFatOrphansCheckbox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(descLabel) .addComponent(descLabel)
@ -261,7 +280,9 @@ final class LocalDiskPanel extends JPanel {
.addComponent(jLabel1) .addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(imageWriterErrorLabel) .addComponent(imageWriterErrorLabel)
.addContainerGap(66, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(errorLabel)
.addContainerGap(58, Short.MAX_VALUE))
); );
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
@ -292,6 +313,10 @@ final class LocalDiskPanel extends JPanel {
fireUpdateEvent(); fireUpdateEvent();
}//GEN-LAST:event_browseButtonActionPerformed }//GEN-LAST:event_browseButtonActionPerformed
private void refreshTablebuttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshTablebuttonActionPerformed
refreshTable();
}//GEN-LAST:event_refreshTablebuttonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton browseButton; private javax.swing.JButton browseButton;
private javax.swing.JCheckBox changeDatabasePathCheckbox; private javax.swing.JCheckBox changeDatabasePathCheckbox;
@ -305,6 +330,7 @@ final class LocalDiskPanel extends JPanel {
private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JCheckBox noFatOrphansCheckbox; private javax.swing.JCheckBox noFatOrphansCheckbox;
private javax.swing.JTextField pathTextField; private javax.swing.JTextField pathTextField;
private javax.swing.JButton refreshTablebutton;
private javax.swing.JComboBox<String> timeZoneComboBox; private javax.swing.JComboBox<String> timeZoneComboBox;
private javax.swing.JLabel timeZoneLabel; private javax.swing.JLabel timeZoneLabel;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
@ -361,7 +387,7 @@ final class LocalDiskPanel extends JPanel {
// Remove any character that isn't alphanumeric, a space, parent, or underscore. // Remove any character that isn't alphanumeric, a space, parent, or underscore.
// If the name ends up empty or starting with a space, prepend "localDisk" // If the name ends up empty or starting with a space, prepend "localDisk"
path = path.replaceAll("[^0-9A-Za-z _()]", ""); // NON-NLS path = path.replaceAll("[^0-9A-Za-z _()]", ""); // NON-NLS
if(path.isEmpty() || path.startsWith(" ")){ if (path.isEmpty() || path.startsWith(" ")) {
path = "localDisk" + path; path = "localDisk" + path;
} }
@ -371,7 +397,7 @@ final class LocalDiskPanel extends JPanel {
} }
private boolean imageWriterPathIsValid() { private boolean imageWriterPathIsValid() {
if((! copyImageCheckbox.isSelected()) || ! (diskTable.getSelectedRow() >= 0 && diskTable.getSelectedRow() < disks.size())){ if ((!copyImageCheckbox.isSelected()) || !(diskTable.getSelectedRow() >= 0 && diskTable.getSelectedRow() < disks.size())) {
imageWriterErrorLabel.setVisible(false); imageWriterErrorLabel.setVisible(false);
imageWriterErrorLabel.setText(""); imageWriterErrorLabel.setText("");
return true; return true;
@ -475,8 +501,6 @@ final class LocalDiskPanel extends JPanel {
*/ */
private class LocalDiskModel implements TableModel { private class LocalDiskModel implements TableModel {
private List<LocalDisk> physicalDrives = new ArrayList<>();
private List<LocalDisk> partitions = new ArrayList<>();
private LocalDiskThread worker = null; private LocalDiskThread worker = null;
private boolean ready = false; private boolean ready = false;
private volatile boolean loadingDisks = false; private volatile boolean loadingDisks = false;
@ -583,6 +607,8 @@ final class LocalDiskPanel extends JPanel {
class LocalDiskThread extends SwingWorker<Object, Void> { class LocalDiskThread extends SwingWorker<Object, Void> {
private final Logger logger = Logger.getLogger(LocalDiskThread.class.getName()); private final Logger logger = Logger.getLogger(LocalDiskThread.class.getName());
private List<LocalDisk> physicalDrives = new ArrayList<>();
private List<LocalDisk> partitions = new ArrayList<>();
@Override @Override
protected Object doInBackground() throws Exception { protected Object doInBackground() throws Exception {
@ -611,12 +637,14 @@ final class LocalDiskPanel extends JPanel {
errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(), errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
"LocalDiskPanel.errLabel.drivesNotDetected.toolTipText")); "LocalDiskPanel.errLabel.drivesNotDetected.toolTipText"));
} }
errorLabel.setVisible(true);
diskTable.setEnabled(false); diskTable.setEnabled(false);
} else if (physicalDrives.isEmpty()) { } else if (physicalDrives.isEmpty()) {
errorLabel.setText( errorLabel.setText(
NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.someDisksNotDetected.text")); NbBundle.getMessage(this.getClass(), "LocalDiskPanel.errLabel.someDisksNotDetected.text"));
errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(), errorLabel.setToolTipText(NbBundle.getMessage(this.getClass(),
"LocalDiskPanel.errLabel.someDisksNotDetected.toolTipText")); "LocalDiskPanel.errLabel.someDisksNotDetected.toolTipText"));
errorLabel.setVisible(true);
} }
} }
@ -625,7 +653,7 @@ final class LocalDiskPanel extends JPanel {
try { try {
super.get(); //block and get all exceptions thrown while doInBackground() super.get(); //block and get all exceptions thrown while doInBackground()
} catch (CancellationException ex) { } catch (CancellationException ex) {
logger.log(Level.INFO, "Loading local disks was canceled, which should not be possible."); //NON-NLS logger.log(Level.INFO, "Loading local disks was canceled."); //NON-NLS
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
logger.log(Level.INFO, "Loading local disks was interrupted."); //NON-NLS logger.log(Level.INFO, "Loading local disks was interrupted."); //NON-NLS
} catch (Exception ex) { } catch (Exception ex) {
@ -644,14 +672,11 @@ final class LocalDiskPanel extends JPanel {
diskTable.clearSelection(); diskTable.clearSelection();
} }
pathTextField.setText(""); pathTextField.setText("");
errorLabel.setText("");
errorLabel.setVisible(false);
fireUpdateEvent(); fireUpdateEvent();
ready = true; ready = true;
} else {
logger.log(Level.INFO, "Loading local disks was canceled, which should not be possible."); //NON-NLS
} }
} }
diskTable.revalidate();
} }
} }
} }

View File

@ -24,7 +24,7 @@ DataContentViewerString.pageLabel2.text=Page
# Product Information panel # Product Information panel
LBL_Description=<div style=\"font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;\">\n <b>Product Version:</b> {0} ({9}) <br><b>Sleuth Kit Version:</b> {7} <br><b>Netbeans RCP Build:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>System:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div> LBL_Description=<div style=\"font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif;\">\n <b>Product Version:</b> {0} ({9}) <br><b>Sleuth Kit Version:</b> {7} <br><b>Netbeans RCP Build:</b> {8} <br> <b>Java:</b> {1}; {2}<br> <b>System:</b> {3}; {4}; {5}<br><b>Userdir:</b> {6}</div>
Format_OperatingSystem_Value={0} version {1} running on {2} Format_OperatingSystem_Value={0} version {1} running on {2}
LBL_Copyright=<div style\="font-size\: 12pt; font-family\: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy&trade; is a digital forensics platform based on The Sleuth Kit&trade; and other tools. <br><ul><li>General Information: <a style\="color\: \#1E2A60;" href\="http\://www.sleuthkit.org">http\://www.sleuthkit.org</a>.</li><li>Training: <a style\="color\: \#1E2A60;" href\="http://www.basistech.com/autopsy-training">http://www.basistech.com/autopsy-training</a></li><li>Commercial Support: <a style\="color\: \#1E2A60;" href\="http://www.basistech.com/digital-forensics/autopsy/support/">http://www.basistech.com/digital-forensics/autopsy/support/</a></li></ul>Copyright &copy; 2003-2016. </div> LBL_Copyright=<div style\="font-size\: 12pt; font-family\: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">Autopsy&trade; is a digital forensics platform based on The Sleuth Kit&trade; and other tools. <br><ul><li>General Information: <a style\="color\: \#1E2A60;" href\="http\://www.sleuthkit.org">http\://www.sleuthkit.org</a>.</li><li>Training: <a style\="color\: \#1E2A60;" href\="http://www.basistech.com/autopsy-training">http://www.basistech.com/autopsy-training</a></li><li>Commercial Support: <a style\="color\: \#1E2A60;" href\="http://www.basistech.com/digital-forensics/autopsy/support/">http://www.basistech.com/digital-forensics/autopsy/support/</a></li></ul>Copyright &copy; 2003-2017. </div>
URL_ON_IMG=http://www.sleuthkit.org/ URL_ON_IMG=http://www.sleuthkit.org/
URL_ON_HELP=http://sleuthkit.org/autopsy/docs/user-docs/4.3/ URL_ON_HELP=http://sleuthkit.org/autopsy/docs/user-docs/4.3/

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -89,16 +89,18 @@ public class ArtifactStringContent implements StringContent {
* table. * table.
*/ */
buffer.append("<table border='1'>"); //NON-NLS buffer.append("<table border='1'>"); //NON-NLS
// header row
buffer.append("<tr>"); //NON-NLS buffer.append("<tr>"); //NON-NLS
buffer.append("<td><b>"); //NON-NLS buffer.append("<th><b>"); //NON-NLS
buffer.append(Bundle.ArtifactStringContent_attrsTableHeader_type()); buffer.append(Bundle.ArtifactStringContent_attrsTableHeader_type());
buffer.append("</b></td>"); //NON-NLS buffer.append("</b></th>"); //NON-NLS
buffer.append("<td><b>"); //NON-NLS buffer.append("<th><b>"); //NON-NLS
buffer.append(Bundle.ArtifactStringContent_attrsTableHeader_value()); buffer.append(Bundle.ArtifactStringContent_attrsTableHeader_value());
buffer.append("</b></td>"); //NON-NLS buffer.append("</b></th>"); //NON-NLS
buffer.append("<td><b>"); //NON-NLS buffer.append("<th><b>"); //NON-NLS
buffer.append(Bundle.ArtifactStringContent_attrsTableHeader_sources()); buffer.append(Bundle.ArtifactStringContent_attrsTableHeader_sources());
buffer.append("</b></td>"); //NON-NLS buffer.append("</b></th>"); //NON-NLS
buffer.append("</tr>\n"); //NON-NLS buffer.append("</tr>\n"); //NON-NLS
try { try {
Content content = artifact.getSleuthkitCase().getContentById(artifact.getObjectID()); Content content = artifact.getSleuthkitCase().getContentById(artifact.getObjectID());
@ -108,64 +110,42 @@ public class ArtifactStringContent implements StringContent {
*/ */
for (BlackboardAttribute attr : artifact.getAttributes()) { for (BlackboardAttribute attr : artifact.getAttributes()) {
/*
* Attribute display name column.
*/
buffer.append("<tr><td>"); //NON-NLS
buffer.append(attr.getAttributeType().getDisplayName());
buffer.append("</td>"); //NON-NLS
/* /*
* Attribute value column. * Attribute value column.
*/ */
buffer.append("<td>"); //NON-NLS String value = "";
switch (attr.getAttributeType().getValueType()) { switch (attr.getAttributeType().getValueType()) {
case STRING: case STRING:
String str = attr.getValueString();
str = str.replaceAll(" ", "&nbsp;"); //NON-NLS
str = str.replaceAll("<", "&lt;"); //NON-NLS
str = str.replaceAll(">", "&gt;"); //NON-NLS
str = str.replaceAll("(\r\n|\n)", "<br />"); //NON-NLS
buffer.append(str);
break;
case INTEGER: case INTEGER:
case LONG: case LONG:
case DOUBLE: case DOUBLE:
buffer.append(attr.getDisplayString());
break;
case BYTE: case BYTE:
buffer.append(Arrays.toString(attr.getValueBytes())); default:
value = attr.getDisplayString();
break; break;
// Use Autopsy date formatting settings, not TSK defaults
case DATETIME: case DATETIME:
long epoch = attr.getValueLong(); long epoch = attr.getValueLong();
String time = "0000-00-00 00:00:00"; value = "0000-00-00 00:00:00";
if (null != content && 0 != epoch) { if (null != content && 0 != epoch) {
dateFormatter.setTimeZone(ContentUtils.getTimeZone(content)); dateFormatter.setTimeZone(ContentUtils.getTimeZone(content));
time = dateFormatter.format(new java.util.Date(epoch * 1000)); value = dateFormatter.format(new java.util.Date(epoch * 1000));
} }
buffer.append(time);
break; break;
} }
buffer.append("</td>"); //NON-NLS
/* /*
* Attribute sources column. * Attribute sources column.
*/ */
buffer.append("<td>"); //NON-NLS String sources = StringUtils.join(attr.getSources(), ", ");
buffer.append(StringUtils.join(attr.getSources(), ", ")); buffer.append(makeTableRow(attr.getAttributeType().getDisplayName(), value, sources));
buffer.append("</td>"); //NON-NLS
buffer.append("</tr>\n"); //NON-NLS
} }
/* /*
* Add a row for the source content path. * Add a row for the source content path.
*/ */
buffer.append("<tr>"); //NON-NLS
buffer.append("<td>"); //NON-NLS
buffer.append(NbBundle.getMessage(this.getClass(), "ArtifactStringContent.getStr.srcFilePath.text"));
buffer.append("</td>"); //NON-NLS
buffer.append("<td>"); //NON-NLS
String path = ""; String path = "";
try { try {
if (null != content) { if (null != content) {
@ -175,33 +155,24 @@ public class ArtifactStringContent implements StringContent {
logger.log(Level.SEVERE, String.format("Error getting source content path for artifact (artifact_id=%d, obj_id=%d)", artifact.getArtifactID(), artifact.getObjectID()), ex); logger.log(Level.SEVERE, String.format("Error getting source content path for artifact (artifact_id=%d, obj_id=%d)", artifact.getArtifactID(), artifact.getObjectID()), ex);
path = Bundle.ArtifactStringContent_failedToGetSourcePath_message(); path = Bundle.ArtifactStringContent_failedToGetSourcePath_message();
} }
buffer.append(path);
buffer.append("</td>"); //NON-NLS buffer.append(makeTableRow(NbBundle.getMessage(this.getClass(), "ArtifactStringContent.getStr.srcFilePath.text"),
buffer.append("</tr>\n"); //NON-NLS path, ""));
/* /*
* Add a row for the artifact id. * Add a row for the artifact id.
*/ */
buffer.append("<tr><td>"); //NON-NLS buffer.append(makeTableRow(NbBundle.getMessage(this.getClass(), "ArtifactStringContent.getStr.artifactId.text"),
buffer.append(NbBundle.getMessage(this.getClass(), "ArtifactStringContent.getStr.artifactId.text")); Long.toString(artifact.getArtifactID()), ""));
buffer.append("</td><td>"); //NON-NLS
buffer.append(artifact.getArtifactID());
buffer.append("</td>"); //NON-NLS
buffer.append("</tr>\n"); //NON-NLS
/*
* Finish the document
*/
buffer.append("</table>"); //NON-NLS
buffer.append("</html>\n"); //NON-NLS
stringContent = buffer.toString();
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
logger.log(Level.SEVERE, String.format("Error getting data for artifact (artifact_id=%d)", artifact.getArtifactID()), ex); logger.log(Level.SEVERE, String.format("Error getting data for artifact (artifact_id=%d)", artifact.getArtifactID()), ex);
buffer.append("<tr><td>"); //NON-NLS buffer.append(makeTableRow(Bundle.ArtifactStringContent_failedToGetAttributes_message(), "", ""));
buffer.append(Bundle.ArtifactStringContent_failedToGetAttributes_message()); } finally {
buffer.append("</td>"); //NON-NLS /*
buffer.append("</tr>\n"); //NON-NLS * Finish the document
*/
buffer.append("</table>"); //NON-NLS buffer.append("</table>"); //NON-NLS
buffer.append("</html>\n"); //NON-NLS buffer.append("</html>\n"); //NON-NLS
stringContent = buffer.toString(); stringContent = buffer.toString();
@ -211,4 +182,25 @@ public class ArtifactStringContent implements StringContent {
return stringContent; return stringContent;
} }
// escape special HTML characters
private String escapeHtmlString(String str) {
str = str.replaceAll(" ", "&nbsp;"); //NON-NLS
str = str.replaceAll("<", "&lt;"); //NON-NLS
str = str.replaceAll(">", "&gt;"); //NON-NLS
str = str.replaceAll("(\r\n|\n)", "<br />"); //NON-NLS
return str;
}
/**
* Make a row in the result table
* @param type String for column1 (Type of attribute))
* @param value String for column2 (value of attribute)
* @param source Column 3 (attribute source)
* @return HTML formatted string of these values
*/
private String makeTableRow(String type, String value, String source) {
String row = "<tr><td>" + escapeHtmlString(type) + "</td><td>" + escapeHtmlString(value) + "</td><td>" + escapeHtmlString(source) + "</td></tr>";
return row;
}
} }

View File

@ -70,7 +70,8 @@ public class BlackboardArtifactNode extends DisplayableItemNode {
private static final Integer[] SHOW_UNIQUE_PATH = new Integer[]{ private static final Integer[] SHOW_UNIQUE_PATH = new Integer[]{
BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID(), BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID(), BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID(),}; BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID(),};
// TODO (RC): This is an unattractive alternative to subclassing BlackboardArtifactNode, // TODO (RC): This is an unattractive alternative to subclassing BlackboardArtifactNode,
// cut from the same cloth as the equally unattractive SHOW_UNIQUE_PATH array // cut from the same cloth as the equally unattractive SHOW_UNIQUE_PATH array
@ -207,7 +208,9 @@ public class BlackboardArtifactNode extends DisplayableItemNode {
// If this is a node for a keyword hit on an artifact, we set the // If this is a node for a keyword hit on an artifact, we set the
// display name to be the artifact type name followed by " Artifact" // display name to be the artifact type name followed by " Artifact"
// e.g. "Messages Artifact". // e.g. "Messages Artifact".
if (artifact != null && artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) { if (artifact != null &&
(artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() ||
artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID())) {
try { try {
for (BlackboardAttribute attribute : artifact.getAttributes()) { for (BlackboardAttribute attribute : artifact.getAttributes()) {
if (attribute.getAttributeType().getTypeID() == ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT.getTypeID()) { if (attribute.getAttributeType().getTypeID() == ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT.getTypeID()) {

View File

@ -20,18 +20,20 @@ package org.sleuthkit.autopsy.ingest.runIngestModuleWizard;
import java.awt.Color; import java.awt.Color;
import java.awt.Component; import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints; import java.awt.GridBagConstraints;
import java.awt.GridBagLayout; import java.awt.GridBagLayout;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent; import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import javax.swing.Box;
import static javax.swing.Box.createVerticalGlue; import static javax.swing.Box.createVerticalGlue;
import javax.swing.ButtonModel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.JTextArea; import javax.swing.JTextArea;
import javax.swing.JToggleButton;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.corecomponents.AdvancedConfigurationDialog; import org.sleuthkit.autopsy.corecomponents.AdvancedConfigurationDialog;
import org.sleuthkit.autopsy.ingest.IngestOptionsPanel; import org.sleuthkit.autopsy.ingest.IngestOptionsPanel;
@ -42,7 +44,7 @@ import org.sleuthkit.autopsy.ingest.IngestProfiles.IngestProfile;
* Visual panel for the choosing of ingest profiles by the user when running * Visual panel for the choosing of ingest profiles by the user when running
* ingest. * ingest.
*/ */
final class IngestProfileSelectionPanel extends JPanel implements ItemListener { final class IngestProfileSelectionPanel extends JPanel {
@Messages({"IngestProfileSelectionPanel.customSettings.name=Custom Settings", @Messages({"IngestProfileSelectionPanel.customSettings.name=Custom Settings",
"IngestProfileSelectionPanel.customSettings.description=configure individual module settings in next step of wizard"}) "IngestProfileSelectionPanel.customSettings.description=configure individual module settings in next step of wizard"})
@ -55,6 +57,10 @@ final class IngestProfileSelectionPanel extends JPanel implements ItemListener {
private List<IngestProfile> profiles = Collections.emptyList(); private List<IngestProfile> profiles = Collections.emptyList();
boolean isLastPanel = false; boolean isLastPanel = false;
//Listener for profile button selection
ActionListener buttonGroupActionListener = (ActionEvent e) -> {
updateSelectedProfile();
};
/** /**
* Creates new IngestProfileSelectionPanel * Creates new IngestProfileSelectionPanel
* *
@ -65,8 +71,9 @@ final class IngestProfileSelectionPanel extends JPanel implements ItemListener {
initComponents(); initComponents();
wizardPanel = panel; wizardPanel = panel;
selectedProfile = lastSelectedProfile; selectedProfile = lastSelectedProfile;
isLastPanel = !selectedProfile.equals(wizardPanel.getDefaultContext());
populateListOfCheckboxes(); populateProfilesList();
} }
/** /**
@ -79,26 +86,45 @@ final class IngestProfileSelectionPanel extends JPanel implements ItemListener {
} }
/** /**
* Adds a radio button for custom settings as well as one for each profile * Handles the change to selected profile
* if custom settings button is selected, it enables the next button, otherwise
* it enables the Finish button.
*/
private void updateSelectedProfile() {
ButtonModel selectedButton = profileListButtonGroup.getSelection();
selectedProfile = selectedButton.getActionCommand();
boolean wasLastPanel = isLastPanel;
isLastPanel = !selectedProfile.equals(wizardPanel.getDefaultContext());
wizardPanel.fireChangeEvent();
this.firePropertyChange("LAST_ENABLED", wasLastPanel, isLastPanel); //NON-NLS
}
/**
* Adds a button for custom settings as well as one for each profile
* that has been created to the panel containing them. * that has been created to the panel containing them.
*/ */
private void populateListOfCheckboxes() { private void populateProfilesList() {
profiles = getProfiles(); profiles = getProfiles();
GridBagLayout gridBagLayout = new GridBagLayout(); GridBagLayout gridBagLayout = new GridBagLayout();
GridBagConstraints constraints = new GridBagConstraints(); GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL; constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 0; constraints.gridx = 0;
constraints.gridy = 0; constraints.gridy = 0;
constraints.weighty = .0; constraints.weighty = .0;
constraints.anchor = GridBagConstraints.FIRST_LINE_START; constraints.anchor = GridBagConstraints.LINE_START;
addRadioButton(CUSTOM_SETTINGS_DISPLAY_NAME, wizardPanel.getDefaultContext(), CUSTOM_SETTINGS_DESCRIPTION, gridBagLayout, constraints); addButton(CUSTOM_SETTINGS_DISPLAY_NAME, wizardPanel.getDefaultContext(), CUSTOM_SETTINGS_DESCRIPTION, gridBagLayout, constraints);
for (IngestProfile profile : profiles) {
profiles.forEach((profile) -> {
constraints.weightx = 0; constraints.weightx = 0;
constraints.gridy++; constraints.gridy++;
constraints.gridx = 0; constraints.gridx = 0;
addRadioButton(profile.toString(), profile.toString(), profile.getDescription(), gridBagLayout, constraints);
} addButton(profile.toString(), profile.toString(), profile.getDescription(), gridBagLayout, constraints);
});
//Add vertical glue at the bottom of the scroll panel so spacing //Add vertical glue at the bottom of the scroll panel so spacing
//between elements is less dependent on the number of elements //between elements is less dependent on the number of elements
constraints.gridy++; constraints.gridy++;
@ -119,29 +145,64 @@ final class IngestProfileSelectionPanel extends JPanel implements ItemListener {
* programmatically * programmatically
* @param profileDesc - the description of the profile * @param profileDesc - the description of the profile
*/ */
private void addRadioButton(String profileDisplayName, String profileContextName, String profileDesc, GridBagLayout layout, GridBagConstraints constraints) { private void addButton(String profileDisplayName, String profileContextName, String profileDesc, GridBagLayout layout, GridBagConstraints constraints) {
String displayText = profileDisplayName + " - " + profileDesc;
JRadioButton myRadio = new JRadioButton(); //Add a spacer
Dimension spacerBlockDimension = new Dimension(6, 4); // Space between left edge and button, Space between rows
Box.Filler spacer = new Box.Filler(spacerBlockDimension, spacerBlockDimension, spacerBlockDimension);
constraints.weightx = 1;
layout.setConstraints(spacer, constraints);
profileListPanel.add(spacer);
constraints.gridx++;
constraints.gridy++;
JToggleButton profileButton = new JToggleButton();
profileButton.setMaximumSize(new java.awt.Dimension(48, 48));
profileButton.setMinimumSize(new java.awt.Dimension(48, 48));
profileButton.setPreferredSize(new java.awt.Dimension(48, 48));
profileButton.setName(profileContextName);
profileButton.setActionCommand(profileContextName);
profileButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/timeline/images/magnifier-zoom-in-green.png")));
profileButton.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/checkbox24.png")));
profileButton.setFocusable(false);
profileButton.setFocusPainted(false);
profileButton.addActionListener(buttonGroupActionListener);
if (profileContextName.equals(selectedProfile)) {
profileButton.setSelected(true);
}
profileListButtonGroup.add(profileButton);
profileListPanel.add(profileButton);
layout.setConstraints(profileButton, constraints);
constraints.gridx++;
constraints.weightx = 1;
//Using a JTextArea as though it is a label in order to get multi-line support //Using a JTextArea as though it is a label in order to get multi-line support
String displayText = profileDisplayName;
if (!profileDesc.isEmpty()) {
displayText += " - " + profileDesc;
}
JTextArea myLabel = new JTextArea(displayText); JTextArea myLabel = new JTextArea(displayText);
Color gray = new Color(240, 240, 240); //matches background of panel Color gray = new Color(240, 240, 240); //matches background of panel
myLabel.setBackground(gray); myLabel.setBackground(gray);
myLabel.setEditable(false); myLabel.setEditable(false);
myLabel.setWrapStyleWord(true); myLabel.setWrapStyleWord(true);
myLabel.setLineWrap(true); myLabel.setLineWrap(true);
myRadio.setName(profileContextName);
myRadio.setToolTipText(profileDesc); //Add space between the button and text
myRadio.addItemListener(this); Box.Filler buttonTextSpacer = new Box.Filler(spacerBlockDimension, spacerBlockDimension, spacerBlockDimension);
if (profileContextName.equals(selectedProfile)) { layout.setConstraints(buttonTextSpacer, constraints);
myRadio.setSelected(true); profileListPanel.add(buttonTextSpacer);
}
profileListButtonGroup.add(myRadio);
profileListPanel.add(myRadio);
layout.setConstraints(myRadio, constraints);
constraints.gridx++; constraints.gridx++;
constraints.weightx = 1;
//Add the text area serving as a label to the right of the button
profileListPanel.add(myLabel); profileListPanel.add(myLabel);
layout.setConstraints(myLabel, constraints); layout.setConstraints(myLabel, constraints);
} }
/** /**
@ -164,30 +225,6 @@ final class IngestProfileSelectionPanel extends JPanel implements ItemListener {
profileListPanel.removeAll(); profileListPanel.removeAll();
} }
/**
* Listens for changes and checks the currently selected radio button if
* custom settings button is enabled it enables the next button, otherwise
* it enables the Finish button.
*
* @param e
*/
@Override
public void itemStateChanged(ItemEvent e) {
for (Component rButton : profileListPanel.getComponents()) {
if (rButton instanceof JRadioButton){
JRadioButton jrb = (JRadioButton) rButton;
if (jrb.isSelected()) {
selectedProfile = jrb.getName();
break;
}
}
}
boolean wasLastPanel = isLastPanel;
isLastPanel = !selectedProfile.equals(wizardPanel.getDefaultContext());
wizardPanel.fireChangeEvent();
this.firePropertyChange("LAST_ENABLED", wasLastPanel, isLastPanel); //NON-NLS
}
/** /**
* Get all the currently existing ingest profiles. * Get all the currently existing ingest profiles.
*/ */
@ -272,7 +309,7 @@ final class IngestProfileSelectionPanel extends JPanel implements ItemListener {
fetchProfileList(); fetchProfileList();
profileListPanel.revalidate(); profileListPanel.revalidate();
profileListPanel.repaint(); profileListPanel.repaint();
populateListOfCheckboxes(); populateProfilesList();
dialog.close(); dialog.close();
} }
); );

View File

@ -32,6 +32,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.FileIngestModule;
import org.sleuthkit.autopsy.ingest.IngestJobContext; import org.sleuthkit.autopsy.ingest.IngestJobContext;
import org.sleuthkit.autopsy.ingest.IngestMessage;
import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter; import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter;
import org.sleuthkit.autopsy.ingest.IngestServices; import org.sleuthkit.autopsy.ingest.IngestServices;
import org.sleuthkit.autopsy.ingest.ModuleDataEvent; import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
@ -55,6 +56,7 @@ final class FilesIdentifierIngestModule implements FileIngestModule {
private static final IngestModuleReferenceCounter refCounter = new IngestModuleReferenceCounter(); private static final IngestModuleReferenceCounter refCounter = new IngestModuleReferenceCounter();
private static final Map<Long, List<FilesSet>> interestingFileSetsByJob = new ConcurrentHashMap<>(); private static final Map<Long, List<FilesSet>> interestingFileSetsByJob = new ConcurrentHashMap<>();
private final FilesIdentifierIngestJobSettings settings; private final FilesIdentifierIngestJobSettings settings;
private final IngestServices services = IngestServices.getInstance();
private IngestJobContext context; private IngestJobContext context;
private Blackboard blackboard; private Blackboard blackboard;
@ -141,7 +143,18 @@ final class FilesIdentifierIngestModule implements FileIngestModule {
MessageNotifyUtil.Notify.error(Bundle.FilesIdentifierIngestModule_indexError_message(), artifact.getDisplayName()); MessageNotifyUtil.Notify.error(Bundle.FilesIdentifierIngestModule_indexError_message(), artifact.getDisplayName());
} }
IngestServices.getInstance().fireModuleDataEvent(new ModuleDataEvent(moduleName, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, Collections.singletonList(artifact))); services.fireModuleDataEvent(new ModuleDataEvent(moduleName, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, Collections.singletonList(artifact)));
// make an ingest inbox message
StringBuilder detailsSb = new StringBuilder();
detailsSb.append("File: " + file.getParentPath() + file.getName() + "<br/>\n");
detailsSb.append("Rule Set: " + filesSet.getName());
services.postMessage(IngestMessage.createDataMessage(InterestingItemsIngestModuleFactory.getModuleName(),
"Interesting File Match: " + filesSet.getName() + "(" + file.getName() +")",
detailsSb.toString(),
file.getName(),
artifact));
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
FilesIdentifierIngestModule.logger.log(Level.SEVERE, "Error posting to the blackboard", ex); //NOI18N NON-NLS FilesIdentifierIngestModule.logger.log(Level.SEVERE, "Error posting to the blackboard", ex); //NOI18N NON-NLS

View File

@ -59,4 +59,12 @@
<!-- overrode depends attribute --> <!-- overrode depends attribute -->
</target> </target>
<property name="ext.dir" value="release/modules/ext" />
<target name="clean" depends="projectized-common.clean">
<!--Override clean to delete jars, etc downloaded with Ivy,
or copied in from thirdparty folder. This way we don't end up with
out-of-date/unneeded stuff in the installer-->
<delete dir="${ext.dir}"/>
</target>
</project> </project>

View File

@ -49,22 +49,22 @@
<dependency conf="autopsy_core->*" org="com.github.spullara.mustache.java" name="compiler" rev="0.9.1" /> <dependency conf="autopsy_core->*" org="com.github.spullara.mustache.java" name="compiler" rev="0.9.1" />
<!-- image support for autopsy and image gallery --> <!-- image support for autopsy and image gallery -->
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.common" name="common-lang" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.common" name="common-lang" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.common" name="common-io" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.common" name="common-io" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.common" name="common-image" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.common" name="common-image" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-jpeg" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-jpeg" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-bmp" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-bmp" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-tiff" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-tiff" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-pnm" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-pnm" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-psd" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-psd" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-iff" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-iff" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-pcx" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-pcx" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-pict" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-pict" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-sgi" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-sgi" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-tga" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-tga" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-icns" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-icns" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-thumbsdb" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-thumbsdb" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-core" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-core" rev="3.2" />
<dependency conf="autopsy_core->*" org="com.twelvemonkeys.imageio" name="imageio-metadata" rev="3.2" /> <dependency conf="autopsy_core->default" org="com.twelvemonkeys.imageio" name="imageio-metadata" rev="3.2" />
</dependencies> </dependencies>
</ivy-module> </ivy-module>

View File

@ -2,7 +2,24 @@
<!-- You may freely edit this file. See harness/README in the NetBeans platform --> <!-- You may freely edit this file. See harness/README in the NetBeans platform -->
<!-- for some information on what you could do (e.g. targets to override). --> <!-- for some information on what you could do (e.g. targets to override). -->
<!-- If you delete this file and reopen the project it will be recreated. --> <!-- If you delete this file and reopen the project it will be recreated. -->
<project name="org.sleuthkit.autopsy.experimental" default="netbeans" basedir="."> <project name="org.sleuthkit.autopsy.experimental" default="netbeans" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
<description>Builds, tests, and runs the project org.sleuthkit.autopsy.experimental.</description> <description>Builds, tests, and runs the project org.sleuthkit.autopsy.experimental.</description>
<import file="nbproject/build-impl.xml"/> <import file="nbproject/build-impl.xml"/>
<import file="../BootstrapIvy.xml"/>
<property name="release.dir" value="${basedir}/release" />
<target name="init" depends="basic-init,files-init,build-init,-javac-init,init-ivy">
<ivy:settings file="ivysettings.xml" />
<ivy:resolve/>
<ivy:retrieve sync="false" pattern="${release.dir}/modules/ext/[artifact]-[revision](-[classifier]).[ext]" />
</target>
<target name="clean" depends="projectized-common.clean">
<!--Override clean to delete jars, etc downloaded with Ivy
or copied in from thirdparty folder. This way we don't end up with
out-of-date/unneeded stuff in the installer-->
<mkdir dir="${release.dir}"/>
<delete includeemptydirs="true">
<fileset dir="${release.dir}" includes="**/*"/>
</delete>
</target>
</project> </project>

22
Experimental/ivy.xml Normal file
View File

@ -0,0 +1,22 @@
<ivy-module version="2.0">
<info organisation="org.sleuthkit.autopsy" module="corelibs"/>
<configurations >
<!-- module dependencies -->
<conf name="experimental"/>
</configurations>
<dependencies>
<dependency conf="experimental->default" org="com.github.lgooddatepicker" name="LGoodDatePicker" rev="4.3.1"/>
<dependency conf="experimental->default" org="org.apache.solr" name="solr-solrj" rev="4.9.1"/>
<dependency conf="experimental->default" org="org.apache.tika" name="tika-core" rev="1.5"/>
<dependency conf="experimental->default" org="org.postgresql" name="postgresql" rev="9.4-1201-jdbc41"/>
<dependency conf="experimental->default" org="com.mchange" name="c3p0" rev="0.9.5"/>
<dependency conf="experimental->default" org="com.fasterxml.jackson.core" name="jackson-core" rev="2.7.0"/>
<dependency conf="experimental->default" org="org.swinglabs.swingx" name="swingx-all" rev="1.6.4"/>
<exclude artifact="commons-io"/>
<exclude artifact="slf4j-api"/>
<exclude artifact="wstx-asl"/>
<exclude artifact="zookeeper"/>
</dependencies>
</ivy-module>

View File

@ -0,0 +1,10 @@
<ivysettings>
<settings defaultResolver="main"/>
<resolvers>
<chain name="main">
<ibiblio name="central" m2compatible="true"/>
<ibiblio name="ibiblio" m2compatible="true"/>
<ibiblio name="xerial" m2compatible="true" root="http://www.xerial.org/maven/repository/snapshot" />
</chain>
</resolvers>
</ivysettings>

View File

@ -5,4 +5,24 @@
<project name="org.sleuthkit.autopsy.imagegallery" default="netbeans" basedir="."> <project name="org.sleuthkit.autopsy.imagegallery" default="netbeans" basedir=".">
<description>Builds, tests, and runs the project org.sleuthkit.autopsy.imagegallery.</description> <description>Builds, tests, and runs the project org.sleuthkit.autopsy.imagegallery.</description>
<import file="nbproject/build-impl.xml"/> <import file="nbproject/build-impl.xml"/>
<property name="thirdparty.dir" value="${basedir}/../thirdparty" />
<property name="ext.dir" value="release/modules/ext" />
<target name="clean" depends="projectized-common.clean">
<!--Override clean to delete jars, etc downloaded with Ivy,
or copied in from thirdparty folder. This way we don't end up with
out-of-date/unneeded stuff in the installer-->
<delete dir="${ext.dir}"/>
</target>
<target name="get-thirdparty-jars" description="get third-party jar dependencies">
<mkdir dir="${ext.dir}"/>
<copy file="${thirdparty.dir}/sqlite-jdbc/sqlite-jdbc-3.7.8-SNAPSHOT.jar" todir="${ext.dir}" />
</target>
<target name="init" depends="basic-init,files-init,build-init,-javac-init">
<!-- copy jars not downloaded with Ivy -->
<antcall target="get-thirdparty-jars"/>
</target>
</project> </project>

View File

@ -5,41 +5,24 @@
<project name="org.sleuthkit.autopsy.keywordsearch" default="netbeans" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant"> <project name="org.sleuthkit.autopsy.keywordsearch" default="netbeans" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
<description>Builds, tests, and runs the project org.sleuthkit.autopsy.keywordsearch.</description> <description>Builds, tests, and runs the project org.sleuthkit.autopsy.keywordsearch.</description>
<import file="nbproject/build-impl.xml"/> <import file="nbproject/build-impl.xml"/>
<import file="../BootstrapIvy.xml"/>
<property name="release.dir" value="release" />
<property name="ivy.install.version" value="2.3.0-rc2" /> <target name="get-solr-deployment" description="copy the solr deployment into release">
<condition property="ivy.home" value="${env.IVY_HOME}"> <copy todir="${release.dir}/solr" >
<isset property="env.IVY_HOME" /> <fileset dir="solr"/>
</condition> </copy>
<property name="ivy.home" value="${user.home}/.ant" />
<property name="ivy.jar.dir" value="${ivy.home}/lib" />
<property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
<target name="download-ivy" unless="offline">
<available file="${ivy.jar.file}" property="ivy.available"/>
<antcall target="-download-ivy" />
</target> </target>
<target name="-download-ivy" unless="ivy.available"> <target name="get-solr-upgrader-jars" description="copy the solr index upgrader jars into release">
<mkdir dir="${ivy.jar.dir}"/> <copy file="SolrUpgradeTools/Solr4IndexUpgrade.jar"
<get src="http://repo2.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" todir="${release.dir}/Solr4to5IndexUpgrade" />
dest="${ivy.jar.file}" usetimestamp="true"/> <copy file="SolrUpgradeTools/Solr5IndexUpgrade.jar"
todir="${release.dir}/Solr5to6IndexUpgrade" />
</target> </target>
<!-- init-ivy will bootstrap Ivy if the user doesn't have it already -->
<target name="init-ivy" depends="download-ivy" unless="ivy.lib.path">
<path id="ivy.lib.path">
<fileset dir="${ivy.jar.dir}" includes="*.jar"/>
</path>
<taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
</target>
<target name="init" depends="basic-init,files-init,build-init,-javac-init,init-ivy"> <target name="init" depends="basic-init,files-init,build-init,-javac-init,init-ivy">
<!-- fetch all the dependencies from Ivy and stick them in the right places --> <!-- fetch all the dependencies from Ivy and stick them in the right places -->
<ivy:resolve/> <ivy:resolve/>
<ivy:retrieve conf="autopsy" sync="true" pattern="release/modules/ext/[artifact]-[revision](-[classifier]).[ext]" /> <ivy:retrieve conf="autopsy" sync="true" pattern="release/modules/ext/[artifact]-[revision](-[classifier]).[ext]" />
@ -47,7 +30,21 @@
<ivy:retrieve conf="solr-libs" sync="true" pattern="release/solr/solr/lib/[artifact]-[revision](-[classifier]).[ext]" /> <ivy:retrieve conf="solr-libs" sync="true" pattern="release/solr/solr/lib/[artifact]-[revision](-[classifier]).[ext]" />
<ivy:retrieve conf="slf4j-libs" sync="true" pattern="release/solr/lib/ext/[artifact]-[revision](-[classifier]).[ext]" /> <ivy:retrieve conf="slf4j-libs" sync="true" pattern="release/solr/lib/ext/[artifact]-[revision](-[classifier]).[ext]" />
<ivy:retrieve conf="servlet" sync="true" pattern="release/solr/lib/servlet-api-3.0.jar" /> <ivy:retrieve conf="servlet" sync="true" pattern="release/solr/lib/servlet-api-3.0.jar" />
<ivy:retrieve conf="solr4to5" sync="true" pattern="release/Solr4to5IndexUpgrade/lib/[artifact]-[revision](-[classifier]).[ext]" />
<ivy:retrieve conf="solr5to6" sync="true" pattern="release/Solr5to6IndexUpgrade/lib/[artifact]-[revision](-[classifier]).[ext]" />
<!--Copy Solr deployment and tools that arn't downloaded with Ivy-->
<antcall target="get-solr-deployment" />
<antcall target="get-solr-upgrader-jars" />
</target>
<target name="clean" depends="projectized-common.clean">
<!--Override clean to delete jars, etc downloaded with Ivy
or copied in from thirdparty folder. This way we don't end up with
out-of-date/unneeded stuff in the installer-->
<delete includeemptydirs="true">
<fileset dir="release" includes="**/*"/>
</delete>
</target> </target>
<target name="clean-all" depends="clean" description="Clear Ivy cache."> <target name="clean-all" depends="clean" description="Clear Ivy cache.">

View File

@ -5,6 +5,10 @@
<!-- module dependencies --> <!-- module dependencies -->
<conf name="autopsy"/> <conf name="autopsy"/>
<!-- Solr index upgrade tool dependencies -->
<conf name="solr4to5"/>
<conf name="solr5to6"/>
<!-- Solr server dependencies --> <!-- Solr server dependencies -->
<conf name="solr-libs"/> <conf name="solr-libs"/>
<conf name="jetty-libs"/> <conf name="jetty-libs"/>
@ -15,6 +19,19 @@
<!-- Solr --> <!-- Solr -->
<dependency conf="solr-libs->default" org="org.apache.solr" name="solr-cell" rev="6.2.1"/> <dependency conf="solr-libs->default" org="org.apache.solr" name="solr-cell" rev="6.2.1"/>
<!-- Solr index upgrade -->
<dependency conf="solr4to5->default" org="org.apache.lucene" name="lucene-analyzers-common" rev="5.5.1"/>
<dependency conf="solr4to5->default" org="org.apache.lucene" name="lucene-backward-codecs" rev="5.5.1"/>
<dependency conf="solr4to5->default" org="org.apache.lucene" name="lucene-codecs" rev="5.5.1"/>
<dependency conf="solr4to5->default" org="org.apache.lucene" name="lucene-core" rev="5.5.1"/>
<dependency conf="solr5to6->default" org="org.apache.lucene" name="lucene-analyzers-common" rev="6.2.1"/>
<dependency conf="solr5to6->default" org="org.apache.lucene" name="lucene-backward-codecs" rev="6.2.1"/>
<dependency conf="solr5to6->default" org="org.apache.lucene" name="lucene-codecs" rev="6.2.1"/>
<dependency conf="solr5to6->default" org="org.apache.lucene" name="lucene-core" rev="6.2.1"/>
<!-- Autopsy --> <!-- Autopsy -->
<dependency conf="autopsy->*" org="org.apache.solr" name="solr-solrj" rev="6.2.1"/> <dependency conf="autopsy->*" org="org.apache.solr" name="solr-solrj" rev="6.2.1"/>
<dependency conf="autopsy->*" org="commons-lang" name="commons-lang" rev="2.4"/> <dependency conf="autopsy->*" org="commons-lang" name="commons-lang" rev="2.4"/>
@ -38,7 +55,7 @@
<dependency conf="slf4j-libs->default" org="org.slf4j" name="jcl-over-slf4j" rev="1.7.10"/> <dependency conf="slf4j-libs->default" org="org.slf4j" name="jcl-over-slf4j" rev="1.7.10"/>
<dependency conf="slf4j-libs->default" org="org.slf4j" name="jul-to-slf4j" rev="1.7.10"/> <dependency conf="slf4j-libs->default" org="org.slf4j" name="jul-to-slf4j" rev="1.7.10"/>
<!-- Tika 1.4 seems to declare a (transitive?) dependency on cleartk-util 3.2.2, but the most recent <!-- Tika 1.14 seems to declare a (transitive?) dependency on cleartk-util 3.2.2, but the most recent
version available is 2.0.0 Overriding the version worked--> version available is 2.0.0 Overriding the version worked-->
<override org="org.cleartk" module="cleartk-util" rev="2.0.0"/> <override org="org.cleartk" module="cleartk-util" rev="2.0.0"/>

Some files were not shown because too many files have changed in this diff Show More