diff --git a/Core/ivy.xml b/Core/ivy.xml
index 36245ce14d..92be3f86e6 100644
--- a/Core/ivy.xml
+++ b/Core/ivy.xml
@@ -46,6 +46,9 @@
+
+
+
diff --git a/Core/nbproject/project.properties b/Core/nbproject/project.properties
index 8d9c857fba..37d8de5814 100644
--- a/Core/nbproject/project.properties
+++ b/Core/nbproject/project.properties
@@ -1,118 +1,141 @@
-file.reference.activemq-all-5.11.1.jar=release\\modules\\ext\\activemq-all-5.11.1.jar
-file.reference.animal-sniffer-annotations-1.17.jar=release\\modules\\ext\\animal-sniffer-annotations-1.17.jar
-file.reference.api-common-1.7.0.jar=release\\modules\\ext\\api-common-1.7.0.jar
-file.reference.batik-awt-util-1.6.jar=release\\modules\\ext\\batik-awt-util-1.6.jar
-file.reference.batik-dom-1.6.jar=release\\modules\\ext\\batik-dom-1.6.jar
-file.reference.batik-svg-dom-1.6.jar=release\\modules\\ext\\batik-svg-dom-1.6.jar
-file.reference.batik-svggen-1.6.jar=release\\modules\\ext\\batik-svggen-1.6.jar
-file.reference.batik-util-1.6.jar=release\\modules\\ext\\batik-util-1.6.jar
-file.reference.batik-xml-1.6.jar=release\\modules\\ext\\batik-xml-1.6.jar
-file.reference.bcpkix-jdk15on-1.54.jar=release\\modules\\ext\\bcpkix-jdk15on-1.54.jar
-file.reference.bcprov-ext-jdk15on-1.54.jar=release\\modules\\ext\\bcprov-ext-jdk15on-1.54.jar
-file.reference.bcprov-jdk15on-1.52.jar=release\\modules\\ext\\bcprov-jdk15on-1.52.jar
-file.reference.bcprov-jdk15on-1.54.jar=release\\modules\\ext\\bcprov-jdk15on-1.54.jar
-file.reference.c3p0-0.9.5.jar=release\\modules\\ext\\c3p0-0.9.5.jar
-file.reference.checker-compat-qual-2.5.3.jar=release\\modules\\ext\\checker-compat-qual-2.5.3.jar
-file.reference.commons-beanutils-1.9.2.jar=release\\modules\\ext\\commons-beanutils-1.9.2.jar
+file.reference.activemq-all-5.11.1.jar=release/modules/ext/activemq-all-5.11.1.jar
+file.reference.apache-mime4j-core-0.8.2.jar=release\\modules\\ext\\apache-mime4j-core-0.8.2.jar
+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.batik-awt-util-1.6.jar=release/modules/ext/batik-awt-util-1.6.jar
+file.reference.batik-dom-1.6.jar=release/modules/ext/batik-dom-1.6.jar
+file.reference.batik-svg-dom-1.6.jar=release/modules/ext/batik-svg-dom-1.6.jar
+file.reference.batik-svggen-1.6.jar=release/modules/ext/batik-svggen-1.6.jar
+file.reference.batik-util-1.6.jar=release/modules/ext/batik-util-1.6.jar
+file.reference.batik-xml-1.6.jar=release/modules/ext/batik-xml-1.6.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-ext-jdk15on-1.54.jar=release/modules/ext/bcprov-ext-jdk15on-1.54.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.byte-buddy-1.10.13.jar=release\\modules\\ext\\byte-buddy-1.10.13.jar
+file.reference.byte-buddy-agent-1.10.13.jar=release\\modules\\ext\\byte-buddy-agent-1.10.13.jar
+file.reference.c3p0-0.9.5.jar=release/modules/ext/c3p0-0.9.5.jar
+file.reference.cdm-4.5.5.jar=release\\modules\\ext\\cdm-4.5.5.jar
file.reference.commons-codec-1.11.jar=release\\modules\\ext\\commons-codec-1.11.jar
-file.reference.commons-collections-3.2.2.jar=release\\modules\\ext\\commons-collections-3.2.2.jar
-file.reference.commons-dbcp2-2.1.1.jar=release\\modules\\ext\\commons-dbcp2-2.1.1.jar
-file.reference.commons-digester-1.8.1.jar=release\\modules\\ext\\commons-digester-1.8.1.jar
-file.reference.commons-lang-2.6.jar=release\\modules\\ext\\commons-lang-2.6.jar
-file.reference.commons-lang3-3.5.jar=release\\modules\\ext\\commons-lang3-3.5.jar
-file.reference.commons-logging-1.2.jar=release\\modules\\ext\\commons-logging-1.2.jar
-file.reference.commons-pool2-2.4.2.jar=release\\modules\\ext\\commons-pool2-2.4.2.jar
-file.reference.commons-validator-1.6.jar=release\\modules\\ext\\commons-validator-1.6.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
-file.reference.DatCon.jar=release\\modules\\ext\\DatCon.jar
-file.reference.decodetect-core-0.3.jar=release\\modules\\ext\\decodetect-core-0.3.jar
-file.reference.error_prone_annotations-2.3.2.jar=release\\modules\\ext\\error_prone_annotations-2.3.2.jar
-file.reference.failureaccess-1.0.1.jar=release\\modules\\ext\\failureaccess-1.0.1.jar
-file.reference.gax-1.44.0.jar=release\\modules\\ext\\gax-1.44.0.jar
-file.reference.gax-grpc-1.44.0.jar=release\\modules\\ext\\gax-grpc-1.44.0.jar
-file.reference.gax-httpjson-0.61.0.jar=release\\modules\\ext\\gax-httpjson-0.61.0.jar
-file.reference.google-api-client-1.27.0.jar=release\\modules\\ext\\google-api-client-1.27.0.jar
-file.reference.google-api-services-translate-v2-rev20170525-1.27.0.jar=release\\modules\\ext\\google-api-services-translate-v2-rev20170525-1.27.0.jar
-file.reference.google-auth-library-credentials-0.15.0.jar=release\\modules\\ext\\google-auth-library-credentials-0.15.0.jar
-file.reference.google-auth-library-oauth2-http-0.15.0.jar=release\\modules\\ext\\google-auth-library-oauth2-http-0.15.0.jar
-file.reference.google-cloud-core-1.70.0.jar=release\\modules\\ext\\google-cloud-core-1.70.0.jar
-file.reference.google-cloud-core-grpc-1.70.0.jar=release\\modules\\ext\\google-cloud-core-grpc-1.70.0.jar
-file.reference.google-cloud-core-http-1.70.0.jar=release\\modules\\ext\\google-cloud-core-http-1.70.0.jar
-file.reference.google-cloud-translate-1.70.0.jar=release\\modules\\ext\\google-cloud-translate-1.70.0.jar
-file.reference.google-http-client-1.29.0.jar=release\\modules\\ext\\google-http-client-1.29.0.jar
-file.reference.google-http-client-appengine-1.29.0.jar=release\\modules\\ext\\google-http-client-appengine-1.29.0.jar
-file.reference.google-http-client-jackson2-1.29.0.jar=release\\modules\\ext\\google-http-client-jackson2-1.29.0.jar
-file.reference.google-oauth-client-1.28.0.jar=release\\modules\\ext\\google-oauth-client-1.28.0.jar
-file.reference.grpc-alts-1.19.0.jar=release\\modules\\ext\\grpc-alts-1.19.0.jar
-file.reference.grpc-auth-1.19.0.jar=release\\modules\\ext\\grpc-auth-1.19.0.jar
-file.reference.grpc-context-1.19.0.jar=release\\modules\\ext\\grpc-context-1.19.0.jar
-file.reference.grpc-core-1.19.0.jar=release\\modules\\ext\\grpc-core-1.19.0.jar
-file.reference.grpc-grpclb-1.19.0.jar=release\\modules\\ext\\grpc-grpclb-1.19.0.jar
-file.reference.grpc-netty-shaded-1.19.0.jar=release\\modules\\ext\\grpc-netty-shaded-1.19.0.jar
-file.reference.grpc-protobuf-1.19.0.jar=release\\modules\\ext\\grpc-protobuf-1.19.0.jar
-file.reference.grpc-protobuf-lite-1.19.0.jar=release\\modules\\ext\\grpc-protobuf-lite-1.19.0.jar
-file.reference.grpc-stub-1.19.0.jar=release\\modules\\ext\\grpc-stub-1.19.0.jar
-file.reference.gson-2.7.jar=release\\modules\\ext\\gson-2.7.jar
-file.reference.guava-27.1-android.jar=release\\modules\\ext\\guava-27.1-android.jar
-file.reference.httpclient-4.5.5.jar=release\\modules\\ext\\httpclient-4.5.5.jar
-file.reference.httpcore-4.4.9.jar=release\\modules\\ext\\httpcore-4.4.9.jar
-file.reference.icepdf-core-6.2.2.jar=release\\modules\\ext\\icepdf-core-6.2.2.jar
-file.reference.icepdf-viewer-6.2.2.jar=release\\modules\\ext\\icepdf-viewer-6.2.2.jar
-file.reference.j2objc-annotations-1.1.jar=release\\modules\\ext\\j2objc-annotations-1.1.jar
+file.reference.commons-collections4-4.2.jar=release\\modules\\ext\\commons-collections4-4.2.jar
+file.reference.commons-csv-1.6.jar=release\\modules\\ext\\commons-csv-1.6.jar
+file.reference.commons-dbcp2-2.1.1.jar=release/modules/ext/commons-dbcp2-2.1.1.jar
+file.reference.commons-exec-1.3.jar=release\\modules\\ext\\commons-exec-1.3.jar
+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.DatCon.jar=release/modules/ext/DatCon.jar
+file.reference.dec-0.1.2.jar=release\\modules\\ext\\dec-0.1.2.jar
+file.reference.decodetect-core-0.3.jar=release/modules/ext/decodetect-core-0.3.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
+file.reference.grib-4.5.5.jar=release\\modules\\ext\\grib-4.5.5.jar
+file.reference.httpclient-4.5.6.jar=release\\modules\\ext\\httpclient-4.5.6.jar
+file.reference.httpmime-4.5.6.jar=release\\modules\\ext\\httpmime-4.5.6.jar
+file.reference.httpservices-4.5.5.jar=release\\modules\\ext\\httpservices-4.5.5.jar
+file.reference.icepdf-core-6.2.2.jar=release/modules/ext/icepdf-core-6.2.2.jar
+file.reference.icepdf-viewer-6.2.2.jar=release/modules/ext/icepdf-viewer-6.2.2.jar
+file.reference.isoparser-1.1.22.jar=release\\modules\\ext\\isoparser-1.1.22.jar
file.reference.jackcess-2.2.0.jar=release\\modules\\ext\\jackcess-2.2.0.jar
file.reference.jackcess-encrypt-2.1.4.jar=release\\modules\\ext\\jackcess-encrypt-2.1.4.jar
-file.reference.jackson-annotations-2.9.0.jar=release\\modules\\ext\\jackson-annotations-2.9.0.jar
+file.reference.jackson-annotations-2.9.7.jar=release\\modules\\ext\\jackson-annotations-2.9.7.jar
file.reference.jackson-core-2.9.7.jar=release\\modules\\ext\\jackson-core-2.9.7.jar
file.reference.jackson-databind-2.9.7.jar=release\\modules\\ext\\jackson-databind-2.9.7.jar
-file.reference.jai_core-1.1.3.jar=release\\modules\\ext\\jai_core-1.1.3.jar
-file.reference.jai_imageio-1.1.jar=release\\modules\\ext\\jai_imageio-1.1.jar
+file.reference.jai-imageio-core-1.4.0.jar=release\\modules\\ext\\jai-imageio-core-1.4.0.jar
+file.reference.jai_core-1.1.3.jar=release/modules/ext/jai_core-1.1.3.jar
+file.reference.jai_imageio-1.1.jar=release/modules/ext/jai_imageio-1.1.jar
+file.reference.java-libpst-0.8.1.jar=release\\modules\\ext\\java-libpst-0.8.1.jar
+file.reference.javax.activation-1.2.0.jar=release\\modules\\ext\\javax.activation-1.2.0.jar
file.reference.javax.annotation-api-1.3.2.jar=release\\modules\\ext\\javax.annotation-api-1.3.2.jar
-file.reference.javax.ws.rs-api-2.0.jar=release\\modules\\ext\\javax.ws.rs-api-2.0.jar
-file.reference.jdom-2.0.5-contrib.jar=release\\modules\\ext\\jdom-2.0.5-contrib.jar
-file.reference.jdom-2.0.5.jar=release\\modules\\ext\\jdom-2.0.5.jar
-file.reference.jericho-html-3.3.jar=release\\modules\\ext\\jericho-html-3.3.jar
-file.reference.jgraphx-4.1.0.jar=release\\modules\\ext\\jgraphx-4.1.0.jar
-file.reference.jline-0.9.94.jar=release\\modules\\ext\\jline-0.9.94.jar
-file.reference.jsoup-1.10.3.jar=release\\modules\\ext\\jsoup-1.10.3.jar
-file.reference.jsr305-3.0.2.jar=release\\modules\\ext\\jsr305-3.0.2.jar
-file.reference.junit-3.8.1.jar=release\\modules\\ext\\junit-3.8.1.jar
-file.reference.jutf7-1.0.0.jar=release\\modules\\ext\\jutf7-1.0.0.jar
-file.reference.jxmapviewer2-2.4.jar=release\\modules\\ext\\jxmapviewer2-2.4.jar
-file.reference.jython-standalone-2.7.0.jar=release\\modules\\ext\\jython-standalone-2.7.0.jar
-file.reference.libphonenumber-3.5.jar=release\\modules\\ext\\libphonenumber-3.5.jar
-file.reference.listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar=release\\modules\\ext\\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
-file.reference.log4j-1.2.16.jar=release\\modules\\ext\\log4j-1.2.16.jar
-file.reference.mchange-commons-java-0.2.9.jar=release\\modules\\ext\\mchange-commons-java-0.2.9.jar
+file.reference.jbig2-imageio-3.0.2.jar=release\\modules\\ext\\jbig2-imageio-3.0.2.jar
+file.reference.jcl-over-slf4j-1.7.25.jar=release\\modules\\ext\\jcl-over-slf4j-1.7.25.jar
+file.reference.jdom-2.0.5-contrib.jar=release/modules/ext/jdom-2.0.5-contrib.jar
+file.reference.jdom-2.0.5.jar=release/modules/ext/jdom-2.0.5.jar
+file.reference.jdom2-2.0.6.jar=release\\modules\\ext\\jdom2-2.0.6.jar
+file.reference.jempbox-1.8.16.jar=release\\modules\\ext\\jempbox-1.8.16.jar
+file.reference.jericho-html-3.3.jar=release/modules/ext/jericho-html-3.3.jar
+file.reference.jgraphx-4.1.0.jar=release/modules/ext/jgraphx-4.1.0.jar
+file.reference.jhighlight-1.0.3.jar=release\\modules\\ext\\jhighlight-1.0.3.jar
+file.reference.jmatio-1.5.jar=release\\modules\\ext\\jmatio-1.5.jar
+file.reference.json-simple-1.1.1.jar=release\\modules\\ext\\json-simple-1.1.1.jar
+file.reference.jsoup-1.11.3.jar=release\\modules\\ext\\jsoup-1.11.3.jar
+file.reference.jul-to-slf4j-1.7.25.jar=release\\modules\\ext\\jul-to-slf4j-1.7.25.jar
+file.reference.juniversalchardet-1.0.3.jar=release\\modules\\ext\\juniversalchardet-1.0.3.jar
+file.reference.junrar-2.0.0.jar=release\\modules\\ext\\junrar-2.0.0.jar
+file.reference.jutf7-1.0.0.jar=release/modules/ext/jutf7-1.0.0.jar
+file.reference.jxmapviewer2-2.4.jar=release/modules/ext/jxmapviewer2-2.4.jar
+file.reference.jython-standalone-2.7.0.jar=release/modules/ext/jython-standalone-2.7.0.jar
+file.reference.libphonenumber-3.5.jar=release/modules/ext/libphonenumber-3.5.jar
+file.reference.mchange-commons-java-0.2.9.jar=release/modules/ext/mchange-commons-java-0.2.9.jar
file.reference.metadata-extractor-2.11.0.jar=release\\modules\\ext\\metadata-extractor-2.11.0.jar
-file.reference.netty-3.7.0.Final.jar=release\\modules\\ext\\netty-3.7.0.Final.jar
-file.reference.okhttp-2.7.5.jar=release\\modules\\ext\\okhttp-2.7.5.jar
-file.reference.okio-1.6.0.jar=release\\modules\\ext\\okio-1.6.0.jar
-file.reference.opencensus-api-0.19.2.jar=release\\modules\\ext\\opencensus-api-0.19.2.jar
-file.reference.opencensus-contrib-grpc-metrics-0.19.2.jar=release\\modules\\ext\\opencensus-contrib-grpc-metrics-0.19.2.jar
-file.reference.opencensus-contrib-http-util-0.19.2.jar=release\\modules\\ext\\opencensus-contrib-http-util-0.19.2.jar
+file.reference.mockito-core-3.5.7.jar=release\\modules\\ext\\mockito-core-3.5.7.jar
+file.reference.netcdf4-4.5.5.jar=release\\modules\\ext\\netcdf4-4.5.5.jar
+file.reference.objenesis-3.1.jar=release\\modules\\ext\\objenesis-3.1.jar
+file.reference.openjson-1.0.10.jar=release\\modules\\ext\\openjson-1.0.10.jar
file.reference.opennlp-tools-1.9.1.jar=release\\modules\\ext\\opennlp-tools-1.9.1.jar
-file.reference.postgresql-9.4.1211.jre7.jar=release\\modules\\ext\\postgresql-9.4.1211.jre7.jar
-file.reference.proto-google-cloud-translate-v3beta1-0.53.0.jar=release\\modules\\ext\\proto-google-cloud-translate-v3beta1-0.53.0.jar
-file.reference.proto-google-common-protos-1.15.0.jar=release\\modules\\ext\\proto-google-common-protos-1.15.0.jar
-file.reference.proto-google-iam-v1-0.12.0.jar=release\\modules\\ext\\proto-google-iam-v1-0.12.0.jar
-file.reference.protobuf-java-3.7.0.jar=release\\modules\\ext\\protobuf-java-3.7.0.jar
-file.reference.protobuf-java-util-3.7.0.jar=release\\modules\\ext\\protobuf-java-util-3.7.0.jar
-file.reference.Rejistry-1.1-SNAPSHOT.jar=release\\modules\\ext\\Rejistry-1.1-SNAPSHOT.jar
-file.reference.sevenzipjbinding-AllPlatforms.jar=release\\modules\\ext\\sevenzipjbinding-AllPlatforms.jar
-file.reference.sevenzipjbinding.jar=release\\modules\\ext\\sevenzipjbinding.jar
-file.reference.sleuthkit-4.10.0.jar=release\\modules\\ext\\sleuthkit-4.10.0.jar
-file.reference.sleuthkit-caseuco-4.10.0.jar=release\\modules\\ext\\sleuthkit-caseuco-4.10.0.jar
-file.reference.slf4j-api-1.7.6.jar=release\\modules\\ext\\slf4j-api-1.7.6.jar
-file.reference.slf4j-log4j12-1.7.6.jar=release\\modules\\ext\\slf4j-log4j12-1.7.6.jar
-file.reference.SparseBitSet-1.1.jar=release\\modules\\ext\\SparseBitSet-1.1.jar
-file.reference.sqlite-jdbc-3.25.2.jar=release\\modules\\ext\\sqlite-jdbc-3.25.2.jar
-file.reference.StixLib.jar=release\\modules\\ext\\StixLib.jar
-file.reference.threetenbp-1.3.3.jar=release\\modules\\ext\\threetenbp-1.3.3.jar
-file.reference.webp-imageio-sejda-0.1.0.jar=release\\modules\\ext\\webp-imageio-sejda-0.1.0.jar
-file.reference.xmpcore-5.1.3.jar=release\\modules\\ext\\xmpcore-5.1.3.jar
-file.reference.zookeeper-3.4.6.jar=release\\modules\\ext\\zookeeper-3.4.6.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
+file.reference.postgresql-9.4.1211.jre7.jar=release/modules/ext/postgresql-9.4.1211.jre7.jar
+file.reference.Rejistry-1.1-SNAPSHOT.jar=release/modules/ext/Rejistry-1.1-SNAPSHOT.jar
+file.reference.rome-1.12.0.jar=release\\modules\\ext\\rome-1.12.0.jar
+file.reference.sentiment-analysis-parser-0.1.jar=release\\modules\\ext\\sentiment-analysis-parser-0.1.jar
+file.reference.sevenzipjbinding-AllPlatforms.jar=release/modules/ext/sevenzipjbinding-AllPlatforms.jar
+file.reference.sevenzipjbinding.jar=release/modules/ext/sevenzipjbinding.jar
+file.reference.sis-metadata-0.8.jar=release\\modules\\ext\\sis-metadata-0.8.jar
+file.reference.sis-netcdf-0.8.jar=release\\modules\\ext\\sis-netcdf-0.8.jar
+file.reference.sis-utility-0.8.jar=release\\modules\\ext\\sis-utility-0.8.jar
+file.reference.sleuthkit-caseuco-4.10.0.jar=release/modules/ext/sleuthkit-caseuco-4.10.0.jar
+file.reference.slf4j-api-1.7.25.jar=release\\modules\\ext\\slf4j-api-1.7.25.jar
+file.reference.sqlite-jdbc-3.25.2.jar=release/modules/ext/sqlite-jdbc-3.25.2.jar
+file.reference.StixLib.jar=release/modules/ext/StixLib.jar
+file.reference.javax.ws.rs-api-2.0.1.jar=release/modules/ext/javax.ws.rs-api-2.0.1.jar
+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-4.10.0.jar=release/modules/ext/sleuthkit-4.10.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
+file.reference.tagsoup-1.2.1.jar=release\\modules\\ext\\tagsoup-1.2.1.jar
+file.reference.tika-core-1.20.jar=release\\modules\\ext\\tika-core-1.20.jar
+file.reference.tika-parsers-1.20.jar=release\\modules\\ext\\tika-parsers-1.20.jar
+file.reference.uimafit-core-2.4.0.jar=release\\modules\\ext\\uimafit-core-2.4.0.jar
+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
+file.reference.zookeeper-3.4.6.jar=release/modules/ext/zookeeper-3.4.6.jar
+file.reference.SparseBitSet-1.1.jar=release/modules/ext/SparseBitSet-1.1.jar
+file.reference.commons-validator-1.6.jar=release/modules/ext/commons-validator-1.6.jar
+file.reference.api-common-1.7.0.jar=release/modules/ext/api-common-1.7.0.jar
+file.reference.gax-1.44.0.jar=release/modules/ext/gax-1.44.0.jar
+file.reference.gax-grpc-1.44.0.jar=release/modules/ext/gax-grpc-1.44.0.jar
+file.reference.gax-httpjson-0.61.0.jar=release/modules/ext/gax-httpjson-0.61.0.jar
+file.reference.google-api-client-1.27.0.jar=release/modules/ext/google-api-client-1.27.0.jar
+file.reference.google-api-services-translate-v2-rev20170525-1.27.0.jar=release/modules/ext/google-api-services-translate-v2-rev20170525-1.27.0.jar
+file.reference.google-auth-library-credentials-0.15.0.jar=release/modules/ext/google-auth-library-credentials-0.15.0.jar
+file.reference.google-auth-library-oauth2-http-0.15.0.jar=release/modules/ext/google-auth-library-oauth2-http-0.15.0.jar
+file.reference.google-cloud-core-1.70.0.jar=release/modules/ext/google-cloud-core-1.70.0.jar
+file.reference.google-cloud-core-http-1.70.0.jar=release/modules/ext/google-cloud-core-http-1.70.0.jar
+file.reference.google-cloud-translate-1.70.0.jar=release/modules/ext/google-cloud-translate-1.70.0.jar
+file.reference.google-http-client-1.29.0.jar=release/modules/ext/google-http-client-1.29.0.jar
+file.reference.google-http-client-appengine-1.29.0.jar=release/modules/ext/google-http-client-appengine-1.29.0.jar
+file.reference.google-http-client-jackson2-1.29.0.jar=release/modules/ext/google-http-client-jackson2-1.29.0.jar
+file.reference.grpc-context-1.19.0.jar=release/modules/ext/grpc-context-1.19.0.jar
+file.reference.opencensus-api-0.19.2.jar=release/modules/ext/opencensus-api-0.19.2.jar
+file.reference.opencensus-contrib-http-util-0.19.2.jar=release/modules/ext/opencensus-contrib-http-util-0.19.2.jar
+file.reference.threetenbp-1.3.3.jar=release/modules/ext/threetenbp-1.3.3.jar
+file.reference.okhttp-2.7.5-javadoc.jar=release/modules/ext/okhttp-2.7.5-javadoc.jar
+file.reference.okhttp-2.7.5-sources.jar=release/modules/ext/okhttp-2.7.5-sources.jar
+file.reference.okhttp-2.7.5.jar=release/modules/ext/okhttp-2.7.5.jar
+file.reference.okio-1.6.0.jar=release/modules/ext/okio-1.6.0.jar
+file.reference.datcon.jar=release/modules/ext/DatCon.jar
javac.source=1.8
javac.compilerargs=-Xlint -Xlint:-serial
license.file=../LICENSE-2.0.txt
@@ -120,5 +143,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.21
+spec.version.base=10.20
diff --git a/Core/nbproject/project.xml b/Core/nbproject/project.xml
index 19c863e6b7..5abd3666b7 100644
--- a/Core/nbproject/project.xml
+++ b/Core/nbproject/project.xml
@@ -6,6 +6,24 @@
org.sleuthkit.autopsy.core
+
+ org.jdesktop.beansbinding
+
+
+
+ 1
+ 1.27.1.121
+
+
+
+ org.jdesktop.layout
+
+
+
+ 1
+ 1.33.1
+
+
org.netbeans.api.progress
@@ -227,14 +245,6 @@
6.55.1
-
- org.sleuthkit.autopsy.Tika
-
-
-
- 1.0
-
-
org.sleuthkit.autopsy.corelibs
@@ -299,6 +309,8 @@
net.sf.sevenzipjbinding.impl
net.sf.sevenzipjbinding.simple
net.sf.sevenzipjbinding.simple.impl
+ org.apache.tika
+ org.apache.tika.io
org.sleuthkit.autopsy.actions
org.sleuthkit.autopsy.appservices
org.sleuthkit.autopsy.casemodule
@@ -340,88 +352,104 @@
org.sleuthkit.datamodel.blackboardutils.attributes
- ext/batik-xml-1.6.jar
- release\modules\ext\batik-xml-1.6.jar
+ ext/commons-lang3-3.8.1.jar
+ release\modules\ext\commons-lang3-3.8.1.jar
- ext/commons-digester-1.8.1.jar
- release\modules\ext\commons-digester-1.8.1.jar
+ ext/batik-xml-1.6.jar
+ release/modules/ext/batik-xml-1.6.jar
ext/jai_core-1.1.3.jar
- release\modules\ext\jai_core-1.1.3.jar
+ release/modules/ext/jai_core-1.1.3.jar
ext/gax-grpc-1.44.0.jar
- release\modules\ext\gax-grpc-1.44.0.jar
+ release/modules/ext/gax-grpc-1.44.0.jar
- ext/failureaccess-1.0.1.jar
- release\modules\ext\failureaccess-1.0.1.jar
+ ext/cdm-4.5.5.jar
+ release\modules\ext\cdm-4.5.5.jar
- ext/grpc-protobuf-1.19.0.jar
- release\modules\ext\grpc-protobuf-1.19.0.jar
+ ext/sis-utility-0.8.jar
+ release\modules\ext\sis-utility-0.8.jar
ext/opencensus-api-0.19.2.jar
- release\modules\ext\opencensus-api-0.19.2.jar
+ release/modules/ext/opencensus-api-0.19.2.jar
ext/batik-svg-dom-1.6.jar
- release\modules\ext\batik-svg-dom-1.6.jar
+ release/modules/ext/batik-svg-dom-1.6.jar
ext/gax-httpjson-0.61.0.jar
- release\modules\ext\gax-httpjson-0.61.0.jar
+ release/modules/ext/gax-httpjson-0.61.0.jar
+
+
+ ext/boilerpipe-1.1.0.jar
+ release\modules\ext\boilerpipe-1.1.0.jar
+
+
+ ext/jsoup-1.11.3.jar
+ release\modules\ext\jsoup-1.11.3.jar
ext/sevenzipjbinding.jar
- release\modules\ext\sevenzipjbinding.jar
+ release/modules/ext/sevenzipjbinding.jar
ext/mchange-commons-java-0.2.9.jar
- release\modules\ext\mchange-commons-java-0.2.9.jar
-
-
- ext/api-common-1.7.0.jar
- release\modules\ext\api-common-1.7.0.jar
+ release/modules/ext/mchange-commons-java-0.2.9.jar
ext/jackson-databind-2.9.7.jar
release\modules\ext\jackson-databind-2.9.7.jar
+
+ ext/jai-imageio-core-1.4.0.jar
+ release\modules\ext\jai-imageio-core-1.4.0.jar
+
+
+ ext/api-common-1.7.0.jar
+ release/modules/ext/api-common-1.7.0.jar
+
+
+ ext/jcl-over-slf4j-1.7.25.jar
+ release\modules\ext\jcl-over-slf4j-1.7.25.jar
+
ext/okhttp-2.7.5.jar
- release\modules\ext\okhttp-2.7.5.jar
+ release/modules/ext/okhttp-2.7.5.jar
- ext/proto-google-cloud-translate-v3beta1-0.53.0.jar
- release\modules\ext\proto-google-cloud-translate-v3beta1-0.53.0.jar
-
-
- ext/error_prone_annotations-2.3.2.jar
- release\modules\ext\error_prone_annotations-2.3.2.jar
+ ext/byte-buddy-1.10.13.jar
+ release\modules\ext\byte-buddy-1.10.13.jar
ext/libphonenumber-3.5.jar
- release\modules\ext\libphonenumber-3.5.jar
+ release/modules/ext/libphonenumber-3.5.jar
+
+
+ ext/tika-core-1.20.jar
+ release\modules\ext\tika-core-1.20.jar
ext/StixLib.jar
- release\modules\ext\StixLib.jar
+ release/modules/ext/StixLib.jar
+
+
+ ext/bcprov-jdk15on-1.60.jar
+ release\modules\ext\bcprov-jdk15on-1.60.jar
ext/google-auth-library-credentials-0.15.0.jar
- release\modules\ext\google-auth-library-credentials-0.15.0.jar
+ release/modules/ext/google-auth-library-credentials-0.15.0.jar
- ext/grpc-auth-1.19.0.jar
- release\modules\ext\grpc-auth-1.19.0.jar
-
-
- ext/j2objc-annotations-1.1.jar
- release\modules\ext\j2objc-annotations-1.1.jar
+ ext/json-simple-1.1.1.jar
+ release\modules\ext\json-simple-1.1.1.jar
ext/metadata-extractor-2.11.0.jar
@@ -431,137 +459,157 @@
ext/commons-codec-1.11.jar
release\modules\ext\commons-codec-1.11.jar
+
+ ext/jmatio-1.5.jar
+ release\modules\ext\jmatio-1.5.jar
+
+
+ ext/tika-parsers-1.20.jar
+ release\modules\ext\tika-parsers-1.20.jar
+
+
+ ext/asm-7.0.jar
+ release\modules\ext\asm-7.0.jar
+
ext/commons-pool2-2.4.2.jar
- release\modules\ext\commons-pool2-2.4.2.jar
+ release/modules/ext/commons-pool2-2.4.2.jar
ext/jxmapviewer2-2.4.jar
- release\modules\ext\jxmapviewer2-2.4.jar
-
-
- ext/jfreechart-1.0.19.jar
- release/modules/ext/jfreechart-1.0.19.jar
-
-
- ext/jcommon-1.0.23.jar
- release/modules/ext/jcommon-1.0.23.jar
+ release/modules/ext/jxmapviewer2-2.4.jar
ext/jdom-2.0.5-contrib.jar
- release\modules\ext\jdom-2.0.5-contrib.jar
+ release/modules/ext/jdom-2.0.5-contrib.jar
+
+
+ ext/openjson-1.0.10.jar
+ release\modules\ext\openjson-1.0.10.jar
+
+
+ ext/isoparser-1.1.22.jar
+ release\modules\ext\isoparser-1.1.22.jar
ext/xmpcore-5.1.3.jar
- release\modules\ext\xmpcore-5.1.3.jar
+ release/modules/ext/xmpcore-5.1.3.jar
ext/batik-util-1.6.jar
- release\modules\ext\batik-util-1.6.jar
+ release/modules/ext/batik-util-1.6.jar
+
+
+ ext/javax.activation-1.2.0.jar
+ release\modules\ext\javax.activation-1.2.0.jar
+
+
+ ext/rome-1.12.0.jar
+ release\modules\ext\rome-1.12.0.jar
ext/javax.annotation-api-1.3.2.jar
release\modules\ext\javax.annotation-api-1.3.2.jar
- ext/jgraphx-4.1.0.jar
- release\modules\ext\jgraphx-4.1.0.jar
+ ext/vorbis-java-core-0.8.jar
+ release\modules\ext\vorbis-java-core-0.8.jar
- ext/jline-0.9.94.jar
- release\modules\ext\jline-0.9.94.jar
+ ext/jgraphx-4.1.0.jar
+ release/modules/ext/jgraphx-4.1.0.jar
ext/DatCon.jar
- release\modules\ext\DatCon.jar
+ release/modules/ext/DatCon.jar
+
+
+ ext/java-libpst-0.8.1.jar
+ release\modules\ext\java-libpst-0.8.1.jar
ext/okio-1.6.0.jar
- release\modules\ext\okio-1.6.0.jar
-
-
- ext/bcprov-jdk15on-1.54.jar
- release\modules\ext\bcprov-jdk15on-1.54.jar
+ release/modules/ext/okio-1.6.0.jar
ext/curator-framework-2.8.0.jar
- release\modules\ext\curator-framework-2.8.0.jar
+ release/modules/ext/curator-framework-2.8.0.jar
ext/commons-dbcp2-2.1.1.jar
- release\modules\ext\commons-dbcp2-2.1.1.jar
+ release/modules/ext/commons-dbcp2-2.1.1.jar
ext/google-http-client-appengine-1.29.0.jar
- release\modules\ext\google-http-client-appengine-1.29.0.jar
+ release/modules/ext/google-http-client-appengine-1.29.0.jar
- ext/proto-google-iam-v1-0.12.0.jar
- release\modules\ext\proto-google-iam-v1-0.12.0.jar
+ ext/uimafit-core-2.4.0.jar
+ release\modules\ext\uimafit-core-2.4.0.jar
ext/jackcess-encrypt-2.1.4.jar
release\modules\ext\jackcess-encrypt-2.1.4.jar
+
+ ext/junrar-2.0.0.jar
+ release\modules\ext\junrar-2.0.0.jar
+
ext/google-http-client-1.29.0.jar
- release\modules\ext\google-http-client-1.29.0.jar
+ release/modules/ext/google-http-client-1.29.0.jar
+
+
+ ext/bcpkix-jdk15on-1.60.jar
+ release\modules\ext\bcpkix-jdk15on-1.60.jar
ext/opennlp-tools-1.9.1.jar
release\modules\ext\opennlp-tools-1.9.1.jar
+
+ ext/slf4j-api-1.7.25.jar
+ release\modules\ext\slf4j-api-1.7.25.jar
+
ext/bcprov-ext-jdk15on-1.54.jar
- release\modules\ext\bcprov-ext-jdk15on-1.54.jar
+ release/modules/ext/bcprov-ext-jdk15on-1.54.jar
ext/google-cloud-core-1.70.0.jar
- release\modules\ext\google-cloud-core-1.70.0.jar
+ release/modules/ext/google-cloud-core-1.70.0.jar
- ext/protobuf-java-3.7.0.jar
- release\modules\ext\protobuf-java-3.7.0.jar
+ ext/geoapi-3.0.1.jar
+ release\modules\ext\geoapi-3.0.1.jar
- ext/bcpkix-jdk15on-1.54.jar
- release\modules\ext\bcpkix-jdk15on-1.54.jar
+ ext/httpmime-4.5.6.jar
+ release\modules\ext\httpmime-4.5.6.jar
+
+
+ ext/jdom2-2.0.6.jar
+ release\modules\ext\jdom2-2.0.6.jar
+
+
+ ext/uimaj-core-3.0.1.jar
+ release\modules\ext\uimaj-core-3.0.1.jar
ext/sqlite-jdbc-3.25.2.jar
- release\modules\ext\sqlite-jdbc-3.25.2.jar
+ release/modules/ext/sqlite-jdbc-3.25.2.jar
- ext/grpc-protobuf-lite-1.19.0.jar
- release\modules\ext\grpc-protobuf-lite-1.19.0.jar
+ ext/cxf-rt-rs-client-3.3.0.jar
+ release\modules\ext\cxf-rt-rs-client-3.3.0.jar
- ext/httpcore-4.4.9.jar
- release\modules\ext\httpcore-4.4.9.jar
+ ext/pdfbox-tools-2.0.13.jar
+ release\modules\ext\pdfbox-tools-2.0.13.jar
- ext/guava-27.1-android.jar
- release\modules\ext\guava-27.1-android.jar
-
-
- ext/bcprov-jdk15on-1.52.jar
- release\modules\ext\bcprov-jdk15on-1.52.jar
-
-
- ext/checker-compat-qual-2.5.3.jar
- release\modules\ext\checker-compat-qual-2.5.3.jar
-
-
- ext/sleuthkit-4.10.0.jar
- release\modules\ext\sleuthkit-4.10.0.jar
-
-
- ext/animal-sniffer-annotations-1.17.jar
- release\modules\ext\animal-sniffer-annotations-1.17.jar
-
-
- ext/sleuthkit-caseuco-4.10.0.jar
- release\modules\ext\sleuthkit-caseuco-4.10.0.jar
+ ext/grib-4.5.5.jar
+ release\modules\ext\grib-4.5.5.jar
ext/sleuthkit-4.10.0.jar
@@ -573,247 +621,255 @@
ext/gax-1.44.0.jar
- release\modules\ext\gax-1.44.0.jar
+ release/modules/ext/gax-1.44.0.jar
- ext/jsoup-1.10.3.jar
- release\modules\ext\jsoup-1.10.3.jar
-
-
- ext/grpc-context-1.19.0.jar
- release\modules\ext\grpc-context-1.19.0.jar
+ ext/jempbox-1.8.16.jar
+ release\modules\ext\jempbox-1.8.16.jar
ext/jackcess-2.2.0.jar
release\modules\ext\jackcess-2.2.0.jar
- ext/slf4j-log4j12-1.7.6.jar
- release\modules\ext\slf4j-log4j12-1.7.6.jar
+ ext/grpc-context-1.19.0.jar
+ release/modules/ext/grpc-context-1.19.0.jar
ext/jericho-html-3.3.jar
- release\modules\ext\jericho-html-3.3.jar
+ release/modules/ext/jericho-html-3.3.jar
- ext/google-cloud-core-grpc-1.70.0.jar
- release\modules\ext\google-cloud-core-grpc-1.70.0.jar
+ ext/httpservices-4.5.5.jar
+ release\modules\ext\httpservices-4.5.5.jar
+
+
+ ext/xz-1.8.jar
+ release\modules\ext\xz-1.8.jar
ext/commons-validator-1.6.jar
- release\modules\ext\commons-validator-1.6.jar
-
-
- ext/slf4j-api-1.7.6.jar
- release\modules\ext\slf4j-api-1.7.6.jar
+ release/modules/ext/commons-validator-1.6.jar
ext/decodetect-core-0.3.jar
- release\modules\ext\decodetect-core-0.3.jar
+ release/modules/ext/decodetect-core-0.3.jar
- ext/httpclient-4.5.5.jar
- release\modules\ext\httpclient-4.5.5.jar
+ ext/mockito-core-3.5.7.jar
+ release\modules\ext\mockito-core-3.5.7.jar
+
+
+ ext/jbig2-imageio-3.0.2.jar
+ release\modules\ext\jbig2-imageio-3.0.2.jar
+
+
+ ext/apache-mime4j-dom-0.8.2.jar
+ release\modules\ext\apache-mime4j-dom-0.8.2.jar
+
+
+ ext/pdfbox-2.0.13.jar
+ release\modules\ext\pdfbox-2.0.13.jar
+
+
+ ext/xmlbeans-3.0.2.jar
+ release\modules\ext\xmlbeans-3.0.2.jar
ext/curator-recipes-2.8.0.jar
- release\modules\ext\curator-recipes-2.8.0.jar
+ release/modules/ext/curator-recipes-2.8.0.jar
- ext/jackson-annotations-2.9.0.jar
- release\modules\ext\jackson-annotations-2.9.0.jar
+ ext/objenesis-3.1.jar
+ release\modules\ext\objenesis-3.1.jar
+
+
+ ext/tagsoup-1.2.1.jar
+ release\modules\ext\tagsoup-1.2.1.jar
ext/jackson-core-2.9.7.jar
release\modules\ext\jackson-core-2.9.7.jar
- ext/commons-lang3-3.5.jar
- release\modules\ext\commons-lang3-3.5.jar
+ ext/sis-metadata-0.8.jar
+ release\modules\ext\sis-metadata-0.8.jar
- ext/log4j-1.2.16.jar
- release\modules\ext\log4j-1.2.16.jar
+ ext/parso-2.0.10.jar
+ release\modules\ext\parso-2.0.10.jar
- ext/commons-logging-1.2.jar
- release\modules\ext\commons-logging-1.2.jar
+ ext/apache-mime4j-core-0.8.2.jar
+ release\modules\ext\apache-mime4j-core-0.8.2.jar
- ext/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
- release\modules\ext\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
-
-
- ext/protobuf-java-util-3.7.0.jar
- release\modules\ext\protobuf-java-util-3.7.0.jar
-
-
- ext/commons-collections-3.2.2.jar
- release\modules\ext\commons-collections-3.2.2.jar
+ ext/commons-io-2.6.jar
+ release\modules\ext\commons-io-2.6.jar
ext/SparseBitSet-1.1.jar
- release\modules\ext\SparseBitSet-1.1.jar
-
-
- ext/grpc-grpclb-1.19.0.jar
- release\modules\ext\grpc-grpclb-1.19.0.jar
+ release/modules/ext/SparseBitSet-1.1.jar
ext/batik-svggen-1.6.jar
- release\modules\ext\batik-svggen-1.6.jar
+ release/modules/ext/batik-svggen-1.6.jar
ext/c3p0-0.9.5.jar
- release\modules\ext\c3p0-0.9.5.jar
+ release/modules/ext/c3p0-0.9.5.jar
ext/zookeeper-3.4.6.jar
- release\modules\ext\zookeeper-3.4.6.jar
+ release/modules/ext/zookeeper-3.4.6.jar
- ext/grpc-alts-1.19.0.jar
- release\modules\ext\grpc-alts-1.19.0.jar
+ ext/commons-csv-1.6.jar
+ release\modules\ext\commons-csv-1.6.jar
ext/jdom-2.0.5.jar
- release\modules\ext\jdom-2.0.5.jar
+ release/modules/ext/jdom-2.0.5.jar
- ext/gson-2.7.jar
- release\modules\ext\gson-2.7.jar
+ ext/jackson-annotations-2.9.7.jar
+ release\modules\ext\jackson-annotations-2.9.7.jar
ext/google-api-client-1.27.0.jar
- release\modules\ext\google-api-client-1.27.0.jar
+ release/modules/ext/google-api-client-1.27.0.jar
+
+
+ ext/netcdf4-4.5.5.jar
+ release\modules\ext\netcdf4-4.5.5.jar
+
+
+ ext/sis-netcdf-0.8.jar
+ release\modules\ext\sis-netcdf-0.8.jar
+
+
+ ext/sentiment-analysis-parser-0.1.jar
+ release\modules\ext\sentiment-analysis-parser-0.1.jar
+
+
+ ext/commons-collections4-4.2.jar
+ release\modules\ext\commons-collections4-4.2.jar
ext/opencensus-contrib-http-util-0.19.2.jar
- release\modules\ext\opencensus-contrib-http-util-0.19.2.jar
+ release/modules/ext/opencensus-contrib-http-util-0.19.2.jar
ext/google-auth-library-oauth2-http-0.15.0.jar
- release\modules\ext\google-auth-library-oauth2-http-0.15.0.jar
+ release/modules/ext/google-auth-library-oauth2-http-0.15.0.jar
+
+
+ ext/juniversalchardet-1.0.3.jar
+ release\modules\ext\juniversalchardet-1.0.3.jar
ext/jython-standalone-2.7.0.jar
- release\modules\ext\jython-standalone-2.7.0.jar
+ release/modules/ext/jython-standalone-2.7.0.jar
- ext/commons-lang-2.6.jar
- release\modules\ext\commons-lang-2.6.jar
+ ext/jhighlight-1.0.3.jar
+ release\modules\ext\jhighlight-1.0.3.jar
- ext/jsr305-3.0.2.jar
- release\modules\ext\jsr305-3.0.2.jar
-
-
- ext/proto-google-common-protos-1.15.0.jar
- release\modules\ext\proto-google-common-protos-1.15.0.jar
-
-
- ext/netty-3.7.0.Final.jar
- release\modules\ext\netty-3.7.0.Final.jar
-
-
- ext/opencensus-contrib-grpc-metrics-0.19.2.jar
- release\modules\ext\opencensus-contrib-grpc-metrics-0.19.2.jar
-
-
- ext/jai_imageio-1.1.jar
- release\modules\ext\jai_imageio-1.1.jar
+ ext/jul-to-slf4j-1.7.25.jar
+ release\modules\ext\jul-to-slf4j-1.7.25.jar
ext/postgresql-9.4.1211.jre7.jar
- release\modules\ext\postgresql-9.4.1211.jre7.jar
+ release/modules/ext/postgresql-9.4.1211.jre7.jar
- ext/junit-3.8.1.jar
- release\modules\ext\junit-3.8.1.jar
+ ext/jai_imageio-1.1.jar
+ release/modules/ext/jai_imageio-1.1.jar
+
+
+ ext/httpclient-4.5.6.jar
+ release\modules\ext\httpclient-4.5.6.jar
ext/curator-client-2.8.0.jar
- release\modules\ext\curator-client-2.8.0.jar
+ release/modules/ext/curator-client-2.8.0.jar
- ext/grpc-core-1.19.0.jar
- release\modules\ext\grpc-core-1.19.0.jar
-
-
- ext/javax.ws.rs-api-2.0.jar
- release\modules\ext\javax.ws.rs-api-2.0.jar
+ ext/fontbox-2.0.13.jar
+ release\modules\ext\fontbox-2.0.13.jar
ext/icepdf-core-6.2.2.jar
- release\modules\ext\icepdf-core-6.2.2.jar
+ release/modules/ext/icepdf-core-6.2.2.jar
ext/activemq-all-5.11.1.jar
- release\modules\ext\activemq-all-5.11.1.jar
+ release/modules/ext/activemq-all-5.11.1.jar
ext/google-cloud-core-http-1.70.0.jar
- release\modules\ext\google-cloud-core-http-1.70.0.jar
+ release/modules/ext/google-cloud-core-http-1.70.0.jar
ext/Rejistry-1.1-SNAPSHOT.jar
- release\modules\ext\Rejistry-1.1-SNAPSHOT.jar
+ release/modules/ext/Rejistry-1.1-SNAPSHOT.jar
- ext/commons-beanutils-1.9.2.jar
- release\modules\ext\commons-beanutils-1.9.2.jar
+ ext/dec-0.1.2.jar
+ release\modules\ext\dec-0.1.2.jar
ext/batik-dom-1.6.jar
- release\modules\ext\batik-dom-1.6.jar
+ release/modules/ext/batik-dom-1.6.jar
ext/google-http-client-jackson2-1.29.0.jar
- release\modules\ext\google-http-client-jackson2-1.29.0.jar
+ release/modules/ext/google-http-client-jackson2-1.29.0.jar
ext/threetenbp-1.3.3.jar
- release\modules\ext\threetenbp-1.3.3.jar
+ release/modules/ext/threetenbp-1.3.3.jar
ext/google-cloud-translate-1.70.0.jar
- release\modules\ext\google-cloud-translate-1.70.0.jar
-
-
- ext/grpc-stub-1.19.0.jar
- release\modules\ext\grpc-stub-1.19.0.jar
-
-
- ext/google-oauth-client-1.28.0.jar
- release\modules\ext\google-oauth-client-1.28.0.jar
+ release/modules/ext/google-cloud-translate-1.70.0.jar
ext/sevenzipjbinding-AllPlatforms.jar
- release\modules\ext\sevenzipjbinding-AllPlatforms.jar
+ release/modules/ext/sevenzipjbinding-AllPlatforms.jar
ext/jutf7-1.0.0.jar
- release\modules\ext\jutf7-1.0.0.jar
+ release/modules/ext/jutf7-1.0.0.jar
+
+
+ ext/byte-buddy-agent-1.10.13.jar
+ release\modules\ext\byte-buddy-agent-1.10.13.jar
ext/batik-awt-util-1.6.jar
- release\modules\ext\batik-awt-util-1.6.jar
+ release/modules/ext/batik-awt-util-1.6.jar
ext/google-api-services-translate-v2-rev20170525-1.27.0.jar
- release\modules\ext\google-api-services-translate-v2-rev20170525-1.27.0.jar
-
-
- ext/icepdf-viewer-6.2.2.jar
- release\modules\ext\icepdf-viewer-6.2.2.jar
+ release/modules/ext/google-api-services-translate-v2-rev20170525-1.27.0.jar
ext/webp-imageio-sejda-0.1.0.jar
- release\modules\ext\webp-imageio-sejda-0.1.0.jar
+ release/modules/ext/webp-imageio-sejda-0.1.0.jar
- ext/grpc-netty-shaded-1.19.0.jar
- release\modules\ext\grpc-netty-shaded-1.19.0.jar
+ ext/icepdf-viewer-6.2.2.jar
+ release/modules/ext/icepdf-viewer-6.2.2.jar
+
+
+ ext/bcmail-jdk15on-1.60.jar
+ release\modules\ext\bcmail-jdk15on-1.60.jar
+
+
+ ext/vorbis-java-tika-0.8.jar
+ release\modules\ext\vorbis-java-tika-0.8.jar
diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java
index a9ebbadfb2..90cb880cc2 100644
--- a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java
+++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryAttributes.java
@@ -44,6 +44,8 @@ import org.sleuthkit.datamodel.ContentTag;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.datamodel.TskData;
+import java.util.StringJoiner;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeNormalizer;
/**
* Class which contains the search attributes which can be specified for
@@ -220,6 +222,8 @@ public class DiscoveryAttributes {
static class FrequencyAttribute extends AttributeType {
static final int BATCH_SIZE = 50; // Number of hashes to look up at one time
+
+ static final int DOMAIN_BATCH_SIZE = 500; // Number of domains to look up at one time
@Override
public DiscoveryKeyUtils.GroupKey getGroupKey(Result file) {
@@ -251,12 +255,13 @@ public class DiscoveryAttributes {
private void processResultFilesForCR(List results,
CentralRepository centralRepoDb) throws DiscoveryException {
List currentFiles = new ArrayList<>();
- Set hashesToLookUp = new HashSet<>();
-
+ Set hashesToLookUp = new HashSet<>();
+ List domainsToQuery = new ArrayList<>();
for (Result result : results) {
if (result.getKnown() == TskData.FileKnown.KNOWN) {
result.setFrequency(SearchData.Frequency.KNOWN);
}
+
if (result.getType() != SearchData.Type.DOMAIN) {
ResultFile file = (ResultFile) result;
if (file.getFrequency() == SearchData.Frequency.UNKNOWN
@@ -265,6 +270,13 @@ public class DiscoveryAttributes {
hashesToLookUp.add(file.getFirstInstance().getMd5Hash());
currentFiles.add(file);
}
+
+ if (hashesToLookUp.size() >= BATCH_SIZE) {
+ computeFrequency(hashesToLookUp, currentFiles, centralRepoDb);
+
+ hashesToLookUp.clear();
+ currentFiles.clear();
+ }
} else {
ResultDomain domain = (ResultDomain) result;
try {
@@ -281,14 +293,92 @@ public class DiscoveryAttributes {
if (hashesToLookUp.size() >= BATCH_SIZE) {
computeFrequency(hashesToLookUp, currentFiles, centralRepoDb);
-
- hashesToLookUp.clear();
- currentFiles.clear();
+ ResultDomain domainInstance = (ResultDomain) result;
+ domainsToQuery.add(domainInstance);
+
+ if (domainsToQuery.size() == DOMAIN_BATCH_SIZE) {
+ queryDomainFrequency(domainsToQuery, centralRepoDb);
+
+ domainsToQuery.clear();
+ }
}
}
+
+ queryDomainFrequency(domainsToQuery, centralRepoDb);
computeFrequency(hashesToLookUp, currentFiles, centralRepoDb);
}
}
+
+ private static void queryDomainFrequency(List domainsToQuery, CentralRepository centralRepository) throws DiscoveryException {
+ if (domainsToQuery.isEmpty()) {
+ return;
+ }
+
+ try {
+ final Map> resultDomainTable = new HashMap<>();
+ final StringJoiner joiner = new StringJoiner(", ");
+
+ final CorrelationAttributeInstance.Type attributeType = centralRepository.getCorrelationTypeById(CorrelationAttributeInstance.DOMAIN_TYPE_ID);
+ for(ResultDomain domainInstance : domainsToQuery) {
+ try {
+ final String domainValue = domainInstance.getDomain();
+ final String normalizedDomain = CorrelationAttributeNormalizer.normalize(attributeType, domainValue);
+ final List bucket = resultDomainTable.getOrDefault(normalizedDomain, new ArrayList<>());
+ bucket.add(domainInstance);
+ resultDomainTable.put(normalizedDomain, bucket);
+ joiner.add("'" + normalizedDomain + "'");
+ } catch (CorrelationAttributeNormalizationException ex) {
+ logger.log(Level.INFO, String.format("Domain [%s] failed normalization, skipping...", domainInstance.getDomain()));
+ }
+ }
+
+ final String tableName = CentralRepoDbUtil.correlationTypeToInstanceTableName(attributeType);
+ final String domainFrequencyQuery = " value AS domain_name, COUNT(*) AS frequency " +
+ "FROM " + tableName + " " +
+ "WHERE value IN (" + joiner + ") " +
+ "GROUP BY value";
+
+ final DomainFrequencyCallback frequencyCallback = new DomainFrequencyCallback(resultDomainTable);
+ centralRepository.processSelectClause(domainFrequencyQuery, frequencyCallback);
+
+ if (frequencyCallback.getCause() != null) {
+ throw frequencyCallback.getCause();
+ }
+ } catch (CentralRepoException | SQLException ex) {
+ throw new DiscoveryException("Fatal exception encountered querying the CR.", ex);
+ }
+ }
+
+ private static class DomainFrequencyCallback implements InstanceTableCallback {
+
+ private final Map> domainLookup;
+ private SQLException sqlCause;
+
+ private DomainFrequencyCallback(Map> domainLookup) {
+ this.domainLookup = domainLookup;
+ }
+
+ @Override
+ public void process(ResultSet resultSet) {
+ try {
+ while (resultSet.next()) {
+ String domain = resultSet.getString("domain_name");
+ Long frequency = resultSet.getLong("frequency");
+
+ List domainInstances = domainLookup.get(domain);
+ for(ResultDomain domainInstance : domainInstances) {
+ domainInstance.setFrequency(SearchData.Frequency.fromCount(frequency));
+ }
+ }
+ } catch (SQLException ex) {
+ this.sqlCause = ex;
+ }
+ }
+
+ SQLException getCause() {
+ return this.sqlCause;
+ }
+ }
/**
* Callback to use with findInterCaseValuesByCount which generates a list of
@@ -681,7 +771,7 @@ public class DiscoveryAttributes {
return Arrays.asList(FREQUENCY, MOST_RECENT_DATE, FIRST_DATE);
}
}
-
+
/**
* Computes the CR frequency of all the given hashes and updates the list of
* files.
diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryKeyUtils.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryKeyUtils.java
index ec5b5516b2..b00fee63e8 100644
--- a/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryKeyUtils.java
+++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DiscoveryKeyUtils.java
@@ -129,24 +129,45 @@ public class DiscoveryKeyUtils {
}
/**
- * @return the keyString
+ * Get the String representation of this key.
+ *
+ * @return The String representation of this key.
*/
String getKeyString() {
return keyString;
}
+ /**
+ * Get the list of filters associated with this key.
+ *
+ * @return The list of filters associated with this key.
+ */
List getFilters() {
return Collections.unmodifiableList(this.filters);
}
+ /**
+ * Get the group sorting type for this key.
+ *
+ * @return The group sorting type for this key.
+ */
Group.GroupSortingAlgorithm getGroupSortingType() {
return groupSortingType;
}
+ /**
+ * Get the grouping attribute for this key.
+ *
+ * @return The grouping attribute for this key.
+ */
DiscoveryAttributes.AttributeType getGroupAttributeType() {
return groupAttributeType;
}
+ /**
+ * Get the fileSorting
+ * @return
+ */
ResultsSorter.SortingMethod getFileSortingMethod() {
return fileSortingMethod;
}
diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCache.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCache.java
index 2a253399a5..481fabefb3 100755
--- a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCache.java
+++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCache.java
@@ -36,17 +36,10 @@ import org.sleuthkit.datamodel.SleuthkitCase;
class DomainSearchCache {
private static final int MAXIMUM_CACHE_SIZE = 10;
- private final LoadingCache>> cache;
-
- DomainSearchCache() {
- this(new DomainSearchCacheLoader());
- }
-
- DomainSearchCache(DomainSearchCacheLoader cacheLoader) {
- this.cache = CacheBuilder.newBuilder()
+ private static final LoadingCache>> cache =
+ CacheBuilder.newBuilder()
.maximumSize(MAXIMUM_CACHE_SIZE)
- .build(cacheLoader);
- }
+ .build(new DomainSearchCacheLoader());
/**
* Get domain search results matching the given parameters. If no results
diff --git a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java
index 59c47429c4..999aab0425 100755
--- a/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java
+++ b/Core/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoader.java
@@ -95,7 +95,7 @@ class DomainSearchCacheLoader extends CacheLoader();
this.skc = skc;
}
@@ -235,6 +235,8 @@ class DomainSearchCacheLoader extends CacheLoader {
private static Comparator getTypeComparator() {
return (Result result1, Result result2) -> Integer.compare(result1.getType().getRanking(), result2.getType().getRanking());
}
-
+
/**
* Compare files using a concatenated version of keyword list names.
* Alphabetical by the list names with files with no keyword list hits going
@@ -244,6 +244,21 @@ public class ResultsSorter implements Comparator {
return compareStrings(first.getDomain().toLowerCase(), second.getDomain().toLowerCase());
};
}
+
+ /**
+ * Sorts results by most recent date time
+ */
+ private static Comparator getMostRecentDateTimeComparator() {
+ return (Result result1, Result result2) -> {
+ if(result1.getType() != SearchData.Type.DOMAIN) {
+ return 0;
+ }
+
+ ResultDomain first = (ResultDomain) result1;
+ ResultDomain second = (ResultDomain) result2;
+ return Long.compare(second.getActivityEnd(), first.getActivityEnd());
+ };
+ }
/**
* A final default comparison between two ResultFile objects. Currently this
diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoaderTest.java b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoaderTest.java
new file mode 100755
index 0000000000..2a75ca2dc7
--- /dev/null
+++ b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchCacheLoaderTest.java
@@ -0,0 +1,157 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2020 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.discovery.search;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import static org.mockito.Mockito.*;
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.sleuthkit.autopsy.discovery.search.DiscoveryKeyUtils.GroupKey;
+import org.sleuthkit.autopsy.discovery.search.DiscoveryKeyUtils.SearchKey;
+import org.sleuthkit.datamodel.TskCoreException;
+
+public class DomainSearchCacheLoaderTest {
+
+ @Test
+ public void load_GroupByDataSourceSortByGroupNameAndDomain() throws DiscoveryException, TskCoreException, SQLException {
+ DomainSearchCacheLoader loader = mock(DomainSearchCacheLoader.class);
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com", 10, 100, 5, 4, 110),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com", 1, 5, 7, 20, 100),
+ DomainSearchTestUtils.mockDomainResult("google.com", 5, 20, 1, 4, 105),
+ DomainSearchTestUtils.mockDomainResult("facebook.com", 2, 2, 1, 3, 110),
+ DomainSearchTestUtils.mockDomainResult("abc.com", 1, 2, 3, 4, 100),
+ DomainSearchTestUtils.mockDomainResult("xyz.com", 1, 2, 3, 4, 20)
+ );
+
+ SearchKey key = new SearchKey(null, new ArrayList<>(),
+ new DiscoveryAttributes.DataSourceAttribute(),
+ Group.GroupSortingAlgorithm.BY_GROUP_NAME,
+ ResultsSorter.SortingMethod.BY_DOMAIN_NAME);
+
+ when(loader.getResultDomainsFromDatabase(key)).thenReturn(domains);
+ when(loader.load(key)).thenCallRealMethod();
+ Map> results = loader.load(key);
+ assertEquals(4, results.size());
+ for(List group : results.values()) {
+ ResultDomain previous = null;
+ for(Result result : group) {
+ ResultDomain current = (ResultDomain) result;
+ if (previous != null) {
+ assertTrue(previous.getDomain().compareTo(current.getDomain()) < 0);
+ }
+ previous = current;
+ }
+ }
+ }
+
+ @Test
+ public void load_GroupByNothingByGroupNameAndDomain() throws DiscoveryException, TskCoreException, SQLException {
+ DomainSearchCacheLoader loader = mock(DomainSearchCacheLoader.class);
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com", 10, 100, 5, 4, 110),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com", 1, 5, 7, 20, 100),
+ DomainSearchTestUtils.mockDomainResult("facebook.com", 2, 2, 1, 3, 110),
+ DomainSearchTestUtils.mockDomainResult("abc.com", 1, 2, 3, 4, 100),
+ DomainSearchTestUtils.mockDomainResult("xyz.com", 1, 2, 3, 4, 20)
+ );
+
+ SearchKey key = new SearchKey(null, new ArrayList<>(),
+ new DiscoveryAttributes.NoGroupingAttribute(),
+ Group.GroupSortingAlgorithm.BY_GROUP_NAME,
+ ResultsSorter.SortingMethod.BY_DOMAIN_NAME);
+
+ when(loader.getResultDomainsFromDatabase(key)).thenReturn(domains);
+ when(loader.load(key)).thenCallRealMethod();
+ Map> results = loader.load(key);
+ assertEquals(1, results.size());
+ for(List group : results.values()) {
+ ResultDomain previous = null;
+ for(Result result : group) {
+ ResultDomain current = (ResultDomain) result;
+ if (previous != null) {
+ assertTrue(previous.getDomain().compareTo(current.getDomain()) < 0);
+ }
+ previous = current;
+ }
+ }
+ }
+
+ @Test
+ public void load_GroupByNothingSortByNameAndDataSource() throws DiscoveryException, TskCoreException, SQLException {
+ DomainSearchCacheLoader loader = mock(DomainSearchCacheLoader.class);
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com", 10, 100, 5, 4, 110),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com", 1, 5, 7, 20, 100)
+ );
+
+ SearchKey key = new SearchKey(null, new ArrayList<>(),
+ new DiscoveryAttributes.NoGroupingAttribute(),
+ Group.GroupSortingAlgorithm.BY_GROUP_NAME,
+ ResultsSorter.SortingMethod.BY_DATA_SOURCE);
+
+ when(loader.getResultDomainsFromDatabase(key)).thenReturn(domains);
+ when(loader.load(key)).thenCallRealMethod();
+ Map> results = loader.load(key);
+ assertEquals(1, results.size());
+ for(List group : results.values()) {
+ ResultDomain previous = null;
+ for(Result result : group) {
+ ResultDomain current = (ResultDomain) result;
+ if (previous != null) {
+ assertTrue(Long.compare(previous.getDataSource().getId(), current.getDataSource().getId()) < 0);
+ }
+ previous = current;
+ }
+ }
+ }
+
+ @Test
+ public void load_GroupByDataSourceBySizeAndName() throws DiscoveryException, TskCoreException, SQLException {
+ DomainSearchCacheLoader loader = mock(DomainSearchCacheLoader.class);
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com", 10, 100, 5, 4, 110),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com", 1, 5, 7, 20, 100)
+ );
+
+ SearchKey key = new SearchKey(null, new ArrayList<>(),
+ new DiscoveryAttributes.DataSourceAttribute(),
+ Group.GroupSortingAlgorithm.BY_GROUP_SIZE,
+ ResultsSorter.SortingMethod.BY_DOMAIN_NAME);
+
+ when(loader.getResultDomainsFromDatabase(key)).thenReturn(domains);
+ when(loader.load(key)).thenCallRealMethod();
+ Map> results = loader.load(key);
+ assertEquals(2, results.size());
+ for(List group : results.values()) {
+ ResultDomain previous = null;
+ for(Result result : group) {
+ ResultDomain current = (ResultDomain) result;
+ if (previous != null) {
+ assertTrue(previous.getDomain().compareTo(current.getDomain()) < 0);
+ }
+ previous = current;
+ }
+ }
+ }
+}
diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTest.java b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTest.java
new file mode 100755
index 0000000000..9ddd7db0bf
--- /dev/null
+++ b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTest.java
@@ -0,0 +1,413 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2020 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.discovery.search;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+
+import static org.mockito.Mockito.*;
+import static org.junit.Assert.*;
+import org.sleuthkit.autopsy.discovery.search.DiscoveryKeyUtils.GroupKey;
+
+public class DomainSearchTest {
+
+ @Test
+ public void groupSizes_SingleGroup_ShouldHaveSizeFour() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"))
+ );
+ }
+ };
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ Map sizes = domainSearch.getGroupSizes(null,
+ new ArrayList<>(), null, null, null, null, null);
+ assertEquals(4, sizes.get(groupOne).longValue());
+ }
+
+ @Test
+ public void groupSizes_MultipleGroups_ShouldHaveCorrectGroupSizes() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ DummyKey groupTwo = new DummyKey("2");
+ DummyKey groupThree = new DummyKey("3");
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"))
+ );
+ put(groupTwo, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("facebook.com"),
+ DomainSearchTestUtils.mockDomainResult("spotify.com"),
+ DomainSearchTestUtils.mockDomainResult("netbeans.com"))
+ );
+ put(groupThree, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("youtube.com"))
+ );
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ Map sizes = domainSearch.getGroupSizes(null,
+ new ArrayList<>(), null, null, null, null, null);
+ assertEquals(4, sizes.get(groupOne).longValue());
+ assertEquals(3, sizes.get(groupTwo).longValue());
+ assertEquals(1, sizes.get(groupThree).longValue());
+ }
+
+ @Test
+ public void groupSizes_EmptyGroup_ShouldBeSizeZero() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(new HashMap<>());
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ Map sizes = domainSearch.getGroupSizes(null,
+ new ArrayList<>(), null, null, null, null, null);
+ assertEquals(0, sizes.size());
+ }
+
+ @Test
+ public void getDomains_SingleGroupFullPage_ShouldContainAllDomains() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"));
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, domains);
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ List firstPage = domainSearch.getDomainsInGroup(null,
+ new ArrayList<>(), null, null, null, groupOne, 0, 3, null, null);
+ assertEquals(4, firstPage.size());
+ for (int i = 0; i < firstPage.size(); i++) {
+ assertEquals(domains.get(i), firstPage.get(i));
+ }
+ }
+
+ @Test
+ public void getDomains_SingleGroupOverSizedPage_ShouldContainAllDomains() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"));
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, domains);
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ List firstPage = domainSearch.getDomainsInGroup(null,
+ new ArrayList<>(), null, null, null, groupOne, 0, 100, null, null);
+ assertEquals(4, firstPage.size());
+ for (int i = 0; i < firstPage.size(); i++) {
+ assertEquals(domains.get(i), firstPage.get(i));
+ }
+ }
+
+ @Test
+ public void getDomains_SingleGroupHalfPage_ShouldContainHalfDomains() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"));
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, domains);
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ List firstPage = domainSearch.getDomainsInGroup(null,
+ new ArrayList<>(), null, null, null, groupOne, 0, 2, null, null);
+ assertEquals(2, firstPage.size());
+ for (int i = 0; i < firstPage.size(); i++) {
+ assertEquals(domains.get(i), firstPage.get(i));
+ }
+ }
+
+ @Test
+ public void getDomains_SingleGroupLastPageLastDomain_ShouldContainLastDomain() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"));
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, domains);
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ List firstPage = domainSearch.getDomainsInGroup(null,
+ new ArrayList<>(), null, null, null, groupOne, 3, 1, null, null);
+ assertEquals(1, firstPage.size());
+ assertEquals(domains.get(domains.size() - 1), firstPage.get(0));
+ }
+
+ @Test
+ public void getDomains_SingleGroupOversizedOffset_ShouldContainNoDomains() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"));
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, domains);
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ List firstPage = domainSearch.getDomainsInGroup(null,
+ new ArrayList<>(), null, null, null, groupOne, 20, 5, null, null);
+ assertEquals(4, firstPage.size());
+ for (int i = 0; i < firstPage.size(); i++) {
+ assertEquals(domains.get(i), firstPage.get(i));
+ }
+ }
+
+ @Test
+ public void getDomains_SingleGroupZeroSizedPage_ShouldContainNoDomains() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"));
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, domains);
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ List firstPage = domainSearch.getDomainsInGroup(null,
+ new ArrayList<>(), null, null, null, groupOne, 0, 0, null, null);
+ assertEquals(0, firstPage.size());
+ }
+
+ @Test
+ public void getDomains_MultipleGroupsFullPage_ShouldContainAllDomainsInGroup() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ DummyKey groupTwo = new DummyKey("2");
+ DummyKey groupThree = new DummyKey("3");
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"))
+ );
+ put(groupTwo, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("facebook.com"),
+ DomainSearchTestUtils.mockDomainResult("spotify.com"),
+ DomainSearchTestUtils.mockDomainResult("netbeans.com"))
+ );
+ put(groupThree, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("youtube.com"))
+ );
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ List firstPage = domainSearch.getDomainsInGroup(null,
+ new ArrayList<>(), null, null, null, groupOne, 0, 3, null, null);
+ assertEquals(4, firstPage.size());
+ }
+
+ @Test
+ public void getDomains_MultipleGroupsHalfPage_ShouldContainHalfDomainsInGroup() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ DummyKey groupTwo = new DummyKey("2");
+ DummyKey groupThree = new DummyKey("3");
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"))
+ );
+ put(groupTwo, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("facebook.com"),
+ DomainSearchTestUtils.mockDomainResult("spotify.com"),
+ DomainSearchTestUtils.mockDomainResult("netbeans.com"))
+ );
+ put(groupThree, Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("youtube.com"))
+ );
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+ List firstPage = domainSearch.getDomainsInGroup(null,
+ new ArrayList<>(), null, null, null, groupTwo, 1, 2, null, null);
+ assertEquals(2, firstPage.size());
+ for (int i = 0; i < firstPage.size(); i++) {
+ assertEquals(dummyData.get(groupTwo).get(i + 1), firstPage.get(i));
+ }
+ }
+
+ @Test
+ public void getDomains_SingleGroupSimulatedPaging_ShouldPageThroughAllDomains() throws DiscoveryException {
+ DomainSearchCache cache = mock(DomainSearchCache.class);
+
+ DummyKey groupOne = new DummyKey("1");
+ List domains = Arrays.asList(
+ DomainSearchTestUtils.mockDomainResult("google.com"),
+ DomainSearchTestUtils.mockDomainResult("yahoo.com"),
+ DomainSearchTestUtils.mockDomainResult("bing.com"),
+ DomainSearchTestUtils.mockDomainResult("amazon.com"),
+ DomainSearchTestUtils.mockDomainResult("facebook.com"),
+ DomainSearchTestUtils.mockDomainResult("capitalone.com"),
+ DomainSearchTestUtils.mockDomainResult("spotify.com"),
+ DomainSearchTestUtils.mockDomainResult("netsuite.com"));
+
+ Map> dummyData = new HashMap>() {
+ {
+ put(groupOne, domains);
+ }
+ };
+
+ when(cache.get(null, new ArrayList<>(), null, null, null, null, null)).thenReturn(dummyData);
+
+ DomainSearch domainSearch = new DomainSearch(cache);
+
+ int start = 0;
+ int size = 2;
+ while (start + size <= domains.size()) {
+ List page = domainSearch.getDomainsInGroup(null,
+ new ArrayList<>(), null, null, null, groupOne, start, size, null, null);
+ assertEquals(2, page.size());
+ for(int i = 0; i < page.size(); i++) {
+ assertEquals(domains.get(start + i), page.get(i));
+ }
+
+ start += size;
+ }
+ }
+
+ private class DummyKey extends GroupKey {
+
+ private final String name;
+
+ public DummyKey(String name) {
+ this.name = name;
+ }
+
+ @Override
+ String getDisplayName() {
+ return name;
+ }
+
+ @Override
+ public boolean equals(Object otherKey) {
+ if (otherKey instanceof GroupKey) {
+ return this.getDisplayName().equals(((GroupKey) otherKey).getDisplayName());
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return this.name.hashCode();
+ }
+
+ @Override
+ public int compareTo(GroupKey o) {
+ return this.getDisplayName().compareTo(o.getDisplayName());
+ }
+ }
+}
diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java
new file mode 100755
index 0000000000..a0f19c17a4
--- /dev/null
+++ b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java
@@ -0,0 +1,51 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2020 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.discovery.search;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import org.sleuthkit.datamodel.Content;
+
+/**
+ * Mock utility methods for DomainSearchTests
+ */
+public class DomainSearchTestUtils {
+
+ private DomainSearchTestUtils() {
+
+ }
+
+ public static ResultDomain mockDomainResult(String domain, long start, long end,
+ long visits, long filesDownloaded, long dataSourceId) {
+ Content dataSource = mockDataSource(dataSourceId);
+ return new ResultDomain(domain, start, end,
+ visits, filesDownloaded, dataSource);
+ }
+
+ public static ResultDomain mockDomainResult(String domain) {
+ return DomainSearchTestUtils.mockDomainResult(domain, 0, 0, 0, 0, 0);
+ }
+
+ public static Content mockDataSource(long dataSourceId) {
+ Content dataSource = mock(Content.class);
+ when(dataSource.getName()).thenReturn("");
+ when(dataSource.getId()).thenReturn(dataSourceId);
+ return dataSource;
+ }
+}