mirror of
https://github.com/elisspace/autopsy.git
synced 2026-10-05 08:46:20 +00:00
Merge branch 'develop' of https://github.com/sleuthkit/autopsy into 5368-GroupByPathModifications
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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.
|
||||
*
|
||||
|
||||
+7
-2
@@ -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
|
||||
|
||||
+36
-69
@@ -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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditIngestSettings.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditIngestSettings.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
@@ -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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.jLabelDescription.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditReportSettings.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/commandlineingest/Bundle.properties" key="CommandLineIngestSettingsPanel.bnEditReportSettings.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</Property>
|
||||
</AccessibilityProperties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnEditReportSettingsActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
|
||||
+39
-251
@@ -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
|
||||
}
|
||||
|
||||
+1
-3
@@ -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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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 |
+200
@@ -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:
|
||||
|
||||
+13
-5
@@ -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 {
|
||||
|
||||
+39
@@ -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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
+15
-10
@@ -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, "{key}")"/>
|
||||
</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
|
||||
|
||||
+30
-10
@@ -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="<String>"/>
|
||||
</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, "{key}")"/>
|
||||
</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);
|
||||
}
|
||||
}
|
||||
+8
-5
@@ -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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ArtifactSelectionDialog.okButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ArtifactSelectionDialog.titleLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ArtifactSelectionDialog.selectAllButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="ArtifactSelectionDialog.deselectAllButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
+17
-11
@@ -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
|
||||
+219
@@ -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
|
||||
+15
-15
@@ -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 {
|
||||
+3
-2
@@ -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.
|
||||
+52
@@ -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;
|
||||
}
|
||||
}
|
||||
+18
-5
@@ -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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseInterestingItemsListPanel.descLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseInterestingItemsListPanel.selectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseInterestingItemsListPanel.deselectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="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, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jAllSetsCheckBoxActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
+90
-80
@@ -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;
|
||||
+18
-6
@@ -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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseTagsListPanel.descLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseTagsListPanel.selectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/report/infrastructure/Bundle.properties" key="PortableCaseTagsListPanel.deselectButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="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, "{key}")"/>
|
||||
</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
Reference in New Issue
Block a user