Merge branch 'develop' of https://github.com/sleuthkit/autopsy into 5368-GroupByPathModifications

This commit is contained in:
William Schaefer
2019-10-15 12:50:28 -04:00
349 changed files with 15808 additions and 6951 deletions
+2
View File
@@ -43,6 +43,8 @@
<dependency conf="core->default" org="com.google.cloud" name="google-cloud-translate" rev="1.70.0"/>
<dependency conf="core->default" org="org.apache.opennlp" name="opennlp-tools" rev="1.9.1"/>
<dependency org="org.sejda.webp-imageio" name="webp-imageio-sejda" rev="0.1.0"/>
<dependency conf="core->default" org="commons-validator" name="commons-validator" rev="1.6"/>
<dependency conf="core->default" org="net.htmlparser.jericho" name="jericho-html" rev="3.3"/>
<dependency org="com.squareup.okhttp" name="okhttp" rev="2.7.5"/>
+1 -1
View File
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
OpenIDE-Module: org.sleuthkit.autopsy.core/10
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/core/Bundle.properties
OpenIDE-Module-Layer: org/sleuthkit/autopsy/core/layer.xml
OpenIDE-Module-Implementation-Version: 28
OpenIDE-Module-Implementation-Version: 29
OpenIDE-Module-Requires: org.openide.windows.WindowManager
AutoUpdate-Show-In-Client: true
AutoUpdate-Essential-Module: true
+5 -4
View File
@@ -3,6 +3,7 @@ file.reference.apache-mime4j-core-0.8.2.jar=release\\modules\\ext\\apache-mime4j
file.reference.apache-mime4j-dom-0.8.2.jar=release\\modules\\ext\\apache-mime4j-dom-0.8.2.jar
file.reference.asm-7.0.jar=release\\modules\\ext\\asm-7.0.jar
file.reference.bcmail-jdk15on-1.60.jar=release\\modules\\ext\\bcmail-jdk15on-1.60.jar
file.reference.bcpkix-jdk15on-1.60.jar=release\\modules\\ext\\bcpkix-jdk15on-1.60.jar
file.reference.bcprov-jdk15on-1.60.jar=release\\modules\\ext\\bcprov-jdk15on-1.60.jar
file.reference.boilerpipe-1.1.0.jar=release\\modules\\ext\\boilerpipe-1.1.0.jar
file.reference.c3p0-0.9.5.jar=release/modules/ext/c3p0-0.9.5.jar
@@ -16,7 +17,6 @@ file.reference.commons-io-2.6.jar=release\\modules\\ext\\commons-io-2.6.jar
file.reference.commons-lang3-3.8.1.jar=release\\modules\\ext\\commons-lang3-3.8.1.jar
file.reference.commons-pool2-2.4.2.jar=release/modules/ext/commons-pool2-2.4.2.jar
file.reference.cxf-rt-rs-client-3.3.0.jar=release\\modules\\ext\\cxf-rt-rs-client-3.3.0.jar
file.reference.dd-plist-1.20.jar=release/modules/ext/dd-plist-1.20.jar
file.reference.dec-0.1.2.jar=release\\modules\\ext\\dec-0.1.2.jar
file.reference.fontbox-2.0.13.jar=release\\modules\\ext\\fontbox-2.0.13.jar
file.reference.geoapi-3.0.1.jar=release\\modules\\ext\\geoapi-3.0.1.jar
@@ -55,7 +55,7 @@ file.reference.mchange-commons-java-0.2.9.jar=release/modules/ext/mchange-common
file.reference.metadata-extractor-2.11.0.jar=release\\modules\\ext\\metadata-extractor-2.11.0.jar
file.reference.netcdf4-4.5.5.jar=release\\modules\\ext\\netcdf4-4.5.5.jar
file.reference.openjson-1.0.10.jar=release\\modules\\ext\\openjson-1.0.10.jar
file.reference.opennlp-tools-1.9.0.jar=release\\modules\\ext\\opennlp-tools-1.9.0.jar
file.reference.opennlp-tools-1.9.1.jar=release\\modules\\ext\\opennlp-tools-1.9.1.jar
file.reference.parso-2.0.10.jar=release\\modules\\ext\\parso-2.0.10.jar
file.reference.pdfbox-2.0.13.jar=release\\modules\\ext\\pdfbox-2.0.13.jar
file.reference.pdfbox-tools-2.0.13.jar=release\\modules\\ext\\pdfbox-tools-2.0.13.jar
@@ -75,7 +75,7 @@ file.reference.javax.ws.rs-api-2.0.1.jar=release/modules/ext/javax.ws.rs-api-2.0
file.reference.cxf-core-3.0.16.jar=release/modules/ext/cxf-core-3.0.16.jar
file.reference.cxf-rt-frontend-jaxrs-3.0.16.jar=release/modules/ext/cxf-rt-frontend-jaxrs-3.0.16.jar
file.reference.cxf-rt-transports-http-3.0.16.jar=release/modules/ext/cxf-rt-transports-http-3.0.16.jar
file.reference.sleuthkit-postgresql-4.6.7.jar=release/modules/ext/sleuthkit-postgresql-4.6.7.jar
file.reference.sleuthkit-postgresql-4.7.0.jar=release/modules/ext/sleuthkit-postgresql-4.7.0.jar
file.reference.curator-client-2.8.0.jar=release/modules/ext/curator-client-2.8.0.jar
file.reference.curator-framework-2.8.0.jar=release/modules/ext/curator-framework-2.8.0.jar
file.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0.jar
@@ -86,6 +86,7 @@ file.reference.uimafit-core-2.4.0.jar=release\\modules\\ext\\uimafit-core-2.4.0.
file.reference.uimaj-core-3.0.1.jar=release\\modules\\ext\\uimaj-core-3.0.1.jar
file.reference.vorbis-java-core-0.8.jar=release\\modules\\ext\\vorbis-java-core-0.8.jar
file.reference.vorbis-java-tika-0.8.jar=release\\modules\\ext\\vorbis-java-tika-0.8.jar
file.reference.webp-imageio-sejda-0.1.0.jar=release/modules/ext/webp-imageio-sejda-0.1.0.jar
file.reference.xmlbeans-3.0.2.jar=release\\modules\\ext\\xmlbeans-3.0.2.jar
file.reference.xmpcore-5.1.3.jar=release/modules/ext/xmpcore-5.1.3.jar
file.reference.xz-1.8.jar=release\\modules\\ext\\xz-1.8.jar
@@ -122,5 +123,5 @@ nbm.homepage=http://www.sleuthkit.org/
nbm.module.author=Brian Carrier
nbm.needs.restart=true
source.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0-sources.jar
spec.version.base=10.16
spec.version.base=10.17
+189 -185
View File
@@ -251,7 +251,7 @@
<compile-dependency/>
<run-dependency>
<release-version>3</release-version>
<specification-version>1.2</specification-version>
<specification-version>1.3</specification-version>
</run-dependency>
</dependency>
</module-dependencies>
@@ -350,49 +350,29 @@
<binary-origin>release\modules\ext\commons-lang3-3.8.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jempbox-1.8.16.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jempbox-1.8.16.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jackcess-2.2.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jackcess-2.2.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jericho-html-3.3.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jericho-html-3.3.jar</binary-origin>
<runtime-relative-path>ext/gax-grpc-1.44.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/gax-grpc-1.44.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/cdm-4.5.5.jar</runtime-relative-path>
<binary-origin>release\modules\ext\cdm-4.5.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/httpservices-4.5.5.jar</runtime-relative-path>
<binary-origin>release\modules\ext\httpservices-4.5.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/xz-1.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\xz-1.8.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-validator-1.6.jar</runtime-relative-path>
<binary-origin>release/modules/ext/commons-validator-1.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sis-utility-0.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\sis-utility-0.8.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jna-5.1.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jna-5.1.0.jar</binary-origin>
<runtime-relative-path>ext/opencensus-api-0.19.2.jar</runtime-relative-path>
<binary-origin>release/modules/ext/opencensus-api-0.19.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/gax-httpjson-0.61.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/gax-httpjson-0.61.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/boilerpipe-1.1.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\boilerpipe-1.1.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jbig2-imageio-3.0.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jbig2-imageio-3.0.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jsoup-1.11.3.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jsoup-1.11.3.jar</binary-origin>
@@ -401,22 +381,10 @@
<runtime-relative-path>ext/sevenzipjbinding.jar</runtime-relative-path>
<binary-origin>release/modules/ext/sevenzipjbinding.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/apache-mime4j-dom-0.8.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\apache-mime4j-dom-0.8.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/mchange-commons-java-0.2.9.jar</runtime-relative-path>
<binary-origin>release/modules/ext/mchange-commons-java-0.2.9.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/pdfbox-2.0.13.jar</runtime-relative-path>
<binary-origin>release\modules\ext\pdfbox-2.0.13.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/xmlbeans-3.0.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\xmlbeans-3.0.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jackson-databind-2.9.7.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jackson-databind-2.9.7.jar</binary-origin>
@@ -425,41 +393,33 @@
<runtime-relative-path>ext/jai-imageio-core-1.4.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jai-imageio-core-1.4.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/api-common-1.7.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/api-common-1.7.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jcl-over-slf4j-1.7.25.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jcl-over-slf4j-1.7.25.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/curator-recipes-2.8.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/curator-recipes-2.8.0.jar</binary-origin>
<runtime-relative-path>ext/okhttp-2.7.5.jar</runtime-relative-path>
<binary-origin>release/modules/ext/okhttp-2.7.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/tika-core-1.20.jar</runtime-relative-path>
<binary-origin>release\modules\ext\tika-core-1.20.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/tagsoup-1.2.1.jar</runtime-relative-path>
<binary-origin>release\modules\ext\tagsoup-1.2.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/StixLib.jar</runtime-relative-path>
<binary-origin>release/modules/ext/StixLib.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jackson-core-2.9.7.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jackson-core-2.9.7.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sis-metadata-0.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\sis-metadata-0.8.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/bcprov-jdk15on-1.60.jar</runtime-relative-path>
<binary-origin>release\modules\ext\bcprov-jdk15on-1.60.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/parso-2.0.10.jar</runtime-relative-path>
<binary-origin>release\modules\ext\parso-2.0.10.jar</binary-origin>
<runtime-relative-path>ext/google-auth-library-credentials-0.15.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-auth-library-credentials-0.15.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/json-simple-1.1.1.jar</runtime-relative-path>
@@ -473,18 +433,10 @@
<runtime-relative-path>ext/commons-codec-1.11.jar</runtime-relative-path>
<binary-origin>release\modules\ext\commons-codec-1.11.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/apache-mime4j-core-0.8.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\apache-mime4j-core-0.8.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jmatio-1.5.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jmatio-1.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sleuthkit-postgresql-4.6.7.jar</runtime-relative-path>
<binary-origin>release/modules/ext/sleuthkit-postgresql-4.6.7.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/tika-parsers-1.20.jar</runtime-relative-path>
<binary-origin>release\modules\ext\tika-parsers-1.20.jar</binary-origin>
@@ -497,18 +449,10 @@
<runtime-relative-path>ext/commons-pool2-2.4.2.jar</runtime-relative-path>
<binary-origin>release/modules/ext/commons-pool2-2.4.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-io-2.6.jar</runtime-relative-path>
<binary-origin>release\modules\ext\commons-io-2.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jdom-2.0.5-contrib.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jdom-2.0.5-contrib.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/SparseBitSet-1.1.jar</runtime-relative-path>
<binary-origin>release/modules/ext/SparseBitSet-1.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/openjson-1.0.10.jar</runtime-relative-path>
<binary-origin>release\modules\ext\openjson-1.0.10.jar</binary-origin>
@@ -517,38 +461,18 @@
<runtime-relative-path>ext/isoparser-1.1.22.jar</runtime-relative-path>
<binary-origin>release\modules\ext\isoparser-1.1.22.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/c3p0-0.9.5.jar</runtime-relative-path>
<binary-origin>release/modules/ext/c3p0-0.9.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/xmpcore-5.1.3.jar</runtime-relative-path>
<binary-origin>release/modules/ext/xmpcore-5.1.3.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/zookeeper-3.4.6.jar</runtime-relative-path>
<binary-origin>release/modules/ext/zookeeper-3.4.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/javax.activation-1.2.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\javax.activation-1.2.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-csv-1.6.jar</runtime-relative-path>
<binary-origin>release\modules\ext\commons-csv-1.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jdom-2.0.5.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jdom-2.0.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/rome-1.12.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\rome-1.12.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jackson-annotations-2.9.7.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jackson-annotations-2.9.7.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/javax.annotation-api-1.3.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\javax.annotation-api-1.3.2.jar</binary-origin>
@@ -557,49 +481,25 @@
<runtime-relative-path>ext/vorbis-java-core-0.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\vorbis-java-core-0.8.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/netcdf4-4.5.5.jar</runtime-relative-path>
<binary-origin>release\modules\ext\netcdf4-4.5.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/java-libpst-0.8.1.jar</runtime-relative-path>
<binary-origin>release\modules\ext\java-libpst-0.8.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/opennlp-tools-1.9.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\opennlp-tools-1.9.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sis-netcdf-0.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\sis-netcdf-0.8.jar</binary-origin>
<runtime-relative-path>ext/okio-1.6.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/okio-1.6.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/curator-framework-2.8.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/curator-framework-2.8.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sentiment-analysis-parser-0.1.jar</runtime-relative-path>
<binary-origin>release\modules\ext\sentiment-analysis-parser-0.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-collections4-4.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\commons-collections4-4.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-dbcp2-2.1.1.jar</runtime-relative-path>
<binary-origin>release/modules/ext/commons-dbcp2-2.1.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jgraphx-v3.8.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jgraphx-v3.8.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/juniversalchardet-1.0.3.jar</runtime-relative-path>
<binary-origin>release\modules\ext\juniversalchardet-1.0.3.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jython-standalone-2.7.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jython-standalone-2.7.0.jar</binary-origin>
<runtime-relative-path>ext/google-http-client-appengine-1.29.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-http-client-appengine-1.29.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/uimafit-core-2.4.0.jar</runtime-relative-path>
@@ -609,26 +509,30 @@
<runtime-relative-path>ext/jackcess-encrypt-2.1.4.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jackcess-encrypt-2.1.4.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jhighlight-1.0.3.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jhighlight-1.0.3.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/junrar-2.0.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\junrar-2.0.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jul-to-slf4j-1.7.25.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jul-to-slf4j-1.7.25.jar</binary-origin>
<runtime-relative-path>ext/google-http-client-1.29.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-http-client-1.29.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/postgresql-9.4.1211.jre7.jar</runtime-relative-path>
<binary-origin>release/modules/ext/postgresql-9.4.1211.jre7.jar</binary-origin>
<runtime-relative-path>ext/bcpkix-jdk15on-1.60.jar</runtime-relative-path>
<binary-origin>release\modules\ext\bcpkix-jdk15on-1.60.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/opennlp-tools-1.9.1.jar</runtime-relative-path>
<binary-origin>release\modules\ext\opennlp-tools-1.9.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/slf4j-api-1.7.25.jar</runtime-relative-path>
<binary-origin>release\modules\ext\slf4j-api-1.7.25.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/google-cloud-core-1.70.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-cloud-core-1.70.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/geoapi-3.0.1.jar</runtime-relative-path>
<binary-origin>release\modules\ext\geoapi-3.0.1.jar</binary-origin>
@@ -641,18 +545,10 @@
<runtime-relative-path>ext/jdom2-2.0.6.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jdom2-2.0.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/httpclient-4.5.6.jar</runtime-relative-path>
<binary-origin>release\modules\ext\httpclient-4.5.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/uimaj-core-3.0.1.jar</runtime-relative-path>
<binary-origin>release\modules\ext\uimaj-core-3.0.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/curator-client-2.8.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/curator-client-2.8.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sqlite-jdbc-3.25.2.jar</runtime-relative-path>
<binary-origin>release/modules/ext/sqlite-jdbc-3.25.2.jar</binary-origin>
@@ -670,65 +566,133 @@
<binary-origin>release\modules\ext\grib-4.5.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/fontbox-2.0.13.jar</runtime-relative-path>
<binary-origin>release\modules\ext\fontbox-2.0.13.jar</binary-origin>
<runtime-relative-path>ext/gax-1.44.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/gax-1.44.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/activemq-all-5.11.1.jar</runtime-relative-path>
<binary-origin>release/modules/ext/activemq-all-5.11.1.jar</binary-origin>
<runtime-relative-path>ext/jempbox-1.8.16.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jempbox-1.8.16.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/dec-0.1.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\dec-0.1.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/Rejistry-1.1-SNAPSHOT.jar</runtime-relative-path>
<binary-origin>release/modules/ext/Rejistry-1.1-SNAPSHOT.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/dd-plist-1.20.jar</runtime-relative-path>
<binary-origin>release/modules/ext/dd-plist-1.20.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sevenzipjbinding-AllPlatforms.jar</runtime-relative-path>
<binary-origin>release/modules/ext/sevenzipjbinding-AllPlatforms.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/bcmail-jdk15on-1.60.jar</runtime-relative-path>
<binary-origin>release\modules\ext\bcmail-jdk15on-1.60.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/vorbis-java-tika-0.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\vorbis-java-tika-0.8.jar</binary-origin>
<runtime-relative-path>ext/jackcess-2.2.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jackcess-2.2.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/grpc-context-1.19.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/grpc-context-1.19.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/gax-grpc-1.44.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/gax-grpc-1.44.0.jar</binary-origin>
<runtime-relative-path>ext/jericho-html-3.3.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jericho-html-3.3.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/opencensus-api-0.19.2.jar</runtime-relative-path>
<binary-origin>release/modules/ext/opencensus-api-0.19.2.jar</binary-origin>
<runtime-relative-path>ext/httpservices-4.5.5.jar</runtime-relative-path>
<binary-origin>release\modules\ext\httpservices-4.5.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/gax-httpjson-0.61.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/gax-httpjson-0.61.0.jar</binary-origin>
<runtime-relative-path>ext/xz-1.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\xz-1.8.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/api-common-1.7.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/api-common-1.7.0.jar</binary-origin>
<runtime-relative-path>ext/commons-validator-1.6.jar</runtime-relative-path>
<binary-origin>release/modules/ext/commons-validator-1.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/google-auth-library-credentials-0.15.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-auth-library-credentials-0.15.0.jar</binary-origin>
<runtime-relative-path>ext/jna-5.1.0.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jna-5.1.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jbig2-imageio-3.0.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jbig2-imageio-3.0.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sleuthkit-postgresql-4.7.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/sleuthkit-postgresql-4.7.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/apache-mime4j-dom-0.8.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\apache-mime4j-dom-0.8.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/pdfbox-2.0.13.jar</runtime-relative-path>
<binary-origin>release\modules\ext\pdfbox-2.0.13.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/xmlbeans-3.0.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\xmlbeans-3.0.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/curator-recipes-2.8.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/curator-recipes-2.8.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/tagsoup-1.2.1.jar</runtime-relative-path>
<binary-origin>release\modules\ext\tagsoup-1.2.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jackson-core-2.9.7.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jackson-core-2.9.7.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sis-metadata-0.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\sis-metadata-0.8.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/parso-2.0.10.jar</runtime-relative-path>
<binary-origin>release\modules\ext\parso-2.0.10.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/apache-mime4j-core-0.8.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\apache-mime4j-core-0.8.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-io-2.6.jar</runtime-relative-path>
<binary-origin>release\modules\ext\commons-io-2.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/SparseBitSet-1.1.jar</runtime-relative-path>
<binary-origin>release/modules/ext/SparseBitSet-1.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/c3p0-0.9.5.jar</runtime-relative-path>
<binary-origin>release/modules/ext/c3p0-0.9.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/zookeeper-3.4.6.jar</runtime-relative-path>
<binary-origin>release/modules/ext/zookeeper-3.4.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-csv-1.6.jar</runtime-relative-path>
<binary-origin>release\modules\ext\commons-csv-1.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jdom-2.0.5.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jdom-2.0.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jackson-annotations-2.9.7.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jackson-annotations-2.9.7.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/google-api-client-1.27.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-api-client-1.27.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/netcdf4-4.5.5.jar</runtime-relative-path>
<binary-origin>release\modules\ext\netcdf4-4.5.5.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sis-netcdf-0.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\sis-netcdf-0.8.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/sentiment-analysis-parser-0.1.jar</runtime-relative-path>
<binary-origin>release\modules\ext\sentiment-analysis-parser-0.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/commons-collections4-4.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\commons-collections4-4.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/opencensus-contrib-http-util-0.19.2.jar</runtime-relative-path>
<binary-origin>release/modules/ext/opencensus-contrib-http-util-0.19.2.jar</binary-origin>
@@ -738,21 +702,57 @@
<binary-origin>release/modules/ext/google-auth-library-oauth2-http-0.15.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/google-http-client-appengine-1.29.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-http-client-appengine-1.29.0.jar</binary-origin>
<runtime-relative-path>ext/jgraphx-v3.8.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jgraphx-v3.8.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/google-http-client-1.29.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-http-client-1.29.0.jar</binary-origin>
<runtime-relative-path>ext/juniversalchardet-1.0.3.jar</runtime-relative-path>
<binary-origin>release\modules\ext\juniversalchardet-1.0.3.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/google-cloud-core-1.70.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-cloud-core-1.70.0.jar</binary-origin>
<runtime-relative-path>ext/jython-standalone-2.7.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/jython-standalone-2.7.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jhighlight-1.0.3.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jhighlight-1.0.3.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/jul-to-slf4j-1.7.25.jar</runtime-relative-path>
<binary-origin>release\modules\ext\jul-to-slf4j-1.7.25.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/postgresql-9.4.1211.jre7.jar</runtime-relative-path>
<binary-origin>release/modules/ext/postgresql-9.4.1211.jre7.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/httpclient-4.5.6.jar</runtime-relative-path>
<binary-origin>release\modules\ext\httpclient-4.5.6.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/curator-client-2.8.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/curator-client-2.8.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/fontbox-2.0.13.jar</runtime-relative-path>
<binary-origin>release\modules\ext\fontbox-2.0.13.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/activemq-all-5.11.1.jar</runtime-relative-path>
<binary-origin>release/modules/ext/activemq-all-5.11.1.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/google-cloud-core-http-1.70.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-cloud-core-http-1.70.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/Rejistry-1.1-SNAPSHOT.jar</runtime-relative-path>
<binary-origin>release/modules/ext/Rejistry-1.1-SNAPSHOT.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/dec-0.1.2.jar</runtime-relative-path>
<binary-origin>release\modules\ext\dec-0.1.2.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/google-http-client-jackson2-1.29.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-http-client-jackson2-1.29.0.jar</binary-origin>
@@ -766,20 +766,24 @@
<binary-origin>release/modules/ext/google-cloud-translate-1.70.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/gax-1.44.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/gax-1.44.0.jar</binary-origin>
<runtime-relative-path>ext/sevenzipjbinding-AllPlatforms.jar</runtime-relative-path>
<binary-origin>release/modules/ext/sevenzipjbinding-AllPlatforms.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/google-api-services-translate-v2-rev20170525-1.27.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/google-api-services-translate-v2-rev20170525-1.27.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/okhttp-2.7.5.jar</runtime-relative-path>
<binary-origin>release/modules/ext/okhttp-2.7.5.jar</binary-origin>
<runtime-relative-path>ext/webp-imageio-sejda-0.1.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/webp-imageio-sejda-0.1.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/okio-1.6.0.jar</runtime-relative-path>
<binary-origin>release/modules/ext/okio-1.6.0.jar</binary-origin>
<runtime-relative-path>ext/bcmail-jdk15on-1.60.jar</runtime-relative-path>
<binary-origin>release\modules\ext\bcmail-jdk15on-1.60.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/vorbis-java-tika-0.8.jar</runtime-relative-path>
<binary-origin>release\modules\ext\vorbis-java-tika-0.8.jar</binary-origin>
</class-path-extension>
</data>
</configuration>
@@ -0,0 +1,49 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.casemodule;
import java.io.File;
import java.nio.file.Paths;
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
/**
* Class for methods to check if access should be limited to a feature
*
*/
final class AccessLimiterUtils {
private final static String MULTI_USER_ACCESS_FILE_NAME = "mualimit"; // NON-NLS
private final static String MULTI_USER_ACCESS_FILE_PATH = Paths.get(PlatformUtil.getUserConfigDirectory(), MULTI_USER_ACCESS_FILE_NAME).toString();
/**
* Check if privileges regarding multi-user cases should be restricted.
*
* @return True if privileges should be restricted, false otherwise.
*/
static boolean limitMultiUserAccess() {
return new File(MULTI_USER_ACCESS_FILE_PATH).exists();
}
/**
* Private constructor for a utility class
*/
private AccessLimiterUtils() {
//private constructer left empty intentionally
}
}
@@ -117,7 +117,7 @@ CTL_CaseNewAction=New Case
CTL_CaseDetailsAction=Case Details
CTL_CaseDeleteAction=Delete Case
CTL_CaseOpenAction=Open Case
CTL_UnpackagePortableCaseAction=Unpackage Portable Case
CTL_UnpackagePortableCaseAction=Unpack and Open Portable Case
EditOptionalCasePropertiesPanel.cancelButton.text=Cancel
EditOptionalCasePropertiesPanel.saveButton.text=Save
GeneralFilter.encaseImageDesc.text=Encase Images (*.e01)
@@ -1049,7 +1049,7 @@ public class Case {
/*
* Enable the case-specific actions.
*/
CallableSystemAction.get(AddImageAction.class).setEnabled(true);
CallableSystemAction.get(AddImageAction.class).setEnabled(Case.getCurrentCase().getMetadata().getCaseType() == CaseType.SINGLE_USER_CASE || !AccessLimiterUtils.limitMultiUserAccess());
CallableSystemAction.get(CaseCloseAction.class).setEnabled(true);
CallableSystemAction.get(CaseDetailsAction.class).setEnabled(true);
CallableSystemAction.get(DataSourceSummaryAction.class).setEnabled(true);
@@ -61,7 +61,7 @@ final class NewCaseVisualPanel1 extends JPanel implements DocumentListener {
*/
void readSettings() {
caseNameTextField.setText("");
if (UserPreferences.getIsMultiUserModeEnabled()) {
if (UserPreferences.getIsMultiUserModeEnabled() && !AccessLimiterUtils.limitMultiUserAccess()) {
multiUserCaseRadioButton.setEnabled(true);
multiUserCaseRadioButton.setSelected(true);
} else {
@@ -29,10 +29,10 @@ import org.openide.windows.WindowManager;
@ActionID(category = "Case", id = "org.sleuthkit.autopsy.casemodule.UnpackagePortableCaseAction")
@ActionRegistration(displayName = "#CTL_UnpackagePortableCaseAction", lazy = false)
@Messages({"CTL_UnpackagePortableCaseAction=Unpackage Portable Case"})
@Messages({"CTL_UnpackagePortableCaseAction=Unpack and Open Portable Case"})
/**
* Unpackage Portable Case action for the Case menu to allow the user to
* decompress a portable case.
* decompress a portable case and open it.
*/
public class UnpackagePortableCaseAction extends CallableSystemAction {
@@ -30,6 +30,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import javax.swing.JFrame;
import javax.swing.SwingWorker;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.openide.modules.InstalledFileLocator;
import org.openide.util.NbBundle;
import org.openide.windows.WindowManager;
@@ -189,7 +191,15 @@ class UnpackagePortableCaseProgressDialog extends javax.swing.JDialog implements
setDisplayError(Bundle.UnpackageWorker_doInBackground_errorCompressingCase());
throw new TskCoreException("Error unpackaging case", ex); // NON-NLS
}
try {
String caseFileDirectory = FilenameUtils.getBaseName(packagedCase);
String caseDirectory = StringUtils.substringBefore(caseFileDirectory, ".zip");
Case.openAsCurrentCase(outputFolder + File.separator + caseDirectory + File.separator + caseDirectory + ".aut"); // NON-NLS
} catch (CaseActionException ex) {
throw new TskCoreException("Error opening case after unpacking it.", ex); // NON-NLS
}
success.set(true);
return null;
}
@@ -80,7 +80,7 @@ public class Services implements Closeable {
/**
* Gets the artifacts blackboard for the current case.
*
* @return @org.sleuthkit.datamodel.Blackboard Blackboard for the current
* @return org.sleuthkit.datamodel.Blackboard Blackboard for the current
* case.
*/
public org.sleuthkit.datamodel.Blackboard getArtifactsBlackboard() {
@@ -1942,6 +1942,58 @@ abstract class AbstractSqlEamDb implements EamDb {
return caseNames.stream().collect(Collectors.toList());
}
/**
* Gets list of distinct case display names, where each case has 1+ Artifact
* Instance matching eamArtifact.
*
* @param aType EamArtifact.Type to search for
* @param value Value to search for
*
* @return List of cases containing this artifact with instances marked as
* bad
*
* @throws EamDbException
*/
@Override
public List<String> getListCasesHavingArtifactInstances(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
String normalizedValue = CorrelationAttributeNormalizer.normalize(aType, value);
Connection conn = connect();
Collection<String> caseNames = new LinkedHashSet<>();
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String tableName = EamDbUtil.correlationTypeToInstanceTableName(aType);
String sql
= "SELECT DISTINCT case_name FROM "
+ tableName
+ " INNER JOIN cases ON "
+ tableName
+ ".case_id=cases.id WHERE "
+ tableName
+ ".value=? ";
try {
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, normalizedValue);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
caseNames.add(resultSet.getString("case_name"));
}
} catch (SQLException ex) {
throw new EamDbException("Error getting notable artifact instances.", ex); // NON-NLS
} finally {
EamDbUtil.closeStatement(preparedStatement);
EamDbUtil.closeResultSet(resultSet);
EamDbUtil.closeConnection(conn);
}
return caseNames.stream().collect(Collectors.toList());
}
/**
* Remove a reference set and all entries contained in it.
*
@@ -211,8 +211,11 @@ public class EamArtifactUtil {
TskData.FileKnown.UNKNOWN,
bbSourceFile.getId());
} catch (TskCoreException | EamDbException | CorrelationAttributeNormalizationException ex) {
logger.log(Level.SEVERE, "Error creating artifact instance.", ex); // NON-NLS
} catch (TskCoreException ex) {
logger.log(Level.SEVERE, "Error getting AbstractFile for artifact: " + bbArtifact.toString(), ex); // NON-NLS
return null;
} catch (EamDbException | CorrelationAttributeNormalizationException ex) {
logger.log(Level.WARNING, "Error creating artifact instance for artifact: " + bbArtifact.toString(), ex); // NON-NLS
return null;
} catch (NoCurrentCaseException ex) {
logger.log(Level.SEVERE, "Case is closed.", ex); // NON-NLS
@@ -475,6 +475,20 @@ public interface EamDb {
*/
List<String> getListCasesHavingArtifactInstancesKnownBad(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException;
/**
* Gets list of distinct case display names, where each case has 1+ Artifact
* Instance matching eamArtifact.
*
* @param aType EamArtifact.Type to search for
* @param value Value to search for
*
* @return List of cases containing this artifact with instances marked as
* bad
*
* @throws EamDbException
*/
List<String> getListCasesHavingArtifactInstances(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException;
/**
* Remove a reference set and all values contained in it.
*
@@ -229,10 +229,13 @@ public class IngestEventsListener {
"# {0} - typeName",
"# {1} - count",
"IngestEventsListener.prevCount.text=Number of previous {0}: {1}"})
static private void makeAndPostPreviousSeenArtifact(BlackboardArtifact originalArtifact) {
static private void makeAndPostPreviousSeenArtifact(BlackboardArtifact originalArtifact, List<String> caseDisplayNames) {
Collection<BlackboardAttribute> attributesForNewArtifact = Arrays.asList(new BlackboardAttribute(
TSK_SET_NAME, MODULE_NAME,
Bundle.IngestEventsListener_prevExists_text()),
new BlackboardAttribute(
TSK_COMMENT, MODULE_NAME,
Bundle.IngestEventsListener_prevCaseComment_text() + caseDisplayNames.stream().distinct().collect(Collectors.joining(","))),
new BlackboardAttribute(
TSK_ASSOCIATED_ARTIFACT, MODULE_NAME,
originalArtifact.getArtifactID()));
@@ -482,9 +485,11 @@ public class IngestEventsListener {
try {
//only alert to previous instances when they were in another case
List<CorrelationAttributeInstance> previousOccurences = dbManager.getArtifactInstancesByTypeValue(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue());
List<String> caseDisplayNames;
for (CorrelationAttributeInstance instance : previousOccurences) {
if (!instance.getCorrelationCase().getCaseUUID().equals(eamArtifact.getCorrelationCase().getCaseUUID())) {
makeAndPostPreviousSeenArtifact(bbArtifact);
caseDisplayNames = dbManager.getListCasesHavingArtifactInstances(eamArtifact.getCorrelationType(), eamArtifact.getCorrelationValue());
makeAndPostPreviousSeenArtifact(bbArtifact, caseDisplayNames);
break;
}
}
@@ -2,16 +2,11 @@ OpenIDE-Module-Name=CommandLineAutopsy
OptionsCategory_Keywords_Command_Line_Ingest_Settings=Command Line Ingest Settings
OptionsCategory_Keywords_General=Options
OptionsCategory_Name_Command_Line_Ingest=Command Line Ingest
CommandLineIngestSettingsPanel.ResultsDirectoryUnspecified=Output folder must be set
CommandLineIngestSettingsPanel.PathInvalid=Path is not valid
CommandLineIngestSettingsPanel.CannotAccess=Cannot access
CommandLineIngestSettingsPanel.CheckPermissions=Check permissions.
CommandLineIngestSettingsPanel.jLabelSelectOutputFolder.text=Select output folder:
CommandLineIngestSettingsPanel.jLabelInvalidResultsFolder.text=jLabelInvalidOutputFolder
CommandLineIngestSettingsPanel.outputPathTextField.toolTipText=Output folder for command line processing, i.e., the location where case folder will be created by command line processing mode.
CommandLineIngestSettingsPanel.outputPathTextField.text=
CommandLineIngestSettingsPanel.browseOutputFolderButton.text=Browse
CommandLineIngestSettingsPanel.bnEditIngestSettings.toolTipText=Ingest job settings for the command line processing mode context.
CommandLineIngestSettingsPanel.bnEditIngestSettings.text=Ingest Module Settings
CommandLinePanel.jLabel1.text=Ingest is running from command line
CommandLineStartupWindow.title.text=Running in Command Line Mode
CommandLineIngestSettingsPanel.bnEditIngestSettings.text=Configure Ingest
CommandLineIngestSettingsPanel.bnEditReportSettings.actionCommand=Report Module Settings
CommandLineIngestSettingsPanel.bnEditReportSettings.toolTipText=Report generation settings for the command line processing mode context.
CommandLineIngestSettingsPanel.bnEditReportSettings.text=Configure Reporting
CommandLineIngestSettingsPanel.jLabelDescription.text=<html>You can create cases, add data sources, run ingest modules, and generate reports from the command line.<br>This options panel allows you to configure the settings to use when running ingest modules and generating reports.<br>See the user documentation for details.</html>
CommandLineIngestSettingsPanel.bnEditIngestSettings.toolTipText=Ingest job settings for the command line processing mode context.
@@ -2,16 +2,11 @@ OpenIDE-Module-Name=CommandLineAutopsy
OptionsCategory_Keywords_Command_Line_Ingest_Settings=Command Line Ingest Settings
OptionsCategory_Keywords_General=Options
OptionsCategory_Name_Command_Line_Ingest=Command Line Ingest
CommandLineIngestSettingsPanel.ResultsDirectoryUnspecified=Output folder must be set
CommandLineIngestSettingsPanel.PathInvalid=Path is not valid
CommandLineIngestSettingsPanel.CannotAccess=Cannot access
CommandLineIngestSettingsPanel.CheckPermissions=Check permissions.
CommandLineIngestSettingsPanel.jLabelSelectOutputFolder.text=Select output folder:
CommandLineIngestSettingsPanel.jLabelInvalidResultsFolder.text=jLabelInvalidOutputFolder
CommandLineIngestSettingsPanel.outputPathTextField.toolTipText=Output folder for command line processing, i.e., the location where case folder will be created by command line processing mode.
CommandLineIngestSettingsPanel.outputPathTextField.text=
CommandLineIngestSettingsPanel.browseOutputFolderButton.text=Browse
CommandLineIngestSettingsPanel.bnEditIngestSettings.toolTipText=Ingest job settings for the command line processing mode context.
CommandLineIngestSettingsPanel.bnEditIngestSettings.text=Ingest Module Settings
CommandLinePanel.jLabel1.text=Ingest is running from command line
CommandLineStartupWindow.title.text=Running in Command Line Mode
CommandLineIngestSettingsPanel.bnEditIngestSettings.text=Configure Ingest
CommandLineIngestSettingsPanel.bnEditReportSettings.actionCommand=Report Module Settings
CommandLineIngestSettingsPanel.bnEditReportSettings.toolTipText=Report generation settings for the command line processing mode context.
CommandLineIngestSettingsPanel.bnEditReportSettings.text=Configure Reporting
CommandLineIngestSettingsPanel.jLabelDescription.text=<html>You can create cases, add data sources, run ingest modules, and generate reports from the command line.<br>This options panel allows you to configure the settings to use when running ingest modules and generating reports.<br>See the user documentation for details.</html>
CommandLineIngestSettingsPanel.bnEditIngestSettings.toolTipText=Ingest job settings for the command line processing mode context.
@@ -0,0 +1,82 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2019-2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.commandlineingest;
import java.util.HashMap;
import java.util.Map;
/**
* Class that contains list of input parameters passed in via command line.
*/
class CommandLineCommand {
/**
* An enumeration of command types.
*/
static enum CommandType {
CREATE_CASE,
ADD_DATA_SOURCE,
RUN_INGEST,
LIST_ALL_DATA_SOURCES,
GENERATE_REPORTS;
}
/**
* An enumeration of input types.
*/
static enum InputType {
CASE_NAME,
CASES_BASE_DIR_PATH,
CASE_FOLDER_PATH,
DATA_SOURCE_PATH,
DATA_SOURCE_ID,
INGEST_PROFILE_NAME;
}
private final CommandType type;
private final Map<String, String> inputs = new HashMap<>();
CommandLineCommand(CommandType type) {
this.type = type;
}
/**
* Adds an parameter to the command.
*
* @param inputName Input parameter name
* @param inputValue Input parameter value
*/
void addInputValue(String inputName, String inputValue) {
inputs.put(inputName, inputValue);
}
/**
* @return the inputs
*/
Map<String, String> getInputs() {
return inputs;
}
/**
* @return the type
*/
CommandType getType() {
return type;
}
}
@@ -24,11 +24,14 @@ import java.io.File;
import java.io.FilenameFilter;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.Collection;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import org.netbeans.spi.sendopts.OptionProcessor;
@@ -38,9 +41,11 @@ import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.CaseActionException;
import org.sleuthkit.autopsy.casemodule.CaseDetails;
import org.sleuthkit.autopsy.casemodule.CaseMetadata;
import static org.sleuthkit.autopsy.casemodule.CaseMetadata.getFileExtension;
import org.sleuthkit.autopsy.core.RuntimeProperties;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
import static org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS;
import static org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback.DataSourceProcessorResult.NO_ERRORS;
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.TimeStampUtils;
@@ -54,21 +59,27 @@ import org.sleuthkit.autopsy.ingest.IngestJobSettings;
import org.sleuthkit.autopsy.ingest.IngestJobStartResult;
import org.sleuthkit.autopsy.ingest.IngestManager;
import org.sleuthkit.autopsy.ingest.IngestModuleError;
import org.sleuthkit.autopsy.report.ReportProgressPanel;
import org.sleuthkit.autopsy.report.caseuco.CaseUcoFormatExporter;
import org.sleuthkit.autopsy.report.caseuco.ReportCaseUco;
import org.sleuthkit.autopsy.ingest.IngestProfiles;
import org.sleuthkit.autopsy.modules.interestingitems.FilesSet;
import org.sleuthkit.autopsy.modules.interestingitems.FilesSetsManager;
import org.sleuthkit.autopsy.progress.LoggingProgressIndicator;
import org.sleuthkit.autopsy.report.infrastructure.ReportGenerator;
import org.sleuthkit.autopsy.report.infrastructure.ReportProgressIndicator;
import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.TskCoreException;
/**
* Allows Autopsy to be invoked with a command line arguments. Causes Autopsy to
* create a case, add a specified data source, run ingest on that data source,
* produce a CASE/UCO report and exit.
* Allows Autopsy to be invoked with command line arguments. Arguments exist to
* cause Autopsy to create a case, add a specified data source, run ingest on
* that data source, list all data sources in the case, and generate reports.
*/
public class CommandLineIngestManager {
private static final Logger LOGGER = Logger.getLogger(CommandLineIngestManager.class.getName());
private static final Set<IngestManager.IngestJobEvent> INGEST_JOB_EVENTS_OF_INTEREST = EnumSet.of(IngestManager.IngestJobEvent.CANCELLED, IngestManager.IngestJobEvent.COMPLETED);
private Path rootOutputDirectory;
private Case caseForJob = null;
private AutoIngestDataSource dataSource = null;
private static final String LOG_DIR_NAME = "Command Output";
public CommandLineIngestManager() {
}
@@ -103,6 +114,10 @@ public class CommandLineIngestManager {
}
}
/**
* Requests the list of command line commands from command line options
* processor and executes the commands one by one.
*/
@Override
public void run() {
LOGGER.log(Level.INFO, "Job processing task started");
@@ -110,8 +125,7 @@ public class CommandLineIngestManager {
try {
// read command line inputs
LOGGER.log(Level.INFO, "Autopsy is running from command line"); //NON-NLS
String dataSourcePath = "";
String baseCaseName = "";
List<CommandLineCommand> commands = null;
// first look up all OptionProcessors and get input data from CommandLineOptionProcessor
Collection<? extends OptionProcessor> optionProcessors = Lookup.getDefault().lookupAll(OptionProcessor.class);
@@ -120,86 +134,173 @@ public class CommandLineIngestManager {
// find CommandLineOptionProcessor
OptionProcessor processor = optionsIterator.next();
if (processor instanceof CommandLineOptionProcessor) {
// check if we are running from command line
dataSourcePath = ((CommandLineOptionProcessor) processor).getPathToDataSource();
baseCaseName = ((CommandLineOptionProcessor) processor).getBaseCaseName();
// check if we are running from command line
commands = ((CommandLineOptionProcessor) processor).getCommands();
}
}
LOGGER.log(Level.INFO, "Data source path = {0}", dataSourcePath); //NON-NLS
LOGGER.log(Level.INFO, "Case name = {0}", baseCaseName); //NON-NLS
System.out.println("Data source path = " + dataSourcePath);
System.out.println("Case name = " + baseCaseName);
// verify inputs
if (dataSourcePath.isEmpty()) {
LOGGER.log(Level.SEVERE, "Data source path not specified");
System.out.println("Data source path not specified");
if (commands == null || commands.isEmpty()) {
LOGGER.log(Level.SEVERE, "No command line commands specified");
System.err.println("No command line commands specified");
return;
}
if (baseCaseName.isEmpty()) {
LOGGER.log(Level.SEVERE, "Case name not specified");
System.out.println("Case name not specified");
return;
}
if (!(new File(dataSourcePath).exists())) {
LOGGER.log(Level.SEVERE, "Data source file not found {0}", dataSourcePath);
System.out.println("Data source file not found " + dataSourcePath);
return;
}
// read options panel configuration
String rootOutputDir = UserPreferences.getCommandLineModeResultsFolder();
LOGGER.log(Level.INFO, "Output directory = {0}", rootOutputDir); //NON-NLS
System.out.println("Output directory = " + rootOutputDir);
if (rootOutputDir.isEmpty()) {
LOGGER.log(Level.SEVERE, "Output directory not specified, please configure Command Line Options Panel (in Tools -> Options)");
System.out.println("Output directory not specified, please configure Command Line Options Panel (in Tools -> Options)");
return;
}
if (!(new File(rootOutputDir).exists())) {
LOGGER.log(Level.SEVERE, "The output directory doesn't exist {0}", rootOutputDir);
System.out.println("The output directory doesn't exist " + rootOutputDir);
return;
}
rootOutputDirectory = Paths.get(rootOutputDir);
// open case
Case caseForJob;
try {
caseForJob = openCase(baseCaseName);
} catch (CaseActionException ex) {
LOGGER.log(Level.SEVERE, "Error creating or opening case " + baseCaseName, ex);
System.out.println("Error creating or opening case " + baseCaseName);
return;
}
// Commands are already stored in order in which they should be executed
for (CommandLineCommand command : commands) {
CommandLineCommand.CommandType type = command.getType();
switch (type) {
case CREATE_CASE:
try {
LOGGER.log(Level.INFO, "Processing 'Create Case' command");
System.out.println("Processing 'Create Case' command");
Map<String, String> inputs = command.getInputs();
String baseCaseName = inputs.get(CommandLineCommand.InputType.CASE_NAME.name());
String rootOutputDirectory = inputs.get(CommandLineCommand.InputType.CASES_BASE_DIR_PATH.name());
openCase(baseCaseName, rootOutputDirectory);
if (caseForJob == null) {
LOGGER.log(Level.SEVERE, "Error creating or opening case {0}", baseCaseName);
System.out.println("Error creating or opening case " + baseCaseName);
return;
}
String outputDirPath = getOutputDirPath(caseForJob);
OutputGenerator.saveCreateCaseOutput(caseForJob, outputDirPath, baseCaseName);
} catch (CaseActionException ex) {
String baseCaseName = command.getInputs().get(CommandLineCommand.InputType.CASE_NAME.name());
LOGGER.log(Level.SEVERE, "Error creating or opening case " + baseCaseName, ex);
System.err.println("Error creating or opening case " + baseCaseName);
// Do not process any other commands
return;
}
break;
case ADD_DATA_SOURCE:
try {
LOGGER.log(Level.INFO, "Processing 'Add Data Source' command");
System.out.println("Processing 'Add Data Source' command");
Map<String, String> inputs = command.getInputs();
AutoIngestDataSource dataSource = new AutoIngestDataSource("", Paths.get(dataSourcePath));
try {
// run data source processor
runDataSourceProcessor(caseForJob, dataSource);
// open the case, if it hasn't been already opened by CREATE_CASE command
if (caseForJob == null) {
String caseDirPath = inputs.get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
openCase(caseDirPath);
}
// run ingest manager
analyze(dataSource);
String dataSourcePath = inputs.get(CommandLineCommand.InputType.DATA_SOURCE_PATH.name());
dataSource = new AutoIngestDataSource("", Paths.get(dataSourcePath));
runDataSourceProcessor(caseForJob, dataSource);
// generate CASE-UCO report
Long selectedDataSourceId = getDataSourceId(dataSource);
Path reportFolderPath = Paths.get(caseForJob.getReportDirectory(), "CASE-UCO", "Data_Source_ID_" + selectedDataSourceId.toString() + "_" + TimeStampUtils.createTimeStamp(), ReportCaseUco.getReportFileName()); //NON_NLS
ReportProgressPanel progressPanel = new ReportProgressPanel("CASE_UCO", rootOutputDir); // dummy progress panel
CaseUcoFormatExporter.generateReport(selectedDataSourceId, reportFolderPath.toString(), progressPanel);
} catch (InterruptedException | AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException | AnalysisStartupException ex) {
LOGGER.log(Level.SEVERE, "Unable to ingest data source " + dataSourcePath + ". Exiting...", ex);
System.out.println("Unable to ingest data source " + dataSourcePath + ". Exiting...");
String outputDirPath = getOutputDirPath(caseForJob);
OutputGenerator.saveAddDataSourceOutput(caseForJob, dataSource, outputDirPath);
} catch (InterruptedException | AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException | CaseActionException ex) {
String dataSourcePath = command.getInputs().get(CommandLineCommand.InputType.DATA_SOURCE_PATH.name());
LOGGER.log(Level.SEVERE, "Error adding data source " + dataSourcePath, ex);
System.err.println("Error adding data source " + dataSourcePath);
// Do not process any other commands
return;
}
break;
case RUN_INGEST:
try {
LOGGER.log(Level.INFO, "Processing 'Run Ingest' command");
System.out.println("Processing 'Run Ingest' command");
Map<String, String> inputs = command.getInputs();
// open the case, if it hasn't been already opened by CREATE_CASE or ADD_DATA_SOURCE commands
if (caseForJob == null) {
String caseDirPath = inputs.get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
openCase(caseDirPath);
}
// populate the AutoIngestDataSource structure, if that hasn't been done by ADD_DATA_SOURCE command
if (dataSource == null) {
String dataSourceId = inputs.get(CommandLineCommand.InputType.DATA_SOURCE_ID.name());
Long dataSourceObjId = Long.valueOf(dataSourceId);
// get Content object for the data source
Content content = null;
try {
content = Case.getCurrentCaseThrows().getSleuthkitCase().getContentById(dataSourceObjId);
} catch (TskCoreException ex) {
LOGGER.log(Level.SEVERE, "Exception while trying to find data source with object ID " + dataSourceId, ex);
System.err.println("Exception while trying to find data source with object ID " + dataSourceId);
// Do not process any other commands
return;
}
if (content == null) {
LOGGER.log(Level.SEVERE, "Unable to find data source with object ID {0}", dataSourceId);
System.out.println("Unable to find data source with object ID " + dataSourceId);
// Do not process any other commands
return;
}
// populate the AutoIngestDataSource structure
dataSource = new AutoIngestDataSource("", Paths.get(content.getName()));
List<Content> contentList = Arrays.asList(new Content[]{content});
List<String> errorList = new ArrayList<>();
dataSource.setDataSourceProcessorOutput(NO_ERRORS, errorList, contentList);
}
// run ingest
String ingestProfile = inputs.get(CommandLineCommand.InputType.INGEST_PROFILE_NAME.name());
analyze(dataSource, ingestProfile);
} catch (InterruptedException | CaseActionException ex) {
String dataSourcePath = command.getInputs().get(CommandLineCommand.InputType.DATA_SOURCE_PATH.name());
LOGGER.log(Level.SEVERE, "Error running ingest on data source " + dataSourcePath, ex);
System.err.println("Error running ingest on data source " + dataSourcePath);
// Do not process any other commands
return;
}
break;
case LIST_ALL_DATA_SOURCES:
try {
LOGGER.log(Level.INFO, "Processing 'List All Data Sources' command");
System.out.println("Processing 'List All Data Sources' command");
Map<String, String> inputs = command.getInputs();
// open the case, if it hasn't been already opened by previous command
if (caseForJob == null) {
String caseDirPath = inputs.get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
openCase(caseDirPath);
}
String outputDirPath = getOutputDirPath(caseForJob);
OutputGenerator.listAllDataSources(caseForJob, outputDirPath);
} catch (CaseActionException ex) {
String caseDirPath = command.getInputs().get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
LOGGER.log(Level.SEVERE, "Error opening case in case directory: " + caseDirPath, ex);
System.err.println("Error opening case in case directory: " + caseDirPath);
// Do not process any other commands
return;
}
break;
case GENERATE_REPORTS:
try {
LOGGER.log(Level.INFO, "Processing 'Generate Reports' command");
System.out.println("Processing 'Generate Reports' command");
Map<String, String> inputs = command.getInputs();
// open the case, if it hasn't been already opened by previous command
if (caseForJob == null) {
String caseDirPath = inputs.get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
openCase(caseDirPath);
}
// generate reports
ReportProgressIndicator progressIndicator = new ReportProgressIndicator(new LoggingProgressIndicator());
ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), progressIndicator);
generator.generateReports();
} catch (CaseActionException ex) {
String caseDirPath = command.getInputs().get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
LOGGER.log(Level.SEVERE, "Error opening case in case directory: " + caseDirPath, ex);
System.err.println("Error opening case in case directory: " + caseDirPath);
// Do not process any other commands
return;
}
break;
default:
break;
}
}
} catch (Throwable ex) {
/*
* Unexpected runtime exceptions firewall. This task is
@@ -208,15 +309,15 @@ public class CommandLineIngestManager {
* Future<Void>, so this ensures that such errors get
* logged.
*/
LOGGER.log(Level.SEVERE, "Unexpected error while ingesting data source " + dataSourcePath, ex);
System.out.println("Unexpected error while ingesting data source " + dataSourcePath + ". Exiting...");
LOGGER.log(Level.SEVERE, "Unexpected error", ex);
System.err.println("Unexpected error. Exiting...");
} finally {
try {
Case.closeCurrentCase();
} catch (CaseActionException ex) {
LOGGER.log(Level.WARNING, "Exception while closing case", ex);
System.out.println("Exception while closing case");
System.err.println("Exception while closing case");
}
}
@@ -230,29 +331,25 @@ public class CommandLineIngestManager {
}
/**
* Provides object ID of the data source by reading it from Content
* object.
* Creates a new case using arguments passed in from command line
* CREATE_CASE command.
*
* @param dataSource DataSource object
* @param baseCaseName Case name
* @param rootOutputDirectory Full path to directory in which case
* output folder will be created
*
* @return object ID
* @throws CaseActionException
*/
private Long getDataSourceId(AutoIngestDataSource dataSource) {
Content content = dataSource.getContent().get(0);
return content.getId();
}
private void openCase(String baseCaseName, String rootOutputDirectory) throws CaseActionException {
private Case openCase(String baseCaseName) throws CaseActionException {
LOGGER.log(Level.INFO, "Opening case {0}", baseCaseName);
Path caseDirectoryPath = findCaseDirectory(rootOutputDirectory, baseCaseName);
LOGGER.log(Level.INFO, "Opening case {0} in directory {1}", new Object[]{baseCaseName, rootOutputDirectory});
Path caseDirectoryPath = findCaseDirectory(Paths.get(rootOutputDirectory), baseCaseName);
if (null != caseDirectoryPath) {
// found an existing case directory for same case name. the input case name must be unique. Exit.
LOGGER.log(Level.SEVERE, "Case {0} already exists. Case name must be unique. Exiting", baseCaseName);
throw new CaseActionException("Case " + baseCaseName + " already exists. Case name must be unique. Exiting");
} else {
caseDirectoryPath = createCaseFolderPath(rootOutputDirectory, baseCaseName);
caseDirectoryPath = createCaseFolderPath(Paths.get(rootOutputDirectory), baseCaseName);
// Create the case directory
Case.createCaseDirectory(caseDirectoryPath.toString(), Case.CaseType.SINGLE_USER_CASE);
@@ -261,9 +358,57 @@ public class CommandLineIngestManager {
Case.createAsCurrentCase(Case.CaseType.SINGLE_USER_CASE, caseDirectoryPath.toString(), caseDetails);
}
Case caseForJob = Case.getCurrentCase();
caseForJob = Case.getCurrentCase();
LOGGER.log(Level.INFO, "Opened case {0}", caseForJob.getName());
return caseForJob;
}
/**
* Opens existing case.
*
* @param caseFolderPath full path to case directory
*
* @throws CaseActionException
*/
private void openCase(String caseFolderPath) throws CaseActionException {
LOGGER.log(Level.INFO, "Opening case in directory {0}", caseFolderPath);
String metadataFilePath = findAutFile(caseFolderPath);
Case.openAsCurrentCase(metadataFilePath);
caseForJob = Case.getCurrentCase();
LOGGER.log(Level.INFO, "Opened case {0}", caseForJob.getName());
}
/**
* Finds the path to the .aut file for the specified case directory.
*
* @param caseDirectory the directory to check for a .aut file
*
* @return the path to the first .aut file found in the directory
*
* @throws CaseActionException if there was an issue finding a .aut file
*/
private String findAutFile(String caseDirectory) throws CaseActionException {
File caseFolder = Paths.get(caseDirectory).toFile();
if (caseFolder.exists()) {
/*
* Search for '*.aut' files.
*/
File[] fileArray = caseFolder.listFiles();
if (fileArray == null) {
throw new CaseActionException("No files found in case directory");
}
String autFilePath = null;
for (File file : fileArray) {
String name = file.getName().toLowerCase();
if (autFilePath == null && name.endsWith(getFileExtension())) {
return file.getAbsolutePath();
}
}
throw new CaseActionException("No .aut files found in case directory");
}
throw new CaseActionException("Case directory was not found");
}
/**
@@ -274,11 +419,16 @@ public class CommandLineIngestManager {
* @param dataSource The data source.
*
* @throws
* AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException if
* there was a DSP processing error
* AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorExceptioif
* there
* was
* a
* DSP
* processing
* error
*
* @throws InterruptedException if the thread running the job processing
* task is interrupted while blocked, i.e., if auto ingest is shutting down.
* @throws ead running the job processing task is interrupted while
* blocked, i.e., if auto ingest is shutting down.
*/
private void runDataSourceProcessor(Case caseForJob, AutoIngestDataSource dataSource) throws InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException {
@@ -375,24 +525,60 @@ public class CommandLineIngestManager {
/**
* Analyzes the data source content returned by the data source
* processor using the configured set of data source level and file
* level analysis modules.
* level analysis modules. If an ingest profile is specified, load that
* profile (profile = ingest context + ingest filter) for ingest.
* Otherwise use baseline configuration.
*
* @param dataSource The data source to analyze.
* @param dataSource The data source to analyze.
* @param ingestProfileName Name of ingest profile to use (optional)
*
* @throws AnalysisStartupException if there is an error analyzing the
* data source.
* @throws InterruptedException if the thread running the job processing
* task is interrupted while blocked, i.e., if auto ingest is shutting
* down.
* data source.
* @throws InterruptedException if the thread running the job
* processing task is interrupted while
* blocked, i.e., if auto ingest is
* shutting down.
*/
private void analyze(AutoIngestDataSource dataSource) throws AnalysisStartupException, InterruptedException {
private void analyze(AutoIngestDataSource dataSource, String ingestProfileName) throws AnalysisStartupException, InterruptedException {
LOGGER.log(Level.INFO, "Starting ingest modules analysis for {0} ", dataSource.getPath());
// configure ingest profile and file filter
IngestProfiles.IngestProfile selectedProfile = null;
FilesSet selectedFileSet = null;
if (!ingestProfileName.isEmpty()) {
selectedProfile = getSelectedProfile(ingestProfileName);
if (selectedProfile == null) {
// unable to find the user specified profile
LOGGER.log(Level.SEVERE, "Unable to find ingest profile: {0}. Ingest cancelled!", ingestProfileName);
System.err.println("Unable to find ingest profile: " + ingestProfileName + ". Ingest cancelled!");
return;
}
// get FileSet filter associated with this profile
selectedFileSet = getSelectedFilter(selectedProfile.getFileIngestFilter());
if (selectedFileSet == null) {
// unable to find the user specified profile
LOGGER.log(Level.SEVERE, "Unable to find file filter {0} for ingest profile: {1}. Ingest cancelled!", new Object[]{selectedProfile.getFileIngestFilter(), ingestProfileName});
System.err.println("Unable to find file filter " + selectedProfile.getFileIngestFilter() + " for ingest profile: " + ingestProfileName + ". Ingest cancelled!");
return;
}
}
IngestJobEventListener ingestJobEventListener = new IngestJobEventListener();
IngestManager.getInstance().addIngestJobEventListener(INGEST_JOB_EVENTS_OF_INTEREST, ingestJobEventListener);
try {
synchronized (ingestLock) {
IngestJobSettings ingestJobSettings = new IngestJobSettings(UserPreferences.getCommandLineModeIngestModuleContextString());
IngestJobSettings ingestJobSettings;
if (selectedProfile == null || selectedFileSet == null) {
// use baseline configuration
ingestJobSettings = new IngestJobSettings(UserPreferences.getCommandLineModeIngestModuleContextString());
} else {
// load the custom ingest
ingestJobSettings = new IngestJobSettings(selectedProfile.toString());
ingestJobSettings.setFileFilter(selectedFileSet);
}
List<String> settingsWarnings = ingestJobSettings.getWarnings();
if (settingsWarnings.isEmpty()) {
IngestJobStartResult ingestJobStartResult = IngestManager.getInstance().beginIngestJob(dataSource.getContent(), ingestJobSettings);
@@ -447,6 +633,50 @@ public class CommandLineIngestManager {
}
}
/**
* Gets the specified ingest profile from the list of all existing
* ingest profiles.
*
* @param ingestProfileName Ingest profile name
*
* @return IngestProfile object, or NULL if the profile doesn't exist
*/
private IngestProfiles.IngestProfile getSelectedProfile(String ingestProfileName) {
IngestProfiles.IngestProfile selectedProfile = null;
// lookup the profile by name
for (IngestProfiles.IngestProfile profile : IngestProfiles.getIngestProfiles()) {
if (profile.toString().equalsIgnoreCase(ingestProfileName)) {
// found the profile
selectedProfile = profile;
break;
}
}
return selectedProfile;
}
/**
* Gets the specified file filter from the list of all existing file
* filters (custom and standard).
*
* @param filterName Name of the file filter
*
* @return FilesSet object, or NULL if the filter doesn't exist
*/
private FilesSet getSelectedFilter(String filterName) {
try {
Map<String, FilesSet> fileIngestFilters = FilesSetsManager.getInstance()
.getCustomFileIngestFilters();
for (FilesSet fSet : FilesSetsManager.getStandardFileIngestFilters()) {
fileIngestFilters.put(fSet.getName(), fSet);
}
return fileIngestFilters.get(filterName);
} catch (FilesSetsManager.FilesSetsManagerException ex) {
LOGGER.log(Level.SEVERE, "Failed to get file ingest filter: " + filterName, ex); //NON-NLS
return null;
}
}
/**
* Creates a case folder path. Does not create the folder described by
* the path.
@@ -456,7 +686,7 @@ public class CommandLineIngestManager {
*
* @return A case folder path with a time stamp suffix.
*/
Path createCaseFolderPath(Path caseFoldersPath, String caseName) {
private Path createCaseFolderPath(Path caseFoldersPath, String caseName) {
String folderName = caseName + "_" + TimeStampUtils.createTimeStamp();
return Paths.get(caseFoldersPath.toString(), folderName);
}
@@ -471,7 +701,7 @@ public class CommandLineIngestManager {
*
* @return The path of the case folder, or null if it is not found.
*/
Path findCaseDirectory(Path folderToSearch, String caseName) {
private Path findCaseDirectory(Path folderToSearch, String caseName) {
File searchFolder = new File(folderToSearch.toString());
if (!searchFolder.isDirectory()) {
return null;
@@ -489,6 +719,17 @@ public class CommandLineIngestManager {
return caseFolderPath;
}
/**
* Returns full path to directory where command outputs should be saved.
*
* @param caseForJob Case object
*
* @return Full path to directory where command outputs should be saved
*/
private String getOutputDirPath(Case caseForJob) {
return caseForJob.getCaseDirectory() + File.separator + LOG_DIR_NAME;
}
/**
* An ingest job event listener that allows the job processing task to
* block until the analysis of a data source by the data source level
@@ -1,6 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[810, 422]"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
@@ -16,7 +21,7 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="nodeScrollPane" alignment="1" pref="864" max="32767" attributes="0"/>
<Component id="nodeScrollPane" alignment="1" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
@@ -31,6 +36,9 @@
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[0, 0]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[803, 553]"/>
</Property>
</Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
@@ -40,46 +48,35 @@
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[100, 100]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[801, 551]"/>
</Property>
</Properties>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Component id="outputPathTextField" min="-2" pref="630" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="browseOutputFolderButton" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="bnEditIngestSettings" alignment="0" min="-2" pref="155" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<Component id="jLabelSelectOutputFolder" min="-2" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="jLabelInvalidResultsFolder" min="-2" pref="544" max="-2" attributes="0"/>
</Group>
<Component id="jLabelDescription" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="bnEditReportSettings" alignment="0" min="-2" pref="155" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="355" max="32767" attributes="0"/>
<EmptySpace pref="-34" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="40" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="jLabelSelectOutputFolder" alignment="3" min="-2" pref="21" max="-2" attributes="0"/>
<Component id="jLabelInvalidResultsFolder" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="1" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="browseOutputFolderButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="outputPathTextField" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="25" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="27" max="-2" attributes="0"/>
<Component id="jLabelDescription" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="bnEditIngestSettings" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="389" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="bnEditReportSettings" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="381" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
@@ -88,10 +85,10 @@
<Component class="javax.swing.JButton" name="bnEditIngestSettings">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="viking/commandline/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditIngestSettings.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditIngestSettings.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="viking/commandline/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditIngestSettings.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditIngestSettings.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditIngestSettings.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
@@ -101,58 +98,28 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnEditIngestSettingsActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="browseOutputFolderButton">
<Component class="javax.swing.JLabel" name="jLabelDescription">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="viking/commandline/Bundle.properties" key="CommandLineIngestSettingsPanel.browseOutputFolderButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.jLabelDescription.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<AccessibilityProperties>
<Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.browseOutputFolderButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</AccessibilityProperties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="browseOutputFolderButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JTextField" name="outputPathTextField">
<Component class="javax.swing.JButton" name="bnEditReportSettings">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="viking/commandline/Bundle.properties" key="CommandLineIngestSettingsPanel.outputPathTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditReportSettings.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="viking/commandline/Bundle.properties" key="CommandLineIngestSettingsPanel.outputPathTextField.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditReportSettings.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditReportSettings.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="jLabelInvalidResultsFolder">
<Properties>
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="0" green="0" red="ff" type="rgb"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="viking/commandline/Bundle.properties" key="CommandLineIngestSettingsPanel.jLabelInvalidResultsFolder.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<AccessibilityProperties>
<Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.jLabelInvalidResultsFolder.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</AccessibilityProperties>
</Component>
<Component class="javax.swing.JLabel" name="jLabelSelectOutputFolder">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="viking/commandline/Bundle.properties" key="CommandLineIngestSettingsPanel.jLabelSelectOutputFolder.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="verticalAlignment" type="int" value="3"/>
</Properties>
<AccessibilityProperties>
<Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.jLabelSelectOutputFolder.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</AccessibilityProperties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnEditReportSettingsActionPerformed"/>
</Events>
</Component>
</SubComponents>
</Container>
@@ -20,20 +20,13 @@ package org.sleuthkit.autopsy.commandlineingest;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.io.File;
import java.nio.file.Files;
import java.util.List;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.ingest.IngestJobSettings;
import org.sleuthkit.autopsy.ingest.IngestJobSettingsPanel;
import java.nio.file.Paths;
import org.sleuthkit.autopsy.coreutils.FileUtil;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.coreutils.Logger;
import static org.sleuthkit.autopsy.report.infrastructure.ReportWizardAction.doReportWizard;
/**
* Configuration panel for auto ingest settings.
@@ -41,10 +34,12 @@ import org.sleuthkit.autopsy.coreutils.Logger;
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
public class CommandLineIngestSettingsPanel extends javax.swing.JPanel {
private final CommandLineIngestSettingsPanelController controller;
private final JFileChooser fc = new JFileChooser();
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(CommandLineIngestSettingsPanel.class.getName());
private static final String REPORTING_CONFIGURATION_NAME = "CommandLineIngest";
private static final boolean DISPLAY_CASE_SPECIFIC_DATA = false; // do not try to display case specific data
private static final boolean RUN_REPORTS = false; // do not generate reports as part of running the report wizard
/**
* Creates new form AutoIngestSettingsPanel
@@ -52,171 +47,14 @@ public class CommandLineIngestSettingsPanel extends javax.swing.JPanel {
* @param theController Controller to notify of changes.
*/
public CommandLineIngestSettingsPanel(CommandLineIngestSettingsPanelController theController) {
controller = theController;
initComponents();
load(true);
outputPathTextField.getDocument().addDocumentListener(new MyDocumentListener());
jLabelInvalidResultsFolder.setText("");
}
private class MyDocumentListener implements DocumentListener {
@Override
public void changedUpdate(DocumentEvent e) {
valid();
controller.changed();
}
@Override
public void removeUpdate(DocumentEvent e) {
valid();
controller.changed();
}
@Override
public void insertUpdate(DocumentEvent e) {
valid();
controller.changed();
}
};
/**
* Load mode from persistent storage.
*
* @param inStartup True if we're doing the initial population of the UI
* @return the REPORTING_CONFIGURATION_NAME
*/
final void load(boolean inStartup) {
String results = org.sleuthkit.autopsy.commandlineingest.UserPreferences.getCommandLineModeResultsFolder();
if (results != null) {
outputPathTextField.setText(results);
} else {
outputPathTextField.setText("");
}
valid();
}
/**
* Save mode to persistent storage.
*/
void store() {
String resultsFolderPath = getNormalizedFolderPath(outputPathTextField.getText().trim());
org.sleuthkit.autopsy.commandlineingest.UserPreferences.setCommandLineModeResultsFolder(resultsFolderPath);
}
/**
* Validate current panel settings.
*/
boolean valid() {
if (validateResultsPath()) {
return true;
}
return false;
}
/**
* Normalizes a path to make sure there are no "space" characters at the end
*
* @param path Path to a directory
*
* @return Path without "space" characters at the end
*/
String normalizePath(String path) {
while (path.length() > 0) {
if (path.charAt(path.length() - 1) == ' ') {
path = path.substring(0, path.length() - 1);
} else {
break;
}
}
return path;
}
/**
* Validates that a path is valid and points to a folder.
*
* @param path A path to be validated
*
* @return boolean returns true if valid and points to a folder, false
* otherwise
*/
boolean isFolderPathValid(String path) {
try {
File file = new File(normalizePath(path));
// check if it's a symbolic link
if (Files.isSymbolicLink(file.toPath())) {
return true;
}
// local folder
if (file.exists() && file.isDirectory()) {
return true;
}
} catch (Exception ex) {
// Files.isSymbolicLink (and other "files" methods) throw exceptions on seemingly innocent inputs.
// For example, it will throw an exception when either " " is last character in path or
// a path starting with ":".
// We can just ignore these exceptions as they occur in process of user typing in the path.
return false;
}
return false;
}
/**
* Returns a path that was normalized by file system.
*
* @param path A path to be normalized. Normalization occurs inside a call
* to new File().
*
* @return String returns normalized OS path
*/
String getNormalizedFolderPath(String path) {
// removes "/", "\", and " " characters at the end of path string.
// normalizePath() removes spaces at the end of path and a call to "new File()"
// internally formats the path string to remove "/" and "\" characters at the end of path.
File file = new File(normalizePath(path));
return file.getPath();
}
/**
* Validate results path. Display warnings if invalid.
*/
boolean validateResultsPath() {
String outputPath = outputPathTextField.getText().trim();
if (outputPath.isEmpty()) {
jLabelInvalidResultsFolder.setVisible(true);
jLabelInvalidResultsFolder.setText(NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.ResultsDirectoryUnspecified"));
/*
NOTE: JIRA-4850: Returning false disables OK and Apply buttons for the entire
Tools->Options bar until the path is set. It was decided to only validate
the path if the path is set.
*/
return true;
}
if (!isFolderPathValid(outputPath)) {
jLabelInvalidResultsFolder.setVisible(true);
jLabelInvalidResultsFolder.setText(NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.PathInvalid"));
return false;
}
if (false == permissionsAppropriate(outputPath)) {
jLabelInvalidResultsFolder.setVisible(true);
jLabelInvalidResultsFolder.setText(NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.CannotAccess")
+ " " + outputPath + " "
+ NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.CheckPermissions"));
return false;
}
jLabelInvalidResultsFolder.setVisible(false);
return true;
public static String getReportingConfigName() {
return REPORTING_CONFIGURATION_NAME;
}
private void displayIngestJobSettingsPanel() {
@@ -261,14 +99,16 @@ public class CommandLineIngestSettingsPanel extends javax.swing.JPanel {
nodeScrollPane = new javax.swing.JScrollPane();
nodePanel = new javax.swing.JPanel();
bnEditIngestSettings = new javax.swing.JButton();
browseOutputFolderButton = new javax.swing.JButton();
outputPathTextField = new javax.swing.JTextField();
jLabelInvalidResultsFolder = new javax.swing.JLabel();
jLabelSelectOutputFolder = new javax.swing.JLabel();
jLabelDescription = new javax.swing.JLabel();
bnEditReportSettings = new javax.swing.JButton();
setPreferredSize(new java.awt.Dimension(810, 422));
nodeScrollPane.setMinimumSize(new java.awt.Dimension(0, 0));
nodeScrollPane.setPreferredSize(new java.awt.Dimension(803, 553));
nodePanel.setMinimumSize(new java.awt.Dimension(100, 100));
nodePanel.setPreferredSize(new java.awt.Dimension(801, 551));
org.openide.awt.Mnemonics.setLocalizedText(bnEditIngestSettings, org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.bnEditIngestSettings.text")); // NOI18N
bnEditIngestSettings.setToolTipText(org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.bnEditIngestSettings.toolTipText")); // NOI18N
@@ -279,22 +119,17 @@ public class CommandLineIngestSettingsPanel extends javax.swing.JPanel {
}
});
org.openide.awt.Mnemonics.setLocalizedText(browseOutputFolderButton, org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.browseOutputFolderButton.text")); // NOI18N
browseOutputFolderButton.addActionListener(new java.awt.event.ActionListener() {
org.openide.awt.Mnemonics.setLocalizedText(jLabelDescription, org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.jLabelDescription.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(bnEditReportSettings, org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.bnEditReportSettings.text")); // NOI18N
bnEditReportSettings.setToolTipText(org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.bnEditReportSettings.toolTipText")); // NOI18N
bnEditReportSettings.setActionCommand(org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.bnEditReportSettings.actionCommand")); // NOI18N
bnEditReportSettings.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
browseOutputFolderButtonActionPerformed(evt);
bnEditReportSettingsActionPerformed(evt);
}
});
outputPathTextField.setText(org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.outputPathTextField.text")); // NOI18N
outputPathTextField.setToolTipText(org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.outputPathTextField.toolTipText")); // NOI18N
jLabelInvalidResultsFolder.setForeground(new java.awt.Color(255, 0, 0));
org.openide.awt.Mnemonics.setLocalizedText(jLabelInvalidResultsFolder, org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.jLabelInvalidResultsFolder.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(jLabelSelectOutputFolder, org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.jLabelSelectOutputFolder.text")); // NOI18N
jLabelSelectOutputFolder.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
javax.swing.GroupLayout nodePanelLayout = new javax.swing.GroupLayout(nodePanel);
nodePanel.setLayout(nodePanelLayout);
nodePanelLayout.setHorizontalGroup(
@@ -302,44 +137,30 @@ public class CommandLineIngestSettingsPanel extends javax.swing.JPanel {
.addGroup(nodePanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(nodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(nodePanelLayout.createSequentialGroup()
.addComponent(outputPathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 630, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(browseOutputFolderButton))
.addComponent(bnEditIngestSettings, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(nodePanelLayout.createSequentialGroup()
.addComponent(jLabelSelectOutputFolder)
.addGap(18, 18, 18)
.addComponent(jLabelInvalidResultsFolder, javax.swing.GroupLayout.PREFERRED_SIZE, 544, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(355, Short.MAX_VALUE))
.addComponent(jLabelDescription, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(bnEditReportSettings, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
nodePanelLayout.setVerticalGroup(
nodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(nodePanelLayout.createSequentialGroup()
.addGap(40, 40, 40)
.addGroup(nodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabelSelectOutputFolder, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabelInvalidResultsFolder))
.addGap(1, 1, 1)
.addGroup(nodePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(browseOutputFolderButton)
.addComponent(outputPathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(25, 25, 25)
.addGap(27, 27, 27)
.addComponent(jLabelDescription, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(bnEditIngestSettings)
.addContainerGap(389, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bnEditReportSettings)
.addContainerGap(381, Short.MAX_VALUE))
);
browseOutputFolderButton.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.browseOutputFolderButton.text")); // NOI18N
jLabelInvalidResultsFolder.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.jLabelInvalidResultsFolder.text")); // NOI18N
jLabelSelectOutputFolder.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(CommandLineIngestSettingsPanel.class, "CommandLineIngestSettingsPanel.jLabelSelectOutputFolder.text")); // NOI18N
nodeScrollPane.setViewportView(nodePanel);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(nodeScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 864, Short.MAX_VALUE)
.addComponent(nodeScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -347,54 +168,21 @@ public class CommandLineIngestSettingsPanel extends javax.swing.JPanel {
);
}// </editor-fold>//GEN-END:initComponents
private void browseOutputFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseOutputFolderButtonActionPerformed
String oldText = outputPathTextField.getText().trim();
// set the current directory of the FileChooser if the oldText is valid
File currentDir = new File(oldText);
if (currentDir.exists()) {
fc.setCurrentDirectory(currentDir);
}
fc.setDialogTitle("Select case output folder:");
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int retval = fc.showOpenDialog(this);
if (retval == JFileChooser.APPROVE_OPTION) {
String path = fc.getSelectedFile().getPath();
outputPathTextField.setText(path);
valid();
controller.changed();
}
}//GEN-LAST:event_browseOutputFolderButtonActionPerformed
private void bnEditReportSettingsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnEditReportSettingsActionPerformed
this.getParent().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
doReportWizard(getReportingConfigName(), DISPLAY_CASE_SPECIFIC_DATA, RUN_REPORTS);
this.getParent().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_bnEditReportSettingsActionPerformed
private void bnEditIngestSettingsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnEditIngestSettingsActionPerformed
displayIngestJobSettingsPanel();
}//GEN-LAST:event_bnEditIngestSettingsActionPerformed
boolean permissionsAppropriate(String path) {
return FileUtil.hasReadWriteAccess(Paths.get(path));
}
private void resetUI() {
load(true);
controller.changed();
}
void setEnabledState(boolean enabled) {
bnEditIngestSettings.setEnabled(enabled);
browseOutputFolderButton.setEnabled(enabled);
jLabelInvalidResultsFolder.setEnabled(enabled);
jLabelSelectOutputFolder.setEnabled(enabled);
outputPathTextField.setEnabled(enabled);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton bnEditIngestSettings;
private javax.swing.JButton browseOutputFolderButton;
private javax.swing.JLabel jLabelInvalidResultsFolder;
private javax.swing.JLabel jLabelSelectOutputFolder;
private javax.swing.JButton bnEditReportSettings;
private javax.swing.JLabel jLabelDescription;
private javax.swing.JPanel nodePanel;
private javax.swing.JScrollPane nodeScrollPane;
private javax.swing.JTextField outputPathTextField;
// End of variables declaration//GEN-END:variables
}
@@ -43,13 +43,11 @@ public final class CommandLineIngestSettingsPanelController extends OptionsPanel
@Override
public void update() {
getPanel().load(false);
changed = false;
}
@Override
public void applyChanges() {
getPanel().store();
changed = false;
}
@@ -59,7 +57,7 @@ public final class CommandLineIngestSettingsPanelController extends OptionsPanel
@Override
public boolean isValid() {
return getPanel().valid();
return true;
}
@Override
@@ -19,7 +19,9 @@
package org.sleuthkit.autopsy.commandlineingest;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
@@ -37,19 +39,36 @@ import org.openide.util.lookup.ServiceProvider;
public class CommandLineOptionProcessor extends OptionProcessor {
private static final Logger logger = Logger.getLogger(CommandLineOptionProcessor.class.getName());
private final Option pathToDataSourceOption = Option.optionalArgument('l', "inputPath");
private final Option caseNameOption = Option.optionalArgument('2', "caseName");
private final Option runFromCommandLineOption = Option.optionalArgument('3', "runFromCommandLine");
private String pathToDataSource;
private String baseCaseName;
private final Option caseNameOption = Option.requiredArgument('n', "caseName");
private final Option caseBaseDirOption = Option.requiredArgument('o', "caseBaseDir");
private final Option createCaseCommandOption = Option.withoutArgument('c', "createCase");
private final Option dataSourcePathOption = Option.requiredArgument('s', "dataSourcePath");
private final Option dataSourceObjectIdOption = Option.requiredArgument('i', "dataSourceObjectId");
private final Option addDataSourceCommandOption = Option.withoutArgument('a', "addDataSource");
private final Option caseDirOption = Option.requiredArgument('d', "caseDir");
private final Option runIngestCommandOption = Option.withoutArgument('r', "runIngest");
private final Option ingestProfileOption = Option.requiredArgument('p', "ingestProfile");
private final Option listAllDataSourcesCommandOption = Option.withoutArgument('l', "listAllDataSources");
private final Option generateReportsOption = Option.withoutArgument('g', "generateReports");
private boolean runFromCommandLine = false;
private final List<CommandLineCommand> commands = new ArrayList<>();
@Override
protected Set<Option> getOptions() {
Set<Option> set = new HashSet<>();
set.add(pathToDataSourceOption);
set.add(createCaseCommandOption);
set.add(caseNameOption);
set.add(runFromCommandLineOption);
set.add(caseBaseDirOption);
set.add(dataSourcePathOption);
set.add(addDataSourceCommandOption);
set.add(dataSourceObjectIdOption);
set.add(caseDirOption);
set.add(runIngestCommandOption);
set.add(ingestProfileOption);
set.add(listAllDataSourcesCommandOption);
set.add(generateReportsOption);
return set;
}
@@ -57,106 +76,268 @@ public class CommandLineOptionProcessor extends OptionProcessor {
protected void process(Env env, Map<Option, String[]> values) throws CommandException {
logger.log(Level.INFO, "Processing Autopsy command line options"); //NON-NLS
System.out.println("Processing Autopsy command line options");
if (values.containsKey(pathToDataSourceOption) && values.containsKey(caseNameOption) && values.containsKey(runFromCommandLineOption)) {
// parse input parameters
String inputPath;
String inputCaseName;
String modeString;
if (values.size() < 3) {
logger.log(Level.SEVERE, "Insufficient number of input arguments to run command line ingest");
System.out.println("Insufficient number of input arguments to run command line ingest");
this.runFromCommandLine = false;
return;
} else {
String[] argDirs = values.get(pathToDataSourceOption);
if (argDirs.length < 1) {
logger.log(Level.SEVERE, "Missing argument 'inputPath'");
System.out.println("Missing argument 'inputPath'");
this.runFromCommandLine = false;
return;
}
inputPath = argDirs[0];
runFromCommandLine = false;
argDirs = values.get(caseNameOption);
if (argDirs.length < 1) {
logger.log(Level.SEVERE, "Missing argument 'caseName'");
System.out.println("Missing argument 'caseName'");
this.runFromCommandLine = false;
return;
}
inputCaseName = argDirs[0];
argDirs = values.get(runFromCommandLineOption);
if (argDirs.length < 1) {
logger.log(Level.SEVERE, "Missing argument 'runFromCommandLine'");
System.out.println("Missing argument 'runFromCommandLine'");
this.runFromCommandLine = false;
return;
}
modeString = argDirs[0];
// input arguments must contain at least one command
if (!(values.containsKey(createCaseCommandOption) || values.containsKey(addDataSourceCommandOption)
|| values.containsKey(runIngestCommandOption) || values.containsKey(listAllDataSourcesCommandOption)
|| values.containsKey(generateReportsOption))) {
// not running from command line
logger.log(Level.INFO, "No command line commands passed in as inputs. Not running from command line."); //NON-NLS
System.err.println("No command line commands passed in as inputs. Not running from command line.");
return;
}
// verify inputs
if (modeString == null || modeString.isEmpty()) {
this.runFromCommandLine = false;
System.out.println("runFromCommandLine argument is empty");
return;
}
if (modeString.equalsIgnoreCase("true")) {
this.runFromCommandLine = true;
}
System.out.println("runFromCommandLine = " + this.runFromCommandLine);
}
// verify inputs
if (inputPath == null || inputPath.isEmpty() || !(new File(inputPath).exists())) {
logger.log(Level.SEVERE, "Input file {0} doesn''t exist", inputPath);
System.out.println("Input file " + inputPath + " doesn't exist");
this.runFromCommandLine = false;
// parse input parameters
String[] argDirs;
String inputCaseName = "";
if (values.containsKey(caseNameOption)) {
argDirs = values.get(caseNameOption);
if (argDirs.length < 1) {
logger.log(Level.SEVERE, "Missing argument 'caseName'");
System.err.println("Missing argument 'caseName'");
return;
}
inputCaseName = argDirs[0];
if (inputCaseName == null || inputCaseName.isEmpty()) {
logger.log(Level.SEVERE, "Case name argument is empty");
System.out.println("Case name argument is empty");
this.runFromCommandLine = false;
logger.log(Level.SEVERE, "'caseName' argument is empty");
System.err.println("'caseName' argument is empty");
return;
}
}
String caseBaseDir = "";
if (values.containsKey(caseBaseDirOption)) {
argDirs = values.get(caseBaseDirOption);
if (argDirs.length < 1) {
logger.log(Level.SEVERE, "Missing argument 'caseBaseDir'");
System.err.println("Missing argument 'caseBaseDir'");
return;
}
caseBaseDir = argDirs[0];
if (caseBaseDir == null || caseBaseDir.isEmpty()) {
logger.log(Level.SEVERE, "Missing argument 'caseBaseDir'");
System.err.println("Missing argument 'caseBaseDir'");
return;
}
// save the inputs
this.pathToDataSource = inputPath;
this.baseCaseName = inputCaseName;
logger.log(Level.INFO, "Input file = {0}", this.pathToDataSource); //NON-NLS
logger.log(Level.INFO, "Case name = {0}", this.baseCaseName); //NON-NLS
logger.log(Level.INFO, "runFromCommandLine = {0}", this.runFromCommandLine); //NON-NLS
System.out.println("Input file = " + this.pathToDataSource);
System.out.println("Case name = " + this.baseCaseName);
System.out.println("runFromCommandLine = " + this.runFromCommandLine);
} else {
System.out.println("Missing input arguments to run command line ingest");
logger.log(Level.SEVERE, "Missing input arguments to run command line ingest");
if (!(new File(caseBaseDir).exists()) || !(new File(caseBaseDir).isDirectory())) {
logger.log(Level.SEVERE, "''caseBaseDir'' {0} directory doesn''t exist or is not a directory", caseBaseDir);
System.err.println("'caseBaseDir' directory doesn't exist or is not a directory: " + caseBaseDir);
return;
}
}
String dataSourcePath = "";
if (values.containsKey(dataSourcePathOption)) {
argDirs = values.get(dataSourcePathOption);
if (argDirs.length < 1) {
logger.log(Level.SEVERE, "Missing argument 'dataSourcePath'");
System.err.println("Missing argument 'dataSourcePath'");
return;
}
dataSourcePath = argDirs[0];
// verify inputs
if (dataSourcePath == null || dataSourcePath.isEmpty()) {
logger.log(Level.SEVERE, "Missing argument 'dataSourcePath'");
System.err.println("Missing argument 'dataSourcePath'");
return;
}
if (!(new File(dataSourcePath).exists())) {
logger.log(Level.SEVERE, "Input data source file {0} doesn''t exist", dataSourcePath);
System.err.println("Input data source file " + dataSourcePath + " doesn't exist");
return;
}
}
String dataSourceId = "";
if (values.containsKey(dataSourceObjectIdOption)) {
argDirs = values.get(dataSourceObjectIdOption);
if (argDirs.length < 1) {
logger.log(Level.SEVERE, "Missing argument 'dataSourceObjectIdOption'");
System.err.println("Missing argument 'dataSourceObjectIdOption'");
return;
}
dataSourceId = argDirs[0];
// verify inputs
if (dataSourceId == null || dataSourceId.isEmpty()) {
logger.log(Level.SEVERE, "Input data source id is empty");
System.err.println("Input data source id is empty");
return;
}
}
String caseDir = "";
if (values.containsKey(caseDirOption)) {
argDirs = values.get(caseDirOption);
if (argDirs.length < 1) {
logger.log(Level.SEVERE, "Missing argument 'caseDirOption'");
System.err.println("Missing argument 'caseDirOption'");
return;
}
caseDir = argDirs[0];
// verify inputs
if (caseDir == null || caseDir.isEmpty()) {
logger.log(Level.SEVERE, "Missing argument 'caseDirOption'");
System.err.println("Missing argument 'caseDirOption'");
return;
}
if (!(new File(caseDir).exists()) || !(new File(caseDir).isDirectory())) {
logger.log(Level.SEVERE, "Case directory {0} doesn''t exist or is not a directory", caseDir);
System.err.println("Case directory " + caseDir + " doesn't exist or is not a directory");
return;
}
}
String ingestProfile = "";
if (values.containsKey(ingestProfileOption)) {
argDirs = values.get(ingestProfileOption);
if (argDirs.length < 1) {
logger.log(Level.SEVERE, "Missing argument 'ingestProfile'");
System.err.println("Missing argument 'ingestProfile'");
return;
}
ingestProfile = argDirs[0];
// verify inputs
if (ingestProfile == null || ingestProfile.isEmpty()) {
logger.log(Level.SEVERE, "Missing argument 'ingestProfile'");
System.err.println("Missing argument 'ingestProfile'");
return;
}
}
// Create commands in order in which they should be executed:
// First create the "CREATE_CASE" command, if present
if (values.containsKey(createCaseCommandOption)) {
// 'caseName' must always be specified for "CREATE_CASE" command
if (inputCaseName.isEmpty()) {
logger.log(Level.SEVERE, "'caseName' argument is empty");
System.out.println("'caseName' argument is empty");
runFromCommandLine = false;
return;
}
// 'caseBaseDir' must always be specified for "CREATE_CASE" command
if (caseBaseDir.isEmpty()) {
logger.log(Level.SEVERE, "'caseBaseDir' argument is empty");
System.err.println("'caseBaseDir' argument is empty");
runFromCommandLine = false;
return;
}
CommandLineCommand newCommand = new CommandLineCommand(CommandLineCommand.CommandType.CREATE_CASE);
newCommand.addInputValue(CommandLineCommand.InputType.CASE_NAME.name(), inputCaseName);
newCommand.addInputValue(CommandLineCommand.InputType.CASES_BASE_DIR_PATH.name(), caseBaseDir);
commands.add(newCommand);
runFromCommandLine = true;
}
// Add ADD_DATA_SOURCE command, if present
if (values.containsKey(addDataSourceCommandOption)) {
// 'caseDir' must only be specified if the case is not being created during the current run
if (!values.containsKey(createCaseCommandOption) && caseDir.isEmpty()) {
// new case is not being created during this run, so 'caseDir' should have been specified
logger.log(Level.SEVERE, "'caseDir' argument is empty");
System.err.println("'caseDir' argument is empty");
runFromCommandLine = false;
return;
}
// 'dataSourcePath' must always be specified for "ADD_DATA_SOURCE" command
if (dataSourcePath.isEmpty()) {
logger.log(Level.SEVERE, "'dataSourcePath' argument is empty");
System.err.println("'dataSourcePath' argument is empty");
runFromCommandLine = false;
return;
}
CommandLineCommand newCommand = new CommandLineCommand(CommandLineCommand.CommandType.ADD_DATA_SOURCE);
newCommand.addInputValue(CommandLineCommand.InputType.CASE_FOLDER_PATH.name(), caseDir);
newCommand.addInputValue(CommandLineCommand.InputType.DATA_SOURCE_PATH.name(), dataSourcePath);
commands.add(newCommand);
runFromCommandLine = true;
}
// Add RUN_INGEST command, if present
if (values.containsKey(runIngestCommandOption)) {
// 'caseDir' must only be specified if the case is not being created during the current run
if (!values.containsKey(createCaseCommandOption) && caseDir.isEmpty()) {
// new case is not being created during this run, so 'caseDir' should have been specified
logger.log(Level.SEVERE, "'caseDir' argument is empty");
System.err.println("'caseDir' argument is empty");
runFromCommandLine = false;
return;
}
// if new data source is being added during this run, then 'dataSourceId' is not specified
if (!values.containsKey(addDataSourceCommandOption) && dataSourceId.isEmpty()) {
// data source is not being added during this run, so 'dataSourceId' should have been specified
logger.log(Level.SEVERE, "'dataSourceId' argument is empty");
System.err.println("'dataSourceId' argument is empty");
runFromCommandLine = false;
return;
}
CommandLineCommand newCommand = new CommandLineCommand(CommandLineCommand.CommandType.RUN_INGEST);
newCommand.addInputValue(CommandLineCommand.InputType.CASE_FOLDER_PATH.name(), caseDir);
newCommand.addInputValue(CommandLineCommand.InputType.DATA_SOURCE_ID.name(), dataSourceId);
newCommand.addInputValue(CommandLineCommand.InputType.INGEST_PROFILE_NAME.name(), ingestProfile);
commands.add(newCommand);
runFromCommandLine = true;
}
// Add "LIST_ALL_DATA_SOURCES" command, if present
if (values.containsKey(listAllDataSourcesCommandOption)) {
// 'caseDir' must only be specified if the case is not being created during the current run
if (!values.containsKey(createCaseCommandOption) && caseDir.isEmpty()) {
// new case is not being created during this run, so 'caseDir' should have been specified
logger.log(Level.SEVERE, "'caseDir' argument is empty");
System.err.println("'caseDir' argument is empty");
runFromCommandLine = false;
return;
}
CommandLineCommand newCommand = new CommandLineCommand(CommandLineCommand.CommandType.LIST_ALL_DATA_SOURCES);
newCommand.addInputValue(CommandLineCommand.InputType.CASE_FOLDER_PATH.name(), caseDir);
commands.add(newCommand);
runFromCommandLine = true;
}
// Add "GENERATE_REPORTS" command, if present
if (values.containsKey(generateReportsOption)) {
// 'caseDir' must only be specified if the case is not being created during the current run
if (!values.containsKey(createCaseCommandOption) && caseDir.isEmpty()) {
// new case is not being created during this run, so 'caseDir' should have been specified
logger.log(Level.SEVERE, "'caseDir' argument is empty");
System.err.println("'caseDir' argument is empty");
runFromCommandLine = false;
return;
}
CommandLineCommand newCommand = new CommandLineCommand(CommandLineCommand.CommandType.GENERATE_REPORTS);
newCommand.addInputValue(CommandLineCommand.InputType.CASE_FOLDER_PATH.name(), caseDir);
commands.add(newCommand);
runFromCommandLine = true;
}
}
/**
* Returns user specified path to data source
*
* @return the inputPath
*/
String getPathToDataSource() {
return pathToDataSource;
}
/**
* Returns user specified case name
*
* @return the inputCaseName
*/
String getBaseCaseName() {
return baseCaseName;
}
/**
* Returns whether Autopsy should be running in command line mode or not.
*
@@ -164,5 +345,14 @@ public class CommandLineOptionProcessor extends OptionProcessor {
*/
public boolean isRunFromCommandLine() {
return runFromCommandLine;
}
}
/**
* Returns list of all commands passed in via command line.
*
* @return list of input commands
*/
List<CommandLineCommand> getCommands() {
return commands;
}
}
@@ -0,0 +1,282 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2019-2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.commandlineingest;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.util.DefaultIndenter;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.TimeStampUtils;
import org.sleuthkit.autopsy.datamodel.utils.DataSourceLoader;
import org.sleuthkit.autopsy.datasourceprocessors.AutoIngestDataSource;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.Image;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TskCoreException;
/**
* Generates JSON output
*/
class OutputGenerator {
private static final Logger logger = Logger.getLogger(OutputGenerator.class.getName());
private OutputGenerator() {
}
/**
* Saves output of "Create Case" command to JSON output file.
*
* @param caseForJob Case object
* @param outputDirPath Full path to a directory where JSON output should be
* saved
* @param baseCaseName Case name
*/
static void saveCreateCaseOutput(Case caseForJob, String outputDirPath, String baseCaseName) {
JsonFactory jsonGeneratorFactory = new JsonFactory();
String reportOutputPath = outputDirPath + File.separator + "createCase_" + TimeStampUtils.createTimeStamp() + ".json";
java.io.File reportFile = Paths.get(reportOutputPath).toFile();
try {
Files.createDirectories(Paths.get(reportFile.getParent()));
} catch (IOException ex) {
logger.log(Level.SEVERE, "Unable to create output file " + reportFile.toString() + " for 'Create Case' command", ex); //NON-NLS
System.err.println("Unable to create output file " + reportFile.toString() + " for 'Create Case' command"); //NON-NLS
return;
}
JsonGenerator jsonGenerator = null;
try {
jsonGenerator = jsonGeneratorFactory.createGenerator(reportFile, JsonEncoding.UTF8);
// instert \n after each field for more readable formatting
jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter().withObjectIndenter(new DefaultIndenter(" ", "\n")));
// save command output
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("@caseName", baseCaseName);
jsonGenerator.writeStringField("@caseDir", caseForJob.getCaseDirectory());
jsonGenerator.writeEndObject();
} catch (IOException ex) {
logger.log(Level.SEVERE, "Failed to create JSON output for 'Create Case' command", ex); //NON-NLS
System.err.println("Failed to create JSON output for 'Create Case' command"); //NON-NLS
} finally {
if (jsonGenerator != null) {
try {
jsonGenerator.close();
} catch (IOException ex) {
logger.log(Level.WARNING, "Failed to close JSON output file for 'Create Case' command", ex); //NON-NLS
System.err.println("Failed to close JSON output file for 'Create Case' command"); //NON-NLS
}
}
}
}
/**
* Saves output of "Add data source" command to JSON output file.
*
* @param caseForJob Case object
* @param outputDirPath Full path to a directory where JSON output should be
* saved
* @param dataSource AutoIngestDataSource object for the data source
*/
static void saveAddDataSourceOutput(Case caseForJob, AutoIngestDataSource dataSource, String outputDirPath) {
List<Content> contentObjects = dataSource.getContent();
if (contentObjects == null || contentObjects.isEmpty()) {
logger.log(Level.SEVERE, "No content objects for 'Add Data Source' command"); //NON-NLS
System.err.println("No content objects for 'Add Data Source' command"); //NON-NLS
return;
}
JsonFactory jsonGeneratorFactory = new JsonFactory();
String reportOutputPath = outputDirPath + File.separator + "addDataSource_" + TimeStampUtils.createTimeStamp() + ".json";
java.io.File reportFile = Paths.get(reportOutputPath).toFile();
try {
Files.createDirectories(Paths.get(reportFile.getParent()));
} catch (IOException ex) {
logger.log(Level.SEVERE, "Unable to create output file " + reportFile.toString() + " for 'Add Data Source' command", ex); //NON-NLS
System.err.println("Unable to create output file " + reportFile.toString() + " for 'Add Data Source' command"); //NON-NLS
return;
}
JsonGenerator jsonGenerator = null;
try {
jsonGenerator = jsonGeneratorFactory.createGenerator(reportFile, JsonEncoding.UTF8);
// instert \n after each field for more readable formatting
jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter().withObjectIndenter(new DefaultIndenter(" ", "\n")));
// save command output
for (Content content : contentObjects) {
String dataSourceName;
if (content.getDataSource() instanceof Image) {
// image data source. Need to get display name
dataSourceName = getImageDisplayName(caseForJob, content.getId());
if (dataSourceName == null) {
// some image data sources do not have "display_name" set, use data source name instead
dataSourceName = content.getName();
}
} else {
// logical data source. The only way I found that works for all types of logical
// data sources is to get AbstractFile from database and use it's name.
// Content.getName() works for most but not all scenarios.
AbstractFile file = caseForJob.getSleuthkitCase().getAbstractFileById(content.getId());
dataSourceName = file.getName();
}
// save the JSON output
saveDataSourceInfoToFile(jsonGenerator, dataSourceName, content.getId());
}
} catch (IOException ex) {
logger.log(Level.SEVERE, "Failed to create JSON output for 'Add Data Source' command", ex); //NON-NLS
System.err.println("Failed to create JSON output for 'Add Data Source' command"); //NON-NLS
} catch (TskCoreException ex) {
logger.log(Level.SEVERE, "Failed to get data source info for 'Add Data Source' command output", ex); //NON-NLS
System.err.println("Failed to get data source info for 'Add Data Source' command output"); //NON-NLS
} catch (SQLException ex) {
logger.log(Level.SEVERE, "Failed to get data source display name for 'Add Data Source' command output", ex); //NON-NLS
System.err.println("Failed to get data source display name for 'Add Data Source' command output"); //NON-NLS
} finally {
if (jsonGenerator != null) {
try {
jsonGenerator.close();
} catch (IOException ex) {
logger.log(Level.WARNING, "Failed to close JSON output file for 'Add Data Source' command", ex); //NON-NLS
System.err.println("Failed to close JSON output file for 'Add Data Source' command"); //NON-NLS
}
}
}
}
/**
* Gets the list of all data sources in a case and then saves their info to
* JSON output file.
*
* @param caseForJob Case object
* @param outputDirPath Full path to a directory where JSON output should be
* saved
*/
static void listAllDataSources(Case caseForJob, String outputDirPath) {
JsonFactory jsonGeneratorFactory = new JsonFactory();
String reportOutputPath = outputDirPath + File.separator + "listAllDataSources_" + TimeStampUtils.createTimeStamp() + ".json";
java.io.File reportFile = Paths.get(reportOutputPath).toFile();
try {
Files.createDirectories(Paths.get(reportFile.getParent()));
} catch (IOException ex) {
logger.log(Level.SEVERE, "Unable to create output file " + reportFile.toString() + " for 'List All Data Sources' command", ex); //NON-NLS
System.err.println("Unable to create output file " + reportFile.toString() + " for 'List All Data Sources' command"); //NON-NLS
return;
}
JsonGenerator jsonGenerator = null;
try {
jsonGenerator = jsonGeneratorFactory.createGenerator(reportFile, JsonEncoding.UTF8);
// instert \n after each field for more readable formatting
jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter().withObjectIndenter(new DefaultIndenter(" ", "\n")));
// list all image data sources
Map<Long, String> imageDataSources = DataSourceLoader.getImageDataSources(caseForJob.getSleuthkitCase());
for (Map.Entry<Long, String> entry : imageDataSources.entrySet()) {
String dataSourceName;
Long dataSourceObjOd = entry.getKey();
dataSourceName = getImageDisplayName(caseForJob, dataSourceObjOd);
if (dataSourceName == null) {
// some image data sources do not have "display_name" set, use data source name instead
dataSourceName = entry.getValue();
}
saveDataSourceInfoToFile(jsonGenerator, dataSourceName, dataSourceObjOd);
}
// list all logical data sources
Map<Long, String> logicalDataSources = DataSourceLoader.getLogicalDataSources(caseForJob.getSleuthkitCase());
for (Map.Entry<Long, String> entry : logicalDataSources.entrySet()) {
String dataSourceName = entry.getValue();
Long dataSourceObjOd = entry.getKey();
saveDataSourceInfoToFile(jsonGenerator, dataSourceName, dataSourceObjOd);
}
} catch (IOException ex) {
logger.log(Level.SEVERE, "Failed to create JSON output for 'List All Data Sources' command", ex); //NON-NLS
System.err.println("Failed to create JSON output for 'List All Data Sources' command"); //NON-NLS
} catch (TskCoreException ex) {
logger.log(Level.SEVERE, "Failed to get data source info for 'List All Data Sources' command output", ex); //NON-NLS
System.err.println("Failed to get data source info for 'List All Data Sources' command output"); //NON-NLS
} catch (SQLException ex) {
logger.log(Level.SEVERE, "Failed to get data source display name for 'List All Data Sources' command output", ex); //NON-NLS
System.err.println("Failed to get data source display name for 'List All Data Sources' command output"); //NON-NLS
} finally {
if (jsonGenerator != null) {
try {
jsonGenerator.close();
} catch (IOException ex) {
logger.log(Level.WARNING, "Failed to close JSON output file for 'List All Data Sources' command", ex); //NON-NLS
System.err.println("Failed to close JSON output file for 'List All Data Sources' command"); //NON-NLS
}
}
}
}
/**
* Saves data source info in JSON output file
*
* @param jsonGenerator Fully initialized JsonGenerator object
* @param dataSourceName Name of the data source
* @param dataSourceObjId Object Id of the data source
* @throws IOException
*/
private static void saveDataSourceInfoToFile(JsonGenerator jsonGenerator, String dataSourceName, long dataSourceObjId) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("@dataSourceName", dataSourceName);
jsonGenerator.writeStringField("@dataSourceObjectId", String.valueOf(dataSourceObjId));
jsonGenerator.writeEndObject();
}
/**
* Gets display_name from tsk_image_info table for Image data sources
*
* @param caseForJob Case object
* @param dataSourceId object ID of the data source
* @return
* @throws TskCoreException
* @throws SQLException
*/
private static String getImageDisplayName(Case caseForJob, Long dataSourceId) throws TskCoreException, SQLException {
String getImageDataSourceQuery = "select display_name from tsk_image_info where obj_id = " + dataSourceId;
try (SleuthkitCase.CaseDbQuery queryResult = caseForJob.getSleuthkitCase().executeQuery(getImageDataSourceQuery)) {
ResultSet resultSet = queryResult.getResultSet();
// check if we got a result
while (resultSet.next()) {
// we got a result so the data source was an image data source
return resultSet.getString(1);
}
}
return null;
}
}
@@ -491,8 +491,7 @@ final class CommonAttributePanel extends javax.swing.JDialog implements Observer
@Override
protected Map<Long, String> doInBackground() throws NoCurrentCaseException, TskCoreException, SQLException {
DataSourceLoader loader = new DataSourceLoader();
return loader.getDataSourceMap();
return DataSourceLoader.getAllDataSources();
}
@Override
@@ -24,7 +24,6 @@ import java.util.logging.Level;
import org.openide.nodes.ChildFactory;
import org.openide.nodes.Node;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.datamodel.Account;
import org.sleuthkit.datamodel.AccountDeviceInstance;
import org.sleuthkit.datamodel.CommunicationsFilter;
import org.sleuthkit.datamodel.CommunicationsManager;
@@ -16,28 +16,14 @@
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JSplitPane" name="jSplitPane1">
<Properties>
<Property name="dividerLocation" type="int" value="500"/>
</Properties>
<Container class="org.openide.explorer.view.OutlineView" name="outlineView">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
<SubComponents>
<Container class="org.openide.explorer.view.OutlineView" name="outlineView">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="left"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
</Container>
</SubComponents>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
</Container>
</SubComponents>
</Form>
@@ -64,8 +64,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
private final Outline outline;
private final ExplorerManager accountsTableEM = new ExplorerManager();
final RelationshipBrowser relationshipBrowser;
/*
* This lookup proxies the selection lookup of both he accounts table and
@@ -73,12 +71,9 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
*/
private final ProxyLookup proxyLookup;
public AccountsBrowser() {
public AccountsBrowser(RelationshipBrowser relationshipBrowser) {
initComponents();
jSplitPane1.setResizeWeight(0.5);
jSplitPane1.setDividerLocation(0.75);
outline = outlineView.getOutline();
outlineView.setPropertyColumns(
"device", Bundle.AccountNode_device(),
@@ -90,9 +85,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.AccountNode_accountName());
outline.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
outline.setColumnSorted(3, false, 1); //it would be nice if the column index wasn't hardcoded
relationshipBrowser = new RelationshipBrowser();
jSplitPane1.setRightComponent(relationshipBrowser);
accountsTableEM.addPropertyChangeListener(evt -> {
if (ExplorerManager.PROP_ROOT_CONTEXT.equals(evt.getPropertyName())) {
@@ -174,20 +166,14 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jSplitPane1 = new javax.swing.JSplitPane();
outlineView = new org.openide.explorer.view.OutlineView();
setLayout(new java.awt.BorderLayout());
jSplitPane1.setDividerLocation(500);
jSplitPane1.setLeftComponent(outlineView);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
add(outlineView, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JSplitPane jSplitPane1;
private org.openide.explorer.view.OutlineView outlineView;
// End of variables declaration//GEN-END:variables
@@ -49,3 +49,5 @@ VisualizationPanel.forwardButton.text=
VisualizationPanel.zoomPercentLabel.text=100%
VisualizationPanel.zoomLabel.text=Zoom:
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report.
CVTTopComponent.filtersPane.TabConstraints.tabTitle=Filters
CVTTopComponent.filterTabPanel.TabConstraints.tabTitle=Filters
@@ -92,6 +92,8 @@ VisualizationPanel.forwardButton.text=
VisualizationPanel.zoomPercentLabel.text=100%
VisualizationPanel.zoomLabel.text=Zoom:
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report.
CVTTopComponent.filtersPane.TabConstraints.tabTitle=Filters
CVTTopComponent.filterTabPanel.TabConstraints.tabTitle=Filters
VisualizationPanel_action_dialogs_title=Communications
VisualizationPanel_action_name_text=Snapshot Report
VisualizationPanel_module_name=Communications
@@ -14,24 +14,52 @@
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JSplitPane" name="mainSplitPane">
<Container class="javax.swing.JTabbedPane" name="filterTabPane">
<Events>
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="filterTabPaneMouseClicked"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="1.0"/>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="West"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="filterTabPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Filters">
<Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.filterTabPanel.TabConstraints.tabTitle" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
<SubComponents>
<Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane">
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
<Container class="javax.swing.JSplitPane" name="splitPane">
<Properties>
<Property name="dividerLocation" type="int" value="1"/>
<Property name="resizeWeight" type="double" value="0.25"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
<SubComponents>
<Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="left"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JTabbedPane" name="browseVisualizeTabPane">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
@@ -45,13 +73,16 @@
</AccessibilityProperties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="right"/>
<JSplitPaneConstraints position="left"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
<SubComponents>
<Component class="org.sleuthkit.autopsy.communications.AccountsBrowser" name="accountsBrowser">
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new org.sleuthkit.autopsy.communications.AccountsBrowser(relationshipBrowser)"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Browse">
@@ -66,6 +97,9 @@
</Constraints>
</Component>
<Component class="org.sleuthkit.autopsy.communications.VisualizationPanel" name="vizPanel">
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new org.sleuthkit.autopsy.communications.VisualizationPanel(relationshipBrowser)"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Visualize">
@@ -19,14 +19,16 @@
package org.sleuthkit.autopsy.communications;
import com.google.common.eventbus.Subscribe;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import org.openide.util.Lookup;
@@ -35,7 +37,10 @@ import org.openide.windows.Mode;
import org.openide.windows.RetainLocation;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.communications.relationships.RelationshipBrowser;
import org.sleuthkit.autopsy.communications.relationships.SelectionInfo;
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
import org.sleuthkit.datamodel.CommunicationsFilter;
/**
* Top component which displays the Communications Visualization Tool.
@@ -48,10 +53,17 @@ import org.sleuthkit.autopsy.coreutils.ThreadConfined;
public final class CVTTopComponent extends TopComponent {
private static final long serialVersionUID = 1L;
private boolean filtersVisible = true;
private final RelationshipBrowser relationshipBrowser = new RelationshipBrowser();
private CommunicationsFilter currentFilter;
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
public CVTTopComponent() {
initComponents();
splitPane.setRightComponent(relationshipBrowser);
splitPane.setDividerLocation(0.25);
setName(Bundle.CVTTopComponent_name());
/*
@@ -68,6 +80,8 @@ public final class CVTTopComponent extends TopComponent {
Lookup lookup = ((Lookup.Provider)selectedComponent).getLookup();
proxyLookup.setNewLookups(lookup);
}
relationshipBrowser.setSelectionInfo(new SelectionInfo(new HashSet<>(), new HashSet<>(), currentFilter));
});
@@ -80,14 +94,19 @@ public final class CVTTopComponent extends TopComponent {
CVTEvents.getCVTEventBus().register(accountsBrowser);
CVTEvents.getCVTEventBus().register(filtersPane);
mainSplitPane.setResizeWeight(0.5);
mainSplitPane.setDividerLocation(0.25);
filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-left.png")));
filterTabbedPane.setTitleAt(0, "");
}
@Subscribe
void pinAccount(CVTEvents.PinAccountsEvent pinEvent) {
browseVisualizeTabPane.setSelectedIndex(1);
}
@Subscribe
void handle(final CVTEvents.FilterChangeEvent filterChangeEvent) {
currentFilter = filterChangeEvent.getNewFilter();
}
/**
* This method is called from within the constructor to initialize the form.
@@ -96,38 +115,68 @@ public final class CVTTopComponent extends TopComponent {
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
GridBagConstraints gridBagConstraints;
mainSplitPane = new JSplitPane();
filterTabbedPane = new JTabbedPane();
filterTabPanel = new JPanel();
filtersPane = new FiltersPanel();
splitPane = new JSplitPane();
browseVisualizeTabPane = new JTabbedPane();
accountsBrowser = new AccountsBrowser();
vizPanel = new VisualizationPanel();
accountsBrowser = new AccountsBrowser(relationshipBrowser);
vizPanel = new VisualizationPanel(relationshipBrowser);
setLayout(new GridBagLayout());
setLayout(new BorderLayout());
mainSplitPane.setLeftComponent(filtersPane);
filterTabbedPane.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
filterTabbedPaneMouseClicked(evt);
}
});
filterTabPanel.setLayout(new BorderLayout());
filterTabPanel.add(filtersPane, BorderLayout.CENTER);
filterTabbedPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.filterTabPanel.TabConstraints.tabTitle"), filterTabPanel); // NOI18N
add(filterTabbedPane, BorderLayout.WEST);
splitPane.setDividerLocation(1);
splitPane.setResizeWeight(0.25);
browseVisualizeTabPane.setFont(new Font("Tahoma", 0, 18)); // NOI18N
browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.accountsBrowser.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/table.png")), accountsBrowser); // NOI18N
browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.vizPanel.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/emblem-web.png")), vizPanel); // NOI18N
mainSplitPane.setRightComponent(browseVisualizeTabPane);
splitPane.setLeftComponent(browseVisualizeTabPane);
browseVisualizeTabPane.getAccessibleContext().setAccessibleName(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName")); // NOI18N
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(mainSplitPane, gridBagConstraints);
add(splitPane, BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void filterTabbedPaneMouseClicked(MouseEvent evt) {//GEN-FIRST:event_filterTabPaneMouseClicked
int index = filterTabbedPane.indexAtLocation(evt.getX(), evt.getY());
if(index != -1) {
if(filtersVisible) {
filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-right.png")));
filterTabPanel.removeAll();
filterTabPanel.revalidate();
filtersVisible = false;
} else {
filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-left.png")));
filterTabPanel.add(filtersPane, BorderLayout.CENTER);
filterTabPanel.revalidate();
filtersVisible = true;
}
}
}//GEN-LAST:event_filterTabPaneMouseClicked
// Variables declaration - do not modify//GEN-BEGIN:variables
private AccountsBrowser accountsBrowser;
private JTabbedPane browseVisualizeTabPane;
private JTabbedPane filterTabbedPane;
private JPanel filterTabPanel;
private FiltersPanel filtersPane;
private JSplitPane mainSplitPane;
private JSplitPane splitPane;
private VisualizationPanel vizPanel;
// End of variables declaration//GEN-END:variables
@@ -18,6 +18,7 @@
<SubComponents>
<Container class="javax.swing.JScrollPane" name="scrollPane">
<Properties>
<Property name="autoscrolls" type="boolean" value="true"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="null"/>
</Property>
@@ -37,7 +38,7 @@
<Container class="javax.swing.JPanel" name="limitPane">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="15" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
<GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="15" insetsRight="25" anchor="18" weightX="1.0" weightY="1.0"/>
</Constraint>
</Constraints>
@@ -128,7 +129,7 @@
<Container class="javax.swing.JPanel" name="dateRangePane">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
@@ -222,7 +223,7 @@
<Container class="javax.swing.JPanel" name="devicesPane">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="100" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="100" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
@@ -325,7 +326,7 @@
<Container class="javax.swing.JPanel" name="accountTypesPane">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
@@ -422,7 +423,7 @@
<Container class="javax.swing.JPanel" name="topPane">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="24" weightX="1.0" weightY="0.0"/>
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="24" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
@@ -129,9 +129,7 @@ final public class FiltersPanel extends JPanel {
public FiltersPanel() {
initComponents();
CheckBoxIconPanel panel = createAccoutTypeCheckBoxPanel(Account.Type.DEVICE, true);
accountTypeMap.put(Account.Type.DEVICE, panel.getCheckBox());
accountTypeListPane.add(panel);
initalizeDeviceAccountType();
deviceRequiredLabel.setVisible(false);
accountTypeRequiredLabel.setVisible(false);
@@ -257,9 +255,11 @@ final public class FiltersPanel extends JPanel {
//clear the device filter widget when the case changes.
devicesMap.clear();
devicesListPane.removeAll();
accountTypeMap.clear();
accountTypeListPane.removeAll();
accountTypeMap.clear();
accountTypeListPane.removeAll();
initalizeDeviceAccountType();
});
}
@@ -269,6 +269,12 @@ final public class FiltersPanel extends JPanel {
IngestManager.getInstance().removeIngestModuleEventListener(ingestListener);
IngestManager.getInstance().removeIngestJobEventListener(ingestJobListener);
}
private void initalizeDeviceAccountType() {
CheckBoxIconPanel panel = createAccoutTypeCheckBoxPanel(Account.Type.DEVICE, true);
accountTypeMap.put(Account.Type.DEVICE, panel.getCheckBox());
accountTypeListPane.add(panel);
}
/**
* Populate the Account Types filter widgets
@@ -471,6 +477,7 @@ final public class FiltersPanel extends JPanel {
setLayout(new java.awt.GridBagLayout());
scrollPane.setAutoscrolls(true);
scrollPane.setBorder(null);
mainPanel.setLayout(new java.awt.GridBagLayout());
@@ -535,7 +542,7 @@ final public class FiltersPanel extends JPanel {
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(15, 0, 15, 0);
gridBagConstraints.insets = new java.awt.Insets(15, 0, 15, 25);
mainPanel.add(limitPane, gridBagConstraints);
startDatePicker.setEnabled(false);
@@ -602,7 +609,7 @@ final public class FiltersPanel extends JPanel {
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25);
mainPanel.add(dateRangePane, gridBagConstraints);
devicesPane.setLayout(new java.awt.GridBagLayout());
@@ -680,7 +687,7 @@ final public class FiltersPanel extends JPanel {
gridBagConstraints.ipady = 100;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25);
mainPanel.add(devicesPane, gridBagConstraints);
accountTypesPane.setLayout(new java.awt.GridBagLayout());
@@ -754,7 +761,7 @@ final public class FiltersPanel extends JPanel {
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25);
mainPanel.add(accountTypesPane, gridBagConstraints);
topPane.setLayout(new java.awt.GridBagLayout());
@@ -804,6 +811,7 @@ final public class FiltersPanel extends JPanel {
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 25);
mainPanel.add(topPane, gridBagConstraints);
scrollPane.setViewportView(mainPanel);
@@ -11,348 +11,282 @@
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,121,0,0,4,-59"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,63,0,0,4,-59"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JSplitPane" name="splitPane">
<Properties>
<Property name="dividerLocation" type="int" value="800"/>
<Property name="resizeWeight" type="double" value="0.5"/>
</Properties>
<Container class="javax.swing.JPanel" name="borderLayoutPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="borderLayoutPanel">
<Container class="javax.swing.JPanel" name="placeHolderPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="left"/>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace pref="316" max="32767" attributes="0"/>
<Component id="jTextArea1" min="-2" pref="424" max="-2" attributes="0"/>
<EmptySpace pref="481" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="32767" attributes="0"/>
<Component id="jTextArea1" min="-2" pref="47" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Container class="javax.swing.JPanel" name="placeHolderPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace pref="250" max="32767" attributes="0"/>
<Component id="jTextArea1" min="-2" pref="424" max="-2" attributes="0"/>
<EmptySpace pref="423" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="32767" attributes="0"/>
<Component id="jTextArea1" min="-2" pref="47" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Component class="javax.swing.JTextArea" name="jTextArea1">
<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="columns" type="int" value="20"/>
<Property name="lineWrap" type="boolean" value="true"/>
<Property name="rows" type="int" value="5"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.jTextArea1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="toolbar">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="First"/>
</Constraint>
</Constraints>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="backButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="forwardButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jSeparator4" min="-2" pref="10" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="fastOrganicLayoutButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="clearVizButton" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="jSeparator2" min="-2" pref="10" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="zoomLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="zoomPercentLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="zoomOutButton" min="-2" pref="32" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="zoomInButton" min="-2" pref="32" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="zoomActualButton" min="-2" pref="33" max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="fitZoomButton" min="-2" pref="32" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jSeparator3" min="-2" pref="10" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="snapshotButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace min="-2" pref="3" max="-2" attributes="0"/>
<Group type="103" groupAlignment="2" attributes="0">
<Component id="fastOrganicLayoutButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="zoomOutButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="zoomInButton" alignment="2" max="32767" attributes="0"/>
<Component id="zoomActualButton" alignment="2" max="32767" attributes="0"/>
<Component id="fitZoomButton" alignment="2" max="32767" attributes="0"/>
<Component id="zoomLabel" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="zoomPercentLabel" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="clearVizButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="jSeparator2" alignment="2" max="32767" attributes="0"/>
<Component id="backButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="forwardButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="snapshotButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="jSeparator3" alignment="2" max="32767" attributes="0"/>
<Component id="jSeparator4" alignment="2" max="32767" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="3" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Component class="javax.swing.JButton" name="fastOrganicLayoutButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fastOrganicLayoutButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fastOrganicLayoutButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="zoomOutButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomOutButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomOutButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomOutButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="zoomInButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomInButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="zoomActualButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomActualButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomActualButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomActualButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="fitZoomButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fitZoomButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="zoomLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="zoomPercentLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomPercentLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="clearVizButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/broom.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.actionCommand" 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="clearVizButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator2">
<Properties>
<Property name="orientation" type="int" value="1"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="backButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_previous.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.backButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.backButton.toolTipText" 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="backButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="forwardButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_next.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.forwardButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.forwardButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="horizontalTextPosition" type="int" value="10"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="forwardButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="snapshotButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/report/images/image.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.toolTipText" 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="snapshotButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator3">
<Properties>
<Property name="orientation" type="int" value="1"/>
</Properties>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator4">
<Properties>
<Property name="orientation" type="int" value="1"/>
</Properties>
</Component>
</SubComponents>
</Container>
<Container class="javafx.embed.swing.JFXPanel" name="notificationsJFXPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Last"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
<Property name="useNullLayout" type="boolean" value="true"/>
</Layout>
</Container>
<Component class="javax.swing.JTextArea" name="jTextArea1">
<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="columns" type="int" value="20"/>
<Property name="lineWrap" type="boolean" value="true"/>
<Property name="rows" type="int" value="5"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.jTextArea1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
<Container class="javafx.embed.swing.JFXPanel" name="notificationsJFXPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Last"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
<Property name="useNullLayout" type="boolean" value="true"/>
</Layout>
</Container>
</SubComponents>
</Container>
<Container class="javax.swing.JToolBar" name="toolbar">
<Properties>
<Property name="rollover" type="boolean" value="true"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="North"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
<SubComponents>
<Component class="javax.swing.JButton" name="backButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_previous.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.backButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.backButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="backButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="forwardButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_next.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.forwardButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.forwardButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="forwardButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator3">
</Component>
<Component class="javax.swing.JButton" name="clearVizButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/broom.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clearVizButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="fastOrganicLayoutButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fastOrganicLayoutButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fastOrganicLayoutButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fastOrganicLayoutButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator2">
</Component>
<Component class="javax.swing.JLabel" name="zoomLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="zoomPercentLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomPercentLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="zoomOutButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomOutButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomOutButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomOutButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="fitZoomButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fitZoomButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="zoomActualButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomActualButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomActualButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomActualButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="zoomInButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomInButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator1">
</Component>
<Component class="javax.swing.JButton" name="snapshotButton">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/org/sleuthkit/autopsy/report/images/image.png"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="snapshotButtonActionPerformed"/>
</Events>
</Component>
</SubComponents>
</Container>
</SubComponents>
@@ -43,6 +43,7 @@ import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
@@ -61,7 +62,6 @@ import java.nio.file.Paths;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.EnumSet;
import java.util.HashMap;
@@ -86,7 +86,6 @@ import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JToolBar;
@@ -96,7 +95,6 @@ import javax.swing.SwingWorker;
import org.apache.commons.lang3.StringUtils;
import org.controlsfx.control.Notifications;
import org.jdesktop.layout.GroupLayout;
import org.jdesktop.layout.LayoutStyle;
import org.openide.util.NbBundle;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.casemodule.Case;
@@ -112,6 +110,7 @@ import org.sleuthkit.datamodel.AccountDeviceInstance;
import org.sleuthkit.datamodel.CommunicationsFilter;
import org.sleuthkit.datamodel.CommunicationsManager;
import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.autopsy.uicomponents.WrapLayout;
/**
* A panel that goes in the Visualize tab of the Communications Visualization
* Tool. Hosts an JGraphX mxGraphComponent that implements the communications
@@ -160,7 +159,8 @@ final public class VisualizationPanel extends JPanel {
private final StateManager stateManager;
@NbBundle.Messages("VisalizationPanel.paintingError=Problem painting visualization.")
public VisualizationPanel() {
public VisualizationPanel(RelationshipBrowser relationshipBrowser) {
this.relationshipBrowser = relationshipBrowser;
initComponents();
//initialize invisible JFXPanel that is used to show JFXNotifications over this window.
notificationsJFXPanel.setScene(new Scene(new Pane()));
@@ -220,9 +220,6 @@ final public class VisualizationPanel extends JPanel {
final GraphMouseListener graphMouseListener = new GraphMouseListener();
graphComponent.getGraphControl().addMouseWheelListener(graphMouseListener);
graphComponent.getGraphControl().addMouseListener(graphMouseListener);
relationshipBrowser = new RelationshipBrowser();
splitPane.setRightComponent(relationshipBrowser);
//feed selection to explorermanager
graph.getSelectionModel().addListener(mxEvent.CHANGE, new SelectionListener());
@@ -247,6 +244,8 @@ final public class VisualizationPanel extends JPanel {
stateManager = new StateManager(pinnedAccountModel);
setStateButtonsEnabled();
toolbar.setLayout(new WrapLayout(FlowLayout.LEFT));
}
@Subscribe
@@ -373,32 +372,28 @@ final public class VisualizationPanel extends JPanel {
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
splitPane = new JSplitPane();
borderLayoutPanel = new JPanel();
placeHolderPanel = new JPanel();
jTextArea1 = new JTextArea();
toolbar = new JPanel();
fastOrganicLayoutButton = new JButton();
zoomOutButton = new JButton();
zoomInButton = new JButton();
zoomActualButton = new JButton();
fitZoomButton = new JButton();
zoomLabel = new JLabel();
zoomPercentLabel = new JLabel();
clearVizButton = new JButton();
jSeparator2 = new JToolBar.Separator();
notificationsJFXPanel = new JFXPanel();
toolbar = new JToolBar();
backButton = new JButton();
forwardButton = new JButton();
snapshotButton = new JButton();
jSeparator3 = new JToolBar.Separator();
jSeparator4 = new JToolBar.Separator();
notificationsJFXPanel = new JFXPanel();
clearVizButton = new JButton();
fastOrganicLayoutButton = new JButton();
jSeparator2 = new JToolBar.Separator();
zoomLabel = new JLabel();
zoomPercentLabel = new JLabel();
zoomOutButton = new JButton();
fitZoomButton = new JButton();
zoomActualButton = new JButton();
zoomInButton = new JButton();
jSeparator1 = new JToolBar.Separator();
snapshotButton = new JButton();
setLayout(new BorderLayout());
splitPane.setDividerLocation(800);
splitPane.setResizeWeight(0.5);
borderLayoutPanel.setLayout(new BorderLayout());
jTextArea1.setBackground(new Color(240, 240, 240));
@@ -411,9 +406,9 @@ final public class VisualizationPanel extends JPanel {
placeHolderPanel.setLayout(placeHolderPanelLayout);
placeHolderPanelLayout.setHorizontalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
.add(placeHolderPanelLayout.createSequentialGroup()
.addContainerGap(250, Short.MAX_VALUE)
.addContainerGap(316, Short.MAX_VALUE)
.add(jTextArea1, GroupLayout.PREFERRED_SIZE, 424, GroupLayout.PREFERRED_SIZE)
.addContainerGap(423, Short.MAX_VALUE))
.addContainerGap(481, Short.MAX_VALUE))
);
placeHolderPanelLayout.setVerticalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
.add(placeHolderPanelLayout.createSequentialGroup()
@@ -423,12 +418,72 @@ final public class VisualizationPanel extends JPanel {
);
borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER);
borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END);
add(borderLayoutPanel, BorderLayout.CENTER);
toolbar.setRollover(true);
backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N
backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N
backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N
backButton.setFocusable(false);
backButton.setHorizontalTextPosition(SwingConstants.CENTER);
backButton.setVerticalTextPosition(SwingConstants.BOTTOM);
backButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
backButtonActionPerformed(evt);
}
});
toolbar.add(backButton);
forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N
forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N
forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N
forwardButton.setFocusable(false);
forwardButton.setHorizontalTextPosition(SwingConstants.CENTER);
forwardButton.setVerticalTextPosition(SwingConstants.BOTTOM);
forwardButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
forwardButtonActionPerformed(evt);
}
});
toolbar.add(forwardButton);
toolbar.add(jSeparator3);
clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N
clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N
clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N
clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N
clearVizButton.setFocusable(false);
clearVizButton.setHorizontalTextPosition(SwingConstants.CENTER);
clearVizButton.setVerticalTextPosition(SwingConstants.BOTTOM);
clearVizButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
clearVizButtonActionPerformed(evt);
}
});
toolbar.add(clearVizButton);
fastOrganicLayoutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N
fastOrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N
fastOrganicLayoutButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.toolTipText")); // NOI18N
fastOrganicLayoutButton.setFocusable(false);
fastOrganicLayoutButton.setHorizontalTextPosition(SwingConstants.CENTER);
fastOrganicLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM);
fastOrganicLayoutButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
fastOrganicLayoutButtonActionPerformed(evt);
}
});
toolbar.add(fastOrganicLayoutButton);
toolbar.add(jSeparator2);
zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N
toolbar.add(zoomLabel);
zoomPercentLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomPercentLabel.text")); // NOI18N
toolbar.add(zoomPercentLabel);
zoomOutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"))); // NOI18N
zoomOutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N
@@ -441,30 +496,7 @@ final public class VisualizationPanel extends JPanel {
zoomOutButtonActionPerformed(evt);
}
});
zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N
zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N
zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N
zoomInButton.setFocusable(false);
zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER);
zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM);
zoomInButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
zoomInButtonActionPerformed(evt);
}
});
zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N
zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N
zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N
zoomActualButton.setFocusable(false);
zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER);
zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM);
zoomActualButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
zoomActualButtonActionPerformed(evt);
}
});
toolbar.add(zoomOutButton);
fitZoomButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N
fitZoomButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N
@@ -477,116 +509,49 @@ final public class VisualizationPanel extends JPanel {
fitZoomButtonActionPerformed(evt);
}
});
toolbar.add(fitZoomButton);
zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N
zoomPercentLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomPercentLabel.text")); // NOI18N
clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N
clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N
clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N
clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N
clearVizButton.addActionListener(new ActionListener() {
zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N
zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N
zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N
zoomActualButton.setFocusable(false);
zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER);
zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM);
zoomActualButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
clearVizButtonActionPerformed(evt);
zoomActualButtonActionPerformed(evt);
}
});
toolbar.add(zoomActualButton);
jSeparator2.setOrientation(SwingConstants.VERTICAL);
backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N
backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N
backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N
backButton.addActionListener(new ActionListener() {
zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N
zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N
zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N
zoomInButton.setFocusable(false);
zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER);
zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM);
zoomInButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
backButtonActionPerformed(evt);
}
});
forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N
forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N
forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N
forwardButton.setHorizontalTextPosition(SwingConstants.LEADING);
forwardButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
forwardButtonActionPerformed(evt);
zoomInButtonActionPerformed(evt);
}
});
toolbar.add(zoomInButton);
toolbar.add(jSeparator1);
snapshotButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/report/images/image.png"))); // NOI18N
snapshotButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.text_1")); // NOI18N
snapshotButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.toolTipText")); // NOI18N
snapshotButton.setFocusable(false);
snapshotButton.setHorizontalTextPosition(SwingConstants.CENTER);
snapshotButton.setVerticalTextPosition(SwingConstants.BOTTOM);
snapshotButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
snapshotButtonActionPerformed(evt);
}
});
toolbar.add(snapshotButton);
jSeparator3.setOrientation(SwingConstants.VERTICAL);
jSeparator4.setOrientation(SwingConstants.VERTICAL);
GroupLayout toolbarLayout = new GroupLayout(toolbar);
toolbar.setLayout(toolbarLayout);
toolbarLayout.setHorizontalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
.add(toolbarLayout.createSequentialGroup()
.addContainerGap()
.add(backButton)
.addPreferredGap(LayoutStyle.RELATED)
.add(forwardButton)
.addPreferredGap(LayoutStyle.RELATED)
.add(jSeparator4, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED)
.add(fastOrganicLayoutButton)
.addPreferredGap(LayoutStyle.RELATED)
.add(clearVizButton)
.addPreferredGap(LayoutStyle.RELATED)
.add(jSeparator2, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED)
.add(zoomLabel)
.addPreferredGap(LayoutStyle.RELATED)
.add(zoomPercentLabel)
.addPreferredGap(LayoutStyle.RELATED)
.add(zoomOutButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED)
.add(zoomInButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED)
.add(zoomActualButton, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED)
.add(fitZoomButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED)
.add(jSeparator3, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED)
.add(snapshotButton)
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
toolbarLayout.setVerticalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
.add(toolbarLayout.createSequentialGroup()
.add(3, 3, 3)
.add(toolbarLayout.createParallelGroup(GroupLayout.CENTER)
.add(fastOrganicLayoutButton)
.add(zoomOutButton)
.add(zoomInButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(zoomActualButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(fitZoomButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(zoomLabel)
.add(zoomPercentLabel)
.add(clearVizButton)
.add(jSeparator2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(backButton)
.add(forwardButton)
.add(snapshotButton)
.add(jSeparator3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(jSeparator4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.add(3, 3, 3))
);
borderLayoutPanel.add(toolbar, BorderLayout.PAGE_START);
borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END);
splitPane.setLeftComponent(borderLayoutPanel);
add(splitPane, BorderLayout.CENTER);
add(toolbar, BorderLayout.NORTH);
}// </editor-fold>//GEN-END:initComponents
private void fitZoomButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitZoomButtonActionPerformed
@@ -726,6 +691,10 @@ final public class VisualizationPanel extends JPanel {
}
}//GEN-LAST:event_snapshotButtonActionPerformed
private void fastOrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fastOrganicLayoutButtonActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_fastOrganicLayoutButtonActionPerformed
private void fitGraph() {
graphComponent.zoomTo(1, true);
mxPoint translate = graph.getView().getTranslate();
@@ -883,15 +852,14 @@ final public class VisualizationPanel extends JPanel {
private JButton fastOrganicLayoutButton;
private JButton fitZoomButton;
private JButton forwardButton;
private JToolBar.Separator jSeparator1;
private JToolBar.Separator jSeparator2;
private JToolBar.Separator jSeparator3;
private JToolBar.Separator jSeparator4;
private JTextArea jTextArea1;
private JFXPanel notificationsJFXPanel;
private JPanel placeHolderPanel;
private JButton snapshotButton;
private JSplitPane splitPane;
private JPanel toolbar;
private JToolBar toolbar;
private JButton zoomActualButton;
private JButton zoomInButton;
private JLabel zoomLabel;
Binary file not shown.

After

Width:  |  Height:  |  Size: 1022 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,200 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.communications.relationships;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.ImageUtils;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.datamodel.Account;
import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.Content;
import org.sleuthkit.datamodel.TskCoreException;
/**
*
* Class representing the Summary data for a given account.
*/
class AccountSummary {
private int attachmentCnt;
private int messagesCnt;
private int emailCnt;
private int callLogCnt;
private int contactsCnt;
private int mediaCnt;
private int referenceCnt;
private final Account selectedAccount;
private final Set<BlackboardArtifact> artifacts;
private static final Logger logger = Logger.getLogger(AccountSummary.class.getName());
/**
* Summary constructor.
*
* @param selectedAccount Selected account object
* @param artifacts List of relationship source artifacts
*/
AccountSummary(Account selectedAccount, Set<BlackboardArtifact> artifacts) {
this.selectedAccount = selectedAccount;
this.artifacts = artifacts;
initCounts();
}
/**
* Initialize the counts based on the selected account and the given artifacts.
*/
private void initCounts() {
for (BlackboardArtifact artifact : artifacts) {
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
if (null != fromID) {
switch (fromID) {
case TSK_EMAIL_MSG:
emailCnt++;
break;
case TSK_CALLLOG:
callLogCnt++;
break;
case TSK_MESSAGE:
messagesCnt++;
break;
case TSK_CONTACT:
if (selectedAccount.getAccountType() != Account.Type.DEVICE) {
String typeSpecificID = selectedAccount.getTypeSpecificID();
List<BlackboardAttribute> attributes = null;
try{
attributes = artifact.getAttributes();
} catch(TskCoreException ex) {
logger.log(Level.WARNING, String.format("Unable to getAttributes for artifact: %d", artifact.getArtifactID()), ex);
break;
}
boolean isReference = false;
for (BlackboardAttribute attribute: attributes) {
String attributeTypeName = attribute.getAttributeType().getTypeName();
String attributeValue = attribute.getValueString();
if (attributeTypeName.contains("PHONE")) {
attributeValue = RelationshipsNodeUtilities.normalizePhoneNum(attributeValue);
} else if (attributeTypeName.contains("EMAIL")) {
attributeValue = RelationshipsNodeUtilities.normalizeEmailAddress(attributeValue);
}
if ( typeSpecificID.equals(attributeValue) ) {
isReference = true;
break;
}
}
if (isReference) {
referenceCnt++;
} else {
contactsCnt++;
}
} else {
contactsCnt++;
}
break;
default:
break;
}
}
try {
attachmentCnt += artifact.getChildrenCount();
for (Content childContent : artifact.getChildren()) {
if (ImageUtils.thumbnailSupported(childContent)) {
mediaCnt++;
}
}
} catch (TskCoreException ex) {
logger.log(Level.WARNING, String.format("Exception thrown "
+ "from getChildrenCount artifactID: %d",
artifact.getArtifactID()), ex); //NON-NLS
}
}
}
/**
* Total number of attachments that this account is referenced.
*
* @return Attachment count
*/
public int getAttachmentCnt() {
return attachmentCnt;
}
/**
* Total number of messages that this account is referenced.
*
* @return Message count
*/
public int getMessagesCnt() {
return messagesCnt;
}
/**
* Total number of Emails that this account is referenced.
*
* @return Email count
*/
public int getEmailCnt() {
return emailCnt;
}
/**
* Total number of call logs that this account is referenced.
*
* @return call log count
*/
public int getCallLogCnt() {
return callLogCnt;
}
/**
* Total number of contacts in this accounts contact book.
*
* @return contact count
*/
public int getContactsCnt() {
return contactsCnt;
}
/**
* Total number of thumbnail\media attachments that this account is referenced.
*
* @return Thumbnail count
*/
public int getThumbnailCnt() {
return mediaCnt;
}
/**
* Total number of contacts that this account is referenced.
*
* @return Contact count
*/
public int getReferenceCnt() {
return referenceCnt;
}
}
@@ -1,6 +1,5 @@
ContactDetailsPane.nameLabel.text=Placeholder
SummaryViewer.countsPanel.border.title=Counts
SummaryViewer.contactsLabel.text=Contacts:
SummaryViewer.countsPanel.border.title=Communications
OutlineViewPanel.messageLabel.text=<Control Disabled>
SummaryViewer.messagesDataLabel.text=messages
SummaryViewer.callLogsDataLabel.text=callLogs
@@ -18,6 +17,12 @@ MessageViewer.backButton.AccessibleContext.accessibleDescription=
MessageViewer.backButton.text=Threads
MessageViewer.showAllButton.text=All Messages
SummaryViewer.thumbnailCntLabel.text=Media Attachments:
SummaryViewer.attachmentsLable.text=Total Attachments:
SummaryViewer.thumbnailsDataLabel.text=attachments
SummaryViewer.attachmentDataLabel.text=count
SummaryViewer.accountLabel.text=<account name>
SummaryViewer.contanctsPanel.border.title=Account Contacts
SummaryViewer.accoutDescriptionLabel.text=<account description>
SummaryViewer.attachmentsLabel.text=Total Attachments:
SummaryViewer.referencesLabel.text=Communication References:
SummaryViewer.referencesDataLabel.text=<reference count>
SummaryViewer.contactsLabel.text=Book Entries:
@@ -35,20 +35,22 @@ MessageViewer_viewMessage_all=All
MessageViewer_viewMessage_calllogs=Call Logs
MessageViewer_viewMessage_selected=Selected
MessageViewer_viewMessage_unthreaded=Unthreaded
SummaryViewer.countsPanel.border.title=Counts
SummaryViewer.contactsLabel.text=Contacts:
SummaryViewer.countsPanel.border.title=Communications
OutlineViewPanel.messageLabel.text=<Control Disabled>
SummaryViewer.messagesDataLabel.text=messages
SummaryViewer.callLogsDataLabel.text=callLogs
SummaryViewer.contactsDataLabel.text=contacts
SummaryViewer.messagesLabel.text=Messages:
SummaryViewer.callLogsLabel.text=Call Logs:
SummaryViewer_Account_Description=This account represents a device in the case.
SummaryViewer_Account_Description_MuliSelect=Summary information is not available when multiple accounts are selected.
SummaryViewer_CaseRefNameColumn_Title=Case Name
SummaryViewer_CentralRepository_Message=<Enable Central Resposity to see Other Occurrences>
SummaryViewer_CentralRepository_Message=<Enable Central Respository to see Other Occurrences>
SummaryViewer_Creation_Date_Title=Creation Date
SummaryViewer_Device_Account_Description=This account was referenced by a device in the case.
SummaryViewer_FileRef_Message=<Select a single account to see File References>
SummaryViewer_FileRefNameColumn_Title=Path
SummaryViewer_TabTitle=Summary
SummeryViewer_FileRef_Message=<Select one Accout to see File References>
ThreadRootMessagePanel.showAllCheckBox.text=Show All Messages
ThreadPane.backButton.text=<---
SummaryViewer.caseReferencesPanel.border.title=Other Occurrences
@@ -60,6 +62,12 @@ MessageViewer.backButton.AccessibleContext.accessibleDescription=
MessageViewer.backButton.text=Threads
MessageViewer.showAllButton.text=All Messages
SummaryViewer.thumbnailCntLabel.text=Media Attachments:
SummaryViewer.attachmentsLable.text=Total Attachments:
SummaryViewer.thumbnailsDataLabel.text=attachments
SummaryViewer.attachmentDataLabel.text=count
SummaryViewer.accountLabel.text=<account name>
SummaryViewer.contanctsPanel.border.title=Account Contacts
SummaryViewer.accoutDescriptionLabel.text=<account description>
SummaryViewer.attachmentsLabel.text=Total Attachments:
SummaryViewer.referencesLabel.text=Communication References:
SummaryViewer.referencesDataLabel.text=<reference count>
SummaryViewer.contactsLabel.text=Book Entries:
@@ -18,9 +18,8 @@
*/
package org.sleuthkit.autopsy.communications.relationships;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import java.util.logging.Level;
import org.openide.nodes.Sheet;
@@ -70,7 +69,7 @@ final class ContactNode extends BlackboardArtifactNode {
@Override
protected Sheet createSheet() {
Sheet sheet = super.createSheet();
Sheet sheet = new Sheet();
final BlackboardArtifact artifact = getArtifact();
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
@@ -89,37 +88,33 @@ final class ContactNode extends BlackboardArtifactNode {
// are used so that all attributed of that type are found, including
// ones that are not predefined as part of BlackboardAttributes
try {
HashMap<String, BlackboardAttribute> phoneNumMap = new HashMap<>();
HashMap<String, BlackboardAttribute> emailMap = new HashMap<>();
HashMap<String, BlackboardAttribute> nameMap = new HashMap<>();
HashMap<String, BlackboardAttribute> otherMap = new HashMap<>();
List<BlackboardAttribute> phoneNumList = new ArrayList<>();
List<BlackboardAttribute> emailList = new ArrayList<>();
List<BlackboardAttribute> nameList = new ArrayList<>();
List<BlackboardAttribute> otherList = new ArrayList<>();
for (BlackboardAttribute bba : artifact.getAttributes()) {
if (bba.getAttributeType().getTypeName().startsWith("TSK_PHONE")) {
phoneNumMap.put(bba.getDisplayString(), bba);
phoneNumList.add(bba);
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_EMAIL")) {
emailMap.put(bba.getDisplayString(), bba);
emailList.add(bba);
} else if (bba.getAttributeType().getTypeName().startsWith("TSK_NAME")) {
nameMap.put(bba.getDisplayString(), bba);
nameList.add(bba);
} else {
otherMap.put(bba.getDisplayString(), bba);
otherList.add(bba);
}
}
addPropertiesToSheet(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME.getLabel(),
sheetSet, nameMap);
sheetSet, nameList);
addPropertiesToSheet(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getLabel(),
sheetSet, phoneNumMap);
sheetSet, phoneNumList);
addPropertiesToSheet(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL.getLabel(),
sheetSet, emailMap);
sheetSet, emailList);
for (BlackboardAttribute bba : otherMap.values()) {
for (BlackboardAttribute bba : otherList) {
sheetSet.put(new NodeProperty<>(bba.getAttributeType().getTypeName(), bba.getAttributeType().getDisplayName(), "", bba.getDisplayString()));
}
// Don't need these values to appear in the Contact property sheet.
sheetSet.remove("S");
sheetSet.remove("C");
List<Content> children = artifact.getChildren();
if(children != null) {
int count = 0;
@@ -142,9 +137,9 @@ final class ContactNode extends BlackboardArtifactNode {
return sheet;
}
private void addPropertiesToSheet(String propertyID, Sheet.Set sheetSet, Map<String, BlackboardAttribute> attributeMap) {
private void addPropertiesToSheet(String propertyID, Sheet.Set sheetSet, List<BlackboardAttribute> attributeList) {
int count = 0;
for (BlackboardAttribute bba : attributeMap.values()) {
for (BlackboardAttribute bba : attributeList) {
if (count++ > 0) {
sheetSet.put(new NodeProperty<>(propertyID + "_" + count, bba.getAttributeType().getDisplayName(), "", bba.getDisplayString()));
} else {
@@ -68,4 +68,43 @@ final class RelationshipsNodeUtilities {
return "";
}
}
/**
* Normalize the phone number by removing all non numeric characters, except
* for leading +.
*
* This function copied from CommunicationManager.
*
* @param phoneNum The phone number to normalize
*
* @return The normalized phone number.
*/
static String normalizePhoneNum(String phoneNum) {
String normailzedPhoneNum = phoneNum.replaceAll("\\D", "");
if (phoneNum.startsWith("+")) {
normailzedPhoneNum = "+" + normailzedPhoneNum;
}
if (normailzedPhoneNum.isEmpty()) {
normailzedPhoneNum = phoneNum;
}
return normailzedPhoneNum;
}
/**
* Normalize the given email address by converting it to lowercase.
*
* This function copied from CommunicationManager.
*
* @param emailAddress The email address tot normalize
*
* @return The normalized email address.
*/
static String normalizeEmailAddress(String emailAddress) {
String normailzedEmailAddr = emailAddress.toLowerCase();
return normailzedEmailAddr;
}
}
@@ -24,7 +24,6 @@ import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.coreutils.ImageUtils;
import org.sleuthkit.datamodel.Account;
import org.sleuthkit.datamodel.AccountDeviceInstance;
import org.sleuthkit.datamodel.BlackboardArtifact;
@@ -47,7 +46,6 @@ public final class SelectionInfo {
private final Set<Account> accounts;
private Set<BlackboardArtifact> accountArtifacts = null;
private SelectionSummary summary = null;
/**
* Wraps the details of the currently selected accounts.
@@ -150,88 +148,6 @@ public final class SelectionInfo {
return accountArtifacts;
}
public SelectionSummary getSummary() {
if (summary == null) {
summary = new SelectionSummary();
}
return summary;
}
final class SelectionSummary {
int attachmentCnt;
int messagesCnt;
int emailCnt;
int callLogCnt;
int contactsCnt;
int mediaCnt;
SelectionSummary() {
getCounts();
}
private void getCounts() {
for (BlackboardArtifact artifact : getArtifacts()) {
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
if (null != fromID) {
switch (fromID) {
case TSK_EMAIL_MSG:
emailCnt++;
break;
case TSK_CALLLOG:
callLogCnt++;
break;
case TSK_MESSAGE:
messagesCnt++;
break;
case TSK_CONTACT:
contactsCnt++;
break;
default:
break;
}
}
try {
attachmentCnt += artifact.getChildrenCount();
for (Content childContent : artifact.getChildren()) {
if (ImageUtils.thumbnailSupported(childContent)) {
mediaCnt++;
}
}
} catch (TskCoreException ex) {
logger.log(Level.WARNING, String.format("Exception thrown "
+ "from getChildrenCount artifactID: %d",
artifact.getArtifactID()), ex); //NON-NLS
}
}
}
public int getAttachmentCnt() {
return attachmentCnt;
}
public int getMessagesCnt() {
return messagesCnt;
}
public int getEmailCnt() {
return emailCnt;
}
public int getCallLogCnt() {
return callLogCnt;
}
public int getContactsCnt() {
return contactsCnt;
}
public int getThumbnailCnt() {
return mediaCnt;
}
}
/**
* Utility class to represent an edge from the graph visualization.
*/
@@ -1,6 +1,154 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<NonVisualComponents>
<Container class="javax.swing.JPanel" name="summaryPanel">
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="accountLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.accountLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="9" insetsBottom="0" insetsRight="9" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="accoutDescriptionLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.accoutDescriptionLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="9" insetsBottom="15" insetsRight="9" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JPanel" name="countsPanel">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Communications">
<ResourceString PropertyName="titleX" bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.countsPanel.border.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</TitledBorder>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="messagesLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.messagesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="9" insetsLeft="15" insetsBottom="9" insetsRight="15" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="callLogsLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.callLogsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="15" insetsBottom="9" insetsRight="15" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="thumbnailCntLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.thumbnailCntLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="15" insetsBottom="9" insetsRight="15" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="thumbnailsDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.thumbnailsDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="2" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="9" insetsRight="15" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="messagesDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.messagesDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="9" insetsLeft="0" insetsBottom="9" insetsRight="15" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="callLogsDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.callLogsDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="9" insetsRight="15" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="attachmentsLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="15" insetsBottom="9" insetsRight="15" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="attachmentDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="3" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="9" insetsRight="15" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
</NonVisualComponents>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
@@ -11,156 +159,11 @@
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,4,7,0,0,4,-35"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,4,7,0,0,5,-101"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="countsPanel">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Counts">
<ResourceString PropertyName="titleX" bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.countsPanel.border.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</TitledBorder>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout>
<DimensionLayout dim="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="messagesLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="callLogsLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="contactsLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="thumbnailCntLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="attachmentsLable" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace type="separate" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="attachmentDataLabel" min="-2" max="-2" attributes="0"/>
<Component id="thumbnailsDataLabel" min="-2" max="-2" attributes="0"/>
<Component id="contactsDataLabel" min="-2" max="-2" attributes="0"/>
<Component id="callLogsDataLabel" min="-2" max="-2" attributes="0"/>
<Component id="messagesDataLabel" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace pref="845" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="7" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="messagesLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="messagesDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="callLogsLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="callLogsDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="contactsLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="contactsDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="thumbnailCntLabel" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="thumbnailsDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="32767" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="attachmentsLable" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="attachmentDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Component class="javax.swing.JLabel" name="contactsLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="SummaryViewer.contactsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="messagesLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.messagesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="callLogsLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.callLogsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="thumbnailCntLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.thumbnailCntLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="thumbnailsDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.thumbnailsDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="messagesDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.messagesDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="callLogsDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.callLogsDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="contactsDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.contactsDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="attachmentsLable">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentsLable.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="attachmentDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
<Component class="org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel" name="fileReferencesPanel">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
@@ -173,7 +176,7 @@
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="9" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
</Constraint>
</Constraints>
</Component>
@@ -189,9 +192,83 @@
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
<GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="9" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JPanel" name="contanctsPanel">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Account Contacts">
<ResourceString PropertyName="titleX" bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.contanctsPanel.border.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</TitledBorder>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="contactsLabel">
<Properties>
<Property name="labelFor" type="java.awt.Component" editor="org.netbeans.modules.form.ComponentChooserEditor">
<ComponentRef name="contactsDataLabel"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="SummaryViewer.contactsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="9" insetsLeft="15" insetsBottom="9" insetsRight="15" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="contactsDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.contactsDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="9" insetsLeft="9" insetsBottom="9" insetsRight="15" anchor="18" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="referencesLabel">
<Properties>
<Property name="labelFor" type="java.awt.Component" editor="org.netbeans.modules.form.ComponentChooserEditor">
<ComponentRef name="referencesDataLabel"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.referencesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="15" insetsBottom="9" insetsRight="0" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="referencesDataLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.referencesDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="1" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="9" insetsBottom="0" insetsRight="0" anchor="18" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Form>
@@ -28,7 +28,6 @@ import org.openide.nodes.Children;
import org.openide.util.Lookup;
import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
import org.sleuthkit.autopsy.communications.relationships.SelectionInfo.SelectionSummary;
import org.sleuthkit.datamodel.Account;
/**
@@ -45,9 +44,13 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
"SummaryViewer_TabTitle=Summary",
"SummaryViewer_FileRefNameColumn_Title=Path",
"SummaryViewer_CaseRefNameColumn_Title=Case Name",
"SummaryViewer_CentralRepository_Message=<Enable Central Resposity to see Other Occurrences>",
"SummaryViewer_CentralRepository_Message=<Enable Central Respository to see Other Occurrences>",
"SummaryViewer_Creation_Date_Title=Creation Date",
"SummeryViewer_FileRef_Message=<Select one Accout to see File References>",})
"SummaryViewer_FileRef_Message=<Select a single account to see File References>",
"SummaryViewer_Device_Account_Description=This account was referenced by a device in the case.",
"SummaryViewer_Account_Description=This account represents a device in the case.",
"SummaryViewer_Account_Description_MuliSelect=Summary information is not available when multiple accounts are selected."
})
/**
* Creates new form SummaryViewer
@@ -72,7 +75,7 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
clearControls();
caseReferencesPanel.hideOutlineView(Bundle.SummaryViewer_CentralRepository_Message());
fileReferencesPanel.hideOutlineView(Bundle.SummeryViewer_FileRef_Message());
fileReferencesPanel.hideOutlineView(Bundle.SummaryViewer_FileRef_Message());
}
@Override
@@ -99,16 +102,31 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
if (info.getAccounts().size() != 1) {
setEnabled(false);
clearControls();
accoutDescriptionLabel.setText(Bundle.SummaryViewer_Account_Description_MuliSelect());
fileReferencesPanel.hideOutlineView(Bundle.SummeryViewer_FileRef_Message());
fileReferencesPanel.hideOutlineView(Bundle.SummaryViewer_FileRef_Message());
} else {
SelectionSummary summaryDetails = info.getSummary();
Account[] accountArray = info.getAccounts().toArray(new Account[1]);
Account account = accountArray[0];
accountLabel.setText(account.getTypeSpecificID());
if (account.getAccountType().equals(Account.Type.DEVICE)) {
accoutDescriptionLabel.setText(Bundle.SummaryViewer_Account_Description());
} else {
accoutDescriptionLabel.setText(Bundle.SummaryViewer_Device_Account_Description());
}
AccountSummary summaryDetails = new AccountSummary(account, info.getArtifacts());
thumbnailsDataLabel.setText(Integer.toString(summaryDetails.getThumbnailCnt()));
callLogsDataLabel.setText(Integer.toString(summaryDetails.getCallLogCnt()));
contactsDataLabel.setText(Integer.toString(summaryDetails.getContactsCnt()));
messagesDataLabel.setText(Integer.toString(summaryDetails.getMessagesCnt() + summaryDetails.getEmailCnt()));
attachmentDataLabel.setText(Integer.toString(summaryDetails.getAttachmentCnt()));
referencesDataLabel.setText(Integer.toString(summaryDetails.getReferenceCnt()));
contactsDataLabel.setText(Integer.toString(summaryDetails.getContactsCnt()));
fileReferencesPanel.showOutlineView();
@@ -139,6 +157,8 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
caseReferencesPanel.setEnabled(enabled);
fileReferencesPanel.setEnabled(enabled);
countsPanel.setEnabled(enabled);
attachmentsLabel.setEnabled(enabled);
referencesLabel.setEnabled(enabled);
}
/**
@@ -150,7 +170,10 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
contactsDataLabel.setText("");
messagesDataLabel.setText("");
attachmentDataLabel.setText("");
accountLabel.setText("");
accoutDescriptionLabel.setText("");
referencesDataLabel.setText("");
fileReferencesPanel.setNode(new AbstractNode(Children.LEAF));
caseReferencesPanel.setNode(new AbstractNode(Children.LEAF));
}
@@ -185,132 +208,204 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
summaryPanel = new javax.swing.JPanel();
accountLabel = new javax.swing.JLabel();
accoutDescriptionLabel = new javax.swing.JLabel();
countsPanel = new javax.swing.JPanel();
contactsLabel = new javax.swing.JLabel();
messagesLabel = new javax.swing.JLabel();
callLogsLabel = new javax.swing.JLabel();
thumbnailCntLabel = new javax.swing.JLabel();
thumbnailsDataLabel = new javax.swing.JLabel();
messagesDataLabel = new javax.swing.JLabel();
callLogsDataLabel = new javax.swing.JLabel();
contactsDataLabel = new javax.swing.JLabel();
attachmentsLable = new javax.swing.JLabel();
attachmentsLabel = new javax.swing.JLabel();
attachmentDataLabel = new javax.swing.JLabel();
fileReferencesPanel = new org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel();
caseReferencesPanel = new org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel();
contanctsPanel = new javax.swing.JPanel();
contactsLabel = new javax.swing.JLabel();
contactsDataLabel = new javax.swing.JLabel();
referencesLabel = new javax.swing.JLabel();
referencesDataLabel = new javax.swing.JLabel();
setLayout(new java.awt.GridBagLayout());
countsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.countsPanel.border.title"))); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(contactsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.contactsLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(messagesLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.messagesLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(callLogsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.callLogsLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(thumbnailCntLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.thumbnailCntLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(thumbnailsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.thumbnailsDataLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(messagesDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.messagesDataLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(callLogsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.callLogsDataLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(contactsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.contactsDataLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(attachmentsLable, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentsLable.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(attachmentDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentDataLabel.text")); // NOI18N
javax.swing.GroupLayout countsPanelLayout = new javax.swing.GroupLayout(countsPanel);
countsPanel.setLayout(countsPanelLayout);
countsPanelLayout.setHorizontalGroup(
countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(countsPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(messagesLabel)
.addComponent(callLogsLabel)
.addComponent(contactsLabel)
.addComponent(thumbnailCntLabel)
.addComponent(attachmentsLable))
.addGap(18, 18, 18)
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(attachmentDataLabel)
.addComponent(thumbnailsDataLabel)
.addComponent(contactsDataLabel)
.addComponent(callLogsDataLabel)
.addComponent(messagesDataLabel))
.addContainerGap(845, Short.MAX_VALUE))
);
countsPanelLayout.setVerticalGroup(
countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(countsPanelLayout.createSequentialGroup()
.addGap(7, 7, 7)
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(messagesLabel)
.addComponent(messagesDataLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(callLogsLabel)
.addComponent(callLogsDataLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(contactsLabel)
.addComponent(contactsDataLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(thumbnailCntLabel)
.addComponent(thumbnailsDataLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(attachmentsLable)
.addComponent(attachmentDataLabel)))
);
summaryPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(accountLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.accountLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(15, 9, 0, 9);
summaryPanel.add(accountLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(accoutDescriptionLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.accoutDescriptionLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
add(countsPanel, gridBagConstraints);
gridBagConstraints.insets = new java.awt.Insets(15, 9, 15, 9);
summaryPanel.add(accoutDescriptionLabel, gridBagConstraints);
countsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.countsPanel.border.title"))); // NOI18N
countsPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(messagesLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.messagesLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(9, 15, 9, 15);
countsPanel.add(messagesLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(callLogsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.callLogsLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 15, 9, 15);
countsPanel.add(callLogsLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(thumbnailCntLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.thumbnailCntLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 15, 9, 15);
countsPanel.add(thumbnailCntLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(thumbnailsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.thumbnailsDataLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 9, 15);
countsPanel.add(thumbnailsDataLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(messagesDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.messagesDataLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(9, 0, 9, 15);
countsPanel.add(messagesDataLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(callLogsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.callLogsDataLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 9, 15);
countsPanel.add(callLogsDataLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(attachmentsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentsLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 15, 9, 15);
countsPanel.add(attachmentsLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(attachmentDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentDataLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 9, 15);
countsPanel.add(attachmentDataLabel, gridBagConstraints);
summaryPanel.add(countsPanel, new java.awt.GridBagConstraints());
setLayout(new java.awt.GridBagLayout());
fileReferencesPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.fileReferencesPanel.border.title"))); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(9, 0, 0, 0);
add(fileReferencesPanel, gridBagConstraints);
caseReferencesPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.caseReferencesPanel.border.title"))); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridy = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(9, 0, 0, 0);
add(caseReferencesPanel, gridBagConstraints);
contanctsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.contanctsPanel.border.title"))); // NOI18N
contanctsPanel.setLayout(new java.awt.GridBagLayout());
contactsLabel.setLabelFor(contactsDataLabel);
org.openide.awt.Mnemonics.setLocalizedText(contactsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.contactsLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(9, 15, 9, 15);
contanctsPanel.add(contactsLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(contactsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.contactsDataLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(9, 9, 9, 15);
contanctsPanel.add(contactsDataLabel, gridBagConstraints);
referencesLabel.setLabelFor(referencesDataLabel);
org.openide.awt.Mnemonics.setLocalizedText(referencesLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.referencesLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 15, 9, 0);
contanctsPanel.add(referencesLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(referencesDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.referencesDataLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 9, 0, 0);
contanctsPanel.add(referencesDataLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(contanctsPanel, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel accountLabel;
private javax.swing.JLabel accoutDescriptionLabel;
private javax.swing.JLabel attachmentDataLabel;
private javax.swing.JLabel attachmentsLable;
private javax.swing.JLabel attachmentsLabel;
private javax.swing.JLabel callLogsDataLabel;
private javax.swing.JLabel callLogsLabel;
private org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel caseReferencesPanel;
private javax.swing.JLabel contactsDataLabel;
private javax.swing.JLabel contactsLabel;
private javax.swing.JPanel contanctsPanel;
private javax.swing.JPanel countsPanel;
private org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel fileReferencesPanel;
private javax.swing.JLabel messagesDataLabel;
private javax.swing.JLabel messagesLabel;
private javax.swing.JLabel referencesDataLabel;
private javax.swing.JLabel referencesLabel;
private javax.swing.JPanel summaryPanel;
private javax.swing.JLabel thumbnailCntLabel;
private javax.swing.JLabel thumbnailsDataLabel;
// End of variables declaration//GEN-END:variables
@@ -117,7 +117,7 @@ public class FileViewer extends javax.swing.JPanel implements DataContentViewer
}
AbstractFile file = selectedNode.getLookup().lookup(AbstractFile.class);
if (file == null) {
if ((file == null) || (file.isDir())) {
return;
}
@@ -189,7 +189,7 @@ public class FileViewer extends javax.swing.JPanel implements DataContentViewer
}
AbstractFile aFile = node.getLookup().lookup(AbstractFile.class);
if (aFile == null) {
if ((aFile == null) || (aFile.isDir())) {
return false;
}
@@ -187,7 +187,6 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie
*/
public MediaPlayerPanel() throws GstException, UnsatisfiedLinkError {
initComponents();
initGst();
customizeComponents();
}
@@ -251,11 +250,6 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie
};
}
private void initGst() throws GstException, UnsatisfiedLinkError {
logger.log(Level.INFO, "Attempting initializing of gstreamer for video/audio viewing"); //NON-NLS
Gst.init();
}
/**
* Loads the file by spawning off a background task to handle file copying
* and video component initializations.
@@ -453,6 +447,12 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie
if(this.isCancelled()) {
return;
}
// Initialize Gstreamer. It is safe to call this for every file.
// It was moved here from the constructor because having it happen
// earlier resulted in conflicts on Linux.
Gst.init();
//Video is ready for playback. Create new components
gstPlayBin = new PlayBin("VideoPlayer", tempFile.toURI());
//Configure event handling
@@ -199,7 +199,7 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan
imageTaggingOptions.setPopupSize(300, 150);
//Disable image tagging for non-windows users or upon failure to load OpenCV.
if (!PlatformUtil.isWindowsOS() || !OpenCvLoader.hasOpenCvLoaded()) {
if (!PlatformUtil.isWindowsOS() || !OpenCvLoader.openCvIsLoaded()) {
tagsMenu.setEnabled(false);
imageTaggingOptions.setEnabled(false);
}
+27 -27
View File
@@ -150,16 +150,16 @@
<attr name="originalFile" stringvalue="Actions/Case/org-sleuthkit-autopsy-casemodule-RecentCases.instance"/>
</file>
</folder>
<file name="org-sleuthkit-autopsy-casemodule-UnpackagePortableCaseAction.shadow">
<attr name="originalFile" stringvalue="Actions/Case/org-sleuthkit-autopsy-casemodule-UnpackagePortableCaseAction.instance"/>
<attr name="position" intvalue="103"/>
</file>
<file name="org-sleuthkit-autopsy-casemodule-CaseCloseAct.shadow">
<attr name="originalFile" stringvalue="Actions/Case/org-sleuthkit-autopsy-casemodule-CaseCloseAction.instance"/>
<attr name="position" intvalue="103"/>
<attr name="position" intvalue="104"/>
</file>
<file name="org-sleuthkit-autopsy-casemodule-CaseDeleteAction.shadow">
<attr name="originalFile" stringvalue="Actions/Case/org-sleuthkit-autopsy-casemodule-CaseDeleteAction.instance"/>
<attr name="position" intvalue="104"/>
</file>
<file name="org-sleuthkit-autopsy-casemodule-UnpackagePortableCaseAction.shadow">
<attr name="originalFile" stringvalue="Actions/Case/org-sleuthkit-autopsy-casemodule-UnpackagePortableCaseAction.instance"/>
<attr name="position" intvalue="105"/>
</file>
<file name="org-sleuthkit-autopsy-casemodule-AddImage-separatorBefore.instance">
@@ -220,8 +220,8 @@
<attr name="originalFile" stringvalue="Actions/Tools/org-sleuthkit-autopsy-ingest-RunIngestAction.instance"/>
</file>
</folder>
<!--<file name="org-sleuthkit-autopsy-report-ReportWizardAction.shadow">
<attr name="originalFile" stringvalue="Actions/Tools/org-sleuthkit-autopsy-report-ReportWizardAction.instance"/>
<!--<file name="org-sleuthkit-autopsy-report-infrastructure-ReportWizardAction.shadow">
<attr name="originalFile" stringvalue="Actions/Tools/org-sleuthkit-autopsy-report-infrastructure-ReportWizardAction.instance"/>
<attr name="position" intvalue="100"/>
</file>-->
<!--<file name="Separator1.instance_hidden"/>
@@ -311,39 +311,39 @@
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.directorytree.FileSearchProvider"/>
<attr name="position" intvalue="250"/>
</file>
<file name="org-sleuthkit-autopsy-report-ReportHTML.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.TableReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.ReportHTML.getDefault"/>
<file name="org-sleuthkit-autopsy-report-modules-html-HTMLReport.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.infrastructure.TableReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.modules.html.HTMLReport.getDefault"/>
<attr name="position" intvalue="900"/>
</file>
<file name="org-sleuthkit-autopsy-report-ReportExcel.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.TableReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.ReportExcel.getDefault"/>
<file name="org-sleuthkit-autopsy-report-modules-excel.ExcelReport.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.infrastructure.TableReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.modules.excel.ExcelReport.getDefault"/>
<attr name="position" intvalue="901"/>
</file>
<file name="org-sleuthkit-autopsy-report-ReportBodyFile.instance">
<file name="org-sleuthkit-autopsy-report-modules-bodyfile-BodyFileReport.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.GeneralReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.ReportBodyFile.getDefault"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.modules.bodyfile.BodyFileReport.getDefault"/>
<attr name="position" intvalue="902"/>
</file>
<file name="org-sleuthkit-autopsy-report-FileReportText.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.FileReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.FileReportText.getDefault"/>
<file name="org-sleuthkit-autopsy-report-modules-file-FileReportText.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.infrastructure.FileReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.modules.file.FileReportText.getDefault"/>
<attr name="position" intvalue="903"/>
</file>
<file name="org-sleuthkit-autopsy-report-ReportKML.instance">
<file name="org-sleuthkit-autopsy-report-modules-kml-KMLReport.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.GeneralReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.ReportKML.getDefault"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.modules.kml.KMLReport.getDefault"/>
<attr name="position" intvalue="904"/>
</file>
<file name="org-sleuthkit-autopsy-modules-stix-STIXReportModule.instance">
<file name="org-sleuthkit-autopsy-report-modules-stix-STIXReportModule.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.GeneralReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.modules.stix.STIXReportModule.getDefault"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.modules.stix.STIXReportModule.getDefault"/>
<attr name="position" intvalue="910"/>
</file>
<file name="org-sleuthkit-autopsy-report-caseuco-ReportCaseUco.instance">
<file name="org-sleuthkit-autopsy-report-modules-caseuco-CaseUcoReport.instance">
<attr name="instanceOf" stringvalue="org.sleuthkit.autopsy.report.GeneralReportModule"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.caseuco.ReportCaseUco.getDefault"/>
<attr name="instanceCreate" methodvalue="org.sleuthkit.autopsy.report.modules.caseuco.CaseUcoReport.getDefault"/>
<attr name="position" intvalue="911"/>
</file>
<!--<folder name="JavaHelp">
@@ -391,9 +391,9 @@
<attr name="position" intvalue="10000"/>
</file>
<!--
<file name="org-sleuthkit-autopsy-report-ReportWizardAction.shadow">
<attr name="displayName" bundlevalue="org.sleuthkit.autopsy.report.Bundle#Toolbars/Reports/org-sleuthkit-autopsy-report-ReportWizardAction.shadow"/>
<attr name="originalFile" stringvalue="Actions/Tools/org-sleuthkit-autopsy-report-ReportWizardAction.instance"/>
<file name="org-sleuthkit-autopsy-report-infrastructure-ReportWizardAction.shadow">
<attr name="displayName" bundlevalue="org.sleuthkit.autopsy.report.Bundle#Toolbars/Reports/org-sleuthkit-autopsy-report-infrastructure-ReportWizardAction.shadow"/>
<attr name="originalFile" stringvalue="Actions/Tools/org-sleuthkit-autopsy-report-infrastructure-ReportWizardAction.instance"/>
<attr name="position" intvalue="103"/>
</file>
<file name="org-sleuthkit-autopsy-casemodule-CaseCloseAction.instance">
@@ -892,6 +892,8 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
"DataResultViewerTable.goToPageTextField.msgDlg=Please enter a valid page number between 1 and {0}",
"DataResultViewerTable.goToPageTextField.err=Invalid page number"})
void gotoPage() {
int originalPage = currentPage;
try {
currentPage = Integer.decode(gotoPageTextField.getText());
} catch (NumberFormatException e) {
@@ -900,7 +902,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
}
if (currentPage > totalPages || currentPage < 1) {
currentPage = 1;
currentPage = originalPage;
JOptionPane.showMessageDialog(DataResultViewerTable.this,
Bundle.DataResultViewerTable_goToPageTextField_msgDlg(totalPages),
Bundle.DataResultViewerTable_goToPageTextField_err(),
@@ -56,6 +56,7 @@ import static org.sleuthkit.autopsy.corecomponents.Bundle.*;
import org.sleuthkit.autopsy.corecomponents.ResultViewerPersistence.SortCriterion;
import org.sleuthkit.autopsy.coreutils.ImageUtils;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.uicomponents.WrapLayout;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.TskCoreException;
File diff suppressed because it is too large Load Diff
@@ -16,10 +16,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.coreutils;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
@@ -43,74 +41,76 @@ import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TskCoreException;
/**
* An abstraction around an SQLite app DB found in a data source.
* This class makes a copy of it, along with any meta files (WAL, SHM),
* opens a SQLite connection to it, and runs queries on it.
* An abstraction around an SQLite app DB found in a data source. This class
* makes a copy of it, along with any meta files (WAL, SHM), opens a SQLite
* connection to it, and runs queries on it.
*/
public final class AppSQLiteDB implements Closeable {
public final class AppSQLiteDB {
private final Logger logger = Logger.getLogger(AppSQLiteDB.class.getName());
private final AbstractFile dbAbstractFile; // AbstractFile for the DB file
private final Connection connection;
private final Statement statement;
/**
* Class to abstract the abstract file for a DB file and its on disk copy
*
* Class to abstract the abstract file for a DB file and its on disk copy
*
*/
private static final class AppSQLiteDBFileBundle {
private final AbstractFile dbAbstractFile;
private final File dbFileCopy;
AppSQLiteDBFileBundle(AbstractFile dbAbstractFile, File dbFileCopy) {
this.dbAbstractFile = dbAbstractFile;
this.dbFileCopy = dbFileCopy;
}
AbstractFile getAbstractFile() {
return dbAbstractFile;
}
File getFileCopy() {
return dbFileCopy;
}
}
private AppSQLiteDB(AppSQLiteDBFileBundle appSQLiteDBFileBundle) throws ClassNotFoundException, SQLException {
this.dbAbstractFile = appSQLiteDBFileBundle.getAbstractFile();
Class.forName("org.sqlite.JDBC"); //NON-NLS //load JDBC driver
connection = DriverManager.getConnection("jdbc:sqlite:" + appSQLiteDBFileBundle.getFileCopy().getPath()); //NON-NLS
statement = connection.createStatement();
}
/**
* Looks for the given SQLIte database filename, with matching path substring.
* It looks for exact name or a pattern match based on a input parameter.
* It makes a copy of each matching file, and creates an instance of
* AppSQLiteDB to help query the DB.
*
* A list of AppSQLiteDB instances is returned, one for each
* match found.,
* .
* @param dataSource data source to search in
* @param dbName db file name to search
* @param matchExactName whether to look for exact file name or a pattern match
* @param parentPathSubstr path substring to match
*
* @return A list of abstract files matching the specified name and path.
* Returns an empty list if no matching database is found.
* Looks for application SQLite database files with a given name or name
* substring and a given parent path or parent path substring. For each
* database file found, a temporary copy is made and an open connection to
* the database in the form of an AppSQLiteDB object is created and
* returned.
*
* @param dataSource The data source to be searched for the database
* files.
* @param dbFileName The database file name or file name substring for
* which to search.
* @param matchExactName Whether or not the database file name argument is
* the full database file name or a substring.
* @param parentPathSubstr The parent path substring, may pass the empty
* string to match any parent path.
*
* @return A list, possibly empty, of AppSQLiteDB objects for the files that
* were found, copied, and connected to.
*/
public static Collection<AppSQLiteDB> findAppDatabases(DataSource dataSource,
String dbName, boolean matchExactName, String parentPathSubstr) {
List<AppSQLiteDB> appDbs = new ArrayList<> ();
String dbFileName, boolean matchExactName, String parentPathSubstr) {
List<AppSQLiteDB> appDbs = new ArrayList<>();
try {
Collection<AppSQLiteDBFileBundle> dbFileBundles = findAndCopySQLiteDB( dataSource, dbName, matchExactName, parentPathSubstr, false);
Collection<AppSQLiteDBFileBundle> dbFileBundles = findAndCopySQLiteDB(dataSource, dbFileName, matchExactName, parentPathSubstr, false);
dbFileBundles.forEach((dbFileBundle) -> {
try {
AppSQLiteDB appSQLiteDB = new AppSQLiteDB(dbFileBundle);
@@ -120,102 +120,105 @@ public final class AppSQLiteDB implements Closeable {
}
});
} catch (TskCoreException ex) {
Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error finding App database files with name = '%s' and path = '%s'.", dbName, parentPathSubstr), ex); //NON-NLS
Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error finding App database files with name = '%s' and path = '%s'.", dbFileName, parentPathSubstr), ex); //NON-NLS
}
return appDbs;
}
public AbstractFile getDBFile() {
return this.dbAbstractFile;
}
/**
* Attaches a database to the current connection.
*
* Finds the specified database file in the specified folder.
* If found, makes copy of the database in the case folder and
* run ATTACH DATABASE sql.
*
*
* Finds the specified database file in the specified folder. If found,
* makes copy of the database in the case folder and run ATTACH DATABASE
* sql.
*
* @param dataSource data source in which to look file the db file
* @param dbName name of db file to look for
* @param dbPath path in which to look for the db file
* @param dbAlias alias name to attach the database as
*
* @return abstract file for the matching db file.
* null if no match is found.
* @param dbName name of db file to look for
* @param dbPath path in which to look for the db file
* @param dbAlias alias name to attach the database as
*
* @return abstract file for the matching db file. null if no match is
* found.
*
* @throws SQLException in case of an SQL error
*/
public AbstractFile attachDatabase(DataSource dataSource, String dbName,
String dbPath, String dbAlias) throws SQLException {
public AbstractFile attachDatabase(DataSource dataSource, String dbName,
String dbPath, String dbAlias) throws SQLException {
try {
// find and copy DB files with exact name and path.
Collection<AppSQLiteDBFileBundle> dbFileBundles = findAndCopySQLiteDB(dataSource, dbName, true, dbPath, true);
Collection<AppSQLiteDBFileBundle> dbFileBundles = findAndCopySQLiteDB(dataSource, dbName, true, dbPath, true);
if (!dbFileBundles.isEmpty()) {
AppSQLiteDBFileBundle dbFileBundle = dbFileBundles.iterator().next();
String attachDbSql = String.format("ATTACH DATABASE '%s' AS '%s'", dbFileBundle.getFileCopy().getPath(), dbAlias); //NON-NLS
statement.executeUpdate(attachDbSql);
statement.executeUpdate(attachDbSql);
return dbFileBundle.getAbstractFile();
}
} catch (TskCoreException ex) {
Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error attaching to App database files with name = '%s' and path = '%s'.", dbName, dbPath), ex); //NON-NLS
}
return null;
}
/**
* Finds database file with the specified name, makes a copy of the file in the case directory,
* and returns the AbstractFile as well as the file copy.
*
* @param dataSource data source to search in
* @param dbName db file name to search
* @param matchExactName whether to look for exact file name or a pattern match
* @param dbPath path to match
* @param matchExactName whether to look for exact path name or a substring match
*
* Finds database file with the specified name, makes a copy of the file in
* the case directory, and returns the AbstractFile as well as the file
* copy.
*
* @param dataSource data source to search in
* @param dbName db file name to search
* @param matchExactName whether to look for exact file name or a pattern
* match
* @param dbPath path to match
* @param matchExactPath whether to look for exact path name or a substring
* match
*
* @return a collection of AppSQLiteDBFileBundle
*
* @throws TskCoreException
*
* @throws TskCoreException
*/
private static Collection<AppSQLiteDBFileBundle> findAndCopySQLiteDB(DataSource dataSource, String dbName,
boolean matchExactName, String dbPath, boolean matchExactPath) throws TskCoreException {
private static Collection<AppSQLiteDBFileBundle> findAndCopySQLiteDB(DataSource dataSource, String dbName,
boolean matchExactName, String dbPath, boolean matchExactPath) throws TskCoreException {
Case openCase;
try {
openCase = Case.getCurrentCaseThrows();
} catch (NoCurrentCaseException ex) {
throw new TskCoreException("Failed to get current case.", ex);
}
List<AppSQLiteDBFileBundle> dbFileBundles = new ArrayList<> ();
List<AppSQLiteDBFileBundle> dbFileBundles = new ArrayList<>();
long fileId = 0;
String localDiskPath = "";
SleuthkitCase skCase = openCase.getSleuthkitCase();
String parentPath = dbPath.replace("\\", "/");
parentPath = SleuthkitCase.escapeSingleQuotes(parentPath);
String whereClause;
if (matchExactName) {
whereClause = String.format("LOWER(name) = LOWER('%s')", dbName);
} else {
whereClause = String.format("LOWER(name) LIKE LOWER('%%%s%%') AND LOWER(name) NOT LIKE LOWER('%%journal%%')", dbName );
whereClause = String.format("LOWER(name) LIKE LOWER('%%%s%%') AND LOWER(name) NOT LIKE LOWER('%%journal%%')", dbName);
}
if (matchExactPath) {
whereClause += String.format(" AND LOWER(parent_path) = LOWER('%s')", parentPath );
whereClause += String.format(" AND LOWER(parent_path) = LOWER('%s')", parentPath);
} else {
whereClause += String.format(" AND LOWER(parent_path) LIKE LOWER('%%%s%%')", parentPath );
whereClause += String.format(" AND LOWER(parent_path) LIKE LOWER('%%%s%%')", parentPath);
}
whereClause += String.format(" AND data_source_obj_id = %s", dataSource.getId());
List<AbstractFile> absFiles = skCase.findAllFilesWhere(whereClause);
for (AbstractFile absFile : absFiles) {
try {
localDiskPath = openCase.getTempDirectory()
+ File.separator + absFile.getId() + absFile.getName();
+ File.separator + absFile.getId() + absFile.getName();
File jFile = new java.io.File(localDiskPath);
fileId = absFile.getId();
ContentUtils.writeToFile(absFile, jFile);
@@ -231,63 +234,58 @@ public final class AppSQLiteDB implements Closeable {
Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.WARNING, String.format("Error reading content from file '%s' (id=%d).", absFile.getName(), fileId), ex); //NON-NLS
} catch (IOException | NoCurrentCaseException | TskCoreException ex) {
Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error creating AppSQLiteDB for file '%s' (id=%d) to copied to '%s'.", absFile.getName(), fileId, localDiskPath), ex); //NON-NLS
}
}
}
return dbFileBundles;
}
/**
* Detaches the specified database from the connection
*
*
* @param dbAlias alias for database to detach
*
* @throws SQLException
*
* @throws SQLException
*/
public void detachDatabase(String dbAlias) throws SQLException {
public void detachDatabase(String dbAlias) throws SQLException {
String detachDbSql = String.format("DETACH DATABASE '%s'", dbAlias);
statement.executeUpdate(detachDbSql); //NON-NLS
}
/**
* Runs the given query on the database and returns result set.
*
* @param queryStr SQL string for the query to run
*
* @return ResultSet from running the query.
*
*
* @return ResultSet from running the query.
*
* @throws SQLException in case of an error.
*
*
*/
public ResultSet runQuery(String queryStr) throws SQLException {
ResultSet resultSet = null;
if (null != queryStr) {
resultSet = statement.executeQuery(queryStr); //NON-NLS
}
}
return resultSet;
}
/**
* Closes the DB connection
*
* @throws IOException
* Closes the DB connection.
*
*/
@Override
public void close() throws IOException {
public void close() {
// Close the DB connection
try {
statement.close();
connection.close();
} catch (SQLException e) {
logger.log(Level.SEVERE, "Error closing the database", e); //NON-NLS
}
}
}
/**
* Searches for a meta file associated with the give SQLite database. If
* found, it copies this file into the temp directory of the current case.
@@ -315,11 +313,11 @@ public final class AppSQLiteDB implements Closeable {
if (metaFiles != null) {
for (AbstractFile metaFile : metaFiles) {
String localDiskPath = openCase.getTempDirectory()
+ File.separator + sqliteFile.getId() + metaFile.getName();
+ File.separator + sqliteFile.getId() + metaFile.getName();
File localMetaFile = new File(localDiskPath);
if (!localMetaFile.exists()) {
ContentUtils.writeToFile(metaFile, localMetaFile);
}
}
}
}
}
@@ -36,8 +36,9 @@ import org.sleuthkit.autopsy.core.UserPreferences;
*/
public final class ExecUtil {
private static final long DEFAULT_TIMEOUT = 5;
private static final TimeUnit DEFAULT_TIMEOUT_UNITS = TimeUnit.SECONDS;
private static final Logger logger = Logger.getLogger(ExecUtil.class.getName());
private static final long DEFAULT_CHECK_INTERVAL = 5;
private static final TimeUnit DEFAULT_CHECK_INTERVAL_UNITS = TimeUnit.SECONDS;
/**
* The execute() methods do a wait() with a timeout on the executing process
@@ -116,16 +117,17 @@ public final class ExecUtil {
}
/**
* Runs a process without a timeout and terminator.
* Runs a process without a termination check interval or process
* terminator.
*
* @param processBuilder A process builder used to configure and construct
* the process to be run.
*
* @return the exit value of the process
* @return The exit value of the process.
*
* @throws SecurityException if a security manager exists and vetoes any
* @throws SecurityException If a security manager exists and vetoes any
* aspect of running the process.
* @throws IOException if an I/O error occurs.
* @throws IOException If an I/O error occurs.
*/
public static int execute(ProcessBuilder processBuilder) throws SecurityException, IOException {
return ExecUtil.execute(processBuilder, 30, TimeUnit.DAYS, new ProcessTerminator() {
@@ -137,48 +139,76 @@ public final class ExecUtil {
}
/**
* Runs a process using the default timeout and a custom terminator.
* Runs a process using the default termination check interval and a process
* terminator.
*
* @param processBuilder A process builder used to configure and construct
* the process to be run.
* @param terminator The terminator.
*
* @return the exit value of the process
* @return The exit value of the process.
*
* @throws SecurityException if a security manager exists and vetoes any
* @throws SecurityException If a security manager exists and vetoes any
* aspect of running the process.
* @throws IOException if an I/O error occurs.
* @throws IOException If an I/O error occurs.
*/
public static int execute(ProcessBuilder processBuilder, ProcessTerminator terminator) throws SecurityException, IOException {
return ExecUtil.execute(processBuilder, ExecUtil.DEFAULT_TIMEOUT, ExecUtil.DEFAULT_TIMEOUT_UNITS, terminator);
return ExecUtil.execute(processBuilder, ExecUtil.DEFAULT_CHECK_INTERVAL, ExecUtil.DEFAULT_CHECK_INTERVAL_UNITS, terminator);
}
/**
* Runs a process using a custom terminator.
* Runs a process using a custom termination check interval and a process
* terminator.
*
* @param processBuilder A process builder used to configure and construct
* the process to be run.
* @param timeOut The duration of the timeout.
* @param units The units for the timeout.
* @param terminator The terminator.
* @param processBuilder A process builder used to configure and
* construct the process to be run.
* @param terminationCheckInterval The interval at which to query the
* process terminator to see if the process
* should be killed.
* @param units The units for the termination check
* interval.
* @param terminator The terminator.
*
* @return the exit value of the process
* @return The exit value of the process.
*
* @throws SecurityException if a security manager exists and vetoes any
* @throws SecurityException If a security manager exists and vetoes any
* aspect of running the process.
* @throws IOException if an I/o error occurs.
* @throws IOException If an I/O error occurs.
*/
public static int execute(ProcessBuilder processBuilder, long timeOut, TimeUnit units, ProcessTerminator terminator) throws SecurityException, IOException {
Process process = processBuilder.start();
public static int execute(ProcessBuilder processBuilder, long terminationCheckInterval, TimeUnit units, ProcessTerminator terminator) throws SecurityException, IOException {
return waitForTermination(processBuilder.command().get(0), processBuilder.start(), terminationCheckInterval, units, terminator);
}
/**
* Waits for an existing process to finish, using a custom termination check
* interval and a process terminator.
*
* @param processName The name of the process, for logging
* purposes.
* @param process The process.
* @param terminationCheckInterval The interval at which to query the
* process terminator to see if the process
* should be killed.
* @param units The units for the termination check
* interval.
* @param terminator The process terminator.
*
* @return The exit value of the process.
*
* @throws SecurityException If a security manager exists and vetoes any
* aspect of running the process.
* @throws IOException If an I/O error occurs.
*/
public static int waitForTermination(String processName, Process process, long terminationCheckInterval, TimeUnit units, ProcessTerminator terminator) throws SecurityException, IOException {
try {
do {
process.waitFor(timeOut, units);
process.waitFor(terminationCheckInterval, units);
if (process.isAlive() && terminator.shouldTerminateProcess()) {
killProcess(process);
try {
process.waitFor(); //waiting to help ensure process is shutdown before calling interrupt() or returning
} catch (InterruptedException exx) {
Logger.getLogger(ExecUtil.class.getName()).log(Level.INFO, String.format("Wait for process termination following killProcess was interrupted for command %s", processBuilder.command().get(0)));
process.waitFor();
} catch (InterruptedException ex) {
logger.log(Level.WARNING, String.format("Thread running %s was interrupted before the process completed", processName), ex);
}
}
} while (process.isAlive());
@@ -189,56 +219,9 @@ public final class ExecUtil {
try {
process.waitFor(); //waiting to help ensure process is shutdown before calling interrupt() or returning
} catch (InterruptedException exx) {
Logger.getLogger(ExecUtil.class.getName()).log(Level.INFO, String.format("Wait for process termination following killProcess was interrupted for command %s", processBuilder.command().get(0)));
logger.log(Level.WARNING, String.format("Thread running %s was interrupted before the process completed", processName), exx);
}
Logger.getLogger(ExecUtil.class.getName()).log(Level.INFO, "Thread interrupted while running {0}", processBuilder.command().get(0)); // NON-NLS
Thread.currentThread().interrupt();
}
return process.exitValue();
}
/**
* Wait for the given process to finish, using the given ProcessTerminator.
*
* @param command The command that was used to start the process. Used
* only for logging purposes.
* @param process The process to wait for.
* @param terminator The ProcessTerminator used to determine if the process
* should be killed.
*
* @returnthe exit value of the process
*
* @throws SecurityException if a security manager exists and vetoes any
* aspect of running the process.
* @throws IOException if an I/o error occurs.
*/
public static int waitForTermination(String command, Process process, ProcessTerminator terminator) throws SecurityException, IOException {
return ExecUtil.waitForTermination(command, process, ExecUtil.DEFAULT_TIMEOUT, ExecUtil.DEFAULT_TIMEOUT_UNITS, terminator);
}
private static int waitForTermination(String command, Process process, long timeOut, TimeUnit units, ProcessTerminator terminator) throws SecurityException, IOException {
try {
do {
process.waitFor(timeOut, units);
if (process.isAlive() && terminator.shouldTerminateProcess()) {
killProcess(process);
try {
process.waitFor(); //waiting to help ensure process is shutdown before calling interrupt() or returning
} catch (InterruptedException exx) {
Logger.getLogger(ExecUtil.class.getName()).log(Level.INFO, String.format("Wait for process termination following killProcess was interrupted for command %s", command));
}
}
} while (process.isAlive());
} catch (InterruptedException ex) {
if (process.isAlive()) {
killProcess(process);
}
try {
process.waitFor(); //waiting to help ensure process is shutdown before calling interrupt() or returning
} catch (InterruptedException exx) {
Logger.getLogger(ExecUtil.class.getName()).log(Level.INFO, String.format("Wait for process termination following killProcess was interrupted for command %s", command));
}
Logger.getLogger(ExecUtil.class.getName()).log(Level.INFO, "Thread interrupted while running {0}", command); // NON-NLS
logger.log(Level.WARNING, String.format("Thread running %s was interrupted before the process completed", processName), ex);
Thread.currentThread().interrupt();
}
return process.exitValue();
@@ -271,7 +254,9 @@ public final class ExecUtil {
}
}
private static final Logger logger = Logger.getLogger(ExecUtil.class.getName());
/*
* Used by deprecated methods.
*/
private Process proc = null;
private ExecUtil.StreamToStringRedirect errorStringRedirect = null;
private ExecUtil.StreamToStringRedirect outputStringRedirect = null;
@@ -287,6 +272,9 @@ public final class ExecUtil {
* @param params parameters of the command
*
* @return string buffer with captured stdout
*
* @throws java.io.IOException
* @throws java.lang.InterruptedException
*/
@Deprecated
public synchronized String execute(final String aCommand, final String... params) throws IOException, InterruptedException {
@@ -333,7 +321,8 @@ public final class ExecUtil {
* @param aCommand command to be executed
* @param params parameters of the command
*
* @return string buffer with captured stdout
* @throws java.io.IOException
* @throws java.lang.InterruptedException
*/
@Deprecated
public synchronized void execute(final Writer stdoutWriter, final String aCommand, final String... params) throws IOException, InterruptedException {
@@ -20,8 +20,6 @@ package org.sleuthkit.autopsy.coreutils;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.logging.Level;
import org.openide.filesystems.FileObject;
import java.nio.file.Files;
@@ -172,19 +170,7 @@ public class FileUtil {
//for now escaping /:"*?<>| (not valid in file name, at least on Windows)
//with underscores. We are only keeping \ as it could be part of the path.
return fileName.replaceAll("[\\p{Cntrl}/:\"*?<>|]+", "_");
}
/**
* UTF-8 sanitize and escape special characters in a file name or a file name component
*
* @param fileName to escape
*
* @return Sanitized string
*/
public static String utf8SanitizeFileName(String fileName) {
Charset charset = StandardCharsets.UTF_8;
return charset.decode(charset.encode(escapeFileName(fileName))).toString();
}
}
/**
* Test if the current user has read and write access to the dirPath.
@@ -121,7 +121,7 @@ public class ImageUtils {
}
DEFAULT_THUMBNAIL = tempImage;
boolean tempFfmpegLoaded = false;
if (OpenCvLoader.hasOpenCvLoaded()) {
if (OpenCvLoader.openCvIsLoaded()) {
try {
if (System.getProperty("os.arch").equals("amd64") || System.getProperty("os.arch").equals("x86_64")) { //NON-NLS
System.loadLibrary("opencv_ffmpeg248_64"); //NON-NLS
@@ -151,6 +151,7 @@ public class ImageUtils {
"image/x-ms-bmp", //NON-NLS
"image/x-portable-graymap", //NON-NLS
"image/x-portable-bitmap", //NON-NLS
"image/webp", //NON-NLS
"application/x-123")); //TODO: is this correct? -jm //NON-NLS
SUPPORTED_IMAGE_MIME_TYPES.removeIf("application/octet-stream"::equals); //NON-NLS
@@ -2,7 +2,7 @@
*
* Autopsy Forensic Browser
*
* Copyright 2012-2018 Basis Technology Corp.
* Copyright 2012-2019 Basis Technology Corp.
*
* Copyright 2012 42six Solutions.
* Contact: aebadirad <at> 42six <dot> com
@@ -30,108 +30,211 @@ import java.sql.Statement;
import java.util.logging.Level;
/**
* Database connection class & utilities.
* An abstraction that loads a given SQLite driver, establishes a connection to
* a given database, and creates a statement for the connection to support basic
* SQL operations on the database.
*/
public class SQLiteDBConnect implements AutoCloseable {
public String sDriver = "";
public String sUrl = null;
public int iTimeout = 30;
public Connection conn = null;
public Statement statement = null;
private static final Logger logger = Logger.getLogger(SQLiteDBConnect.class.getName());
private static final int STMT_EXEC_TIMEOUT_SECS = 30;
/*
* Stub constructor for quick instantiation o/t fly for using some of the
* ancillary stuff
/**
* Constructs an abstraction that loads a given SQLite driver, establishes a
* connection to a given database, and creates a statement for the
* connection to support basic SQL operations on the database.
*
* @param driver The SQLite driver class name.
* @param url The SQLite database URL to which to connect.
*
* @throws SQLException If there is an error loading the driver,
* establishing the connection, or creating a statement
* for the connection.
*/
public SQLiteDBConnect() {
}
/*
* quick and dirty constructor to test the database passing the
* DriverManager name and the fully loaded url to handle
*/
/*
* NB this will typically be available if you make this class concrete and
* not abstract
*/
public SQLiteDBConnect(String sDriverToLoad, String sUrlToLoad) throws SQLException {
init(sDriverToLoad, sUrlToLoad);
}
public final void init(String sDriverVar, String sUrlVar) throws SQLException {
setDriver(sDriverVar);
setUrl(sUrlVar);
setConnection();
setStatement();
}
private void setDriver(String sDriverVar) {
sDriver = sDriverVar;
}
private void setUrl(String sUrlVar) {
sUrl = sUrlVar;
}
public void setConnection() throws SQLException {
public SQLiteDBConnect(String driver, String url) throws SQLException {
sDriver = driver;
sUrl = url;
try {
Class.forName(sDriver);
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException ex) {
throw new SQLException(ex);
}
conn = DriverManager.getConnection(sUrl);
}
public Connection getConnection() {
return conn;
}
public void setStatement() throws SQLException {
if (conn == null) {
setConnection();
}
statement = conn.createStatement();
statement.setQueryTimeout(iTimeout); // set timeout to 30 sec.
statement.setQueryTimeout(STMT_EXEC_TIMEOUT_SECS);
}
public Statement getStatement() {
return statement;
}
public void executeStmt(String instruction) throws SQLException {
statement.executeUpdate(instruction);
}
/** processes an array of instructions e.g. a set of SQL command strings
* passed from a file
/**
* Executes an SQL statement. For use with statements that do not return
* result sets.
*
* NB you should ensure you either handle empty lines in files by either
* removing them or parsing them out since they will generate spurious
* SQLExceptions when they are encountered during the iteration....
* @param sqlStatement The SQL statement to execute.
*
* @throws SQLException If there is an error executing the statement.
*/
public void executeStmt(String[] instructionSet) throws SQLException {
for (int i = 0; i < instructionSet.length; i++) {
executeStmt(instructionSet[i]);
public void executeStmt(String sqlStatement) throws SQLException {
statement.executeUpdate(sqlStatement);
}
/**
* Executes one or more SQL statements in sequence. For use with statements
* that do not return result sets.
*
* @param sqlStatements The SQL statements to execute.
*
* @throws SQLException If there is an error executing the statements.
*/
public void executeStmt(String[] sqlStatements) throws SQLException {
for (String stmt : sqlStatements) {
executeStmt(stmt);
}
}
public ResultSet executeQry(String instruction) throws SQLException {
return statement.executeQuery(instruction);
/**
* Executes an SQL query and returns a result set. The caller should close
* the result set when finished with it, and should not make any other calls
* on this object until finished with the result set.
*
* @param sqlStatement The SQL query to execute.
*
* @return The result set.
*
* @throws SQLException If there is an error executing the query.
*/
public ResultSet executeQry(String sqlStatement) throws SQLException {
return statement.executeQuery(sqlStatement);
}
/**
* Closes the connection to the database. Should be called when the use of
* this object is completed, unless the object was constructed in a try with
* resources statement, in which case the closing is automatic when the
* object goes out of scope.
*/
public void closeConnection() {
if (conn == null) {
return;
}
try {
conn.close();
} catch (SQLException ex) {
logger.log(Level.WARNING, "Unable to close connection to SQLite DB at " + sUrl, ex);
}
//Implementing Autoclosable.close() allows this class to be used in try-with-resources.
}
@Override
public void close() {
closeConnection();
}
/*
* Partially constructs a utility object for doing basic operations on a
* SQLite database. The object is not in a usable state. Further
* initialization is required. See methods below.
*
* @deprecated Do not use.
*/
@Deprecated
public SQLiteDBConnect() {
}
/**
* Loads a given SQLite driver, establishes a connection to a given
* database, and creates a statement for the connection.
*
* @param driver The SQLite driver class name.
* @param url The SQLite database URL to which to connect.
*
* @throws SQLException If there is an error establishing the connection or
* creating a statement for the connection.
*
* @deprecated Do not use.
*/
@Deprecated
public final void init(String driver, String url) throws SQLException {
sDriver = driver;
sUrl = url;
closeConnection();
setConnection();
setStatement();
}
/**
* Sets or resets the connection to the SQLite database, if the SQLite
* driver and the database URL have been set.
*
* @throws SQLException If there is an error loading the driver or
* establishing the connection.
*
* @deprecated Do not use.
*/
@Deprecated
public void setConnection() throws SQLException {
if (sDriver == null || sDriver.isEmpty() || sUrl == null || sUrl.isEmpty()) {
throw new SQLException("Driver and or databse URl not initialized");
}
closeConnection();
try {
Class.forName(sDriver);
} catch (ClassNotFoundException ex) {
throw new SQLException(ex);
}
conn = DriverManager.getConnection(sUrl);
}
/**
* Gets the connection, if any, to the database.
*
* @return The connection to the database, may be null.
*
* @deprecated Do not use.
*/
@Deprecated
public Connection getConnection() {
return conn;
}
/**
* Creates a connection to the database if there is none, and creates a
* statement using the connection.
*
* @throws SQLException If there is an error creating the connection or the
* staement.
*
* @deprecated Do not use.
*/
@Deprecated
public void setStatement() throws SQLException {
if (conn == null) {
setConnection();
}
statement = conn.createStatement();
statement.setQueryTimeout(iTimeout);
}
/**
* Gets the statement, if any, associated with the connection to the
* database, if any.
*
* @return The statement, may be null.
*
* @deprecated Do not use.
*/
@Deprecated
public Statement getStatement() {
return statement;
}
/*
* The lack of encapsulation of these fields is an error. Access to them
* outside of instances of this class is deprecated.
*
* @deprecated Do not access.
*/
public String sDriver = "";
public String sUrl = null;
public int iTimeout = STMT_EXEC_TIMEOUT_SECS;
public Connection conn = null;
public Statement statement = null;
}
@@ -51,7 +51,7 @@ public abstract class DisplayableItemNode extends AbstractNode {
*
* @throws TskCoreException
*/
protected static AbstractFile findLinked(BlackboardArtifact artifact) throws TskCoreException {
static AbstractFile findLinked(BlackboardArtifact artifact) throws TskCoreException {
BlackboardAttribute pathIDAttribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH_ID));
if (pathIDAttribute != null) {
long contentID = pathIDAttribute.getValueLong();
@@ -27,7 +27,7 @@ import java.util.List;
*/
public class FileTypeExtensions {
private final static List<String> IMAGE_EXTENSIONS = Arrays.asList(".jpg", ".jpeg", ".png", ".psd", ".nef", ".tiff", ".bmp", ".tec", ".tif"); //NON-NLS
private final static List<String> IMAGE_EXTENSIONS = Arrays.asList(".jpg", ".jpeg", ".png", ".psd", ".nef", ".tiff", ".bmp", ".tec", ".tif", ".webp"); //NON-NLS
private final static List<String> VIDEO_EXTENSIONS = Arrays.asList(".aaf", ".3gp", ".asf", ".avi", ".m1v", ".m2v", //NON-NLS
".m4v", ".mp4", ".mov", ".mpeg", ".mpg", ".mpe", ".mp4", ".rm", ".wmv", ".mpv", ".flv", ".swf"); //NON-NLS
private final static List<String> AUDIO_EXTENSIONS = Arrays.asList(".aiff", ".aif", ".flac", ".wav", ".m4a", ".ape", //NON-NLS
@@ -399,7 +399,12 @@ public class InterestingHits implements AutopsyVisitableItem {
super(Children.create(new HitFactory(setName, typeName), true), Lookups.singleton(setName));
this.typeName = typeName;
this.setName = setName;
super.setName(typeName);
/**
* We use the combination of setName and typeName as the name of
* the node to ensure that nodes have a unique name. This comes into
* play when associating paging state with the node.
*/
super.setName(setName + "_" + typeName);
updateDisplayName();
this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/interesting_item.png"); //NON-NLS
interestingResults.addObserver(this);
@@ -456,7 +461,12 @@ public class InterestingHits implements AutopsyVisitableItem {
private final Map<Long, BlackboardArtifact> artifactHits = new HashMap<>();
private HitFactory(String setName, String typeName) {
super(typeName);
/**
* The node name passed to the parent constructor must be the
* same as the name set in the InterestingItemTypeNode constructor,
* i.e. setName underscore typeName
*/
super(setName + "_" + typeName);
this.setName = setName;
this.typeName = typeName;
interestingResults.addObserver(this);
@@ -328,7 +328,8 @@ final public class Accounts implements AutopsyVisitableItem {
= "SELECT DISTINCT blackboard_attributes.value_text as account_type "
+ " FROM blackboard_artifacts " //NON-NLS
+ " JOIN blackboard_attributes ON blackboard_artifacts.artifact_id = blackboard_attributes.artifact_id " //NON-NLS
+ " WHERE blackboard_attributes.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE.getTypeID()
+ " WHERE blackboard_artifacts.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID() //NON-NLS
+ " AND blackboard_attributes.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE.getTypeID() //NON-NLS
+ getFilterByDataSourceClause();
try (SleuthkitCase.CaseDbQuery executeQuery = skCase.executeQuery(accountTypesInUseQuery);
@@ -42,7 +42,19 @@ public class DataSourceLoader {
private static final String SELECT_DATA_SOURCES_IMAGE = "select obj_id, name from tsk_image_names where obj_id in (SELECT obj_id FROM tsk_objects WHERE obj_id in (select obj_id from data_source_info))";
private void loadLogicalSources(SleuthkitCase tskDb, Map<Long, String> dataSouceMap) throws TskCoreException, SQLException {
/**
* Query case database for a list of all existing logical data sources and
* their object IDs.
*
* @param tskDb SleuthkitCase database handle
*
* @return Map of Long (id) to String (data source file name only)
* @throws TskCoreException
* @throws SQLException
*/
public static Map<Long, String> getLogicalDataSources(SleuthkitCase tskDb) throws TskCoreException, SQLException {
Map<Long, String> dataSourceMap = new HashMap<>();
//try block releases resources - exceptions are handled in done()
try (
SleuthkitCase.CaseDbQuery query = tskDb.executeQuery(SELECT_DATA_SOURCES_LOGICAL);
@@ -50,12 +62,25 @@ public class DataSourceLoader {
while (resultSet.next()) {
Long objectId = resultSet.getLong(1);
String dataSourceName = resultSet.getString(2);
dataSouceMap.put(objectId, dataSourceName);
dataSourceMap.put(objectId, dataSourceName);
}
}
return dataSourceMap;
}
private void loadImageSources(SleuthkitCase tskDb, Map<Long, String> dataSourceMap) throws SQLException, TskCoreException {
/**
* Query case database for a list of all existing image data sources and
* their object IDs.
*
* @param tskDb SleuthkitCase database handle
*
* @return Map of Long (id) to String (data source file name only)
* @throws SQLException
* @throws TskCoreException
*/
public static Map<Long, String> getImageDataSources(SleuthkitCase tskDb) throws SQLException, TskCoreException {
Map<Long, String> dataSourceMap = new HashMap<>();
//try block releases resources - exceptions are handled in done()
try (
SleuthkitCase.CaseDbQuery query = tskDb.executeQuery(SELECT_DATA_SOURCES_IMAGE);
@@ -71,27 +96,29 @@ public class DataSourceLoader {
}
}
}
return dataSourceMap;
}
/**
* Get a map of data source Ids to their string names for the current case.
* Get a map of all data source Ids to their string names (data source file
* name only) for the current case.
*
* @return Map of Long (id) to String (name)
* @return Map of Long (id) to String (data source file name only)
*
* @throws NoCurrentCaseException
* @throws TskCoreException
* @throws SQLException
*/
public Map<Long, String> getDataSourceMap() throws NoCurrentCaseException, TskCoreException, SQLException {
Map<Long, String> dataSouceMap = new HashMap<>();
public static Map<Long, String> getAllDataSources() throws NoCurrentCaseException, TskCoreException, SQLException {
Map<Long, String> dataSourceMap = new HashMap<>();
Case currentCase = Case.getCurrentCaseThrows();
SleuthkitCase tskDb = currentCase.getSleuthkitCase();
loadLogicalSources(tskDb, dataSouceMap);
dataSourceMap.putAll(getLogicalDataSources(tskDb));
loadImageSources(tskDb, dataSouceMap);
dataSourceMap.putAll(getImageDataSources(tskDb));
return dataSouceMap;
return dataSourceMap;
}
}
@@ -567,7 +567,7 @@ public class DataResultFilterNode extends FilterNode {
// is a DirectoryTreeFilterNode that wraps the dataModelNode. We need
// to set that wrapped node as the selection and root context of the
// directory tree explorer manager (sourceEm)
if(sourceEm == null) {
if(sourceEm == null || sourceEm.getSelectedNodes().length == 0) {
return null;
}
final Node currentSelectionInDirectoryTree = sourceEm.getSelectedNodes()[0];
@@ -22,7 +22,6 @@ import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.RunIngestModulesAction
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import org.openide.awt.DynamicMenuContent;
@@ -54,11 +53,11 @@ final class RunIngestSubMenu extends JMenuItem implements DynamicMenuContent {
try {
dataSources = Case.getCurrentCaseThrows().getDataSources();
} catch (IllegalStateException ex) {
} catch (IllegalStateException | NoCurrentCaseException ex) {
// No open Cases, create a disabled empty menu
return getEmpty();
} catch (TskCoreException | NoCurrentCaseException e) {
logger.log(Level.INFO, "Exception getting images: " + e.getMessage());
} catch (TskCoreException e) {
System.out.println("Exception getting images: " + e.getMessage()); //NON-NLS
}
JComponent[] comps = new JComponent[dataSources.size()];
@@ -70,8 +70,8 @@ final class ConfigVisualPanel1 extends JPanel {
ConfigVisualPanel1() {
initComponents();
configFileTextField.getDocument().addDocumentListener(new MyDocumentListener(this));
refreshDriveList();
SwingUtilities.invokeLater(() -> {
refreshDriveList();
updateControls();
});
}
@@ -101,9 +101,12 @@
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="flagEncryptionProgramsCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="finalizeImageWriter" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="promptBeforeExit" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="createVHDCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="promptBeforeExit" alignment="0" min="-2" max="-2" attributes="0"/>
<Group type="102" attributes="0">
<EmptySpace min="21" pref="21" max="-2" attributes="0"/>
<Component id="finalizeImageWriter" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
@@ -124,7 +127,7 @@
</Group>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Group type="102" attributes="0">
<Component id="rulesScrollPane" pref="478" max="32767" attributes="0"/>
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
@@ -132,9 +135,9 @@
<Component id="editRuleButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="deleteRuleButton" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="30" max="-2" attributes="0"/>
@@ -190,12 +193,13 @@
<Component id="jSeparator1" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Component id="flagEncryptionProgramsCheckBox" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Component id="finalizeImageWriter" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Component id="promptBeforeExit" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="createVHDCheckBox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="finalizeImageWriter" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="promptBeforeExit" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="19" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
@@ -472,6 +476,7 @@
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/configuration/Bundle.properties" key="ConfigVisualPanel2.finalizeImageWriter.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="finalizeImageWriterActionPerformed"/>
@@ -215,6 +215,7 @@ final class ConfigVisualPanel2 extends JPanel {
org.openide.awt.Mnemonics.setLocalizedText(ruleSetFileLabel, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.ruleSetFileLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(finalizeImageWriter, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.finalizeImageWriter.text")); // NOI18N
finalizeImageWriter.setEnabled(false);
finalizeImageWriter.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
finalizeImageWriterActionPerformed(evt);
@@ -345,9 +346,11 @@ final class ConfigVisualPanel2 extends JPanel {
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(flagEncryptionProgramsCheckBox)
.addComponent(finalizeImageWriter)
.addComponent(createVHDCheckBox)
.addComponent(promptBeforeExit)
.addComponent(createVHDCheckBox))
.addGroup(layout.createSequentialGroup()
.addGap(21, 21, 21)
.addComponent(finalizeImageWriter)))
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(jSeparator1)))))
);
@@ -418,11 +421,12 @@ final class ConfigVisualPanel2 extends JPanel {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(flagEncryptionProgramsCheckBox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(finalizeImageWriter)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(promptBeforeExit)
.addComponent(createVHDCheckBox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(createVHDCheckBox))))
.addComponent(finalizeImageWriter)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(promptBeforeExit)
.addGap(19, 19, 19))))
);
}// </editor-fold>//GEN-END:initComponents
@@ -558,6 +562,7 @@ final class ConfigVisualPanel2 extends JPanel {
private void createVHDCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createVHDCheckBoxActionPerformed
config.setCreateVHD(createVHDCheckBox.isSelected());
finalizeImageWriter.setEnabled(createVHDCheckBox.isSelected());
}//GEN-LAST:event_createVHDCheckBoxActionPerformed
/**
@@ -661,6 +666,7 @@ final class ConfigVisualPanel2 extends JPanel {
finalizeImageWriter.setSelected(config.isFinalizeImageWriter());
promptBeforeExit.setSelected(config.isPromptBeforeExit());
createVHDCheckBox.setSelected(config.isCreateVHD());
finalizeImageWriter.setEnabled(config.isCreateVHD());
LogicalImagerRuleSet ruleSet = getRuleSetFromCurrentConfig();
flagEncryptionProgramsCheckBox.setSelected(ruleSet.find(EncryptionProgramsRule.getName()) != null);
RulesTableModel rulesTableModel = new RulesTableModel();
@@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.logicalimager.dsp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
@@ -29,6 +30,7 @@ import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
@@ -52,17 +54,19 @@ import org.sleuthkit.datamodel.TskCoreException;
/**
* A runnable that - copy the logical image folder to a destination folder - add
* SearchResults.txt and users.txt files to report - add an image data source to the
* SearchResults.txt and *_users.txt files to report - add an image data source to the
* case database.
*/
final class AddLogicalImageTask implements Runnable {
private final static Logger LOGGER = Logger.getLogger(AddLogicalImageTask.class.getName());
private final static String SEARCH_RESULTS_TXT = "SearchResults.txt"; //NON-NLS
private final static String USERS_TXT = "users.txt"; //NON-NLS
private final static String USERS_TXT = "_users.txt"; //NON-NLS
private final static String MODULE_NAME = "Logical Imager"; //NON-NLS
private final static String ROOT_STR = "root"; // NON-NLS
private final static String VHD_EXTENSION = ".vhd"; // NON-NLS
private final static int REPORT_PROGRESS_INTERVAL = 100;
private final static int POST_ARTIFACT_INTERVAL = 1000;
private final String deviceId;
private final String timeZone;
private final File src;
@@ -99,7 +103,7 @@ final class AddLogicalImageTask implements Runnable {
}
/**
* Add SearchResults.txt and users.txt to the case
* Add SearchResults.txt and *_users.txt to the case
* report Adds the image to the case database.
*/
@Messages({
@@ -144,8 +148,8 @@ final class AddLogicalImageTask implements Runnable {
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
return;
}
// Add the SearchResults.txt and users.txt to the case report
// Add the SearchResults.txt and *_users.txt to the case report
String resultsFilename;
if (Paths.get(dest.toString(), SEARCH_RESULTS_TXT).toFile().exists()) {
resultsFilename = SEARCH_RESULTS_TXT;
@@ -164,15 +168,25 @@ final class AddLogicalImageTask implements Runnable {
}
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingToReport(resultsFilename));
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingToReport(USERS_TXT));
status = addReport(Paths.get(dest.toString(), USERS_TXT), USERS_TXT + " " + src.getName());
if (status != null) {
errorList.add(status);
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
return;
// All all *_users.txt files to report
File[] userFiles = dest.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(USERS_TXT);
}
});
for (File userFile : userFiles) {
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingToReport(userFile.getName()));
status = addReport(userFile.toPath(), userFile.getName() + " " + src.getName());
if (status != null) {
errorList.add(status);
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
return;
}
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingToReport(userFile.getName()));
}
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingToReport(USERS_TXT));
// Get all VHD files in the dest directory
List<String> imagePaths = new ArrayList<>();
for (File f : dest.listFiles()) {
@@ -198,6 +212,7 @@ final class AddLogicalImageTask implements Runnable {
}
List<Content> newDataSources = new ArrayList<>();
Map<String, List<Long>> interestingFileMap = new HashMap<>();
if (imagePaths.isEmpty()) {
createVHD = false;
@@ -214,7 +229,7 @@ final class AddLogicalImageTask implements Runnable {
try {
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingExtractedFiles());
addExtractedFiles(dest, resultsPath, newDataSources);
interestingFileMap = addExtractedFiles(dest, resultsPath, newDataSources);
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingExtractedFiles());
} catch (IOException | TskCoreException ex) {
errorList.add(ex.getMessage());
@@ -239,8 +254,16 @@ final class AddLogicalImageTask implements Runnable {
if (addMultipleImagesTask.getResult() == DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS) {
LOGGER.log(Level.SEVERE, "Failed to add VHD datasource"); // NON-NLS
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, addMultipleImagesTask.getErrorMessages(), emptyDataSources);
return;
return;
}
try {
interestingFileMap = getInterestingFileMapForVHD(Paths.get(dest.toString(), resultsFilename));
} catch (TskCoreException | IOException ex) {
errorList.add(Bundle.AddLogicalImageTask_failedToAddInterestingFiles(ex.getMessage()));
LOGGER.log(Level.SEVERE, "Failed to add interesting files", ex); // NON-NLS
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.NONCRITICAL_ERRORS, errorList, emptyDataSources);
}
} catch (NoCurrentCaseException ex) {
String msg = Bundle.AddLogicalImageTask_noCurrentCase();
errorList.add(msg);
@@ -251,7 +274,7 @@ final class AddLogicalImageTask implements Runnable {
if (cancelled) {
if (!createVHD) {
// TODO: When 5453 is fixed, we should be able to delete it when adding VHD.
// TODO: When 5453 is fixed, we should be able to delete it when adding VHD.
deleteDestinationDirectory();
}
errorList.add(Bundle.AddLogicalImageTask_addImageCancelled());
@@ -261,7 +284,7 @@ final class AddLogicalImageTask implements Runnable {
try {
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingInterestingFiles());
addInterestingFiles(Paths.get(dest.toString(), resultsFilename), createVHD);
addInterestingFiles(interestingFileMap);
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingInterestingFiles());
if (createVHD) {
callback.done(addMultipleImagesTask.getResult(), addMultipleImagesTask.getErrorMessages(), addMultipleImagesTask.getNewDataSources());
@@ -330,15 +353,70 @@ final class AddLogicalImageTask implements Runnable {
@Messages({
"# {0} - line number", "# {1} - fields length", "# {2} - expected length", "AddLogicalImageTask.notEnoughFields=File does not contain enough fields at line {0}, got {1}, expecting {2}",
"# {0} - target image path", "AddLogicalImageTask.cannotFindDataSourceObjId=Cannot find obj_id in tsk_image_names for {0}",
"# {0} - file number", "# {1} - total files", "AddLogicalImageTask.addingInterestingFile=Adding interesting files ({0}/{1})"
"# {0} - file number", "# {1} - total files", "AddLogicalImageTask.addingInterestingFile=Adding interesting files ({0}/{1})",
"AddLogicalImageTask.logicalImagerResults=Logical Imager results"
})
private void addInterestingFiles(Path resultsPath, boolean createVHD) throws IOException, TskCoreException {
private void addInterestingFiles(Map<String, List<Long>> interestingFileMap) throws IOException, TskCoreException {
int lineNumber = 0;
List<BlackboardArtifact> artifacts = new ArrayList<>();
Iterator<Map.Entry<String, List<Long>>> iterator = interestingFileMap.entrySet().iterator();
while (iterator.hasNext()) {
if (cancelled) {
// Don't delete destination directory once we started adding interesting files.
// At this point the database and destination directory are complete.
break;
}
Map.Entry<String, List<Long>> entry = iterator.next();
String key = entry.getKey();
String ruleName;
String[] split = key.split("\t");
ruleName = split[1];
List<Long> fileIds = entry.getValue();
for (Long fileId: fileIds) {
if (cancelled) {
postArtifacts(artifacts);
return;
}
if (lineNumber % REPORT_PROGRESS_INTERVAL == 0) {
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingInterestingFile(lineNumber, totalFiles));
}
if (lineNumber % POST_ARTIFACT_INTERVAL == 0) {
postArtifacts(artifacts);
artifacts.clear();
}
addInterestingFileToArtifacts(fileId, Bundle.AddLogicalImageTask_logicalImagerResults(), ruleName, artifacts);
lineNumber++;
}
iterator.remove();
}
postArtifacts(artifacts);
}
private void addInterestingFileToArtifacts(long fileId, String ruleSetName, String ruleName, List<BlackboardArtifact> artifacts) throws TskCoreException {
Collection<BlackboardAttribute> attributes = new ArrayList<>();
BlackboardAttribute setNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, MODULE_NAME, ruleSetName);
attributes.add(setNameAttribute);
BlackboardAttribute ruleNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY, MODULE_NAME, ruleName);
attributes.add(ruleNameAttribute);
BlackboardArtifact artifact = this.currentCase.getSleuthkitCase().newBlackboardArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, fileId);
artifact.addAttributes(attributes);
artifacts.add(artifact);
}
@Messages({
"# {0} - file number", "# {1} - total files", "AddLogicalImageTask.searchingInterestingFile=Searching for interesting files ({0}/{1})"
})
private Map<String, List<Long>> getInterestingFileMapForVHD(Path resultsPath) throws TskCoreException, IOException {
Map<Long, List<String>> objIdToimagePathsMap = currentCase.getSleuthkitCase().getImagePaths();
imagePathToObjIdMap = imagePathsToDataSourceObjId(objIdToimagePathsMap);
Map<String, List<Long>> interestingFileMap = new HashMap<>();
try (BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(resultsPath.toFile()), "UTF8"))) { // NON-NLS
List<BlackboardArtifact> artifacts = new ArrayList<>();
String line;
br.readLine(); // skip the header line
int lineNumber = 2;
@@ -362,47 +440,44 @@ final class AddLogicalImageTask implements Runnable {
String filename = fields[7];
String parentPath = fields[8];
if (lineNumber % 100 == 0) {
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingInterestingFile(lineNumber, totalFiles));
if (lineNumber % REPORT_PROGRESS_INTERVAL == 0) {
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_searchingInterestingFile(lineNumber, totalFiles));
}
String query = makeQuery(createVHD, vhdFilename, fileMetaAddressStr, parentPath, filename);
// TODO - findAllFilesWhere should SQL-escape the query
String query = makeQuery(vhdFilename, fileMetaAddressStr, parentPath, filename);
List<AbstractFile> matchedFiles = Case.getCurrentCase().getSleuthkitCase().findAllFilesWhere(query);
List<Long> fileIds = new ArrayList<>();
for (AbstractFile file : matchedFiles) {
addInterestingFileToArtifacts(file, ruleSetName, ruleName, artifacts);
fileIds.add(file.getId());
}
String key = String.format("%s\t%s", ruleSetName, ruleName);
if (interestingFileMap.containsKey(key)) {
interestingFileMap.get(key).addAll(fileIds);
} else {
interestingFileMap.put(key, fileIds);
}
lineNumber++;
} // end reading file
try {
// index the artifact for keyword search
blackboard.postArtifacts(artifacts, MODULE_NAME);
} catch (Blackboard.BlackboardException ex) {
LOGGER.log(Level.SEVERE, "Unable to post artifacts to blackboard", ex); //NON-NLS
}
}
return interestingFileMap;
}
private void addInterestingFileToArtifacts(AbstractFile file, String ruleSetName, String ruleName, List<BlackboardArtifact> artifacts) throws TskCoreException {
Collection<BlackboardAttribute> attributes = new ArrayList<>();
BlackboardAttribute setNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, MODULE_NAME, ruleSetName);
attributes.add(setNameAttribute);
BlackboardAttribute ruleNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY, MODULE_NAME, ruleName);
attributes.add(ruleNameAttribute);
if (!blackboard.artifactExists(file, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, attributes)) {
BlackboardArtifact artifact = this.currentCase.getSleuthkitCase().newBlackboardArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, file.getId());
artifact.addAttributes(attributes);
artifacts.add(artifact);
private void postArtifacts(List<BlackboardArtifact> artifacts) {
try {
// index the artifact for keyword search
blackboard.postArtifacts(artifacts, MODULE_NAME);
} catch (Blackboard.BlackboardException ex) {
LOGGER.log(Level.SEVERE, "Unable to post artifacts to blackboard", ex); //NON-NLS
}
}
@Messages({
"# {0} - file number", "# {1} - total files", "AddLogicalImageTask.addingExtractedFile=Adding extracted files ({0}/{1})"
})
private void addExtractedFiles(File src, Path resultsPath, List<Content> newDataSources) throws TskCoreException, IOException {
private Map<String, List<Long>> addExtractedFiles(File src, Path resultsPath, List<Content> newDataSources) throws TskCoreException, IOException {
SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase();
SleuthkitCase.CaseDbTransaction trans = null;
Map<String, List<Long>> interestingFileMap = new HashMap<>();
try {
trans = skCase.beginTransaction();
@@ -417,7 +492,7 @@ final class AddLogicalImageTask implements Runnable {
while ((line = br.readLine()) != null) {
if (cancelled) {
rollbackTransaction(trans);
return;
return new HashMap<>();
}
String[] fields = line.split("\t", -1); // NON-NLS
if (fields.length != 14) {
@@ -428,8 +503,8 @@ final class AddLogicalImageTask implements Runnable {
// String fileSystemOffsetStr = fields[1];
// String fileMetaAddressStr = fields[2];
// String extractStatusStr = fields[3];
// String ruleSetName = fields[4];
// String ruleName = fields[5];
String ruleSetName = fields[4];
String ruleName = fields[5];
// String description = fields[6];
String filename = fields[7];
String parentPath = fields[8];
@@ -440,12 +515,12 @@ final class AddLogicalImageTask implements Runnable {
String ctime = fields[13];
parentPath = ROOT_STR + "/" + vhdFilename + "/" + parentPath;
if (lineNumber % 100 == 0) {
if (lineNumber % REPORT_PROGRESS_INTERVAL == 0) {
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingExtractedFile(lineNumber, totalFiles));
}
//addLocalFile here
fileImporter.addLocalFile(
AbstractFile fileAdded = fileImporter.addLocalFile(
Paths.get(src.toString(), extractedFilePath).toFile(),
filename,
parentPath,
@@ -454,12 +529,19 @@ final class AddLogicalImageTask implements Runnable {
Long.parseLong(atime),
Long.parseLong(mtime),
localFilesDataSource);
String key = String.format("%s\t%s", ruleSetName, ruleName);
List<Long> value = new ArrayList<>();
if (interestingFileMap.containsKey(key)) {
value = interestingFileMap.get(key);
}
value.add(fileAdded.getId());
interestingFileMap.put(key, value);
lineNumber++;
} // end reading file
}
trans.commit();
newDataSources.add(localFilesDataSource);
return interestingFileMap;
} catch (NumberFormatException | TskCoreException ex) {
LOGGER.log(Level.SEVERE, "Error adding extracted files", ex); // NON-NLS
@@ -489,21 +571,16 @@ final class AddLogicalImageTask implements Runnable {
}
}
String makeQuery(boolean createVHD, String vhdFilename, String fileMetaAddressStr, String parentPath, String filename) throws TskCoreException {
String makeQuery(String vhdFilename, String fileMetaAddressStr, String parentPath, String filename) throws TskCoreException {
String query;
if (createVHD) {
String targetImagePath = Paths.get(dest.toString(), vhdFilename).toString();
Long dataSourceObjId = imagePathToObjIdMap.get(targetImagePath);
if (dataSourceObjId == null) {
throw new TskCoreException(Bundle.AddLogicalImageTask_cannotFindDataSourceObjId(targetImagePath));
}
query = String.format("data_source_obj_id = '%s' AND meta_addr = '%s' AND name = '%s'", // NON-NLS
dataSourceObjId.toString(), fileMetaAddressStr, filename.replace("'", "''"));
} else {
String newParentPath = "/" + ROOT_STR + "/" + vhdFilename + "/" + parentPath;
query = String.format("name = '%s' AND parent_path = '%s'", // NON-NLS
filename.replace("'", "''"), newParentPath.replace("'", "''"));
String targetImagePath = Paths.get(dest.toString(), vhdFilename).toString();
Long dataSourceObjId = imagePathToObjIdMap.get(targetImagePath);
if (dataSourceObjId == null) {
throw new TskCoreException(Bundle.AddLogicalImageTask_cannotFindDataSourceObjId(targetImagePath));
}
query = String.format("data_source_obj_id = '%s' AND meta_addr = '%s' AND name = '%s'", // NON-NLS
dataSourceObjId.toString(), fileMetaAddressStr, filename.replace("'", "''"));
// TODO - findAllFilesWhere should SQL-escape the query
return query;
}
@@ -41,11 +41,15 @@ AddLogicalImageTask.failedToGetTotalFilesCount=Failed to get total files count:
# {0} - file
AddLogicalImageTask.failToGetCanonicalPath=Fail to get canonical path for {0}
AddLogicalImageTask.ingestionCancelled=Ingestion cancelled
AddLogicalImageTask.logicalImagerResults=Logical Imager results
AddLogicalImageTask.noCurrentCase=No current case
# {0} - line number
# {1} - fields length
# {2} - expected length
AddLogicalImageTask.notEnoughFields=File does not contain enough fields at line {0}, got {1}, expecting {2}
# {0} - file number
# {1} - total files
AddLogicalImageTask.searchingInterestingFile=Searching for interesting files ({0}/{1})
# {0} - imageFilePath
AddMultipleImagesTask.adding=Adding: {0}
# {0} - file
@@ -79,7 +83,7 @@ LogicalImagerDSProcessor.failToCreateDirectory=Failed to create directory {0}
LogicalImagerDSProcessor.imageDirPathNotFound={0} not found.\nUSB drive has been ejected.
LogicalImagerDSProcessor.noCurrentCase=No current case
LogicalImagerPanel.imageTable.columnModel.title0=Hostname
LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date
LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date (GMT)
LogicalImagerPanel.imageTable.columnModel.title2=Path
# {0} - sparseImageDirectory
LogicalImagerPanel.messageLabel.directoryDoesNotContainSparseImage=Directory {0} does not contain any images
@@ -72,7 +72,7 @@
<Component id="jScrollPane1" min="-2" pref="568" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace max="32767" attributes="0"/>
<EmptySpace pref="93" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
@@ -89,7 +89,7 @@
<EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="imageScrollPane" pref="0" max="32767" attributes="0"/>
<Component id="driveListScrollPane" pref="23" max="32767" attributes="0"/>
<Component id="driveListScrollPane" pref="198" max="32767" attributes="0"/>
</Group>
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Component id="refreshButton" min="-2" max="-2" attributes="0"/>
@@ -276,7 +276,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 568, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap(93, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -290,7 +290,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(imageScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addComponent(driveListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 23, Short.MAX_VALUE))
.addComponent(driveListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 198, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(refreshButton)
.addGap(18, 18, 18)
@@ -647,7 +647,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
@Messages({
"LogicalImagerPanel.imageTable.columnModel.title0=Hostname",
"LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date",
"LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date (GMT)",
"LogicalImagerPanel.imageTable.columnModel.title2=Path"
})
@Override
@@ -22,6 +22,9 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
@@ -57,6 +60,7 @@ import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.casemodule.services.FileManager;
import static org.sleuthkit.autopsy.coreutils.FileUtil.escapeFileName;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.ingest.IngestJobContext;
import org.sleuthkit.autopsy.ingest.IngestServices;
@@ -159,7 +163,8 @@ class DocumentEmbeddedContentExtractor {
void extractEmbeddedContent(AbstractFile abstractFile) {
List<ExtractedFile> listOfExtractedImages = null;
List<AbstractFile> listOfExtractedImageAbstractFiles = null;
this.parentFileName = EmbeddedFileExtractorIngestModule.getUniqueName(abstractFile);
//save the parent file name with out illegal windows characters
this.parentFileName = utf8SanitizeFileName(EmbeddedFileExtractorIngestModule.getUniqueName(abstractFile));
// Skip files that already have been unpacked.
try {
@@ -289,7 +294,6 @@ class DocumentEmbeddedContentExtractor {
// These get thrown in certain images. The reason is unknown. It is
// likely due to problems with the file formats that POI is poorly
// handling.
//Any runtime exception escaping
LOGGER.log(Level.WARNING, "Word document container could not be initialized. Reason: {0}", ex.getMessage()); //NON-NLS
return null;
@@ -308,7 +312,7 @@ class DocumentEmbeddedContentExtractor {
byte[] data = null;
int pictureNumber = 0; //added to ensure uniqueness in cases where suggestFullFileName returns duplicates
for (Picture picture : listOfAllPictures) {
String fileName = UNKNOWN_IMAGE_NAME_PREFIX +pictureNumber +"."+ picture.suggestFileExtension();
String fileName = UNKNOWN_IMAGE_NAME_PREFIX + pictureNumber + "." + picture.suggestFileExtension();
try {
data = picture.getContent();
} catch (Exception ex) {
@@ -474,11 +478,12 @@ class DocumentEmbeddedContentExtractor {
return listOfExtractedImages;
}
/**
* Extracts embedded attachments from PDF files.
*
*
* @param abstractFile Input PDF file
*
* @return List of extracted files to be made into derived file instances.
*/
private List<ExtractedFile> extractEmbeddedContentFromPDF(AbstractFile abstractFile) {
@@ -489,20 +494,20 @@ class DocumentEmbeddedContentExtractor {
Map<String, Path> extractedAttachments = pdfExtractor.extract(
new ReadContentInputStream(abstractFile), abstractFile.getId(),
outputDirectory);
//Convert output to hook into the existing logic for creating derived files
List<ExtractedFile> extractedFiles = new ArrayList<>();
extractedAttachments.entrySet().forEach((pathEntry) -> {
String fileName = pathEntry.getKey();
Path writeLocation = pathEntry.getValue();
extractedFiles.add(new ExtractedFile(fileName,
getFileRelativePath(writeLocation.getFileName().toString()),
getFileRelativePath(writeLocation.getFileName().toString()),
writeLocation.toFile().length()));
});
return extractedFiles;
} catch (IOException | SAXException | TikaException ex) {
LOGGER.log(Level.WARNING, "Error attempting to extract attachments from PDFs", ex); //NON-NLS
} catch (IOException | SAXException | TikaException | InvalidPathException ex) {
LOGGER.log(Level.WARNING, "Error attempting to extract attachments from PDFs for file Name: " + abstractFile.getName() + " ID: " + abstractFile.getId(), ex); //NON-NLS
}
return Collections.emptyList();
}
@@ -557,6 +562,19 @@ class DocumentEmbeddedContentExtractor {
return Paths.get(moduleDirRelative, this.parentFileName, fileName).toString();
}
/**
* UTF-8 sanitize and escape special characters in a file name or a file
* name component
*
* @param fileName to escape
*
* @return Sanitized string
*/
private static String utf8SanitizeFileName(String fileName) {
Charset charset = StandardCharsets.UTF_8;
return charset.decode(charset.encode(escapeFileName(fileName))).toString();
}
/**
* Represents a file extracted using either Tika or POI methods. Currently,
* POI is not capable of extracting ctime, crtime, mtime, and atime; these
@@ -669,6 +687,8 @@ class DocumentEmbeddedContentExtractor {
//that might be included in the name) and make sure
//to normalize the name
name = FilenameUtils.normalize(FilenameUtils.getName(name));
//remove any illegal characters from name
name = utf8SanitizeFileName(name);
}
// Get the suggested extension based on mime type.
@@ -23,6 +23,7 @@ import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -791,7 +792,7 @@ public class HashDbManager implements PropertyChangeListener {
* Instances of this class represent hash databases used to classify files
* as known or know bad.
*/
class SleuthkitHashSet extends HashDb{
class SleuthkitHashSet extends HashDb {
private static final long serialVersionUID = 1L;
private final int handle;
@@ -35,6 +35,7 @@ import java.util.Collection;
import java.util.List;
import java.util.Locale;
import static java.util.Objects.nonNull;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.stream.Collectors;
import org.openide.modules.InstalledFileLocator;
@@ -82,7 +83,9 @@ public class PlasoIngestModule implements DataSourceIngestModule {
private static final String PSORT_EXECUTABLE = "psort.exe";//NON-NLS
private static final String COOKIE = "cookie";//NON-NLS
private static final int LOG2TIMELINE_WORKERS = 2;
private static final long TERMINATION_CHECK_INTERVAL = 5;
private static final TimeUnit TERMINATION_CHECK_INTERVAL_UNITS = TimeUnit.SECONDS;
private File log2TimeLineExecutable;
private File psortExecutable;
@@ -163,7 +166,7 @@ public class PlasoIngestModule implements DataSourceIngestModule {
try (BufferedReader log2TimeLineOutpout = new BufferedReader(new InputStreamReader(log2TimeLineProcess.getInputStream()))) {
L2TStatusProcessor statusReader = new L2TStatusProcessor(log2TimeLineOutpout, statusHelper, moduleOutputPath);
new Thread(statusReader, "log2timeline status reader").start(); //NON-NLS
ExecUtil.waitForTermination(LOG2TIMELINE_EXECUTABLE, log2TimeLineProcess, new DataSourceIngestModuleProcessTerminator(context));
ExecUtil.waitForTermination(LOG2TIMELINE_EXECUTABLE, log2TimeLineProcess, TERMINATION_CHECK_INTERVAL, TERMINATION_CHECK_INTERVAL_UNITS, new DataSourceIngestModuleProcessTerminator(context));
statusReader.cancel();
}
@@ -1,206 +1,11 @@
OpenIDE-Module-Name=Report
CTL_ReportWizardAction=Run Report
ArtifactSelectionDialog.titleLabel.text=Select which artifacts you would like to report on:
ArtifactSelectionDialog.okButton.text=OK
ReportVisualPanel1.reportModulesLabel.text=Report Modules:
ReportVisualPanel1.invalidModuleWarning=Encountered an invalid Report Module ({0})
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
ReportVisualPanel2.dataLabel.text=Select which data to report on:
ReportVisualPanel2.deselectAllButton.text=Deselect All
ReportVisualPanel2.selectAllButton.text=Select All
ReportVisualPanel2.advancedButton.text=Data Types
ArtifactSelectionDialog.deselectAllButton.text=Deselect All
ArtifactSelectionDialog.selectAllButton.text=Select All
ReportGenerationPanel.closeButton.text=Close
ReportProgressPanel.reportLabel.text=reportLabel
ReportProgressPanel.pathLabel.text=pathLabel
ReportProgressPanel.separationLabel.text=:
ReportProgressPanel.statusMessageLabel.text=processingLabel
ReportGenerationPanel.titleLabel.text=Report Generation Progress
ReportVisualPanel2.taggedResultsRadioButton.text=Tagged Results
ReportVisualPanel2.allResultsRadioButton.text=All Results
ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
ArtifactSelectionDialog.dlgTitle.text=Advanced Artifact Selection
FileReportDataTypes.filename.text=Name
FileReportDataTypes.fileExt.text=File Extension
FileReportDataTypes.fileType.text=File Type
FileReportDataTypes.isDel.text=Is Deleted
FileReportDataTypes.aTime.text=Last Accessed
FileReportDataTypes.crTime.text=File Created
FileReportDataTypes.mTime.text=Last Modified
FileReportDataTypes.size.text=Size
FileReportDataTypes.address.text=Address
FileReportDataTypes.hash.text=Hash Value
FileReportDataTypes.knownStatus.text=Known Status
FileReportDataTypes.perms.text=Permissions
FileReportDataTypes.path.text=Full Path
FileReportText.getName.text=Files - Text
FileReportText.getDesc.text=A delimited text file containing information about individual files in the case.
ReportBodyFile.progress.querying=Querying files...
ReportBodyFile.ingestWarning.text=Warning, this report was run before ingest services completed\!
ReportBodyFile.progress.loading=Loading files...
ReportBodyFile.progress.processing=Now processing {0}...
ReportBodyFile.getName.text=TSK Body File
ReportBodyFile.getDesc.text=Body file format report with MAC times for every file. This format can be used for a timeline view.
ReportBodyFile.getFilePath.text=BodyFile.txt
ReportKML.progress.querying=Querying files...
ReportKML.progress.loading=Loading files...
ReportKML.getName.text=Google Earth KML
ReportKML.getDesc.text=KML format report with coordinates for relevant files. This format can be used for google earth views.
ReportKML.getFilePath.text=ReportKML.kml
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
ReportExcel.numAartifacts.text=Number of artifacts:
ReportExcel.getName.text=Excel Report
ReportExcel.getDesc.text=A report about results and tagged items in Excel (XLS) format.
ReportExcel.sheetName.text=Summary
ReportExcel.cellVal.summary=Summary
ReportExcel.cellVal.caseName=Case Name:
ReportExcel.cellVal.caseNum=Case Number:
ReportExcel.cellVal.examiner=Examiner:
ReportExcel.cellVal.numImages=Number of Images:
ReportGenerationPanel.confDlg.sureToClose.msg=Are you sure you'd like to close the dialog?\nAll reports will be canceled.
ReportGenerationPanel.confDlg.title.closing=Closing
ReportGenerationPanel.confDlg.cancelReport.msg=Are you sure you'd like to cancel the report?
ReportGenerator.displayProgress.title.text=Report Generation Progress...
ReportGenerator.progress.queryingDb.text=Querying database...
ReportGenerator.progress.processingFile.text=Now processing {0}
ReportGenerator.artifactTable.taggedResults.text=Contains results that were tagged with one of the following:
ReportGenerator.progress.processing=Now processing {0}...
ReportGenerator.msgShow.skippingArtType.title=Skipping artifact type {0} in reports
ReportGenerator.msgShow.skippingArtType.msg=Unknown columns to report on
ReportGenerator.makeContTagTab.taggedFiles.msg=Contains files that were tagged with one of the following:
ReportGenerator.makeBbArtTagTab.taggedRes.msg=This report only includes results tagged with:
ReportGenerator.tagTable.header.resultType=Result Type
ReportGenerator.tagTable.header.tag=Tag
ReportGenerator.tagTable.header.comment=Comment
ReportGenerator.tagTable.header.srcFile=Source File
ReportGenerator.progress.createdThumb.text=Creating thumbnails...
ReportGenerator.htmlOutput.header.file=File
ReportGenerator.htmlOutput.header.tag=Tag
ReportGenerator.htmlOutput.header.comment=Comment
ReportGenerator.htmlOutput.header.timeModified=Modified Time
ReportGenerator.htmlOutput.header.timeChanged=Changed Time
ReportGenerator.htmlOutput.header.timeAccessed=Accessed Time
ReportGenerator.htmlOutput.header.timeCreated=Created Time
ReportGenerator.htmlOutput.header.size=Size (Bytes)
ReportGenerator.htmlOutput.header.hash=Hash
ReportGenerator.thumbnailTable.name=Tagged Images
ReportGenerator.thumbnailTable.desc=Contains thumbnails of images that are associated with tagged files and results.
ReportGenerator.writeKwHits.userSrchs=User Searches
ReportGenerator.progress.processingList=Now processing {0} ({1})...
ReportGenerator.artTableColHdr.url=URL
ReportGenerator.artTableColHdr.title=Title
ReportGenerator.artTableColHdr.dateCreated=Date Created
ReportGenerator.artTableColHdr.program=Program
ReportGenerator.artTableColHdr.urlDomainDecoded=URL Domain
ReportGenerator.artTableColHdr.srcFile=Source File
ReportGenerator.artTableColHdr.dateTime=Date/Time
ReportGenerator.artTableColHdr.name=Name
ReportGenerator.artTableColHdr.value=Value
ReportGenerator.artTableColHdr.dateAccessed=Date Accessed
ReportGenerator.artTableColHdr.referrer=Referrer
ReportGenerator.artTableColHdr.dest=Destination
ReportGenerator.artTableColHdr.sourceUrl=Source URL
ReportGenerator.artTableColHdr.path=Path
ReportGenerator.artTableColHdr.progName=Program Name
ReportGenerator.artTableColHdr.instDateTime=Install Date/Time
ReportGenerator.artTableColHdr.preview=Preview
ReportGenerator.artTableColHdr.file=File
ReportGenerator.artTableColHdr.size=Size
ReportGenerator.artTableColHdr.deviceId=Device ID
ReportGenerator.artTableColHdr.text=Text
ReportGenerator.artTableColHdr.domain=Domain
ReportGenerator.artTableColHdr.dateTaken=Date Taken
ReportGenerator.artTableColHdr.devManufacturer=Device Manufacturer
ReportGenerator.artTableColHdr.devMake=Device Make
ReportGenerator.artTableColHdr.devModel=Device Model
ReportGenerator.artTableColHdr.latitude=Latitude
ReportGenerator.artTableColHdr.longitude=Longitude
ReportGenerator.artTableColHdr.latitudeStart=Starting Latitude
ReportGenerator.artTableColHdr.longitudeStart=Starting Longitude
ReportGenerator.artTableColHdr.latitudeEnd=Ending Latitude
ReportGenerator.artTableColHdr.longitudeEnd=Ending Longitude
ReportGenerator.artTableColHdr.associatedArtifact=Associated Artifact
ReportGenerator.artTableColHdr.count=Count
ReportGenerator.artTableColHdr.personName=Person Name
ReportGenerator.artTableColHdr.phoneNumber=Phone Number
ReportGenerator.artTableColHdr.phoneNumHome=Phone Number (Home)
ReportGenerator.artTableColHdr.phoneNumOffice=Phone Number (Office)
ReportGenerator.artTableColHdr.phoneNumMobile=Phone Number (Mobile)
ReportGenerator.artTableColHdr.email=Email
ReportGenerator.artTableColHdr.msgType=Message Type
ReportGenerator.artTableColHdr.direction=Direction
ReportGenerator.artTableColHdr.readStatus=Read Status
ReportGenerator.artTableColHdr.fromPhoneNum=From Phone Number
ReportGenerator.artTableColHdr.fromEmail=From Email
ReportGenerator.artTableColHdr.toPhoneNum=To Phone Number
ReportGenerator.artTableColHdr.toEmail=To Email
ReportGenerator.artTableColHdr.subject=Subject
ReportGenerator.artTableColHdr.tskEmailTo=E-Mail To
ReportGenerator.artTableColHdr.tskEmailCc=E-Mail CC
ReportGenerator.artTableColHdr.tskEmailBcc=E-Mail BCC
ReportGenerator.artTableColHdr.tskEmailFrom=E-Mail From
ReportGenerator.artTableColHdr.tskMsgId=Message ID
ReportGenerator.artTableColHdr.tskDateTimeRcvd=Date Received
ReportGenerator.artTableColHdr.tskDateTimeSent=Date Sent
ReportGenerator.artTableColHdr.tskSubject=Subject
ReportGenerator.artTableColHdr.tskSetName=Set Name
ReportGenerator.artTableColHdr.tskInterestingFilesCategory=Rule
ReportGenerator.artTableColHdr.tskGpsRouteCategory=Category
ReportGenerator.artTableColHdr.tskPath=Path
ReportGenerator.artTableColHdr.calendarEntryType=Calendar Entry Type
ReportGenerator.artTableColHdr.description=Description
ReportGenerator.artTableColHdr.startDateTime=Start Date/Time
ReportGenerator.artTableColHdr.endDateTime=End Date/Time
ReportGenerator.artTableColHdr.location=Location
ReportGenerator.artTableColHdr.shortCut=Short Cut
ReportGenerator.artTableColHdr.deviceName=Device Name
ReportGenerator.artTableColHdr.deviceAddress=Device Address
ReportGenerator.artTableColHdr.altitude=Altitude
ReportGenerator.artTableColHdr.locationAddress=Location Address
ReportGenerator.artTableColHdr.category=Category
ReportGenerator.artTableColHdr.userId=User ID
ReportGenerator.artTableColHdr.userName=User Name
ReportGenerator.artTableColHdr.password=Password
ReportGenerator.artTableColHdr.appName=App Name
ReportGenerator.artTableColHdr.appPath=App Path
ReportGenerator.artTableColHdr.replytoAddress=ReplyTo Address
ReportGenerator.artTableColHdr.mailServer=Mail Server
ReportGenerator.artTableColHdr.tags=Tags
ReportGenerator.artTableColHdr.localPath=Local path
ReportGenerator.artTableColHdr.remotePath=Remote path
ReportGenerator.errors.reportErrorTitle=Error generating report
ReportGenerator.errors.reportErrorText=Error generating report:
ReportHTML.addThumbRows.dataType.title=Tagged Images - {0}
ReportHTML.addThumbRows.dataType.msg=Tagged Results and Contents that contain images.
ReportHTML.thumbLink.tags=Tags:
ReportHTML.getName.text=HTML Report
ReportHTML.getDesc.text=A report about results and tagged items in HTML format.
ReportHTML.writeIndex.title=for case {0}
ReportHTML.writeIndex.noFrames.msg=Your browser is not compatible with our frame setup.
ReportHTML.writeIndex.noFrames.seeNav=Please see <a href\="content\nav.html">the navigation page</a> for artifact links,
ReportHTML.writeIndex.seeSum=and <a href\="content\summary.html">the summary page</a> for a case summary.
ReportHTML.writeNav.title=Report Navigation
ReportHTML.writeNav.h1=Report Navigation
ReportHTML.writeNav.summary=Case Summary
ReportHTML.writeSum.title=Case Summary
ReportHTML.writeSum.warningMsg=<span>Warning, this report was run before ingest services completed\!</span>
#
# autopsy/test/scripts/regression.py._html_report_diff() uses reportGenOn.text, caseName, caseNum,
# examiner as a regex signature to skip report.html and summary.html
#
ReportHTML.writeSum.reportGenOn.text=HTML Report Generated on {0}
ReportHTML.writeSum.imageInfoHeading=<h2>Image Information:</h2>
ReportHTML.writeSum.softwareInfoHeading=<h2>Software Information:</h2>
ReportHTML.writeSum.ingestHistoryHeading=<h2>Ingest History:</h2>
ReportHTML.writeSum.modulesEnabledHeading=Enabled Modules:
ReportHTML.writeSum.autopsyVersion=Autopsy Version:
ReportHTML.writeSum.timezone=Timezone:
ReportHTML.writeSum.path=Path:
ReportProgressPanel.progress.queuing=Queuing...
ReportProgressPanel.pathLabel.text=pathLabel
ReportProgressPanel.reportLabel.text=reportLabel
ReportProgressPanel.statusMessageLabel.text=processingLabel
ReportProgressPanel.separationLabel.text=:
ReportProgressPanel.initPathLabel.noFile=<html><u>No report file</u></html>
ReportProgressPanel.start.cancelButton.text=Cancel
ReportProgressPanel.start.progress.text=Starting report...
@@ -209,64 +14,3 @@ ReportProgressPanel.complete.processLb2.text=Completed with error
ReportProgressPanel.complete.cancelButton.text=Complete
ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
ReportProgressPanel.cancel.procLbl.text=Canceled
ReportVisualPanel1.getName.text=Select and Configure Report Modules
ReportVisualPanel2.getName.text=Configure Artifact Reports
ReportWizardAction.actionName.text=Generate Report
ReportWizardAction.reportWiz.title=Generate Report
ReportWizardAction.toolBarButton.text=Generate Report
ReportWizardFileOptionsPanel.finishButton.text=Finish
ReportWizardFileOptionsVisualPanel.getName.text=Configure File Report
ReportWizardPanel1.nextButton.text=Next >
ReportWizardPanel1.finishButton.text=Finish
ReportWizardPanel2.finishButton.text=Finish
ReportWizardPanel2.nextButton.text=Next >
ReportBodyFile.generateReport.srcModuleName.text=TSK Body File
ReportExcel.endReport.srcModuleName.text=Excel Report
ReportHTML.writeIndex.srcModuleName.text=HTML Report
ReportKML.genReport.srcModuleName.text=Geospatial Data
ReportKML.genReport.reportName=KML Report
ReportGenerator.artTableColHdr.extension.text=Extension
ReportGenerator.artTableColHdr.mimeType.text=MIME Type
ReportGenerator.artTableColHdr.processorArchitecture.text=Processor Architecture
ReportGenerator.artTableColHdr.osName.text=Operating System Name
ReportGenerator.artTableColHdr.osInstallDate.text=Install Date
ReportGenerator.errList.failedMakeRptFolder=Failed to make report folder, may be unable to generate reports.
ReportGenerator.notifyErr.errsDuringRptGen=Errors during report generation:
ReportGenerator.errList.failedGetContentTags=Failed to get content tags.
ReportGenerator.errList.failedGetBBArtifactTags=Failed to get blackboard artifact tags.
ReportGenerator.errList.errGetContentFromBBArtifact=Error while getting content from a blackboard artifact to report on.
ReportGenerator.errList.failedGetBBAttribs=Failed to get Blackboard Attributes when generating report.
ReportGenerator.errList.failedGetBBArtifacts=Failed to get Blackboard Artifacts when generating report.
ReportGenerator.errList.failedQueryKWLists=Failed to query keyword lists.
ReportGenerator.errList.failedGetAbstractFileByID=Failed to get Abstract File by ID.
ReportGenerator.errList.failedQueryKWs=Failed to query keywords.
ReportGenerator.errList.failedQueryHashsetLists=Failed to query hashset lists.
ReportGenerator.errList.failedGetAbstractFileFromID=Failed to get Abstract File from ID.
ReportGenerator.errList.failedQueryHashsetHits=Failed to query hashsets hits.
ReportGenerator.errList.coreExceptionWhileGenRptRow=Core exception while generating row data for artifact report.
ReportKML.latLongStartPoint={0};{1};;{2} (Start)\n
ReportKML.latLongEndPoint={0};{1};;{2} (End)\n
ReportGenerationPanel.cancelButton.actionCommand=Cancel
ReportGenerationPanel.cancelButton.text=Cancel
ReportHTMLConfigurationPanel.headerTextField.text=
ReportHTMLConfigurationPanel.footerTextField.text=
ReportHTMLConfigurationPanel.headerLabel.text=Header:
ReportHTMLConfigurationPanel.footerLabel.text=Footer:
CreatePortableCasePanel.selectAllButton.text=Select All
CreatePortableCasePanel.deselectAllButton.text=Deselect All
CreatePortableCasePanel.outputFolderTextField.text=jTextField1
CreatePortableCasePanel.chooseOutputFolderButton.text=Choose folder
CreatePortableCasePanel.jLabel1.text=Export files tagged as:
CreatePortableCasePanel.jLabel2.text=Select output folder:
CreatePortableCasePanel.errorLabel.text_1=Windows only
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
PortableCaseTagsListPanel.deselectButton.text=Deselect All
PortableCaseTagsListPanel.selectButton.text=Select All
PortableCaseInterestingItemsListPanel.selectButton.text=Select All
PortableCaseInterestingItemsListPanel.deselectButton.text=Deselect All
ReportFileTextConfigurationPanel.tabDelimitedButton.text=Tab delimited
ReportFileTextConfigurationPanel.commaDelimitedButton.text=Comma delimited
PortableCaseTagsListPanel.descLabel.text=Include the following tags:
PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets:
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
@@ -1,269 +1,16 @@
OpenIDE-Module-Name=Report
CTL_ReportWizardAction=Run Report
ArtifactSelectionDialog.titleLabel.text=Select which artifacts you would like to report on:
ArtifactSelectionDialog.okButton.text=OK
PortableCaseInterestingItemsListPanel.error.errorLoadingTags=Error loading interesting item set names
PortableCaseInterestingItemsListPanel.error.errorTitle=Error getting intesting item set names for case
PortableCaseInterestingItemsListPanel.error.noOpenCase=There is no case open
PortableCaseReportModule.compressCase.canceled=Compression canceled by user
PortableCaseReportModule.compressCase.errorCompressingCase=Error compressing case
# {0} - Temp folder path
PortableCaseReportModule.compressCase.errorCreatingTempFolder=Could not create temporary folder {0}
PortableCaseReportModule.compressCase.errorFinding7zip=Could not locate 7-Zip executable
# {0} - File name
PortableCaseReportModule.copyContentToPortableCase.copyingFile=Copying file {0}
# {0} - case folder
PortableCaseReportModule.createCase.caseDirExists=Case folder {0} already exists
PortableCaseReportModule.createCase.errorCreatingCase=Error creating case
# {0} - folder
PortableCaseReportModule.createCase.errorCreatingFolder=Error creating folder {0}
PortableCaseReportModule.createCase.errorStoringMaxIds=Error storing maximum database IDs
PortableCaseReportModule.generateReport.caseClosed=Current case has been closed
PortableCaseReportModule.generateReport.compressingCase=Compressing case...
# {0} - tag name
PortableCaseReportModule.generateReport.copyingArtifacts=Copying artifacts tagged as {0}...
# {0} - tag name
PortableCaseReportModule.generateReport.copyingFiles=Copying files tagged as {0}...
PortableCaseReportModule.generateReport.copyingTags=Copying tags...
PortableCaseReportModule.generateReport.creatingCase=Creating portable case database...
PortableCaseReportModule.generateReport.errorCopyingArtifacts=Error copying tagged artifacts
PortableCaseReportModule.generateReport.errorCopyingFiles=Error copying tagged files
PortableCaseReportModule.generateReport.errorCopyingInterestingFiles=Error copying interesting files
PortableCaseReportModule.generateReport.errorCopyingInterestingResults=Error copying interesting results
PortableCaseReportModule.generateReport.errorCopyingTags=Error copying tags
PortableCaseReportModule.generateReport.errorCreatingImageTagTable=Error creating image tags table
PortableCaseReportModule.generateReport.errorCreatingReportFolder=Could not make report folder
PortableCaseReportModule.generateReport.errorGeneratingUCOreport=Problem while generating CASE-UCO report
# {0} - attribute type name
PortableCaseReportModule.generateReport.errorLookingUpAttrType=Error looking up attribute type {0}
PortableCaseReportModule.generateReport.interestingItemError=Error loading intersting items
PortableCaseReportModule.generateReport.noContentToCopy=No interesting files, results, or tagged items to copy
# {0} - output folder
PortableCaseReportModule.generateReport.outputDirDoesNotExist=Output folder {0} does not exist
# {0} - output folder
PortableCaseReportModule.generateReport.outputDirIsNotDir=Output folder {0} is not a folder
PortableCaseReportModule.generateReport.verifying=Verifying selected parameters...
PortableCaseReportModule.getDescription.description=Copies selected items to a new single-user case that can be easily shared
PortableCaseReportModule.getName.name=Portable Case
PortableCaseTagsListPanel.error.errorLoadingTags=Error loading tags
PortableCaseTagsListPanel.error.errorTitle=Error getting tag names for case
PortableCaseTagsListPanel.error.noOpenCase=There is no case open
ReportExcel.exceptionMessage.dataTooLarge=Value is too long to fit into an Excel cell.
ReportExcel.exceptionMessage.errorText=Error showing data into an Excel cell.
ReportExcel.writeSummary.caseName=Case Name:
ReportExcel.writeSummary.caseNotes=Case Notes:
ReportExcel.writeSummary.caseNum=Case Number:
ReportExcel.writeSummary.examiner=Examiner:
ReportExcel.writeSummary.numImages=Number of Images:
ReportExcel.writeSummary.sheetName=Summary
ReportExcel.writeSummary.summary=Summary
ReportGenerator.artTableColHdr.comment=Comment
ReportGenerator.errList.noOpenCase=No open case available.
ReportGenerator.tagTable.header.userName=User Name
ReportHTML.writeSum.case=Case:
ReportHTML.writeSum.caseNotes=Notes:
ReportHTML.writeSum.caseNumber=Case Number:
ReportHTML.writeSum.caseNumImages=Number of Images:
ReportHTML.writeSum.examiner=Examiner:
ReportVisualPanel1.reportModulesLabel.text=Report Modules:
ReportVisualPanel1.invalidModuleWarning=Encountered an invalid Report Module ({0})
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
ReportVisualPanel2.dataLabel.text=Select which data to report on:
ReportVisualPanel2.deselectAllButton.text=Deselect All
ReportVisualPanel2.selectAllButton.text=Select All
ReportVisualPanel2.advancedButton.text=Data Types
ArtifactSelectionDialog.deselectAllButton.text=Deselect All
ArtifactSelectionDialog.selectAllButton.text=Select All
ReportGenerationPanel.closeButton.text=Close
ReportProgressPanel.reportLabel.text=reportLabel
ReportProgressPanel.pathLabel.text=pathLabel
ReportProgressPanel.separationLabel.text=:
ReportProgressPanel.statusMessageLabel.text=processingLabel
ReportGenerationPanel.titleLabel.text=Report Generation Progress
ReportVisualPanel2.taggedResultsRadioButton.text=Tagged Results
ReportVisualPanel2.allResultsRadioButton.text=All Results
ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
ArtifactSelectionDialog.dlgTitle.text=Advanced Artifact Selection
FileReportDataTypes.filename.text=Name
FileReportDataTypes.fileExt.text=File Extension
FileReportDataTypes.fileType.text=File Type
FileReportDataTypes.isDel.text=Is Deleted
FileReportDataTypes.aTime.text=Last Accessed
FileReportDataTypes.crTime.text=File Created
FileReportDataTypes.mTime.text=Last Modified
FileReportDataTypes.size.text=Size
FileReportDataTypes.address.text=Address
FileReportDataTypes.hash.text=Hash Value
FileReportDataTypes.knownStatus.text=Known Status
FileReportDataTypes.perms.text=Permissions
FileReportDataTypes.path.text=Full Path
FileReportText.getName.text=Files - Text
FileReportText.getDesc.text=A delimited text file containing information about individual files in the case.
ReportBodyFile.progress.querying=Querying files...
ReportBodyFile.ingestWarning.text=Warning, this report was run before ingest services completed\!
ReportBodyFile.progress.loading=Loading files...
ReportBodyFile.progress.processing=Now processing {0}...
ReportBodyFile.getName.text=TSK Body File
ReportBodyFile.getDesc.text=Body file format report with MAC times for every file. This format can be used for a timeline view.
ReportBodyFile.getFilePath.text=BodyFile.txt
ReportKML.progress.querying=Querying files...
ReportKML.progress.loading=Loading files...
ReportKML.getName.text=Google Earth KML
ReportKML.getDesc.text=KML format report with coordinates for relevant files. This format can be used for google earth views.
ReportKML.getFilePath.text=ReportKML.kml
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
ReportExcel.numAartifacts.text=Number of artifacts:
ReportExcel.getName.text=Excel Report
ReportExcel.getDesc.text=A report about results and tagged items in Excel (XLS) format.
ReportExcel.sheetName.text=Summary
ReportExcel.cellVal.summary=Summary
ReportExcel.cellVal.caseName=Case Name:
ReportExcel.cellVal.caseNum=Case Number:
ReportExcel.cellVal.examiner=Examiner:
ReportExcel.cellVal.numImages=Number of Images:
ReportGenerationPanel.confDlg.sureToClose.msg=Are you sure you'd like to close the dialog?\nAll reports will be canceled.
ReportGenerationPanel.confDlg.title.closing=Closing
ReportGenerationPanel.confDlg.cancelReport.msg=Are you sure you'd like to cancel the report?
ReportGenerator.displayProgress.title.text=Report Generation Progress...
ReportGenerator.progress.queryingDb.text=Querying database...
ReportGenerator.progress.processingFile.text=Now processing {0}
ReportGenerator.artifactTable.taggedResults.text=Contains results that were tagged with one of the following:
ReportGenerator.progress.processing=Now processing {0}...
ReportGenerator.msgShow.skippingArtType.title=Skipping artifact type {0} in reports
ReportGenerator.msgShow.skippingArtType.msg=Unknown columns to report on
ReportGenerator.makeContTagTab.taggedFiles.msg=Contains files that were tagged with one of the following:
ReportGenerator.makeBbArtTagTab.taggedRes.msg=This report only includes results tagged with:
ReportGenerator.tagTable.header.resultType=Result Type
ReportGenerator.tagTable.header.tag=Tag
ReportGenerator.tagTable.header.comment=Comment
ReportGenerator.tagTable.header.srcFile=Source File
ReportGenerator.progress.createdThumb.text=Creating thumbnails...
ReportGenerator.htmlOutput.header.file=File
ReportGenerator.htmlOutput.header.tag=Tag
ReportGenerator.htmlOutput.header.comment=Comment
ReportGenerator.htmlOutput.header.timeModified=Modified Time
ReportGenerator.htmlOutput.header.timeChanged=Changed Time
ReportGenerator.htmlOutput.header.timeAccessed=Accessed Time
ReportGenerator.htmlOutput.header.timeCreated=Created Time
ReportGenerator.htmlOutput.header.size=Size (Bytes)
ReportGenerator.htmlOutput.header.hash=Hash
ReportGenerator.thumbnailTable.name=Tagged Images
ReportGenerator.thumbnailTable.desc=Contains thumbnails of images that are associated with tagged files and results.
ReportGenerator.writeKwHits.userSrchs=User Searches
ReportGenerator.progress.processingList=Now processing {0} ({1})...
ReportGenerator.artTableColHdr.url=URL
ReportGenerator.artTableColHdr.title=Title
ReportGenerator.artTableColHdr.dateCreated=Date Created
ReportGenerator.artTableColHdr.program=Program
ReportGenerator.artTableColHdr.urlDomainDecoded=URL Domain
ReportGenerator.artTableColHdr.srcFile=Source File
ReportGenerator.artTableColHdr.dateTime=Date/Time
ReportGenerator.artTableColHdr.name=Name
ReportGenerator.artTableColHdr.value=Value
ReportGenerator.artTableColHdr.dateAccessed=Date Accessed
ReportGenerator.artTableColHdr.referrer=Referrer
ReportGenerator.artTableColHdr.dest=Destination
ReportGenerator.artTableColHdr.sourceUrl=Source URL
ReportGenerator.artTableColHdr.path=Path
ReportGenerator.artTableColHdr.progName=Program Name
ReportGenerator.artTableColHdr.instDateTime=Install Date/Time
ReportGenerator.artTableColHdr.preview=Preview
ReportGenerator.artTableColHdr.file=File
ReportGenerator.artTableColHdr.size=Size
ReportGenerator.artTableColHdr.deviceId=Device ID
ReportGenerator.artTableColHdr.text=Text
ReportGenerator.artTableColHdr.domain=Domain
ReportGenerator.artTableColHdr.dateTaken=Date Taken
ReportGenerator.artTableColHdr.devManufacturer=Device Manufacturer
ReportGenerator.artTableColHdr.devMake=Device Make
ReportGenerator.artTableColHdr.devModel=Device Model
ReportGenerator.artTableColHdr.latitude=Latitude
ReportGenerator.artTableColHdr.longitude=Longitude
ReportGenerator.artTableColHdr.latitudeStart=Starting Latitude
ReportGenerator.artTableColHdr.longitudeStart=Starting Longitude
ReportGenerator.artTableColHdr.latitudeEnd=Ending Latitude
ReportGenerator.artTableColHdr.longitudeEnd=Ending Longitude
ReportGenerator.artTableColHdr.associatedArtifact=Associated Artifact
ReportGenerator.artTableColHdr.count=Count
ReportGenerator.artTableColHdr.personName=Person Name
ReportGenerator.artTableColHdr.phoneNumber=Phone Number
ReportGenerator.artTableColHdr.phoneNumHome=Phone Number (Home)
ReportGenerator.artTableColHdr.phoneNumOffice=Phone Number (Office)
ReportGenerator.artTableColHdr.phoneNumMobile=Phone Number (Mobile)
ReportGenerator.artTableColHdr.email=Email
ReportGenerator.artTableColHdr.msgType=Message Type
ReportGenerator.artTableColHdr.direction=Direction
ReportGenerator.artTableColHdr.readStatus=Read Status
ReportGenerator.artTableColHdr.fromPhoneNum=From Phone Number
ReportGenerator.artTableColHdr.fromEmail=From Email
ReportGenerator.artTableColHdr.toPhoneNum=To Phone Number
ReportGenerator.artTableColHdr.toEmail=To Email
ReportGenerator.artTableColHdr.subject=Subject
ReportGenerator.artTableColHdr.tskEmailTo=E-Mail To
ReportGenerator.artTableColHdr.tskEmailCc=E-Mail CC
ReportGenerator.artTableColHdr.tskEmailBcc=E-Mail BCC
ReportGenerator.artTableColHdr.tskEmailFrom=E-Mail From
ReportGenerator.artTableColHdr.tskMsgId=Message ID
ReportGenerator.artTableColHdr.tskDateTimeRcvd=Date Received
ReportGenerator.artTableColHdr.tskDateTimeSent=Date Sent
ReportGenerator.artTableColHdr.tskSubject=Subject
ReportGenerator.artTableColHdr.tskSetName=Set Name
ReportGenerator.artTableColHdr.tskInterestingFilesCategory=Rule
ReportGenerator.artTableColHdr.tskGpsRouteCategory=Category
ReportGenerator.artTableColHdr.tskPath=Path
ReportGenerator.artTableColHdr.calendarEntryType=Calendar Entry Type
ReportGenerator.artTableColHdr.description=Description
ReportGenerator.artTableColHdr.startDateTime=Start Date/Time
ReportGenerator.artTableColHdr.endDateTime=End Date/Time
ReportGenerator.artTableColHdr.location=Location
ReportGenerator.artTableColHdr.shortCut=Short Cut
ReportGenerator.artTableColHdr.deviceName=Device Name
ReportGenerator.artTableColHdr.deviceAddress=Device Address
ReportGenerator.artTableColHdr.altitude=Altitude
ReportGenerator.artTableColHdr.locationAddress=Location Address
ReportGenerator.artTableColHdr.category=Category
ReportGenerator.artTableColHdr.userId=User ID
ReportGenerator.artTableColHdr.userName=User Name
ReportGenerator.artTableColHdr.password=Password
ReportGenerator.artTableColHdr.appName=App Name
ReportGenerator.artTableColHdr.appPath=App Path
ReportGenerator.artTableColHdr.replytoAddress=ReplyTo Address
ReportGenerator.artTableColHdr.mailServer=Mail Server
ReportGenerator.artTableColHdr.tags=Tags
ReportGenerator.artTableColHdr.localPath=Local path
ReportGenerator.artTableColHdr.remotePath=Remote path
ReportGenerator.errors.reportErrorTitle=Error generating report
ReportGenerator.errors.reportErrorText=Error generating report:
ReportHTML.addThumbRows.dataType.title=Tagged Images - {0}
ReportHTML.addThumbRows.dataType.msg=Tagged Results and Contents that contain images.
ReportHTML.thumbLink.tags=Tags:
ReportHTML.getName.text=HTML Report
ReportHTML.getDesc.text=A report about results and tagged items in HTML format.
ReportHTML.writeIndex.title=for case {0}
ReportHTML.writeIndex.noFrames.msg=Your browser is not compatible with our frame setup.
ReportHTML.writeIndex.noFrames.seeNav=Please see <a href\="content\nav.html">the navigation page</a> for artifact links,
ReportHTML.writeIndex.seeSum=and <a href\="content\summary.html">the summary page</a> for a case summary.
ReportHTML.writeNav.title=Report Navigation
ReportHTML.writeNav.h1=Report Navigation
ReportHTML.writeNav.summary=Case Summary
ReportHTML.writeSum.title=Case Summary
ReportHTML.writeSum.warningMsg=<span>Warning, this report was run before ingest services completed\!</span>
#
# autopsy/test/scripts/regression.py._html_report_diff() uses reportGenOn.text, caseName, caseNum,
# examiner as a regex signature to skip report.html and summary.html
#
ReportHTML.writeSum.reportGenOn.text=HTML Report Generated on {0}
ReportHTML.writeSum.imageInfoHeading=<h2>Image Information:</h2>
ReportHTML.writeSum.softwareInfoHeading=<h2>Software Information:</h2>
ReportHTML.writeSum.ingestHistoryHeading=<h2>Ingest History:</h2>
ReportHTML.writeSum.modulesEnabledHeading=Enabled Modules:
ReportHTML.writeSum.autopsyVersion=Autopsy Version:
ReportHTML.writeSum.timezone=Timezone:
ReportHTML.writeSum.path=Path:
ReportProgressPanel.pathLabel.text=pathLabel
ReportProgressPanel.progress.canceled=Canceled
ReportProgressPanel.progress.complete=Complete
ReportProgressPanel.progress.error=Error
ReportProgressPanel.progress.queuing=Queuing...
ReportProgressPanel.progress.running=Running...
ReportProgressPanel.reportLabel.text=reportLabel
ReportProgressPanel.statusMessageLabel.text=processingLabel
ReportProgressPanel.separationLabel.text=:
ReportProgressPanel.initPathLabel.noFile=<html><u>No report file</u></html>
ReportProgressPanel.start.cancelButton.text=Cancel
ReportProgressPanel.start.progress.text=Starting report...
@@ -272,66 +19,3 @@ ReportProgressPanel.complete.processLb2.text=Completed with error
ReportProgressPanel.complete.cancelButton.text=Complete
ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
ReportProgressPanel.cancel.procLbl.text=Canceled
ReportVisualPanel1.getName.text=Select and Configure Report Modules
ReportVisualPanel2.getName.text=Configure Artifact Reports
ReportWizardAction.actionName.text=Generate Report
ReportWizardAction.reportWiz.title=Generate Report
ReportWizardAction.toolBarButton.text=Generate Report
ReportWizardFileOptionsPanel.finishButton.text=Finish
ReportWizardFileOptionsVisualPanel.getName.text=Configure File Report
ReportWizardPanel1.nextButton.text=Next >
ReportWizardPanel1.finishButton.text=Finish
ReportWizardPanel2.finishButton.text=Finish
ReportWizardPanel2.nextButton.text=Next >
ReportBodyFile.generateReport.srcModuleName.text=TSK Body File
ReportExcel.endReport.srcModuleName.text=Excel Report
ReportHTML.writeIndex.srcModuleName.text=HTML Report
ReportKML.genReport.srcModuleName.text=Geospatial Data
ReportKML.genReport.reportName=KML Report
ReportGenerator.artTableColHdr.extension.text=Extension
ReportGenerator.artTableColHdr.mimeType.text=MIME Type
ReportGenerator.artTableColHdr.processorArchitecture.text=Processor Architecture
ReportGenerator.artTableColHdr.osName.text=Operating System Name
ReportGenerator.artTableColHdr.osInstallDate.text=Install Date
ReportGenerator.errList.failedMakeRptFolder=Failed to make report folder, may be unable to generate reports.
ReportGenerator.notifyErr.errsDuringRptGen=Errors during report generation:
ReportGenerator.errList.failedGetContentTags=Failed to get content tags.
ReportGenerator.errList.failedGetBBArtifactTags=Failed to get blackboard artifact tags.
ReportGenerator.errList.errGetContentFromBBArtifact=Error while getting content from a blackboard artifact to report on.
ReportGenerator.errList.failedGetBBAttribs=Failed to get Blackboard Attributes when generating report.
ReportGenerator.errList.failedGetBBArtifacts=Failed to get Blackboard Artifacts when generating report.
ReportGenerator.errList.failedQueryKWLists=Failed to query keyword lists.
ReportGenerator.errList.failedGetAbstractFileByID=Failed to get Abstract File by ID.
ReportGenerator.errList.failedQueryKWs=Failed to query keywords.
ReportGenerator.errList.failedQueryHashsetLists=Failed to query hashset lists.
ReportGenerator.errList.failedGetAbstractFileFromID=Failed to get Abstract File from ID.
ReportGenerator.errList.failedQueryHashsetHits=Failed to query hashsets hits.
ReportGenerator.errList.coreExceptionWhileGenRptRow=Core exception while generating row data for artifact report.
ReportKML.latLongStartPoint={0};{1};;{2} (Start)\n
ReportKML.latLongEndPoint={0};{1};;{2} (End)\n
ReportGenerationPanel.cancelButton.actionCommand=Cancel
ReportGenerationPanel.cancelButton.text=Cancel
ReportHTMLConfigurationPanel.headerTextField.text=
ReportHTMLConfigurationPanel.footerTextField.text=
ReportHTMLConfigurationPanel.headerLabel.text=Header:
ReportHTMLConfigurationPanel.footerLabel.text=Footer:
CreatePortableCasePanel.selectAllButton.text=Select All
CreatePortableCasePanel.deselectAllButton.text=Deselect All
CreatePortableCasePanel.outputFolderTextField.text=jTextField1
CreatePortableCasePanel.chooseOutputFolderButton.text=Choose folder
CreatePortableCasePanel.jLabel1.text=Export files tagged as:
CreatePortableCasePanel.jLabel2.text=Select output folder:
CreatePortableCasePanel.errorLabel.text_1=Windows only
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
PortableCaseTagsListPanel.deselectButton.text=Deselect All
PortableCaseTagsListPanel.selectButton.text=Select All
PortableCaseInterestingItemsListPanel.selectButton.text=Select All
PortableCaseInterestingItemsListPanel.deselectButton.text=Deselect All
ReportFileTextConfigurationPanel.tabDelimitedButton.text=Tab delimited
ReportFileTextConfigurationPanel.commaDelimitedButton.text=Comma delimited
PortableCaseTagsListPanel.descLabel.text=Include the following tags:
PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets:
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
ReportWizardPortableCaseOptionsVisualPanel.getName.title=Choose Portable Case settings
TableReportGenerator.StatusColumn.Header=Review Status
@@ -1,246 +1,8 @@
OpenIDE-Module-Name=\u30ec\u30dd\u30fc\u30c8
CTL_ReportWizardAction=\u30ec\u30dd\u30fc\u30c8\u3092\u5b9f\u884c
ArtifactSelectionDialog.titleLabel.text=\u3069\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306b\u3064\u3044\u3066\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u304b\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
ArtifactSelectionDialog.okButton.text=OK
ReportVisualPanel1.reportModulesLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\uff1a
DefaultReportConfigurationPanel.infoLabel.text=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u3067\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002
ReportVisualPanel2.dataLabel.text=\u3069\u306e\u30c7\u30fc\u30bf\u306b\u3064\u3044\u3066\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u304b\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
ReportVisualPanel2.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
ReportVisualPanel2.selectAllButton.text=\u5168\u3066\u9078\u629e
ReportVisualPanel2.advancedButton.text=\u30c7\u30fc\u30bf\u30bf\u30a4\u30d7
ArtifactSelectionDialog.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
ArtifactSelectionDialog.selectAllButton.text=\u5168\u3066\u9078\u629e
ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b
ReportProgressPanel.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
ReportProgressPanel.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
ReportProgressPanel.separationLabel.text=:
ReportProgressPanel.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
ReportGenerationPanel.titleLabel.text=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u30d7\u30ed\u30b0\u30ec\u30b9
ReportVisualPanel2.taggedResultsRadioButton.text=\u30bf\u30b0\u3055\u308c\u305f\u7d50\u679c
ReportVisualPanel2.allResultsRadioButton.text=\u5168\u3066\u306e\u7d50\u679c
ReportWizardFileOptionsVisualPanel.selectAllButton.text=\u5168\u3066\u9078\u629e
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
ReportWizardFileOptionsVisualPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u306b\u542b\u3081\u308b\u30a2\u30a4\u30c6\u30e0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
ArtifactSelectionDialog.dlgTitle.text=\u30a2\u30c9\u30d0\u30f3\u30b9\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u9078\u629e
FileReportDataTypes.filename.text=\u540d\u524d
FileReportDataTypes.fileExt.text=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50
FileReportDataTypes.fileType.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7
FileReportDataTypes.isDel.text=\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f
FileReportDataTypes.aTime.text=\u6700\u5f8c\u306e\u30a2\u30af\u30bb\u30b9
FileReportDataTypes.crTime.text=\u4f5c\u6210\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
FileReportDataTypes.mTime.text=\u6700\u5f8c\u306e\u4fee\u6b63
FileReportDataTypes.size.text=\u30b5\u30a4\u30ba
FileReportDataTypes.address.text=\u30a2\u30c9\u30ec\u30b9
FileReportDataTypes.hash.text=\u30cf\u30c3\u30b7\u30e5\u5024
FileReportDataTypes.knownStatus.text=\u65e2\u77e5\u30b9\u30c6\u30fc\u30bf\u30b9
FileReportDataTypes.perms.text=\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3
FileReportDataTypes.path.text=\u30d5\u30eb\u30d1\u30b9
FileReportText.getName.text=\u30d5\u30a1\u30a4\u30eb - \u30c6\u30ad\u30b9\u30c8
FileReportText.getDesc.text=\u30b1\u30fc\u30b9\u306e\u500b\u5225\u30d5\u30a1\u30a4\u30eb\u306b\u3064\u3044\u3066\u306e\u60c5\u5831\u3092\u6301\u3064\u3001\u30bf\u30d6\u533a\u5207\u308a\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3002
ReportBodyFile.progress.querying=\u30d5\u30a1\u30a4\u30eb\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u4e2d\u2026
ReportBodyFile.ingestWarning.text=\u8b66\u544a\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b5\u30fc\u30d3\u30b9\u304c\u5b8c\u4e86\u3059\u308b\u524d\u306b\u30ec\u30dd\u30fc\u30c8\u304c\u5b9f\u884c\u3055\u308c\u307e\u3057\u305f\uff01
ReportBodyFile.progress.loading=\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u2026
ReportBodyFile.progress.processing={0}\u3092\u51e6\u7406\u4e2d\u2026
ReportBodyFile.getName.text=TSK\u30dc\u30c7\u30a3\u30d5\u30a1\u30a4\u30eb
ReportBodyFile.getDesc.text=\u5404\u30d5\u30a1\u30a4\u30eb\u306eMAC\u30bf\u30a4\u30e0\u3092\u542b\u3080\u3001\u30dc\u30c7\u30a3\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u30ec\u30dd\u30fc\u30c8\u3002\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30d3\u30e5\u30fc\u306b\u3053\u306e\u5f62\u5f0f\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002
ReportBodyFile.getFilePath.text=BodyFile.txt
ReportBranding.defaultReportTitle.text=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30ec\u30dd\u30fc\u30c8
ReportBranding.defaultReportFooter.text=Autopsy\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30fb\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306b\u3088\u308a\u63d0\u4f9b - www.sleuthkit.org
ReportExcel.numAartifacts.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u6570\uff1a
ReportExcel.getName.text=\u7d50\u679c - Excel
ReportExcel.getDesc.text=\u7d50\u679c\u306b\u95a2\u3059\u308b\u30ec\u30dd\u30fc\u30c8\u3002Excel(XLS)\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3067\u30a2\u30a4\u30c6\u30e0\u306e\u30bf\u30b0\u4ed8\u3051\u304c\u3055\u308c\u3066\u3044\u307e\u3059\u3002
ReportExcel.sheetName.text=\u30b5\u30de\u30ea\u30fc
ReportExcel.cellVal.summary=\u30b5\u30de\u30ea\u30fc
ReportExcel.cellVal.caseName=\u30b1\u30fc\u30b9\u540d\uff1a
ReportExcel.cellVal.caseNum=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a
ReportExcel.cellVal.examiner=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a
ReportExcel.cellVal.numImages=\u30a4\u30e1\u30fc\u30b8\u6570\uff1a
ReportGenerationPanel.confDlg.sureToClose.msg=\u3053\u306e\u30c0\u30a4\u30a2\u30ed\u30b0\u3092\u672c\u5f53\u306b\u9589\u3058\u307e\u3059\u304b\uff1f\n\u5168\u3066\u306e\u30ec\u30dd\u30fc\u30c8\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3059\u3002
ReportGenerationPanel.confDlg.title.closing=\u9589\u3058\u3066\u3044\u307e\u3059
ReportGenerator.displayProgress.title.text=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u30d7\u30ed\u30b0\u30ec\u30b9\u2026
ReportGenerator.progress.queryingDb.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u4e2d\u2026
ReportGenerator.progress.processingFile.text={0}\u3092\u51e6\u7406\u4e2d
ReportGenerator.artifactTable.taggedResults.text=\u6b21\u306e\u4e2d\u306e\u4e00\u3064\u3067\u30bf\u30b0\u3055\u308c\u305f\u7d50\u679c\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\uff1a
ReportGenerator.progress.processing={0}\u3092\u51e6\u7406\u4e2d\u2026
ReportGenerator.msgShow.skippingArtType.title=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7{0}\u3092\u30ec\u30dd\u30fc\u30c8\u3067\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u3044\u307e\u3059
ReportGenerator.msgShow.skippingArtType.msg=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u3059\u308b\u306e\u306b\u4e0d\u660e\u306a\u30b3\u30e9\u30e0
ReportGenerator.msgShow.skippingArtRow.title=\u30bf\u30a4\u30d7{0}\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u884c\u3092\u30ec\u30dd\u30fc\u30c8\u3067\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u3044\u307e\u3059
ReportGenerator.msgShow.skippingArtRow.msg=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u3059\u308b\u306e\u306b\u4e0d\u660e\u306a\u30b3\u30e9\u30e0
ReportGenerator.makeContTagTab.taggedFiles.msg=\u306e\u4e2d\u306e\u4e00\u3064\u3067\u30bf\u30b0\u3055\u308c\u305f\u7d50\u679c\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\uff1a
ReportGenerator.makeBbArtTagTab.taggedRes.msg=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306b\u306f\u6b21\u3067\u30bf\u30b0\u3055\u308c\u305f\u7d50\u679c\u3057\u304b\u542b\u307e\u308c\u307e\u305b\u3093\uff1a
ReportGenerator.tagTable.header.resultType=\u7d50\u679c\u30bf\u30a4\u30d7
ReportGenerator.tagTable.header.tag=\u30bf\u30b0
ReportGenerator.tagTable.header.comment=\u30b3\u30e1\u30f3\u30c8
ReportGenerator.tagTable.header.srcFile=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
ReportGenerator.progress.createdThumb.text=\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u4f5c\u6210\u4e2d\u2026
ReportGenerator.thumbnailTable.name=\u30b5\u30e0\u30cd\u30a4\u30eb
ReportGenerator.thumbnailTable.desc=\u30bf\u30b0\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3084\u7d50\u679c\u306b\u95a2\u9023\u3059\u308b\u30a4\u30e1\u30fc\u30b8\u306e\u30b5\u30e0\u30cd\u30a4\u30eb\u304c\u542b\u307e\u308c\u307e\u3059\u3002
ReportGenerator.writeKwHits.userSrchs=\u30e6\u30fc\u30b6\u691c\u7d22
ReportGenerator.progress.processingList={0} ({1})\u3092\u51e6\u7406\u4e2d\u2026
ReportGenerator.artTableColHdr.url=URL
ReportGenerator.artTableColHdr.title=\u30bf\u30a4\u30c8\u30eb
ReportGenerator.artTableColHdr.dateCreated=\u4f5c\u6210\u65e5\u4ed8
ReportGenerator.artTableColHdr.program=\u30d7\u30ed\u30b0\u30e9\u30e0
ReportGenerator.artTableColHdr.srcFile=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
ReportGenerator.artTableColHdr.dateTime=\u65e5\u4ed8\uff0f\u6642\u523b
ReportGenerator.artTableColHdr.name=\u540d\u524d
ReportGenerator.artTableColHdr.value=\u30d0\u30ea\u30e5\u30fc
ReportGenerator.artTableColHdr.dateAccessed=\u30a2\u30af\u30bb\u30b9\u65e5\u4ed8
ReportGenerator.artTableColHdr.referrer=\u30ea\u30d5\u30a1\u30e9
ReportGenerator.artTableColHdr.dest=\u30c7\u30b9\u30c6\u30a3\u30cd\u30fc\u30b7\u30e7\u30f3
ReportGenerator.artTableColHdr.sourceUrl=\u30bd\u30fc\u30b9URL
ReportGenerator.artTableColHdr.path=\u30d1\u30b9
ReportGenerator.artTableColHdr.progName=\u30d7\u30ed\u30b0\u30e9\u30e0\u540d
ReportGenerator.artTableColHdr.instDateTime=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65e5\u4ed8\uff0f\u6642\u523b
ReportGenerator.artTableColHdr.preview=\u30d7\u30ec\u30d3\u30e5\u30fc
ReportGenerator.artTableColHdr.file=\u30d5\u30a1\u30a4\u30eb
ReportGenerator.artTableColHdr.size=\u30b5\u30a4\u30ba
ReportGenerator.artTableColHdr.deviceId=\u6a5f\u5668ID
ReportGenerator.artTableColHdr.text=\u30c6\u30ad\u30b9\u30c8
ReportGenerator.artTableColHdr.domain=\u30c9\u30e1\u30a4\u30f3
ReportGenerator.artTableColHdr.devManufacturer=\u6a5f\u5668\u30e1\u30fc\u30ab\u30fc
ReportGenerator.artTableColHdr.devModel=\u6a5f\u5668\u30e2\u30c7\u30eb
ReportGenerator.artTableColHdr.personName=\u4eba\u540d
ReportGenerator.artTableColHdr.phoneNumber=\u96fb\u8a71\u756a\u53f7
ReportGenerator.artTableColHdr.phoneNumHome=\u96fb\u8a71\u756a\u53f7\uff08\u81ea\u5b85\uff09
ReportGenerator.artTableColHdr.phoneNumOffice=\u96fb\u8a71\u756a\u53f7\uff08\u4f1a\u793e\uff09
ReportGenerator.artTableColHdr.phoneNumMobile=\u96fb\u8a71\u756a\u53f7\uff08\u643a\u5e2f\uff09
ReportGenerator.artTableColHdr.email=Email
ReportGenerator.artTableColHdr.msgType=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7
ReportGenerator.artTableColHdr.latitude=\u7def\u5ea6
ReportGenerator.artTableColHdr.longitude=\u7d4c\u5ea6
ReportGenerator.artTableColHdr.dateTaken=\u64ae\u5f71\u65e5\u4ed8
ReportGenerator.artTableColHdr.subject=\u30b5\u30d6\u30b8\u30a7\u30af\u30c8
ReportGenerator.artTableColHdr.calendarEntryType=\u30ab\u30ec\u30f3\u30c0\u30fc\u30a8\u30f3\u30c8\u30ea\u30bf\u30a4\u30d7
ReportGenerator.artTableColHdr.description=\u8aac\u660e
ReportGenerator.artTableColHdr.startDateTime=\u958b\u59cb\u65e5\u4ed8\uff0f\u6642\u523b
ReportGenerator.artTableColHdr.shortCut=\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8
ReportGenerator.artTableColHdr.endDateTime=\u4fee\u4e86\u65e5\u4ed8\uff0f\u6642\u523b
ReportGenerator.artTableColHdr.location=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3
ReportGenerator.artTableColHdr.deviceName=\u6a5f\u5668\u540d
ReportGenerator.artTableColHdr.deviceAddress=\u6a5f\u5668\u30a2\u30c9\u30ec\u30b9
ReportGenerator.artTableColHdr.altitude=\u6a19\u9ad8
ReportGenerator.artTableColHdr.locationAddress=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u30a2\u30c9\u30ec\u30b9
ReportGenerator.artTableColHdr.category=\u30ab\u30c6\u30b4\u30ea\u30fc
ReportGenerator.artTableColHdr.userId=\u30e6\u30fc\u30b6ID
ReportGenerator.artTableColHdr.password=\u30d1\u30b9\u30ef\u30fc\u30c9
ReportGenerator.artTableColHdr.replytoAddress=\u8fd4\u4fe1\u30a2\u30c9\u30ec\u30b9
ReportGenerator.artTableColHdr.mailServer=\u30e1\u30fc\u30eb\u30b5\u30fc\u30d0
ReportGenerator.artTableColHdr.tags=\u30bf\u30b0
ReportHTML.addThumbRows.dataType.title=\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u30a4\u30e1\u30fc\u30b8 - {0}
ReportHTML.addThumbRows.dataType.msg=\u30a4\u30e1\u30fc\u30b8\u3092\u542b\u3080\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u7d50\u679c\u304a\u3088\u3073\u30b3\u30f3\u30c6\u30f3\u30c4\u3002
ReportHTML.thumbLink.tags=\u30bf\u30b0\uff1a
ReportHTML.getName.text=\u7d50\u679c - HTML
ReportHTML.getDesc.text=HTML\u5f62\u5f0f\u306e\u7d50\u679c\u304a\u3088\u3073\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u30a2\u30a4\u30c6\u30e0\u306e\u30ec\u30dd\u30fc\u30c8
ReportHTML.writeIndex.title=\u30b1\u30fc\u30b9{0}\u306eAutopsy\u30ec\u30dd\u30fc\u30c8
ReportHTML.writeNav.title=\u30ec\u30dd\u30fc\u30c8\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3
ReportHTML.writeNav.h1=\u30ec\u30dd\u30fc\u30c8\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3
ReportHTML.writeNav.summary=\u30b1\u30fc\u30b9\u30b5\u30de\u30ea\u30fc
ReportHTML.writeSum.title=\u30b1\u30fc\u30b9\u30b5\u30de\u30ea\u30fc
ReportHTML.writeSum.caseName=\u30b1\u30fc\u30b9\uff1a
ReportHTML.writeSum.caseNum=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a
ReportHTML.writeSum.examiner=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a
ReportHTML.writeSum.numImages=\u30a4\u30e1\u30fc\u30b8\u6570\uff1a
ReportHTML.writeSum.path=\u30d1\u30b9\uff1a
ReportProgressPanel.start.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
ReportProgressPanel.complete.processLbl.text=\u5b8c\u4e86
ReportProgressPanel.complete.cancelButton.text=\u5b8c\u4e86
ReportProgressPanel.cancel.cancelButton.toolTipText=\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f
ReportWizardAction.actionName.text=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
ReportWizardAction.reportWiz.title=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
ReportWizardAction.toolBarButton.text=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
ReportWizardPanel1.nextButton.text=\u6b21 >
ReportWizardPanel2.nextButton.text=\u6b21 >
ReportGenerator.artTableColHdr.direction=\u65b9\u5411
ReportGenerator.artTableColHdr.fromEmail=\u9001\u4fe1\u5143E\u30e1\u30fc\u30eb
ReportGenerator.artTableColHdr.toEmail=\u9001\u4fe1\u5148E\u30e1\u30fc\u30eb
ReportGenerator.artTableColHdr.fromPhoneNum=\u767a\u4fe1\u8005\u96fb\u8a71\u756a\u53f7
ReportGenerator.artTableColHdr.toPhoneNum=\u7740\u4fe1\u8005\u96fb\u8a71\u756a\u53f7
ReportGenerator.artTableColHdr.appName=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u540d
ReportGenerator.artTableColHdr.appPath=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d1\u30b9
ReportHTML.writeIndex.noFrames.msg=\u4f7f\u7528\u3057\u3066\u3044\u308b\u30d6\u30e9\u30a6\u30b6\u306f\u5f0a\u793e\u306e\u30d5\u30ec\u30fc\u30e0\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3068\u306e\u4e92\u63db\u6027\u304c\u3042\u308a\u307e\u305b\u3093\u3002
ReportHTML.writeIndex.noFrames.seeNav=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ea\u30f3\u30af\u306f\u4e0b\u8a18\u306e\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30da\u30fc\u30b8</a>\u3092\u3054\u89a7\u4e0b\u3055\u3044<a href\="nav.html">
ReportHTML.writeIndex.seeSum=\u307e\u305f\u3001\u30b1\u30fc\u30b9\u30b5\u30de\u30ea\u30fc\u306f\u4e0b\u8a18\u306e\u30b5\u30de\u30ea\u30fc\u30da\u30fc\u30b8</a>\u3092\u3054\u89a7\u4e0b\u3055\u3044\u3002<a href\="summary.html">
ReportHTML.writeSum.warningMsg=<span>\u8b66\u544a\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b5\u30fc\u30d3\u30b9\u304c\u5b8c\u4e86\u3059\u308b\u524d\u306b\u30ec\u30dd\u30fc\u30c8\u304c\u5b9f\u884c\u3055\u308c\u307e\u3057\u305f\uff01</span>
ReportHTML.writeSum.noExaminer=<i>\u8abf\u67fb\u62c5\u5f53\u8005\u7121\u3057</i>
ReportHTML.writeSum.imageInfoHeading=<h2>\u30a4\u30e1\u30fc\u30b8\u60c5\u5831\uff1a</h2>
ReportHTML.writeSum.timezone=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\uff1a
ReportProgressPanel.progress.queuing=\u30ad\u30e5\u30fc\u30a4\u30f3\u30b0\u2026
ReportProgressPanel.initPathLabel.noFile=<html><u>\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u7121\u3057</u></html>
ReportProgressPanel.start.progress.text=\u30ec\u30dd\u30fc\u30c8\u958b\u59cb\u4e2d\u2026
ReportProgressPanel.cancel.procLbl.text=\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f
ReportVisualPanel1.getName.text=\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u9078\u629e\u304a\u3088\u3073\u8a2d\u5b9a
ReportVisualPanel2.getName.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ec\u30dd\u30fc\u30c8\u3092\u8a2d\u5b9a
ReportWizardFileOptionsPanel.finishButton.text=\u7d42\u4e86
ReportWizardFileOptionsVisualPanel.getName.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u3092\u8a2d\u5b9a
ReportWizardPanel1.finishButton.text=\u7d42\u4e86
ReportWizardPanel2.finishButton.text=\u7d42\u4e86
ReportHTML.writeSum.reportGenOn.text={0}\u306bHTML\u30ec\u30dd\u30fc\u30c8\u306f\u751f\u6210\u3055\u308c\u307e\u3057\u305f
ReportHTML.writeSum.noCaseNum=<i>\u30b1\u30fc\u30b9\u756a\u53f7\u304c\u3042\u308a\u307e\u305b\u3093</i>
ReportGenerator.errors.reportErrorTitle=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
ReportGenerator.errors.reportErrorText=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a
ReportKML.getDesc.text=\u95a2\u9023\u30d5\u30a1\u30a4\u30eb\u306e\u5ea7\u6a19\u3092\u542b\u3080KML\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306e\u30ec\u30dd\u30fc\u30c8\u3002\u3053\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u306fGoogle Earth\u30d3\u30e5\u30fc\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002
ReportKML.getName.text=Google Earth/KML
ReportKML.progress.loading=\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u2026
ReportKML.progress.querying=\u30d5\u30a1\u30a4\u30eb\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u4e2d\u2026
ReportBodyFile.generateReport.srcModuleName.text=TSK\u30dc\u30c7\u30a3\u30d5\u30a1\u30a4\u30eb
ReportExcel.endReport.srcModuleName.text=Excel\u30ec\u30dd\u30fc\u30c8
ReportGenerator.artTableColHdr.extension.text=\u62e1\u5f35\u5b50
ReportGenerator.artTableColHdr.mimeType.text=MIME\u30bf\u30a4\u30d7
ReportHTML.writeIndex.srcModuleName.text=HTML\u30ec\u30dd\u30fc\u30c8
ReportKML.genReport.reportName=KML\u30ec\u30dd\u30fc\u30c8
ReportGenerator.artTableColHdr.associatedArtifact=\u95a2\u4fc2\u3059\u308b\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8
ReportGenerator.artTableColHdr.count=\u30ab\u30a6\u30f3\u30c8
ReportGenerator.artTableColHdr.devMake=\u6a5f\u5668\u578b\u540d
ReportGenerator.artTableColHdr.latitudeEnd=\u5230\u7740\u7def\u5ea6
ReportGenerator.artTableColHdr.latitudeStart=\u51fa\u767a\u7def\u5ea6
ReportGenerator.artTableColHdr.localPath=\u30ed\u30fc\u30ab\u30eb\u30d1\u30b9
ReportGenerator.artTableColHdr.longitudeEnd=\u5230\u7740\u7d4c\u5ea6
ReportGenerator.artTableColHdr.longitudeStart=\u51fa\u767a\u7d4c\u5ea6
ReportGenerator.artTableColHdr.osInstallDate.text=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65e5\u4ed8
ReportGenerator.artTableColHdr.osName.text=\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u540d
ReportGenerator.artTableColHdr.processorArchitecture.text=\u30d7\u30ed\u30bb\u30c3\u30b5\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3
ReportGenerator.artTableColHdr.readStatus=\u8aad\u307f\u53d6\u308a\u4e2d\u30b9\u30c6\u30fc\u30bf\u30b9
ReportGenerator.artTableColHdr.remotePath=\u30ea\u30e2\u30fc\u30c8\u30d1\u30b9
ReportGenerator.artTableColHdr.tskDateTimeRcvd=\u53d7\u4fe1\u65e5
ReportGenerator.artTableColHdr.tskDateTimeSent=\u9001\u4fe1\u65e5
ReportGenerator.artTableColHdr.tskEmailBcc=E-Mail BCC
ReportGenerator.artTableColHdr.tskEmailCc=E-Mail CC
ReportGenerator.artTableColHdr.tskEmailFrom=E-Mail\u9001\u4fe1\u5143
ReportGenerator.artTableColHdr.tskEmailTo=E-Mail\u9001\u4fe1\u5148
ReportGenerator.artTableColHdr.tskGpsRouteCategory=\u30ab\u30c6\u30b4\u30ea
ReportGenerator.artTableColHdr.tskInterestingFilesCategory=\u30eb\u30fc\u30eb
ReportGenerator.artTableColHdr.tskMsgId=\u30e1\u30c3\u30bb\u30fc\u30b8ID
ReportGenerator.artTableColHdr.tskPath=\u30d1\u30b9
ReportGenerator.artTableColHdr.tskSetName=\u30bb\u30c3\u30c8\u540d
ReportGenerator.artTableColHdr.tskSubject=\u30b5\u30d6\u30b8\u30a7\u30af\u30c8
ReportGenerator.artTableColHdr.urlDomainDecoded=URL\u30c9\u30e1\u30a4\u30f3
ReportGenerator.artTableColHdr.userName=\u30e6\u30fc\u30b6\u540d
ReportGenerator.errList.coreExceptionWhileGenRptRow=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ec\u30dd\u30fc\u30c8\u7528\u30ed\u30fc\u30c7\u30fc\u30bf\u306e\u751f\u6210\u4e2d\u306b\u30b3\u30a2\u30a8\u30af\u30bb\u30d7\u30b7\u30e7\u30f3\uff08\u4f8b\u5916\uff09\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f
ReportGenerator.errList.errGetContentFromBBArtifact=Blackboard\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u304b\u3089\u30ec\u30dd\u30fc\u30c8\u7528\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedGetAbstractFileByID=ID\u306b\u57fa\u3065\u304d\u30a2\u30d6\u30b9\u30c8\u30e9\u30af\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3059\u308b\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f
ReportGenerator.errList.failedGetBBArtifacts=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306bBlackboard\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedGetBBArtifactTags=Blackboard\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30b0\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedGetBBAttribs=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306bBlackboard\u5c5e\u6027\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedGetContentTags=\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30b0\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedMakeRptFolder=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0\u306e\u4f5c\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u304c\u3067\u304d\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
ReportGenerator.errList.failedQueryHashsetHits=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d2\u30c3\u30c8\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedQueryHashsetLists=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30ea\u30b9\u30c8\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedQueryKWLists=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedQueryKWs=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.htmlOutput.header.comment=\u30b3\u30e1\u30f3\u30c8
ReportGenerator.htmlOutput.header.file=\u30d5\u30a1\u30a4\u30eb
ReportGenerator.htmlOutput.header.hash=\u30cf\u30c3\u30b7\u30e5
ReportGenerator.htmlOutput.header.size=\u30b5\u30a4\u30ba\uff08\u30d0\u30a4\u30c8\uff09
ReportGenerator.htmlOutput.header.tag=\u30bf\u30b0
ReportGenerator.htmlOutput.header.timeAccessed=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
ReportGenerator.htmlOutput.header.timeCreated=\u4f5c\u6210\u65e5\u6642
ReportGenerator.htmlOutput.header.timeModified=\u4fee\u6b63\u65e5\u6642
ReportGenerator.notifyErr.errsDuringRptGen=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306e\u30a8\u30e9\u30fc\uff1a
ReportGenerator.errList.failedGetAbstractFileFromID=ID\u306b\u57fa\u3065\u304d\u30a2\u30d6\u30b9\u30c8\u30e9\u30af\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3059\u308b\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f
ReportKML.getFilePath.text=\u30ec\u30dd\u30fc\u30c8KML.kml
ReportVisualPanel1.invalidModuleWarning=\u7121\u52b9\u306a\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb({0})\u306b\u906d\u9047\u3057\u307e\u3057\u305f
ReportGenerationPanel.confDlg.cancelReport.msg=\u672c\u5f53\u306b\u30ec\u30dd\u30fc\u30c8\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3059\u304b\uff1f
ReportProgressPanel.complete.processLb2.text=\u5b8c\u4e86\u3057\u307e\u3057\u305f\u304c\u3001\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
ReportProgressPanel.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
ReportProgressPanel.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
ReportProgressPanel.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
ReportProgressPanel.separationLabel.text=:
@@ -0,0 +1,35 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report;
/**
* Implementation of the ReportModuleSettings interface for use by report
* modules that do not have settings.
*/
public final class NoReportModuleSettings implements ReportModuleSettings {
private static final long serialVersionUID = 1L;
private final String setting = "None"; //NON-NLS
@Override
public long getVersionNumber() {
return serialVersionUID;
}
}
@@ -18,6 +18,7 @@
*/
package org.sleuthkit.autopsy.report;
import org.sleuthkit.autopsy.report.infrastructure.ReportGenerator;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
@@ -62,7 +63,7 @@ public final class ReportBranding implements ReportBrandingProviderI {
//initialize with extracting of resource files if needed, ensure 1 writer at a time
synchronized (ReportBranding.class) {
reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.REPORTS_DIR + File.separator
reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.getReportsDirectory() + File.separator
+ "branding"; //NON-NLS
File brandingDir = new File(reportsBrandingDir);
if (!brandingDir.exists()) {
@@ -1,324 +0,0 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2013-2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingWorker;
import org.openide.filesystems.FileUtil;
import org.openide.util.NbBundle;
import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.datamodel.TskData;
class ReportGenerator {
private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
/**
* Progress reportGenerationPanel that can be used to check for
* cancellation.
*/
private ReportProgressPanel progressPanel;
private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
private final ReportGenerationPanel reportGenerationPanel = new ReportGenerationPanel();
static final String REPORTS_DIR = "Reports"; //NON-NLS
private List<String> errorList;
/**
* Displays the list of errors during report generation in user-friendly
* way. MessageNotifyUtil used to display bubble notification.
*/
private void displayReportErrors() {
if (!errorList.isEmpty()) {
String errorString = "";
for (String error : errorList) {
errorString += error + "\n";
}
MessageNotifyUtil.Notify.error(
NbBundle.getMessage(this.getClass(), "ReportGenerator.notifyErr.errsDuringRptGen"), errorString);
}
}
/**
* Creates a report generator.
*/
ReportGenerator() {
this.errorList = new ArrayList<>();
}
/**
* Display the progress panels to the user, and add actions to close the
* parent dialog.
*/
private void displayProgressPanel() {
final JDialog dialog = new JDialog((JFrame) WindowManager.getDefault().getMainWindow(), true);
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dialog.setTitle(NbBundle.getMessage(this.getClass(), "ReportGenerator.displayProgress.title.text"));
dialog.add(this.reportGenerationPanel);
dialog.pack();
reportGenerationPanel.addCloseAction(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.dispose();
}
});
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
reportGenerationPanel.close();
}
});
dialog.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
dialog.setVisible(true);
}
/**
* Run the GeneralReportModules using a SwingWorker.
*/
void generateGeneralReport(GeneralReportModule generalReportModule) throws IOException {
if (generalReportModule != null) {
String reportDir = createReportDirectory(generalReportModule);
setupProgressPanel(generalReportModule, reportDir);
ReportWorker worker = new ReportWorker(() -> {
generalReportModule.generateReport(reportDir, progressPanel);
});
worker.execute();
displayProgressPanel();
}
}
/**
* Run the TableReportModules using a SwingWorker.
*
* @param artifactTypeSelections the enabled/disabled state of the artifact
* types to be included in the report
* @param tagSelections the enabled/disabled state of the tag names to be
* included in the report
*/
void generateTableReport(TableReportModule tableReport, Map<BlackboardArtifact.Type, Boolean> artifactTypeSelections, Map<String, Boolean> tagNameSelections) throws IOException {
if (tableReport != null && null != artifactTypeSelections) {
String reportDir = createReportDirectory(tableReport);
setupProgressPanel(tableReport, reportDir);
ReportWorker worker = new ReportWorker(() -> {
tableReport.startReport(reportDir);
TableReportGenerator generator = new TableReportGenerator(artifactTypeSelections, tagNameSelections, progressPanel, tableReport);
generator.execute();
tableReport.endReport();
// finish progress, wrap up
progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE);
errorList = generator.getErrorList();
});
worker.execute();
displayProgressPanel();
}
}
/**
* Run the FileReportModules using a SwingWorker.
*
* @param enabledInfo the Information that should be included about each
* file in the report.
*/
void generateFileListReport(FileReportModule fileReportModule, Map<FileReportDataTypes, Boolean> enabledInfo) throws IOException {
if (fileReportModule != null && null != enabledInfo) {
String reportDir = createReportDirectory(fileReportModule);
List<FileReportDataTypes> enabled = new ArrayList<>();
for (Entry<FileReportDataTypes, Boolean> e : enabledInfo.entrySet()) {
if (e.getValue()) {
enabled.add(e.getKey());
}
}
setupProgressPanel(fileReportModule, reportDir);
ReportWorker worker = new ReportWorker(() -> {
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
progressPanel.start();
progressPanel.updateStatusLabel(
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.queryingDb.text"));
}
List<AbstractFile> files = getFiles();
int numFiles = files.size();
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
fileReportModule.startReport(reportDir);
fileReportModule.startTable(enabled);
}
progressPanel.setIndeterminate(false);
progressPanel.setMaximumProgress(numFiles);
int i = 0;
// Add files to report.
for (AbstractFile file : files) {
// Check to see if any reports have been cancelled.
if (progressPanel.getStatus() == ReportStatus.CANCELED) {
return;
} else {
fileReportModule.addRow(file, enabled);
progressPanel.increment();
}
if ((i % 100) == 0) {
progressPanel.updateStatusLabel(
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.processingFile.text",
file.getName()));
}
i++;
}
fileReportModule.endTable();
fileReportModule.endReport();
progressPanel.complete(ReportStatus.COMPLETE);
});
worker.execute();
displayProgressPanel();
}
}
/**
* Run the Portable Case Report Module
*/
void generatePortableCaseReport(PortableCaseReportModule portableCaseReportModule, PortableCaseReportModule.PortableCaseOptions options) throws IOException {
if (portableCaseReportModule != null) {
String reportDir = createReportDirectory(portableCaseReportModule);
setupProgressPanel(portableCaseReportModule, reportDir);
ReportWorker worker = new ReportWorker(() -> {
portableCaseReportModule.generateReport(reportDir, options, progressPanel);
});
worker.execute();
displayProgressPanel();
}
}
/**
* Get all files in the image.
*
* @return
*/
private List<AbstractFile> getFiles() {
List<AbstractFile> absFiles;
try {
SleuthkitCase skCase = Case.getCurrentCaseThrows().getSleuthkitCase();
absFiles = skCase.findAllFilesWhere("meta_type != " + TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue()); //NON-NLS
return absFiles;
} catch (TskCoreException | NoCurrentCaseException ex) {
MessageNotifyUtil.Notify.show(
NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorTitle"),
NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage(),
MessageNotifyUtil.MessageType.ERROR);
logger.log(Level.SEVERE, "failed to generate reports. Unable to get all files in the image.", ex); //NON-NLS
return Collections.<AbstractFile>emptyList();
}
}
private void setupProgressPanel(ReportModule module, String reportDir) {
String reportFilePath = module.getRelativeFilePath();
if (reportFilePath == null) {
this.progressPanel = reportGenerationPanel.addReport(module.getName(), null);
} else if (reportFilePath.isEmpty()) {
this.progressPanel = reportGenerationPanel.addReport(module.getName(), reportDir);
} else {
this.progressPanel = reportGenerationPanel.addReport(module.getName(), reportDir + reportFilePath);
}
}
private static String createReportDirectory(ReportModule module) throws IOException {
Case currentCase;
try {
currentCase = Case.getCurrentCaseThrows();
} catch (NoCurrentCaseException ex) {
throw new IOException("Exception while getting open case.", ex);
}
// Create the root reports directory path of the form: <CASE DIRECTORY>/Reports/<Case fileName> <Timestamp>/
DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy-HH-mm-ss");
Date date = new Date();
String dateNoTime = dateFormat.format(date);
String reportPath = String.format(REPORT_PATH_FMT_STR, currentCase.getReportDirectory(), currentCase.getDisplayName(), module.getName(), dateNoTime);
// Create the root reports directory.
try {
FileUtil.createFolder(new File(reportPath));
} catch (IOException ex) {
throw new IOException("Failed to make report folder, unable to generate reports.", ex);
}
return reportPath;
}
private class ReportWorker extends SwingWorker<Void, Void> {
private final Runnable doInBackground;
private ReportWorker(Runnable doInBackground) {
this.doInBackground = doInBackground;
}
@Override
protected Void doInBackground() throws Exception {
doInBackground.run();
return null;
}
@Override
protected void done() {
try {
get();
} catch (InterruptedException | ExecutionException ex) {
MessageNotifyUtil.Notify.show(
NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorTitle"),
NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage(),
MessageNotifyUtil.MessageType.ERROR);
logger.log(Level.SEVERE, "failed to generate reports", ex); //NON-NLS
} // catch and ignore if we were cancelled
catch (java.util.concurrent.CancellationException ex) {
} finally {
displayReportErrors();
errorList.clear();
}
}
}
}
@@ -27,7 +27,7 @@ import javax.swing.JPanel;
/**
* Interface for report modules that plug in to the reporting infrastructure.
*/
interface ReportModule {
public interface ReportModule {
/**
* Get the name of the report this module generates.
@@ -61,4 +61,31 @@ interface ReportModule {
public default JPanel getConfigurationPanel() {
return new DefaultReportConfigurationPanel();
}
/**
* Get default configuration for this report module.
*
* @return Object which contains default report module settings.
*/
public default ReportModuleSettings getDefaultConfiguration() {
return new NoReportModuleSettings();
}
/**
* Get current configuration for this report module.
*
* @return Object which contains current report module settings.
*/
public default ReportModuleSettings getConfiguration() {
return new NoReportModuleSettings();
}
/**
* Set report module configuration.
*
* @param settings Object which contains report module settings.
*/
public default void setConfiguration(ReportModuleSettings settings) {
// NO-OP
}
}
@@ -0,0 +1,39 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report;
import java.io.Serializable;
/**
* An interface for defining report module settings. The settings are
* serializable to support persistence of settings for different configurations
* and between invocations of the application. Report module writers will
* implement their own settings classes conforming to this interface.
*/
public interface ReportModuleSettings extends Serializable {
/**
* Returns the version number of the settings object. The version number
* should be a private final static long per the documentation of the
* Serializable interface.
*
* @return A serialization version number.
*/
long getVersionNumber();
}
@@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2018 Basis Technology Corp.
* Copyright 2012-2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -46,28 +46,57 @@ public class ReportProgressPanel extends javax.swing.JPanel {
* Used by a report generation module to communicate report generation
* status to this panel and its listeners.
*/
@NbBundle.Messages({
"ReportProgressPanel.progress.queuing=Queuing...",
"ReportProgressPanel.progress.running=Running...",
"ReportProgressPanel.progress.complete=Complete",
"ReportProgressPanel.progress.canceled=Canceled",
"ReportProgressPanel.progress.error=Error",})
public enum ReportStatus {
QUEUING,
RUNNING,
COMPLETE,
CANCELED,
ERROR
QUEUING(Bundle.ReportProgressPanel_progress_queuing()),
RUNNING(Bundle.ReportProgressPanel_progress_running()),
COMPLETE(Bundle.ReportProgressPanel_progress_complete()),
CANCELED(Bundle.ReportProgressPanel_progress_canceled()),
ERROR(Bundle.ReportProgressPanel_progress_error());
private final String displayName;
ReportStatus(String displayName) {
this.displayName = displayName;
}
/**
* Gets the display name of the report status.
*
* @return The display name.
*/
public String getDisplayName() {
return displayName;
}
}
/**
* Constructs a panel used by report generation module to show progress.
*/
public ReportProgressPanel() {
initComponents();
reportProgressBar.setIndeterminate(true);
reportProgressBar.setMaximum(100);
statusMessageLabel.setText(Bundle.ReportProgressPanel_progress_queuing());
status = ReportStatus.QUEUING;
reportLabel.setText("");
pathLabel.setText(""); //NON-NLS
}
/**
* Sets label text.
*
* @param reportName The name of the report being generated.
* @param reportPath The path to the report file.
*/
public ReportProgressPanel(String reportName, String reportPath) {
initComponents();
reportProgressBar.setIndeterminate(true);
reportProgressBar.setMaximum(100);
public final void setLabels(String reportName, String reportPath) {
reportLabel.setText(reportName);
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.progress.queuing"));
status = ReportStatus.QUEUING;
if (null != reportPath) {
pathLabel.setText("<html><u>" + shortenPath(reportPath) + "</u></html>"); //NON-NLS
pathLabel.setToolTipText(reportPath);
@@ -76,10 +105,16 @@ public class ReportProgressPanel extends javax.swing.JPanel {
@Override
public void mouseClicked(MouseEvent mouseEvent) {
/*
* Do nothing for this event.
*/
}
@Override
public void mousePressed(MouseEvent mouseEvent) {
/*
* Do nothing for this event.
*/
}
@Override
@@ -125,6 +160,15 @@ public class ReportProgressPanel extends javax.swing.JPanel {
return status;
}
/**
* Sets the current status of the generation of the report.
*
* @param status The current status.
*/
protected void setStatus(ReportStatus status) {
this.status = status;
}
/**
* Starts the progress bar component of this panel.
*/
@@ -210,6 +254,28 @@ public class ReportProgressPanel extends javax.swing.JPanel {
* @param reportStatus The final status, must be COMPLETE or ERROR.
*/
public void complete(ReportStatus reportStatus) {
switch (reportStatus) {
case COMPLETE:
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLbl.text"));
break;
case ERROR:
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLb2.text"));
break;
default:
complete(reportStatus, "");
break;
}
}
/**
* Makes the components of this panel indicate the final status of
* generation of the report.
*
* @param reportStatus The final status, must be COMPLETE or ERROR.
* @param statusMessage String to use as label or error text.
*/
public void complete(ReportStatus reportStatus, String statusMessage) {
EventQueue.invokeLater(() -> {
reportProgressBar.setIndeterminate(false);
if (status != ReportStatus.CANCELED) {
@@ -218,11 +284,11 @@ public class ReportProgressPanel extends javax.swing.JPanel {
ReportStatus oldValue = status;
status = ReportStatus.COMPLETE;
statusMessageLabel.setForeground(Color.BLACK);
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLbl.text"));
statusMessageLabel.setText(statusMessage);
reportProgressBar.setValue(reportProgressBar.getMaximum());
reportProgressBar.setStringPainted(true);
reportProgressBar.setForeground(GREEN);
reportProgressBar.setString("Complete"); //NON-NLS
reportProgressBar.setString(ReportStatus.COMPLETE.getDisplayName());
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
break;
}
@@ -230,11 +296,11 @@ public class ReportProgressPanel extends javax.swing.JPanel {
ReportStatus oldValue = status;
status = ReportStatus.ERROR;
statusMessageLabel.setForeground(RED);
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLb2.text"));
statusMessageLabel.setText(statusMessage);
reportProgressBar.setValue(reportProgressBar.getMaximum());
reportProgressBar.setStringPainted(true);
reportProgressBar.setForeground(RED);
reportProgressBar.setString("Error"); //NON-NLS
reportProgressBar.setString(ReportStatus.ERROR.getDisplayName());
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
break;
}
@@ -250,7 +316,7 @@ public class ReportProgressPanel extends javax.swing.JPanel {
* Makes the components of this panel indicate generation of the report was
* cancelled.
*/
void cancel() {
public void cancel() {
switch (status) {
case COMPLETE:
break;
@@ -265,7 +331,7 @@ public class ReportProgressPanel extends javax.swing.JPanel {
reportProgressBar.setValue(0);
reportProgressBar.setStringPainted(true);
reportProgressBar.setForeground(RED); // Red
reportProgressBar.setString("Cancelled"); //NON-NLS
reportProgressBar.setString(ReportStatus.CANCELED.getDisplayName());
firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
statusMessageLabel.setForeground(RED);
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.cancel.procLbl.text"));
@@ -363,6 +429,21 @@ public class ReportProgressPanel extends javax.swing.JPanel {
private javax.swing.JLabel statusMessageLabel;
// End of variables declaration//GEN-END:variables
/**
* Constructs a panel used by a report generation module to show progress.
*
* @param reportName The report name.
* @param reportPath The report path.
*
* @deprecated Use {@link #ReportProgressPanel()} and {@link #setLabels()}
* instead.
*/
@Deprecated
public ReportProgressPanel(String reportName, String reportPath) {
this();
setLabels(reportName, reportPath);
}
/**
* Makes the components of this panel indicate the generation of the report
* is completed.
@@ -1,149 +0,0 @@
/*
*
* Autopsy Forensic Browser
*
* Copyright 2013-2018 Basis Technology Corp.
*
* Copyright 2012 42six Solutions.
* Contact: aebadirad <at> 42six <dot> com
* Project Contact/Architect: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.EnumSet;
import java.util.Map;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.WizardDescriptor;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionReferences;
import org.openide.awt.ActionRegistration;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.actions.CallableSystemAction;
import org.openide.util.actions.Presenter;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.core.RuntimeProperties;
import org.sleuthkit.datamodel.BlackboardArtifact;
@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.report.ReportWizardAction")
@ActionRegistration(displayName = "#CTL_ReportWizardAction", lazy = false)
@ActionReferences(value = {
@ActionReference(path = "Menu/Tools", position = 301, separatorAfter = 399),
@ActionReference(path = "Toolbars/Case", position = 105)})
public final class ReportWizardAction extends CallableSystemAction implements Presenter.Toolbar, ActionListener {
private final JButton toolbarButton = new JButton();
private static final String ACTION_NAME = NbBundle.getMessage(ReportWizardAction.class, "ReportWizardAction.actionName.text");
/**
* When the Generate Report button or menu item is selected, open the
* reporting wizard. When the wizard is finished, create a ReportGenerator
* with the wizard information, and start all necessary reports.
*/
@SuppressWarnings("unchecked")
public static void doReportWizard() {
WizardDescriptor wiz = new WizardDescriptor(new ReportWizardIterator());
wiz.setTitleFormat(new MessageFormat("{0} {1}"));
wiz.setTitle(NbBundle.getMessage(ReportWizardAction.class, "ReportWizardAction.reportWiz.title"));
if (DialogDisplayer.getDefault().notify(wiz) == WizardDescriptor.FINISH_OPTION) {
ReportGenerator generator = new ReportGenerator(); //NON-NLS
TableReportModule tableReport = (TableReportModule) wiz.getProperty("tableModule");
GeneralReportModule generalReport = (GeneralReportModule) wiz.getProperty("generalModule");
FileReportModule fileReport = (FileReportModule) wiz.getProperty("fileModule");
PortableCaseReportModule portableCaseReport = (PortableCaseReportModule) wiz.getProperty("portableCaseModule"); // NON-NLS
try {
if (tableReport != null) {
generator.generateTableReport(tableReport, (Map<BlackboardArtifact.Type, Boolean>) wiz.getProperty("artifactStates"), (Map<String, Boolean>) wiz.getProperty("tagStates")); //NON-NLS
} else if (generalReport != null) {
generator.generateGeneralReport(generalReport);
} else if (fileReport != null) {
generator.generateFileListReport(fileReport, (Map<FileReportDataTypes, Boolean>) wiz.getProperty("fileReportOptions")); //NON-NLS
} else if (portableCaseReport != null) {
generator.generatePortableCaseReport(portableCaseReport, (PortableCaseReportModule.PortableCaseOptions) wiz.getProperty("portableCaseReportOptions"));
}
} catch (IOException e) {
NotifyDescriptor descriptor = new NotifyDescriptor.Message(e.getMessage(), NotifyDescriptor.ERROR_MESSAGE);
DialogDisplayer.getDefault().notify(descriptor);
}
}
}
public ReportWizardAction() {
setEnabled(false);
Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), (PropertyChangeEvent evt) -> {
if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) {
Case newCase = (Case) evt.getNewValue();
setEnabled(newCase != null && RuntimeProperties.runningWithGUI());
}
});
// Initialize the Generate Report button
toolbarButton.addActionListener(ReportWizardAction.this::actionPerformed);
}
@Override
@SuppressWarnings("unchecked")
public void actionPerformed(ActionEvent e) {
doReportWizard();
}
@Override
public void performAction() {
}
@Override
public String getName() {
return ACTION_NAME;
}
@Override
public HelpCtx getHelpCtx() {
return HelpCtx.DEFAULT_HELP;
}
/**
* Returns the tool bar component of this action
*
* @return component the tool bar button
*/
@Override
public Component getToolbarPresenter() {
ImageIcon icon = new ImageIcon(getClass().getResource("images/btn_icon_generate_report.png")); //NON-NLS
toolbarButton.setIcon(icon);
toolbarButton.setText(NbBundle.getMessage(this.getClass(), "ReportWizardAction.toolBarButton.text"));
return toolbarButton;
}
/**
* Set this action to be enabled/disabled
*
* @param value whether to enable this action or not
*/
@Override
public void setEnabled(boolean value) {
super.setEnabled(value);
toolbarButton.setEnabled(value);
}
}
@@ -1,67 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" 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"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="21" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Component id="jLabelSelectDataSource" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
<Component id="selectDataSourceComboBox" pref="348" max="32767" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="11" max="-2" attributes="0"/>
<Component id="jLabelSelectDataSource" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="selectDataSourceComboBox" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="130" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<Component class="javax.swing.JComboBox" name="selectDataSourceComboBox">
<Properties>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="dataSourcesList" type="code"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;String&gt;"/>
</AuxValues>
</Component>
<Component class="javax.swing.JLabel" name="jLabelSelectDataSource">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/caseuco/Bundle.properties" key="ReportCaseUcoConfigPanel.jLabelSelectDataSource.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
</AuxValues>
</Component>
</SubComponents>
</Form>
@@ -1,133 +0,0 @@
/*
*
* Autopsy Forensic Browser
*
* Copyright 2019-2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report.caseuco;
import java.sql.SQLException;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.ComboBoxModel;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.datamodel.utils.DataSourceLoader;
import org.sleuthkit.autopsy.guiutils.DataSourceComboBoxModel;
import org.sleuthkit.datamodel.TskCoreException;
/**
* UI controls for CASE-UCO report. It is a panel which provides the
* ability to select a single datasource from a dropdown list
* of sources in the current case.
*/
final class ReportCaseUcoConfigPanel extends javax.swing.JPanel {
private static final long serialVersionUID = 1L;
static final long NO_DATA_SOURCE_SELECTED = -1;
private ComboBoxModel<String> dataSourcesList = new DataSourceComboBoxModel();
private final Map<Long, String> dataSourceMap;
private final DataSourceLoader dataSourceLoader;
/**
* Creates new form ReportCaseUcoConfigPanel
*/
ReportCaseUcoConfigPanel() throws NoCurrentCaseException, TskCoreException, SQLException {
initComponents();
this.dataSourceLoader = new DataSourceLoader();
this.dataSourceMap = dataSourceLoader.getDataSourceMap();
String[] dataSourcesNames = new String[dataSourceMap.size()];
if (dataSourcesNames.length > 0) {
dataSourcesNames = dataSourceMap.values().toArray(dataSourcesNames);
setDatasourceComboboxModel(new DataSourceComboBoxModel(dataSourcesNames));
selectDataSourceComboBox.setEnabled(true);
selectDataSourceComboBox.setSelectedIndex(0);
}
}
/**
* Get the ID for the datasource selected in the combo box.
*
* @return the selected datasource ID or
ReportCaseUcoConfigPanel.NO_DATA_SOURCE_SELECTED if none is selected
*/
Long getSelectedDataSourceId() {
for (Entry<Long, String> entry : this.dataSourceMap.entrySet()) {
if (entry.getValue().equals(this.selectDataSourceComboBox.getSelectedItem())) {
return entry.getKey();
}
}
return ReportCaseUcoConfigPanel.NO_DATA_SOURCE_SELECTED;
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
selectDataSourceComboBox = new javax.swing.JComboBox<>();
jLabelSelectDataSource = new javax.swing.JLabel();
selectDataSourceComboBox.setModel(dataSourcesList);
selectDataSourceComboBox.setEnabled(false);
jLabelSelectDataSource.setText(org.openide.util.NbBundle.getMessage(ReportCaseUcoConfigPanel.class, "ReportCaseUcoConfigPanel.jLabelSelectDataSource.text")); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(21, 21, 21)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabelSelectDataSource)
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(selectDataSourceComboBox, 0, 348, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(11, 11, 11)
.addComponent(jLabelSelectDataSource)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(selectDataSourceComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(130, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel jLabelSelectDataSource;
private javax.swing.JComboBox<String> selectDataSourceComboBox;
// End of variables declaration//GEN-END:variables
/**
* Set the datamodel for the combo box which displays the data sources in
* the current case
*
* @param dataSourceComboBoxModel the DataSourceComboBoxModel to use
*/
void setDatasourceComboboxModel(DataSourceComboBoxModel dataSourceComboBoxModel) {
this.dataSourcesList = dataSourceComboBoxModel;
this.selectDataSourceComboBox.setModel(dataSourcesList);
}
}
@@ -36,7 +36,7 @@
</Group>
<Group type="102" alignment="0" attributes="0">
<Component id="titleLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="221" max="32767" attributes="0"/>
<EmptySpace min="0" pref="195" max="32767" attributes="0"/>
</Group>
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
@@ -95,7 +95,7 @@
<Component class="javax.swing.JButton" name="okButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ArtifactSelectionDialog.okButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ArtifactSelectionDialog.okButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
@@ -105,14 +105,17 @@
<Component class="javax.swing.JLabel" name="titleLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ArtifactSelectionDialog.titleLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ArtifactSelectionDialog.titleLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ArtifactSelectionDialog.titleLabel.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="selectAllButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ArtifactSelectionDialog.selectAllButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ArtifactSelectionDialog.selectAllButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
@@ -122,7 +125,7 @@
<Component class="javax.swing.JButton" name="deselectAllButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ArtifactSelectionDialog.deselectAllButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ArtifactSelectionDialog.deselectAllButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
<Events>
@@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report;
package org.sleuthkit.autopsy.report.infrastructure;
import java.awt.Component;
import java.awt.event.MouseAdapter;
@@ -45,20 +45,20 @@ import org.sleuthkit.datamodel.TskCoreException;
* Allow examiner to select artifacts on which to report.
*/
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
public class ArtifactSelectionDialog extends javax.swing.JDialog {
class ArtifactSelectionDialog extends javax.swing.JDialog {
private ArtifactModel model;
private ArtifactRenderer renderer;
private Map<BlackboardArtifact.Type, Boolean> artifactTypeSelections;
private List<BlackboardArtifact.Type> artifactTypes;
private Map<BlackboardArtifact.Type, Boolean> artifactTypeSelections = new HashMap<>();
private List<BlackboardArtifact.Type> artifactTypes = new ArrayList<>();
/**
* Creates new form ArtifactSelectionDialog
*
*
* @param parent The parent window
* @param modal Block user-input to other top-level windows.
*/
public ArtifactSelectionDialog(java.awt.Frame parent, boolean modal) {
ArtifactSelectionDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
populateList();
@@ -95,7 +95,10 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog {
} catch (TskCoreException ex) {
Logger.getLogger(ArtifactSelectionDialog.class.getName()).log(Level.SEVERE, "Error getting list of artifacts in use: {0}", ex.getLocalizedMessage()); //NON-NLS
} catch (NoCurrentCaseException ex) {
Logger.getLogger(ArtifactSelectionDialog.class.getName()).log(Level.SEVERE, "Exception while getting open case.", ex.getLocalizedMessage()); //NON-NLS
// There may not be a case open, for example when configuring Command Line reports
if (Case.isCaseOpen()) {
Logger.getLogger(ArtifactSelectionDialog.class.getName()).log(Level.SEVERE, "Exception while getting open case.", ex.getLocalizedMessage()); //NON-NLS
}
}
}
@@ -110,9 +113,11 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog {
@Override
public void mousePressed(MouseEvent evt) {
int index = artifactList.locationToIndex(evt.getPoint());
BlackboardArtifact.Type type = model.getElementAt(index);
artifactTypeSelections.put(type, !artifactTypeSelections.get(type));
artifactList.repaint();
if (index >= 0) {
BlackboardArtifact.Type type = model.getElementAt(index);
artifactTypeSelections.put(type, !artifactTypeSelections.get(type));
artifactList.repaint();
}
}
});
}
@@ -159,6 +164,7 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog {
});
org.openide.awt.Mnemonics.setLocalizedText(titleLabel, org.openide.util.NbBundle.getMessage(ArtifactSelectionDialog.class, "ArtifactSelectionDialog.titleLabel.text")); // NOI18N
titleLabel.setToolTipText(org.openide.util.NbBundle.getMessage(ArtifactSelectionDialog.class, "ArtifactSelectionDialog.titleLabel.toolTipText")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(selectAllButton, org.openide.util.NbBundle.getMessage(ArtifactSelectionDialog.class, "ArtifactSelectionDialog.selectAllButton.text")); // NOI18N
selectAllButton.addActionListener(new java.awt.event.ActionListener() {
@@ -189,7 +195,7 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog {
.addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addGroup(layout.createSequentialGroup()
.addComponent(titleLabel)
.addGap(0, 221, Short.MAX_VALUE))
.addGap(0, 195, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(okButton)))
@@ -0,0 +1,202 @@
OpenIDE-Module-Name=Report
CTL_ReportWizardAction=Run Report
ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
PortableCaseTagsListPanel.deselectButton.text=Deselect All
PortableCaseTagsListPanel.selectButton.text=Select All
PortableCaseTagsListPanel.descLabel.text=Include the following tags:
ReportGenerationPanel.cancelButton.actionCommand=Cancel
ReportGenerationPanel.cancelButton.text=Cancel
ReportGenerationPanel.closeButton.text=Close
PortableCaseInterestingItemsListPanel.deselectButton.text=Deselect All
PortableCaseInterestingItemsListPanel.selectButton.text=Select All
PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets:
PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items
ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results
ReportVisualPanel2.advancedButton.text=Result Types
ReportVisualPanel2.deselectAllButton.text=Deselect All
ReportVisualPanel2.selectAllButton.text=Select All
ReportVisualPanel2.dataLabel.text=Select which data to report on:
ReportVisualPanel2.allResultsRadioButton.text=All Results
ReportVisualPanel2.specificTaggedResultsRadioButton.text=Specific Tagged Results
ReportVisualPanel1.reportModulesLabel.text=Report Modules:
ArtifactSelectionDialog.okButton.text=OK
ArtifactSelectionDialog.deselectAllButton.text=Deselect All
ArtifactSelectionDialog.selectAllButton.text=Select All
ArtifactSelectionDialog.titleLabel.toolTipText=
ArtifactSelectionDialog.titleLabel.text=Select which result types you would like to report on:
ArtifactSelectionDialog.dlgTitle.text=Result Type Selection
ReportVisualPanel1.invalidModuleWarning=Encountered an invalid Report Module ({0})
ReportGenerationPanel.titleLabel.text=Report Generation Progress
ReportGenerationPanel.confDlg.sureToClose.msg=Are you sure you'd like to close the dialog?\nAll reports will be canceled.
ReportGenerationPanel.confDlg.title.closing=Closing
ReportGenerationPanel.confDlg.cancelReport.msg=Are you sure you'd like to cancel the report?
ReportGenerator.displayProgress.title.text=Report Generation Progress...
ReportGenerator.progress.queryingDb.text=Querying database...
ReportGenerator.progress.readingTagsArtifacts.text=Reading tags and artifacts from case database
ReportGenerator.progress.processingFile.text=Now processing {0}
ReportGenerator.artifactTable.taggedResults.text=Contains results that were tagged with one of the following:
ReportGenerator.progress.processing=Now processing {0}...
ReportGenerator.msgShow.skippingArtType.title=Skipping artifact type {0} in reports
ReportGenerator.msgShow.skippingArtType.msg=Unknown columns to report on
ReportGenerator.makeContTagTab.taggedFiles.msg=Contains files that were tagged with one of the following:
ReportGenerator.makeBbArtTagTab.taggedRes.msg=This report only includes results tagged with:
ReportGenerator.tagTable.header.resultType=Result Type
ReportGenerator.tagTable.header.tag=Tag
ReportGenerator.tagTable.header.comment=Comment
ReportGenerator.tagTable.header.srcFile=Source File
ReportGenerator.progress.createdThumb.text=Creating thumbnails...
ReportGenerator.htmlOutput.header.file=File
ReportGenerator.htmlOutput.header.tag=Tag
ReportGenerator.htmlOutput.header.comment=Comment
ReportGenerator.htmlOutput.header.timeModified=Modified Time
ReportGenerator.htmlOutput.header.timeChanged=Changed Time
ReportGenerator.htmlOutput.header.timeAccessed=Accessed Time
ReportGenerator.htmlOutput.header.timeCreated=Created Time
ReportGenerator.htmlOutput.header.size=Size (Bytes)
ReportGenerator.htmlOutput.header.hash=Hash
ReportGenerator.thumbnailTable.name=Tagged Images
ReportGenerator.thumbnailTable.desc=Contains thumbnails of images that are associated with tagged files and results.
ReportGenerator.writeKwHits.userSrchs=User Searches
ReportGenerator.progress.processingList=Now processing {0} ({1})...
ReportGenerator.artTableColHdr.url=URL
ReportGenerator.artTableColHdr.title=Title
ReportGenerator.artTableColHdr.dateCreated=Date Created
ReportGenerator.artTableColHdr.program=Program
ReportGenerator.artTableColHdr.urlDomainDecoded=URL Domain
ReportGenerator.artTableColHdr.srcFile=Source File
ReportGenerator.artTableColHdr.dateTime=Date/Time
ReportGenerator.artTableColHdr.name=Name
ReportGenerator.artTableColHdr.value=Value
ReportGenerator.artTableColHdr.dateAccessed=Date Accessed
ReportGenerator.artTableColHdr.referrer=Referrer
ReportGenerator.artTableColHdr.dest=Destination
ReportGenerator.artTableColHdr.sourceUrl=Source URL
ReportGenerator.artTableColHdr.path=Path
ReportGenerator.artTableColHdr.progName=Program Name
ReportGenerator.artTableColHdr.instDateTime=Install Date/Time
ReportGenerator.artTableColHdr.preview=Preview
ReportGenerator.artTableColHdr.file=File
ReportGenerator.artTableColHdr.size=Size
ReportGenerator.artTableColHdr.deviceId=Device ID
ReportGenerator.artTableColHdr.text=Text
ReportGenerator.artTableColHdr.domain=Domain
ReportGenerator.artTableColHdr.dateTaken=Date Taken
ReportGenerator.artTableColHdr.devManufacturer=Device Manufacturer
ReportGenerator.artTableColHdr.devMake=Device Make
ReportGenerator.artTableColHdr.devModel=Device Model
ReportGenerator.artTableColHdr.latitude=Latitude
ReportGenerator.artTableColHdr.longitude=Longitude
ReportGenerator.artTableColHdr.latitudeStart=Starting Latitude
ReportGenerator.artTableColHdr.longitudeStart=Starting Longitude
ReportGenerator.artTableColHdr.latitudeEnd=Ending Latitude
ReportGenerator.artTableColHdr.longitudeEnd=Ending Longitude
ReportGenerator.artTableColHdr.associatedArtifact=Associated Artifact
ReportGenerator.artTableColHdr.count=Count
ReportGenerator.artTableColHdr.personName=Person Name
ReportGenerator.artTableColHdr.phoneNumber=Phone Number
ReportGenerator.artTableColHdr.phoneNumHome=Phone Number (Home)
ReportGenerator.artTableColHdr.phoneNumOffice=Phone Number (Office)
ReportGenerator.artTableColHdr.phoneNumMobile=Phone Number (Mobile)
ReportGenerator.artTableColHdr.email=Email
ReportGenerator.artTableColHdr.msgType=Message Type
ReportGenerator.artTableColHdr.direction=Direction
ReportGenerator.artTableColHdr.readStatus=Read Status
ReportGenerator.artTableColHdr.fromPhoneNum=From Phone Number
ReportGenerator.artTableColHdr.fromEmail=From Email
ReportGenerator.artTableColHdr.toPhoneNum=To Phone Number
ReportGenerator.artTableColHdr.toEmail=To Email
ReportGenerator.artTableColHdr.subject=Subject
ReportGenerator.artTableColHdr.tskEmailTo=E-Mail To
ReportGenerator.artTableColHdr.tskEmailCc=E-Mail CC
ReportGenerator.artTableColHdr.tskEmailBcc=E-Mail BCC
ReportGenerator.artTableColHdr.tskEmailFrom=E-Mail From
ReportGenerator.artTableColHdr.tskMsgId=Message ID
ReportGenerator.artTableColHdr.tskDateTimeRcvd=Date Received
ReportGenerator.artTableColHdr.tskDateTimeSent=Date Sent
ReportGenerator.artTableColHdr.tskSubject=Subject
ReportGenerator.artTableColHdr.tskSetName=Set Name
ReportGenerator.artTableColHdr.tskInterestingFilesCategory=Rule
ReportGenerator.artTableColHdr.tskGpsRouteCategory=Category
ReportGenerator.artTableColHdr.tskPath=Path
ReportGenerator.artTableColHdr.calendarEntryType=Calendar Entry Type
ReportGenerator.artTableColHdr.description=Description
ReportGenerator.artTableColHdr.startDateTime=Start Date/Time
ReportGenerator.artTableColHdr.endDateTime=End Date/Time
ReportGenerator.artTableColHdr.location=Location
ReportGenerator.artTableColHdr.shortCut=Short Cut
ReportGenerator.artTableColHdr.deviceName=Device Name
ReportGenerator.artTableColHdr.deviceAddress=Device Address
ReportGenerator.artTableColHdr.altitude=Altitude
ReportGenerator.artTableColHdr.locationAddress=Location Address
ReportGenerator.artTableColHdr.category=Category
ReportGenerator.artTableColHdr.userId=User ID
ReportGenerator.artTableColHdr.userName=User Name
ReportGenerator.artTableColHdr.password=Password
ReportGenerator.artTableColHdr.appName=App Name
ReportGenerator.artTableColHdr.appPath=App Path
ReportGenerator.artTableColHdr.replytoAddress=ReplyTo Address
ReportGenerator.artTableColHdr.mailServer=Mail Server
ReportGenerator.artTableColHdr.tags=Tags
ReportGenerator.artTableColHdr.localPath=Local path
ReportGenerator.artTableColHdr.remotePath=Remote path
ReportGenerator.errors.reportErrorTitle=Error generating report
ReportGenerator.errors.reportErrorText=Error generating report:
ReportVisualPanel1.getName.text=Select and Configure Report Modules
ReportVisualPanel2.getName.text=Configure Report
ReportWizardAction.actionName.text=Generate Report
ReportWizardAction.reportWiz.title=Generate Report
ReportWizardAction.toolBarButton.text=Generate Report
ReportWizardAction.unableToSaveConfig.errorLabel.text=Failed to save reporting configuration
ReportWizardFileOptionsPanel.finishButton.text=Finish
ReportWizardFileOptionsVisualPanel.getName.text=Configure File Report
ReportWizardPanel1.nextButton.text=Next >
ReportWizardPanel1.finishButton.text=Finish
ReportWizardPanel2.finishButton.text=Finish
ReportWizardPanel2.nextButton.text=Next >
ReportGenerator.artTableColHdr.extension.text=Extension
ReportGenerator.artTableColHdr.mimeType.text=MIME Type
ReportGenerator.artTableColHdr.processorArchitecture.text=Processor Architecture
ReportGenerator.artTableColHdr.osName.text=Operating System Name
ReportGenerator.artTableColHdr.osInstallDate.text=Install Date
ReportGenerator.errList.failedMakeRptFolder=Failed to make report folder, may be unable to generate reports.
ReportGenerator.notifyErr.errsDuringRptGen=Errors during report generation:
ReportGenerator.errList.failedGetAllTagsArtifacts=Failed get all possible tag names and artifact types.
ReportGenerator.errList.noReportSettings=Report settings have not been configured.
ReportGenerator.errList.failedGetContentTags=Failed to get content tags.
ReportGenerator.errList.failedGetBBArtifactTags=Failed to get blackboard artifact tags.
ReportGenerator.errList.errGetContentFromBBArtifact=Error while getting content from a blackboard artifact to report on.
ReportGenerator.errList.failedGetBBAttribs=Failed to get Blackboard Attributes when generating report.
ReportGenerator.errList.failedGetBBArtifacts=Failed to get Blackboard Artifacts when generating report.
ReportGenerator.errList.failedQueryKWLists=Failed to query keyword lists.
ReportGenerator.errList.failedGetAbstractFileByID=Failed to get Abstract File by ID.
ReportGenerator.errList.failedQueryKWs=Failed to query keywords.
ReportGenerator.errList.failedQueryHashsetLists=Failed to query hashset lists.
ReportGenerator.errList.failedGetAbstractFileFromID=Failed to get Abstract File from ID.
ReportGenerator.errList.failedQueryHashsetHits=Failed to query hashsets hits.
ReportGenerator.errList.coreExceptionWhileGenRptRow=Core exception while generating row data for artifact report.
CreatePortableCasePanel.selectAllButton.text=Select All
CreatePortableCasePanel.deselectAllButton.text=Deselect All
CreatePortableCasePanel.outputFolderTextField.text=jTextField1
CreatePortableCasePanel.chooseOutputFolderButton.text=Choose folder
CreatePortableCasePanel.jLabel1.text=Export files tagged as:
CreatePortableCasePanel.jLabel2.text=Select output folder:
CreatePortableCasePanel.errorLabel.text_1=Windows only
FileReportDataTypes.filename.text=Name
FileReportDataTypes.fileExt.text=File Extension
FileReportDataTypes.fileType.text=File Type
FileReportDataTypes.isDel.text=Is Deleted
FileReportDataTypes.aTime.text=Last Accessed
FileReportDataTypes.crTime.text=File Created
FileReportDataTypes.mTime.text=Last Modified
FileReportDataTypes.size.text=Size
FileReportDataTypes.address.text=Address
FileReportDataTypes.hash.text=Hash Value
FileReportDataTypes.knownStatus.text=Known Status
FileReportDataTypes.perms.text=Permissions
FileReportDataTypes.path.text=Full Path
@@ -0,0 +1,219 @@
OpenIDE-Module-Name=Report
CTL_ReportWizardAction=Run Report
PortableCaseInterestingItemsListPanel.error.errorLoadingTags=Error loading interesting item set names
PortableCaseInterestingItemsListPanel.error.errorTitle=Error getting intesting item set names for case
PortableCaseInterestingItemsListPanel.error.noOpenCase=There is no case open
PortableCaseTagsListPanel.error.errorLoadingTags=Error loading tags
PortableCaseTagsListPanel.error.errorTitle=Error getting tag names for case
PortableCaseTagsListPanel.error.noOpenCase=There is no case open
ReportGenerator.artTableColHdr.comment=Comment
ReportGenerator.errList.noOpenCase=No open case available.
ReportGenerator.tagTable.header.userName=User Name
ReportProgressIndicator.cancelledMessage=Report generation cancelled
ReportProgressIndicator.completedMessage=Report generation completed
ReportProgressIndicator.completedWithErrorsMessage=Report generation completed with errors
ReportProgressIndicator.startMessage=Report generation started
ReportProgressIndicator.switchToDeterminateMessage=Report generation progress switched to determinate
ReportProgressIndicator.switchToIndeterminateMessage=Report generation progress switched to indeterminate
ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
PortableCaseTagsListPanel.deselectButton.text=Deselect All
PortableCaseTagsListPanel.selectButton.text=Select All
PortableCaseTagsListPanel.descLabel.text=Include the following tags:
ReportGenerationPanel.cancelButton.actionCommand=Cancel
ReportGenerationPanel.cancelButton.text=Cancel
ReportGenerationPanel.closeButton.text=Close
PortableCaseInterestingItemsListPanel.deselectButton.text=Deselect All
PortableCaseInterestingItemsListPanel.selectButton.text=Select All
PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets:
PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items
ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results
ReportVisualPanel2.advancedButton.text=Result Types
ReportVisualPanel2.deselectAllButton.text=Deselect All
ReportVisualPanel2.selectAllButton.text=Select All
ReportVisualPanel2.dataLabel.text=Select which data to report on:
ReportVisualPanel2.allResultsRadioButton.text=All Results
ReportVisualPanel2.specificTaggedResultsRadioButton.text=Specific Tagged Results
ReportVisualPanel1.reportModulesLabel.text=Report Modules:
ArtifactSelectionDialog.okButton.text=OK
ArtifactSelectionDialog.deselectAllButton.text=Deselect All
ArtifactSelectionDialog.selectAllButton.text=Select All
ArtifactSelectionDialog.titleLabel.toolTipText=
ArtifactSelectionDialog.titleLabel.text=Select which result types you would like to report on:
ArtifactSelectionDialog.dlgTitle.text=Result Type Selection
ReportVisualPanel1.invalidModuleWarning=Encountered an invalid Report Module ({0})
ReportGenerationPanel.titleLabel.text=Report Generation Progress
ReportGenerationPanel.confDlg.sureToClose.msg=Are you sure you'd like to close the dialog?\nAll reports will be canceled.
ReportGenerationPanel.confDlg.title.closing=Closing
ReportGenerationPanel.confDlg.cancelReport.msg=Are you sure you'd like to cancel the report?
ReportGenerator.displayProgress.title.text=Report Generation Progress...
ReportGenerator.progress.queryingDb.text=Querying database...
ReportGenerator.progress.readingTagsArtifacts.text=Reading tags and artifacts from case database
ReportGenerator.progress.processingFile.text=Now processing {0}
ReportGenerator.artifactTable.taggedResults.text=Contains results that were tagged with one of the following:
ReportGenerator.progress.processing=Now processing {0}...
ReportGenerator.msgShow.skippingArtType.title=Skipping artifact type {0} in reports
ReportGenerator.msgShow.skippingArtType.msg=Unknown columns to report on
ReportGenerator.makeContTagTab.taggedFiles.msg=Contains files that were tagged with one of the following:
ReportGenerator.makeBbArtTagTab.taggedRes.msg=This report only includes results tagged with:
ReportGenerator.tagTable.header.resultType=Result Type
ReportGenerator.tagTable.header.tag=Tag
ReportGenerator.tagTable.header.comment=Comment
ReportGenerator.tagTable.header.srcFile=Source File
ReportGenerator.progress.createdThumb.text=Creating thumbnails...
ReportGenerator.htmlOutput.header.file=File
ReportGenerator.htmlOutput.header.tag=Tag
ReportGenerator.htmlOutput.header.comment=Comment
ReportGenerator.htmlOutput.header.timeModified=Modified Time
ReportGenerator.htmlOutput.header.timeChanged=Changed Time
ReportGenerator.htmlOutput.header.timeAccessed=Accessed Time
ReportGenerator.htmlOutput.header.timeCreated=Created Time
ReportGenerator.htmlOutput.header.size=Size (Bytes)
ReportGenerator.htmlOutput.header.hash=Hash
ReportGenerator.thumbnailTable.name=Tagged Images
ReportGenerator.thumbnailTable.desc=Contains thumbnails of images that are associated with tagged files and results.
ReportGenerator.writeKwHits.userSrchs=User Searches
ReportGenerator.progress.processingList=Now processing {0} ({1})...
ReportGenerator.artTableColHdr.url=URL
ReportGenerator.artTableColHdr.title=Title
ReportGenerator.artTableColHdr.dateCreated=Date Created
ReportGenerator.artTableColHdr.program=Program
ReportGenerator.artTableColHdr.urlDomainDecoded=URL Domain
ReportGenerator.artTableColHdr.srcFile=Source File
ReportGenerator.artTableColHdr.dateTime=Date/Time
ReportGenerator.artTableColHdr.name=Name
ReportGenerator.artTableColHdr.value=Value
ReportGenerator.artTableColHdr.dateAccessed=Date Accessed
ReportGenerator.artTableColHdr.referrer=Referrer
ReportGenerator.artTableColHdr.dest=Destination
ReportGenerator.artTableColHdr.sourceUrl=Source URL
ReportGenerator.artTableColHdr.path=Path
ReportGenerator.artTableColHdr.progName=Program Name
ReportGenerator.artTableColHdr.instDateTime=Install Date/Time
ReportGenerator.artTableColHdr.preview=Preview
ReportGenerator.artTableColHdr.file=File
ReportGenerator.artTableColHdr.size=Size
ReportGenerator.artTableColHdr.deviceId=Device ID
ReportGenerator.artTableColHdr.text=Text
ReportGenerator.artTableColHdr.domain=Domain
ReportGenerator.artTableColHdr.dateTaken=Date Taken
ReportGenerator.artTableColHdr.devManufacturer=Device Manufacturer
ReportGenerator.artTableColHdr.devMake=Device Make
ReportGenerator.artTableColHdr.devModel=Device Model
ReportGenerator.artTableColHdr.latitude=Latitude
ReportGenerator.artTableColHdr.longitude=Longitude
ReportGenerator.artTableColHdr.latitudeStart=Starting Latitude
ReportGenerator.artTableColHdr.longitudeStart=Starting Longitude
ReportGenerator.artTableColHdr.latitudeEnd=Ending Latitude
ReportGenerator.artTableColHdr.longitudeEnd=Ending Longitude
ReportGenerator.artTableColHdr.associatedArtifact=Associated Artifact
ReportGenerator.artTableColHdr.count=Count
ReportGenerator.artTableColHdr.personName=Person Name
ReportGenerator.artTableColHdr.phoneNumber=Phone Number
ReportGenerator.artTableColHdr.phoneNumHome=Phone Number (Home)
ReportGenerator.artTableColHdr.phoneNumOffice=Phone Number (Office)
ReportGenerator.artTableColHdr.phoneNumMobile=Phone Number (Mobile)
ReportGenerator.artTableColHdr.email=Email
ReportGenerator.artTableColHdr.msgType=Message Type
ReportGenerator.artTableColHdr.direction=Direction
ReportGenerator.artTableColHdr.readStatus=Read Status
ReportGenerator.artTableColHdr.fromPhoneNum=From Phone Number
ReportGenerator.artTableColHdr.fromEmail=From Email
ReportGenerator.artTableColHdr.toPhoneNum=To Phone Number
ReportGenerator.artTableColHdr.toEmail=To Email
ReportGenerator.artTableColHdr.subject=Subject
ReportGenerator.artTableColHdr.tskEmailTo=E-Mail To
ReportGenerator.artTableColHdr.tskEmailCc=E-Mail CC
ReportGenerator.artTableColHdr.tskEmailBcc=E-Mail BCC
ReportGenerator.artTableColHdr.tskEmailFrom=E-Mail From
ReportGenerator.artTableColHdr.tskMsgId=Message ID
ReportGenerator.artTableColHdr.tskDateTimeRcvd=Date Received
ReportGenerator.artTableColHdr.tskDateTimeSent=Date Sent
ReportGenerator.artTableColHdr.tskSubject=Subject
ReportGenerator.artTableColHdr.tskSetName=Set Name
ReportGenerator.artTableColHdr.tskInterestingFilesCategory=Rule
ReportGenerator.artTableColHdr.tskGpsRouteCategory=Category
ReportGenerator.artTableColHdr.tskPath=Path
ReportGenerator.artTableColHdr.calendarEntryType=Calendar Entry Type
ReportGenerator.artTableColHdr.description=Description
ReportGenerator.artTableColHdr.startDateTime=Start Date/Time
ReportGenerator.artTableColHdr.endDateTime=End Date/Time
ReportGenerator.artTableColHdr.location=Location
ReportGenerator.artTableColHdr.shortCut=Short Cut
ReportGenerator.artTableColHdr.deviceName=Device Name
ReportGenerator.artTableColHdr.deviceAddress=Device Address
ReportGenerator.artTableColHdr.altitude=Altitude
ReportGenerator.artTableColHdr.locationAddress=Location Address
ReportGenerator.artTableColHdr.category=Category
ReportGenerator.artTableColHdr.userId=User ID
ReportGenerator.artTableColHdr.userName=User Name
ReportGenerator.artTableColHdr.password=Password
ReportGenerator.artTableColHdr.appName=App Name
ReportGenerator.artTableColHdr.appPath=App Path
ReportGenerator.artTableColHdr.replytoAddress=ReplyTo Address
ReportGenerator.artTableColHdr.mailServer=Mail Server
ReportGenerator.artTableColHdr.tags=Tags
ReportGenerator.artTableColHdr.localPath=Local path
ReportGenerator.artTableColHdr.remotePath=Remote path
ReportGenerator.errors.reportErrorTitle=Error generating report
ReportGenerator.errors.reportErrorText=Error generating report:
ReportVisualPanel1.getName.text=Select and Configure Report Modules
ReportVisualPanel2.getName.text=Configure Report
ReportWizardAction.actionName.text=Generate Report
ReportWizardAction.reportWiz.title=Generate Report
ReportWizardAction.toolBarButton.text=Generate Report
ReportWizardAction.unableToSaveConfig.errorLabel.text=Failed to save reporting configuration
ReportWizardFileOptionsPanel.finishButton.text=Finish
ReportWizardFileOptionsVisualPanel.getName.text=Configure File Report
ReportWizardPanel1.nextButton.text=Next >
ReportWizardPanel1.finishButton.text=Finish
ReportWizardPanel2.finishButton.text=Finish
ReportWizardPanel2.nextButton.text=Next >
ReportGenerator.artTableColHdr.extension.text=Extension
ReportGenerator.artTableColHdr.mimeType.text=MIME Type
ReportGenerator.artTableColHdr.processorArchitecture.text=Processor Architecture
ReportGenerator.artTableColHdr.osName.text=Operating System Name
ReportGenerator.artTableColHdr.osInstallDate.text=Install Date
ReportGenerator.errList.failedMakeRptFolder=Failed to make report folder, may be unable to generate reports.
ReportGenerator.notifyErr.errsDuringRptGen=Errors during report generation:
ReportGenerator.errList.failedGetAllTagsArtifacts=Failed get all possible tag names and artifact types.
ReportGenerator.errList.noReportSettings=Report settings have not been configured.
ReportGenerator.errList.failedGetContentTags=Failed to get content tags.
ReportGenerator.errList.failedGetBBArtifactTags=Failed to get blackboard artifact tags.
ReportGenerator.errList.errGetContentFromBBArtifact=Error while getting content from a blackboard artifact to report on.
ReportGenerator.errList.failedGetBBAttribs=Failed to get Blackboard Attributes when generating report.
ReportGenerator.errList.failedGetBBArtifacts=Failed to get Blackboard Artifacts when generating report.
ReportGenerator.errList.failedQueryKWLists=Failed to query keyword lists.
ReportGenerator.errList.failedGetAbstractFileByID=Failed to get Abstract File by ID.
ReportGenerator.errList.failedQueryKWs=Failed to query keywords.
ReportGenerator.errList.failedQueryHashsetLists=Failed to query hashset lists.
ReportGenerator.errList.failedGetAbstractFileFromID=Failed to get Abstract File from ID.
ReportGenerator.errList.failedQueryHashsetHits=Failed to query hashsets hits.
ReportGenerator.errList.coreExceptionWhileGenRptRow=Core exception while generating row data for artifact report.
CreatePortableCasePanel.selectAllButton.text=Select All
CreatePortableCasePanel.deselectAllButton.text=Deselect All
CreatePortableCasePanel.outputFolderTextField.text=jTextField1
CreatePortableCasePanel.chooseOutputFolderButton.text=Choose folder
CreatePortableCasePanel.jLabel1.text=Export files tagged as:
CreatePortableCasePanel.jLabel2.text=Select output folder:
CreatePortableCasePanel.errorLabel.text_1=Windows only
FileReportDataTypes.filename.text=Name
FileReportDataTypes.fileExt.text=File Extension
FileReportDataTypes.fileType.text=File Type
FileReportDataTypes.isDel.text=Is Deleted
FileReportDataTypes.aTime.text=Last Accessed
FileReportDataTypes.crTime.text=File Created
FileReportDataTypes.mTime.text=Last Modified
FileReportDataTypes.size.text=Size
FileReportDataTypes.address.text=Address
FileReportDataTypes.hash.text=Hash Value
FileReportDataTypes.knownStatus.text=Known Status
FileReportDataTypes.perms.text=Permissions
FileReportDataTypes.path.text=Full Path
ReportWizardPortableCaseOptionsVisualPanel.getName.title=Choose Portable Case settings
TableReportGenerator.StatusColumn.Header=Review Status
@@ -0,0 +1,186 @@
CTL_ReportWizardAction=\u30ec\u30dd\u30fc\u30c8\u3092\u5b9f\u884c
ReportWizardFileOptionsVisualPanel.selectAllButton.text=\u5168\u3066\u9078\u629e
ReportWizardFileOptionsVisualPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u306b\u542b\u3081\u308b\u30a2\u30a4\u30c6\u30e0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b
ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
ReportVisualPanel2.allResultsRadioButton.text=\u5168\u3066\u306e\u7d50\u679c
ReportVisualPanel2.advancedButton.text=\u30c7\u30fc\u30bf\u30bf\u30a4\u30d7
ReportVisualPanel2.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
ReportVisualPanel2.selectAllButton.text=\u5168\u3066\u9078\u629e
ReportVisualPanel2.dataLabel.text=\u3069\u306e\u30c7\u30fc\u30bf\u306b\u3064\u3044\u3066\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u304b\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
ReportVisualPanel1.reportModulesLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\uff1a
ArtifactSelectionDialog.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
ArtifactSelectionDialog.selectAllButton.text=\u5168\u3066\u9078\u629e
ArtifactSelectionDialog.titleLabel.text=\u3069\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306b\u3064\u3044\u3066\u30ec\u30dd\u30fc\u30c8\u3059\u308b\u304b\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
ArtifactSelectionDialog.okButton.text=OK
ReportGenerationPanel.titleLabel.text=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u30d7\u30ed\u30b0\u30ec\u30b9
ArtifactSelectionDialog.dlgTitle.text=\u30a2\u30c9\u30d0\u30f3\u30b9\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u9078\u629e
ReportGenerationPanel.confDlg.sureToClose.msg=\u3053\u306e\u30c0\u30a4\u30a2\u30ed\u30b0\u3092\u672c\u5f53\u306b\u9589\u3058\u307e\u3059\u304b\uff1f\n\u5168\u3066\u306e\u30ec\u30dd\u30fc\u30c8\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3059\u3002
ReportGenerationPanel.confDlg.title.closing=\u9589\u3058\u3066\u3044\u307e\u3059
ReportGenerator.displayProgress.title.text=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u30d7\u30ed\u30b0\u30ec\u30b9\u2026
ReportGenerator.progress.queryingDb.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u4e2d\u2026
ReportGenerator.progress.processingFile.text={0}\u3092\u51e6\u7406\u4e2d
ReportGenerator.artifactTable.taggedResults.text=\u6b21\u306e\u4e2d\u306e\u4e00\u3064\u3067\u30bf\u30b0\u3055\u308c\u305f\u7d50\u679c\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\uff1a
ReportGenerator.progress.processing={0}\u3092\u51e6\u7406\u4e2d\u2026
ReportGenerator.msgShow.skippingArtType.title=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7{0}\u3092\u30ec\u30dd\u30fc\u30c8\u3067\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u3044\u307e\u3059
ReportGenerator.msgShow.skippingArtType.msg=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u3059\u308b\u306e\u306b\u4e0d\u660e\u306a\u30b3\u30e9\u30e0
ReportGenerator.msgShow.skippingArtRow.title=\u30bf\u30a4\u30d7{0}\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u884c\u3092\u30ec\u30dd\u30fc\u30c8\u3067\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u3044\u307e\u3059
ReportGenerator.msgShow.skippingArtRow.msg=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u3059\u308b\u306e\u306b\u4e0d\u660e\u306a\u30b3\u30e9\u30e0
ReportGenerator.makeContTagTab.taggedFiles.msg=\u306e\u4e2d\u306e\u4e00\u3064\u3067\u30bf\u30b0\u3055\u308c\u305f\u7d50\u679c\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\uff1a
ReportGenerator.makeBbArtTagTab.taggedRes.msg=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306b\u306f\u6b21\u3067\u30bf\u30b0\u3055\u308c\u305f\u7d50\u679c\u3057\u304b\u542b\u307e\u308c\u307e\u305b\u3093\uff1a
ReportGenerator.tagTable.header.resultType=\u7d50\u679c\u30bf\u30a4\u30d7
ReportGenerator.tagTable.header.tag=\u30bf\u30b0
ReportGenerator.tagTable.header.comment=\u30b3\u30e1\u30f3\u30c8
ReportGenerator.tagTable.header.srcFile=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
ReportGenerator.progress.createdThumb.text=\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u4f5c\u6210\u4e2d\u2026
ReportGenerator.thumbnailTable.name=\u30b5\u30e0\u30cd\u30a4\u30eb
ReportGenerator.thumbnailTable.desc=\u30bf\u30b0\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3084\u7d50\u679c\u306b\u95a2\u9023\u3059\u308b\u30a4\u30e1\u30fc\u30b8\u306e\u30b5\u30e0\u30cd\u30a4\u30eb\u304c\u542b\u307e\u308c\u307e\u3059\u3002
ReportGenerator.writeKwHits.userSrchs=\u30e6\u30fc\u30b6\u691c\u7d22
ReportGenerator.progress.processingList={0} ({1})\u3092\u51e6\u7406\u4e2d\u2026
ReportGenerator.artTableColHdr.url=URL
ReportGenerator.artTableColHdr.title=\u30bf\u30a4\u30c8\u30eb
ReportGenerator.artTableColHdr.dateCreated=\u4f5c\u6210\u65e5\u4ed8
ReportGenerator.artTableColHdr.program=\u30d7\u30ed\u30b0\u30e9\u30e0
ReportGenerator.artTableColHdr.srcFile=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
ReportGenerator.artTableColHdr.dateTime=\u65e5\u4ed8\uff0f\u6642\u523b
ReportGenerator.artTableColHdr.name=\u540d\u524d
ReportGenerator.artTableColHdr.value=\u30d0\u30ea\u30e5\u30fc
ReportGenerator.artTableColHdr.dateAccessed=\u30a2\u30af\u30bb\u30b9\u65e5\u4ed8
ReportGenerator.artTableColHdr.referrer=\u30ea\u30d5\u30a1\u30e9
ReportGenerator.artTableColHdr.dest=\u30c7\u30b9\u30c6\u30a3\u30cd\u30fc\u30b7\u30e7\u30f3
ReportGenerator.artTableColHdr.sourceUrl=\u30bd\u30fc\u30b9URL
ReportGenerator.artTableColHdr.path=\u30d1\u30b9
ReportGenerator.artTableColHdr.progName=\u30d7\u30ed\u30b0\u30e9\u30e0\u540d
ReportGenerator.artTableColHdr.instDateTime=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65e5\u4ed8\uff0f\u6642\u523b
ReportGenerator.artTableColHdr.preview=\u30d7\u30ec\u30d3\u30e5\u30fc
ReportGenerator.artTableColHdr.file=\u30d5\u30a1\u30a4\u30eb
ReportGenerator.artTableColHdr.size=\u30b5\u30a4\u30ba
ReportGenerator.artTableColHdr.deviceId=\u6a5f\u5668ID
ReportGenerator.artTableColHdr.text=\u30c6\u30ad\u30b9\u30c8
ReportGenerator.artTableColHdr.domain=\u30c9\u30e1\u30a4\u30f3
ReportGenerator.artTableColHdr.devManufacturer=\u6a5f\u5668\u30e1\u30fc\u30ab\u30fc
ReportGenerator.artTableColHdr.devModel=\u6a5f\u5668\u30e2\u30c7\u30eb
ReportGenerator.artTableColHdr.personName=\u4eba\u540d
ReportGenerator.artTableColHdr.phoneNumber=\u96fb\u8a71\u756a\u53f7
ReportGenerator.artTableColHdr.phoneNumHome=\u96fb\u8a71\u756a\u53f7\uff08\u81ea\u5b85\uff09
ReportGenerator.artTableColHdr.phoneNumOffice=\u96fb\u8a71\u756a\u53f7\uff08\u4f1a\u793e\uff09
ReportGenerator.artTableColHdr.phoneNumMobile=\u96fb\u8a71\u756a\u53f7\uff08\u643a\u5e2f\uff09
ReportGenerator.artTableColHdr.email=Email
ReportGenerator.artTableColHdr.msgType=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7
ReportGenerator.artTableColHdr.latitude=\u7def\u5ea6
ReportGenerator.artTableColHdr.longitude=\u7d4c\u5ea6
ReportGenerator.artTableColHdr.dateTaken=\u64ae\u5f71\u65e5\u4ed8
ReportGenerator.artTableColHdr.subject=\u30b5\u30d6\u30b8\u30a7\u30af\u30c8
ReportGenerator.artTableColHdr.calendarEntryType=\u30ab\u30ec\u30f3\u30c0\u30fc\u30a8\u30f3\u30c8\u30ea\u30bf\u30a4\u30d7
ReportGenerator.artTableColHdr.description=\u8aac\u660e
ReportGenerator.artTableColHdr.startDateTime=\u958b\u59cb\u65e5\u4ed8\uff0f\u6642\u523b
ReportGenerator.artTableColHdr.shortCut=\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8
ReportGenerator.artTableColHdr.endDateTime=\u4fee\u4e86\u65e5\u4ed8\uff0f\u6642\u523b
ReportGenerator.artTableColHdr.location=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3
ReportGenerator.artTableColHdr.deviceName=\u6a5f\u5668\u540d
ReportGenerator.artTableColHdr.deviceAddress=\u6a5f\u5668\u30a2\u30c9\u30ec\u30b9
ReportGenerator.artTableColHdr.altitude=\u6a19\u9ad8
ReportGenerator.artTableColHdr.locationAddress=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u30a2\u30c9\u30ec\u30b9
ReportGenerator.artTableColHdr.category=\u30ab\u30c6\u30b4\u30ea\u30fc
ReportGenerator.artTableColHdr.userId=\u30e6\u30fc\u30b6ID
ReportGenerator.artTableColHdr.password=\u30d1\u30b9\u30ef\u30fc\u30c9
ReportGenerator.artTableColHdr.replytoAddress=\u8fd4\u4fe1\u30a2\u30c9\u30ec\u30b9
ReportGenerator.artTableColHdr.mailServer=\u30e1\u30fc\u30eb\u30b5\u30fc\u30d0
ReportGenerator.artTableColHdr.tags=\u30bf\u30b0
ReportProgressPanel.start.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
ReportProgressPanel.complete.processLbl.text=\u5b8c\u4e86
ReportProgressPanel.complete.cancelButton.text=\u5b8c\u4e86
ReportProgressPanel.cancel.cancelButton.toolTipText=\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f
ReportWizardAction.actionName.text=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
ReportWizardAction.reportWiz.title=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
ReportWizardAction.toolBarButton.text=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
ReportWizardPanel1.nextButton.text=\u6b21 >
ReportWizardPanel2.nextButton.text=\u6b21 >
ReportGenerator.artTableColHdr.direction=\u65b9\u5411
ReportGenerator.artTableColHdr.fromEmail=\u9001\u4fe1\u5143E\u30e1\u30fc\u30eb
ReportGenerator.artTableColHdr.toEmail=\u9001\u4fe1\u5148E\u30e1\u30fc\u30eb
ReportGenerator.artTableColHdr.fromPhoneNum=\u767a\u4fe1\u8005\u96fb\u8a71\u756a\u53f7
ReportGenerator.artTableColHdr.toPhoneNum=\u7740\u4fe1\u8005\u96fb\u8a71\u756a\u53f7
ReportGenerator.artTableColHdr.appName=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u540d
ReportGenerator.artTableColHdr.appPath=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d1\u30b9
ReportProgressPanel.progress.queuing=\u30ad\u30e5\u30fc\u30a4\u30f3\u30b0\u2026
ReportProgressPanel.initPathLabel.noFile=<html><u>\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u7121\u3057</u></html>
ReportProgressPanel.start.progress.text=\u30ec\u30dd\u30fc\u30c8\u958b\u59cb\u4e2d\u2026
ReportProgressPanel.cancel.procLbl.text=\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f
ReportVisualPanel1.getName.text=\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u9078\u629e\u304a\u3088\u3073\u8a2d\u5b9a
ReportVisualPanel2.getName.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ec\u30dd\u30fc\u30c8\u3092\u8a2d\u5b9a
ReportWizardFileOptionsPanel.finishButton.text=\u7d42\u4e86
ReportWizardFileOptionsVisualPanel.getName.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u3092\u8a2d\u5b9a
ReportWizardPanel1.finishButton.text=\u7d42\u4e86
ReportWizardPanel2.finishButton.text=\u7d42\u4e86
ReportGenerator.errors.reportErrorTitle=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
ReportGenerator.errors.reportErrorText=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a
ReportGenerator.artTableColHdr.extension.text=\u62e1\u5f35\u5b50
ReportGenerator.artTableColHdr.mimeType.text=MIME\u30bf\u30a4\u30d7
ReportGenerator.artTableColHdr.associatedArtifact=\u95a2\u4fc2\u3059\u308b\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8
ReportGenerator.artTableColHdr.count=\u30ab\u30a6\u30f3\u30c8
ReportGenerator.artTableColHdr.devMake=\u6a5f\u5668\u578b\u540d
ReportGenerator.artTableColHdr.latitudeEnd=\u5230\u7740\u7def\u5ea6
ReportGenerator.artTableColHdr.latitudeStart=\u51fa\u767a\u7def\u5ea6
ReportGenerator.artTableColHdr.localPath=\u30ed\u30fc\u30ab\u30eb\u30d1\u30b9
ReportGenerator.artTableColHdr.longitudeEnd=\u5230\u7740\u7d4c\u5ea6
ReportGenerator.artTableColHdr.longitudeStart=\u51fa\u767a\u7d4c\u5ea6
ReportGenerator.artTableColHdr.osInstallDate.text=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65e5\u4ed8
ReportGenerator.artTableColHdr.osName.text=\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u540d
ReportGenerator.artTableColHdr.processorArchitecture.text=\u30d7\u30ed\u30bb\u30c3\u30b5\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3
ReportGenerator.artTableColHdr.readStatus=\u8aad\u307f\u53d6\u308a\u4e2d\u30b9\u30c6\u30fc\u30bf\u30b9
ReportGenerator.artTableColHdr.remotePath=\u30ea\u30e2\u30fc\u30c8\u30d1\u30b9
ReportGenerator.artTableColHdr.tskDateTimeRcvd=\u53d7\u4fe1\u65e5
ReportGenerator.artTableColHdr.tskDateTimeSent=\u9001\u4fe1\u65e5
ReportGenerator.artTableColHdr.tskEmailBcc=E-Mail BCC
ReportGenerator.artTableColHdr.tskEmailCc=E-Mail CC
ReportGenerator.artTableColHdr.tskEmailFrom=E-Mail\u9001\u4fe1\u5143
ReportGenerator.artTableColHdr.tskEmailTo=E-Mail\u9001\u4fe1\u5148
ReportGenerator.artTableColHdr.tskGpsRouteCategory=\u30ab\u30c6\u30b4\u30ea
ReportGenerator.artTableColHdr.tskInterestingFilesCategory=\u30eb\u30fc\u30eb
ReportGenerator.artTableColHdr.tskMsgId=\u30e1\u30c3\u30bb\u30fc\u30b8ID
ReportGenerator.artTableColHdr.tskPath=\u30d1\u30b9
ReportGenerator.artTableColHdr.tskSetName=\u30bb\u30c3\u30c8\u540d
ReportGenerator.artTableColHdr.tskSubject=\u30b5\u30d6\u30b8\u30a7\u30af\u30c8
ReportGenerator.artTableColHdr.urlDomainDecoded=URL\u30c9\u30e1\u30a4\u30f3
ReportGenerator.artTableColHdr.userName=\u30e6\u30fc\u30b6\u540d
ReportGenerator.errList.coreExceptionWhileGenRptRow=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ec\u30dd\u30fc\u30c8\u7528\u30ed\u30fc\u30c7\u30fc\u30bf\u306e\u751f\u6210\u4e2d\u306b\u30b3\u30a2\u30a8\u30af\u30bb\u30d7\u30b7\u30e7\u30f3\uff08\u4f8b\u5916\uff09\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f
ReportGenerator.errList.errGetContentFromBBArtifact=Blackboard\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u304b\u3089\u30ec\u30dd\u30fc\u30c8\u7528\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedGetAbstractFileByID=ID\u306b\u57fa\u3065\u304d\u30a2\u30d6\u30b9\u30c8\u30e9\u30af\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3059\u308b\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f
ReportGenerator.errList.failedGetBBArtifacts=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306bBlackboard\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedGetBBArtifactTags=Blackboard\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30b0\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedGetBBAttribs=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306bBlackboard\u5c5e\u6027\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedGetContentTags=\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30b0\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedMakeRptFolder=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0\u306e\u4f5c\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u304c\u3067\u304d\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
ReportGenerator.errList.failedQueryHashsetHits=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d2\u30c3\u30c8\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedQueryHashsetLists=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30ea\u30b9\u30c8\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedQueryKWLists=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.errList.failedQueryKWs=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u30af\u30a8\u30ea\u3059\u308b\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ReportGenerator.htmlOutput.header.comment=\u30b3\u30e1\u30f3\u30c8
ReportGenerator.htmlOutput.header.file=\u30d5\u30a1\u30a4\u30eb
ReportGenerator.htmlOutput.header.hash=\u30cf\u30c3\u30b7\u30e5
ReportGenerator.htmlOutput.header.size=\u30b5\u30a4\u30ba\uff08\u30d0\u30a4\u30c8\uff09
ReportGenerator.htmlOutput.header.tag=\u30bf\u30b0
ReportGenerator.htmlOutput.header.timeAccessed=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
ReportGenerator.htmlOutput.header.timeCreated=\u4f5c\u6210\u65e5\u6642
ReportGenerator.htmlOutput.header.timeModified=\u4fee\u6b63\u65e5\u6642
ReportGenerator.notifyErr.errsDuringRptGen=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306e\u30a8\u30e9\u30fc\uff1a
ReportGenerator.errList.failedGetAbstractFileFromID=ID\u306b\u57fa\u3065\u304d\u30a2\u30d6\u30b9\u30c8\u30e9\u30af\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3059\u308b\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f
ReportVisualPanel1.invalidModuleWarning=\u7121\u52b9\u306a\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb({0})\u306b\u906d\u9047\u3057\u307e\u3057\u305f
ReportGenerationPanel.confDlg.cancelReport.msg=\u672c\u5f53\u306b\u30ec\u30dd\u30fc\u30c8\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3059\u304b\uff1f
ReportProgressPanel.complete.processLb2.text=\u5b8c\u4e86\u3057\u307e\u3057\u305f\u304c\u3001\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
FileReportDataTypes.filename.text=\u540d\u524d
FileReportDataTypes.fileExt.text=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50
FileReportDataTypes.fileType.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7
FileReportDataTypes.isDel.text=\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f
FileReportDataTypes.aTime.text=\u6700\u5f8c\u306e\u30a2\u30af\u30bb\u30b9
FileReportDataTypes.crTime.text=\u4f5c\u6210\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
FileReportDataTypes.mTime.text=\u6700\u5f8c\u306e\u4fee\u6b63
FileReportDataTypes.size.text=\u30b5\u30a4\u30ba
FileReportDataTypes.address.text=\u30a2\u30c9\u30ec\u30b9
FileReportDataTypes.hash.text=\u30cf\u30c3\u30b7\u30e5\u5024
FileReportDataTypes.knownStatus.text=\u65e2\u77e5\u30b9\u30c6\u30fc\u30bf\u30b9
FileReportDataTypes.perms.text=\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3
FileReportDataTypes.path.text=\u30d5\u30eb\u30d1\u30b9
@@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report;
package org.sleuthkit.autopsy.report.infrastructure;
import org.openide.util.NbBundle;
import org.sleuthkit.datamodel.AbstractFile;
@@ -30,15 +30,15 @@ import org.sleuthkit.datamodel.TskData;
*
* @author jwallace
*/
enum FileReportDataTypes {
public enum FileReportDataTypes {
NAME(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.filename.text")) {
NAME(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.filename.text")) {
@Override
public String getValue(AbstractFile file) {
return file.getName();
}
},
FILE_EXT(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.fileExt.text")) {
FILE_EXT(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.fileExt.text")) {
@Override
public String getValue(AbstractFile file) {
String name = file.getName();
@@ -46,13 +46,13 @@ enum FileReportDataTypes {
return (extIndex == -1 ? "" : name.substring(extIndex));
}
},
FILE_TYPE(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.fileType.text")) {
FILE_TYPE(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.fileType.text")) {
@Override
public String getValue(AbstractFile file) {
return file.getMetaTypeAsString();
}
},
DELETED(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.isDel.text")) {
DELETED(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.isDel.text")) {
@Override
public String getValue(AbstractFile file) {
if (file.getMetaFlagsAsString().equals(TskData.TSK_FS_META_FLAG_ENUM.UNALLOC.toString())) {
@@ -61,55 +61,55 @@ enum FileReportDataTypes {
return "";
}
},
A_TIME(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.aTime.text")) {
A_TIME(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.aTime.text")) {
@Override
public String getValue(AbstractFile file) {
return file.getAtimeAsDate();
}
},
CR_TIME(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.crTime.text")) {
CR_TIME(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.crTime.text")) {
@Override
public String getValue(AbstractFile file) {
return file.getCrtimeAsDate();
}
},
M_TIME(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.mTime.text")) {
M_TIME(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.mTime.text")) {
@Override
public String getValue(AbstractFile file) {
return file.getMtimeAsDate();
}
},
SIZE(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.size.text")) {
SIZE(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.size.text")) {
@Override
public String getValue(AbstractFile file) {
return String.valueOf(file.getSize());
}
},
ADDRESS(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.address.text")) {
ADDRESS(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.address.text")) {
@Override
public String getValue(AbstractFile file) {
return String.valueOf(file.getMetaAddr());
}
},
HASH_VALUE(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.hash.text")) {
HASH_VALUE(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.hash.text")) {
@Override
public String getValue(AbstractFile file) {
return file.getMd5Hash();
}
},
KNOWN_STATUS(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.knownStatus.text")) {
KNOWN_STATUS(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.knownStatus.text")) {
@Override
public String getValue(AbstractFile file) {
return file.getKnown().getName();
}
},
PERMISSIONS(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.perms.text")) {
PERMISSIONS(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.perms.text")) {
@Override
public String getValue(AbstractFile file) {
return file.getModesAsString();
}
},
FULL_PATH(NbBundle.getMessage(FileReportText.class, "FileReportDataTypes.path.text")) {
FULL_PATH(NbBundle.getMessage(FileReportDataTypes.class, "FileReportDataTypes.path.text")) {
@Override
public String getValue(AbstractFile file) {
try {
@@ -16,8 +16,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report;
package org.sleuthkit.autopsy.report.infrastructure;
import org.sleuthkit.autopsy.report.ReportModule;
import java.util.List;
import org.sleuthkit.datamodel.AbstractFile;
@@ -26,7 +27,7 @@ import org.sleuthkit.datamodel.AbstractFile;
*
* @author jwallace
*/
interface FileReportModule extends ReportModule {
public interface FileReportModule extends ReportModule {
/**
* Initialize the report which will be stored at the given path.
@@ -0,0 +1,52 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report.infrastructure;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* Class for persisting the file properties used by FileReportGenerator to drive
* report generation by FileReportModules.
*/
final class FileReportSettings implements Serializable {
private static final long serialVersionUID = 1L;
private Map<FileReportDataTypes, Boolean> filePropertiesInfo = new HashMap<>();
/**
* Creates FileReportSettings object.
*
* @param fileReportInfo The information that should be included about each
* file in the report.
*/
FileReportSettings(Map<FileReportDataTypes, Boolean> fileReportInfo) {
this.filePropertiesInfo = fileReportInfo;
}
/**
* Gets file report settings.
*
* @return File report settings
*/
Map<FileReportDataTypes, Boolean> getFileProperties() {
return filePropertiesInfo;
}
}
@@ -43,6 +43,7 @@
<EmptySpace max="-2" attributes="0"/>
<Component id="deselectButton" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="jAllSetsCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="0" pref="8" max="32767" attributes="0"/>
</Group>
@@ -54,10 +55,12 @@
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
<Component id="descLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
<Component id="jAllSetsCheckBox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jScrollPane1" pref="179" max="32767" attributes="0"/>
<Component id="jScrollPane1" min="-2" pref="164" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="selectButton" alignment="3" min="-2" max="-2" attributes="0"/>
@@ -87,14 +90,14 @@
<Component class="javax.swing.JLabel" name="descLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="PortableCaseInterestingItemsListPanel.descLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseInterestingItemsListPanel.descLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="selectButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="PortableCaseInterestingItemsListPanel.selectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseInterestingItemsListPanel.selectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[87, 23]"/>
@@ -110,13 +113,23 @@
<Component class="javax.swing.JButton" name="deselectButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="PortableCaseInterestingItemsListPanel.deselectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseInterestingItemsListPanel.deselectButton.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="deselectButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JCheckBox" name="jAllSetsCheckBox">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.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="jAllSetsCheckBoxActionPerformed"/>
</Events>
</Component>
</SubComponents>
</Container>
</SubComponents>
@@ -16,13 +16,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.sleuthkit.autopsy.report;
package org.sleuthkit.autopsy.report.infrastructure;
import org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -33,7 +34,6 @@ import java.util.logging.Level;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListModel;
import javax.swing.event.ListDataListener;
@@ -41,9 +41,9 @@ import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule.GetInterestingItemSetNamesCallback;
import org.sleuthkit.datamodel.BlackboardArtifact;
import org.sleuthkit.datamodel.BlackboardAttribute;
import org.sleuthkit.datamodel.CaseDbAccessManager;
import org.sleuthkit.datamodel.TskCoreException;
/**
@@ -59,16 +59,35 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
private Map<String, Long> setCounts;
private final ReportWizardPortableCaseOptionsPanel wizPanel;
private final PortableCaseReportModule.PortableCaseOptions options;
private final PortableCaseReportModuleSettings settings;
private final boolean useCaseSpecificData;
/**
* Creates new form PortableCaseListPanel
*/
PortableCaseInterestingItemsListPanel(ReportWizardPortableCaseOptionsPanel wizPanel, PortableCaseReportModule.PortableCaseOptions options) {
PortableCaseInterestingItemsListPanel(ReportWizardPortableCaseOptionsPanel wizPanel, PortableCaseReportModuleSettings options, boolean useCaseSpecificData) {
this.wizPanel = wizPanel;
this.options = options;
this.useCaseSpecificData = useCaseSpecificData;
this.settings = options;
initComponents();
customizeComponents();
// update tag selection
jAllSetsCheckBox.setSelected(settings.areAllSetsSelected());
setNamesListBox.setEnabled(!jAllSetsCheckBox.isSelected());
selectButton.setEnabled(!jAllSetsCheckBox.isSelected());
deselectButton.setEnabled(!jAllSetsCheckBox.isSelected());
selectAllSets(jAllSetsCheckBox.isSelected());
this.jAllSetsCheckBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
setNamesListBox.setEnabled(!jAllSetsCheckBox.isSelected());
selectButton.setEnabled(!jAllSetsCheckBox.isSelected());
deselectButton.setEnabled(!jAllSetsCheckBox.isSelected());
selectAllSets(jAllSetsCheckBox.isSelected());
}
});
}
@NbBundle.Messages({
@@ -80,26 +99,34 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
// Get the set names in use for the current case.
setNames = new ArrayList<>();
try {
// Get all SET_NAMEs from interesting item artifacts
String innerSelect = "SELECT (value_text) AS set_name FROM blackboard_attributes WHERE (artifact_type_id = '" +
BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() + "' OR artifact_type_id = '" +
BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() + "') AND attribute_type_id = '" +
BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + "'"; // NON-NLS
// Get the count of each SET_NAME
String query = "set_name, count(1) AS set_count FROM (" + innerSelect + ") set_names GROUP BY set_name"; // NON-NLS
GetInterestingItemSetNamesCallback callback = new GetInterestingItemSetNamesCallback();
Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select(query, callback);
setCounts = callback.getSetCountMap();
setNames.addAll(setCounts.keySet());
} catch (TskCoreException ex) {
Logger.getLogger(ReportWizardPortableCaseOptionsVisualPanel.class.getName()).log(Level.SEVERE, "Failed to get interesting item set names", ex); // NON-NLS
JOptionPane.showMessageDialog(this, Bundle.PortableCaseInterestingItemsListPanel_error_errorLoadingTags(), Bundle.PortableCaseInterestingItemsListPanel_error_errorTitle(), JOptionPane.ERROR_MESSAGE);
} catch (NoCurrentCaseException ex) {
Logger.getLogger(ReportWizardPortableCaseOptionsVisualPanel.class.getName()).log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
JOptionPane.showMessageDialog(this, Bundle.PortableCaseInterestingItemsListPanel_error_noOpenCase(), Bundle.PortableCaseInterestingItemsListPanel_error_errorTitle(), JOptionPane.ERROR_MESSAGE);
setCounts = new HashMap<>();
// only try to load tag names if we are displaying case specific data, otherwise
// we will be displaying case specific data in command line wizard if there is
// a case open in the background
if (useCaseSpecificData) {
try {
// Get all SET_NAMEs from interesting item artifacts
String innerSelect = "SELECT (value_text) AS set_name FROM blackboard_attributes WHERE (artifact_type_id = '"
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() + "' OR artifact_type_id = '"
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() + "') AND attribute_type_id = '"
+ BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + "'"; // NON-NLS
// Get the count of each SET_NAME
String query = "set_name, count(1) AS set_count FROM (" + innerSelect + ") set_names GROUP BY set_name"; // NON-NLS
GetInterestingItemSetNamesCallback callback = new GetInterestingItemSetNamesCallback();
Case.getCurrentCaseThrows().getSleuthkitCase().getCaseDbAccessManager().select(query, callback);
setCounts = callback.getSetCountMap();
setNames.addAll(setCounts.keySet());
} catch (TskCoreException ex) {
Logger.getLogger(ReportWizardPortableCaseOptionsVisualPanel.class.getName()).log(Level.SEVERE, "Failed to get interesting item set names", ex); // NON-NLS
} catch (NoCurrentCaseException ex) {
// There may not be a case open when configuring report modules for Command Line execution
if (Case.isCaseOpen()) {
Logger.getLogger(ReportWizardPortableCaseOptionsVisualPanel.class.getName()).log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
}
}
}
Collections.sort(setNames);
@@ -135,8 +162,9 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
* Save the current selections and enabled/disable the finish button as needed.
*/
private void updateSetNameList() {
options.updateSetNames(getSelectedSetNames());
wizPanel.setFinish(options.isValid());
settings.updateSetNames(getSelectedSetNames());
settings.setAllSetsSelected(jAllSetsCheckBox.isSelected());
wizPanel.setFinish(settings.isValid());
}
/**
@@ -199,43 +227,6 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
}
}
return selectedSetNames;
}
/**
* Processes the result sets from the interesting item set name query.
*/
private static class GetInterestingItemSetNamesCallback implements CaseDbAccessManager.CaseDbAccessQueryCallback {
private static final Logger logger = Logger.getLogger(GetInterestingItemSetNamesCallback.class.getName());
private final Map<String, Long> setCounts = new HashMap<>();
@Override
public void process(ResultSet rs) {
try {
while (rs.next()) {
try {
Long setCount = rs.getLong("set_count"); // NON-NLS
String setName = rs.getString("set_name"); // NON-NLS
setCounts.put(setName, setCount);
} catch (SQLException ex) {
logger.log(Level.WARNING, "Unable to get data_source_obj_id or value from result set", ex); // NON-NLS
}
}
} catch (SQLException ex) {
logger.log(Level.WARNING, "Failed to get next result for values by datasource", ex); // NON-NLS
}
}
/**
* Gets the counts for each interesting items set
*
* @return A map from each set name to the number of items in it
*/
Map<String, Long> getSetCountMap() {
return setCounts;
}
}
/**
@@ -253,6 +244,7 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
descLabel = new javax.swing.JLabel();
selectButton = new javax.swing.JButton();
deselectButton = new javax.swing.JButton();
jAllSetsCheckBox = new javax.swing.JCheckBox();
jScrollPane1.setViewportView(setNamesListBox);
@@ -274,6 +266,13 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
}
});
org.openide.awt.Mnemonics.setLocalizedText(jAllSetsCheckBox, org.openide.util.NbBundle.getMessage(PortableCaseInterestingItemsListPanel.class, "PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text")); // NOI18N
jAllSetsCheckBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jAllSetsCheckBoxActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
@@ -288,17 +287,20 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(deselectButton)))
.addComponent(deselectButton))
.addComponent(jAllSetsCheckBox))
.addGap(0, 8, Short.MAX_VALUE)))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGap(6, 6, 6)
.addComponent(descLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jAllSetsCheckBox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
@@ -318,25 +320,33 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
}// </editor-fold>//GEN-END:initComponents
private void deselectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deselectButtonActionPerformed
for (String setName : setNames) {
setNameSelections.put(setName, Boolean.FALSE);
}
updateSetNameList();
setNamesListBox.repaint();
selectAllSets(false);
}//GEN-LAST:event_deselectButtonActionPerformed
private void selectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectButtonActionPerformed
for (String setName : setNames) {
setNameSelections.put(setName, Boolean.TRUE);
}
updateSetNameList();
setNamesListBox.repaint();
selectAllSets(true);
}//GEN-LAST:event_selectButtonActionPerformed
private void jAllSetsCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jAllSetsCheckBoxActionPerformed
selectAllSets(true);
}//GEN-LAST:event_jAllSetsCheckBoxActionPerformed
private void selectAllSets(boolean select) {
Boolean state = Boolean.TRUE;
if (!select) {
state = Boolean.FALSE;
}
for (String setName : setNames) {
setNameSelections.put(setName, state);
}
updateSetNameList();
setNamesListBox.repaint();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel descLabel;
private javax.swing.JButton deselectButton;
private javax.swing.JCheckBox jAllSetsCheckBox;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton selectButton;
@@ -34,7 +34,7 @@
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jScrollPane1" pref="215" max="32767" attributes="0"/>
<Component id="jScrollPane1" pref="0" max="32767" attributes="0"/>
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="descLabel" min="-2" max="-2" attributes="0"/>
@@ -43,6 +43,7 @@
<EmptySpace max="-2" attributes="0"/>
<Component id="deselectButton" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="jAllTagsCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
@@ -54,10 +55,11 @@
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Component id="descLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
<Component id="jAllTagsCheckBox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jScrollPane1" pref="178" max="32767" attributes="0"/>
<Component id="jScrollPane1" min="-2" pref="168" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="selectButton" alignment="3" min="-2" max="-2" attributes="0"/>
@@ -87,14 +89,14 @@
<Component class="javax.swing.JLabel" name="descLabel">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="PortableCaseTagsListPanel.descLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseTagsListPanel.descLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="selectButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="PortableCaseTagsListPanel.selectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseTagsListPanel.selectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[87, 23]"/>
@@ -110,13 +112,23 @@
<Component class="javax.swing.JButton" name="deselectButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="PortableCaseTagsListPanel.deselectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseTagsListPanel.deselectButton.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="deselectButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JCheckBox" name="jAllTagsCheckBox">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseTagsListPanel.jAllTagsCheckBox.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="jAllTagsCheckBoxActionPerformed"/>
</Events>
</Component>
</SubComponents>
</Container>
</SubComponents>

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