Merge branch 'develop' of https://github.com/sleuthkit/autopsy into 1130-is-group-analyzed
@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
|||||||
OpenIDE-Module: org.sleuthkit.autopsy.core/10
|
OpenIDE-Module: org.sleuthkit.autopsy.core/10
|
||||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/core/Bundle.properties
|
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/core/Bundle.properties
|
||||||
OpenIDE-Module-Layer: org/sleuthkit/autopsy/core/layer.xml
|
OpenIDE-Module-Layer: org/sleuthkit/autopsy/core/layer.xml
|
||||||
OpenIDE-Module-Implementation-Version: 25
|
OpenIDE-Module-Implementation-Version: 26
|
||||||
OpenIDE-Module-Requires: org.openide.windows.WindowManager
|
OpenIDE-Module-Requires: org.openide.windows.WindowManager
|
||||||
AutoUpdate-Show-In-Client: true
|
AutoUpdate-Show-In-Client: true
|
||||||
AutoUpdate-Essential-Module: true
|
AutoUpdate-Essential-Module: true
|
||||||
|
@ -63,7 +63,7 @@ file.reference.cxf-rt-transports-http-3.0.16.jar=release/modules/ext/cxf-rt-tran
|
|||||||
file.reference.fontbox-2.0.8.jar=release/modules/ext/fontbox-2.0.8.jar
|
file.reference.fontbox-2.0.8.jar=release/modules/ext/fontbox-2.0.8.jar
|
||||||
file.reference.pdfbox-2.0.8.jar=release/modules/ext/pdfbox-2.0.8.jar
|
file.reference.pdfbox-2.0.8.jar=release/modules/ext/pdfbox-2.0.8.jar
|
||||||
file.reference.pdfbox-tools-2.0.8.jar=release/modules/ext/pdfbox-tools-2.0.8.jar
|
file.reference.pdfbox-tools-2.0.8.jar=release/modules/ext/pdfbox-tools-2.0.8.jar
|
||||||
file.reference.sleuthkit-postgresql-4.6.4.jar=release/modules/ext/sleuthkit-postgresql-4.6.4.jar
|
file.reference.sleuthkit-postgresql-4.6.5.jar=release/modules/ext/sleuthkit-postgresql-4.6.5.jar
|
||||||
file.reference.tagsoup-1.2.1.jar=release/modules/ext/tagsoup-1.2.1.jar
|
file.reference.tagsoup-1.2.1.jar=release/modules/ext/tagsoup-1.2.1.jar
|
||||||
file.reference.tika-core-1.17.jar=release/modules/ext/tika-core-1.17.jar
|
file.reference.tika-core-1.17.jar=release/modules/ext/tika-core-1.17.jar
|
||||||
file.reference.tika-parsers-1.17.jar=release/modules/ext/tika-parsers-1.17.jar
|
file.reference.tika-parsers-1.17.jar=release/modules/ext/tika-parsers-1.17.jar
|
||||||
@ -84,5 +84,5 @@ nbm.homepage=http://www.sleuthkit.org/
|
|||||||
nbm.module.author=Brian Carrier
|
nbm.module.author=Brian Carrier
|
||||||
nbm.needs.restart=true
|
nbm.needs.restart=true
|
||||||
source.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0-sources.jar
|
source.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0-sources.jar
|
||||||
spec.version.base=10.13
|
spec.version.base=10.14
|
||||||
|
|
||||||
|
@ -339,7 +339,7 @@
|
|||||||
<package>org.sleuthkit.autopsy.progress</package>
|
<package>org.sleuthkit.autopsy.progress</package>
|
||||||
<package>org.sleuthkit.autopsy.report</package>
|
<package>org.sleuthkit.autopsy.report</package>
|
||||||
<package>org.sleuthkit.autopsy.textextractors</package>
|
<package>org.sleuthkit.autopsy.textextractors</package>
|
||||||
<package>org.sleuthkit.autopsy.textextractors.extractionconfigs</package>
|
<package>org.sleuthkit.autopsy.textextractors.configs</package>
|
||||||
<package>org.sleuthkit.autopsy.texttranslation</package>
|
<package>org.sleuthkit.autopsy.texttranslation</package>
|
||||||
<package>org.sleuthkit.datamodel</package>
|
<package>org.sleuthkit.datamodel</package>
|
||||||
</public-packages>
|
</public-packages>
|
||||||
@ -500,8 +500,8 @@
|
|||||||
<binary-origin>release/modules/ext/isoparser-1.1.18.jar</binary-origin>
|
<binary-origin>release/modules/ext/isoparser-1.1.18.jar</binary-origin>
|
||||||
</class-path-extension>
|
</class-path-extension>
|
||||||
<class-path-extension>
|
<class-path-extension>
|
||||||
<runtime-relative-path>ext/sleuthkit-postgresql-4.6.4.jar</runtime-relative-path>
|
<runtime-relative-path>ext/sleuthkit-postgresql-4.6.5.jar</runtime-relative-path>
|
||||||
<binary-origin>release/modules/ext/sleuthkit-postgresql-4.6.4.jar</binary-origin>
|
<binary-origin>release/modules/ext/sleuthkit-postgresql-4.6.5.jar</binary-origin>
|
||||||
</class-path-extension>
|
</class-path-extension>
|
||||||
<class-path-extension>
|
<class-path-extension>
|
||||||
<runtime-relative-path>ext/vorbis-java-core-0.8.jar</runtime-relative-path>
|
<runtime-relative-path>ext/vorbis-java-core-0.8.jar</runtime-relative-path>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.othercasessearch;
|
package org.sleuthkit.autopsy.allcasessearch;
|
||||||
|
|
||||||
import org.openide.nodes.Children;
|
import org.openide.nodes.Children;
|
||||||
import org.openide.nodes.FilterNode;
|
import org.openide.nodes.FilterNode;
|
||||||
@ -27,7 +27,7 @@ import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
|
|||||||
* A <code>Children</code> implementation for a
|
* A <code>Children</code> implementation for a
|
||||||
* <code>CorrelationPropertyFilterNode</code>.
|
* <code>CorrelationPropertyFilterNode</code>.
|
||||||
*/
|
*/
|
||||||
final class OtherCasesFilterChildren extends FilterNode.Children {
|
final class AllCasesFilterChildren extends FilterNode.Children {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new Children instance.
|
* Create a new Children instance.
|
||||||
@ -41,7 +41,7 @@ final class OtherCasesFilterChildren extends FilterNode.Children {
|
|||||||
static Children createInstance(Node wrappedNode, boolean createChildren) {
|
static Children createInstance(Node wrappedNode, boolean createChildren) {
|
||||||
|
|
||||||
if (createChildren) {
|
if (createChildren) {
|
||||||
return new OtherCasesFilterChildren(wrappedNode);
|
return new AllCasesFilterChildren(wrappedNode);
|
||||||
} else {
|
} else {
|
||||||
return Children.LEAF;
|
return Children.LEAF;
|
||||||
}
|
}
|
||||||
@ -53,7 +53,7 @@ final class OtherCasesFilterChildren extends FilterNode.Children {
|
|||||||
*
|
*
|
||||||
* @param wrappedNode The node wrapped by CorrelationPropertyFilterNode.
|
* @param wrappedNode The node wrapped by CorrelationPropertyFilterNode.
|
||||||
*/
|
*/
|
||||||
OtherCasesFilterChildren(Node wrappedNode) {
|
AllCasesFilterChildren(Node wrappedNode) {
|
||||||
super(wrappedNode);
|
super(wrappedNode);
|
||||||
}
|
}
|
||||||
|
|
@ -16,7 +16,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.othercasessearch;
|
package org.sleuthkit.autopsy.allcasessearch;
|
||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import org.openide.awt.ActionID;
|
import org.openide.awt.ActionID;
|
||||||
@ -27,16 +27,15 @@ import org.openide.util.NbBundle;
|
|||||||
import org.openide.util.actions.CallableSystemAction;
|
import org.openide.util.actions.CallableSystemAction;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||||
import org.sleuthkit.autopsy.othercasessearch.Bundle;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Action for accessing the Search Other Cases dialog.
|
* Action for accessing the Search Other Cases dialog.
|
||||||
*/
|
*/
|
||||||
@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.othercasessearch.OtherCasesSearchAction")
|
@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.allcasessearch.AllCasesSearchAction")
|
||||||
@ActionRegistration(displayName = "#CTL_OtherCasesSearchAction=Search Other Cases", lazy = false)
|
@ActionRegistration(displayName = "#CTL_OtherCasesSearchAction=Search All Cases", lazy = false)
|
||||||
@ActionReference(path = "Menu/Tools", position = 201)
|
@ActionReference(path = "Menu/Tools", position = 201)
|
||||||
@NbBundle.Messages({"CTL_OtherCasesSearchAction=Search Other Cases"})
|
@NbBundle.Messages({"CTL_AllCasesSearchAction=Search All Cases"})
|
||||||
public class OtherCasesSearchAction extends CallableSystemAction {
|
public class AllCasesSearchAction extends CallableSystemAction {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEnabled() {
|
public boolean isEnabled() {
|
||||||
@ -50,15 +49,15 @@ public class OtherCasesSearchAction extends CallableSystemAction {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void performAction() {
|
public void performAction() {
|
||||||
OtherCasesSearchDialog dialog = new OtherCasesSearchDialog();
|
AllCasesSearchDialog dialog = new AllCasesSearchDialog();
|
||||||
dialog.display();
|
dialog.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
"OtherCasesSearchAction.getName.text=Search Other Cases"})
|
"AllCasesSearchAction.getName.text=Search All Cases"})
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return Bundle.OtherCasesSearchAction_getName_text();
|
return Bundle.AllCasesSearchAction_getName_text();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -16,7 +16,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.othercasessearch;
|
package org.sleuthkit.autopsy.allcasessearch;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.openide.nodes.Children;
|
import org.openide.nodes.Children;
|
||||||
@ -27,15 +27,15 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeIns
|
|||||||
* Creates CorrelationAttributeInstanceNodes from a collection of
|
* Creates CorrelationAttributeInstanceNodes from a collection of
|
||||||
* CorrelationAttributeInstances.
|
* CorrelationAttributeInstances.
|
||||||
*/
|
*/
|
||||||
class OtherCasesSearchChildren extends Children.Keys<CorrelationAttributeInstance> {
|
class AllCasesSearchChildren extends Children.Keys<CorrelationAttributeInstance> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an instance of OtherCasesSearchChildren.
|
* Create an instance of AllCasesSearchChildren.
|
||||||
*
|
*
|
||||||
* @param lazy Lazy load?
|
* @param lazy Lazy load?
|
||||||
* @param fileList List of CorrelationAttributeInstances.
|
* @param fileList List of CorrelationAttributeInstances.
|
||||||
*/
|
*/
|
||||||
OtherCasesSearchChildren(boolean lazy, List<CorrelationAttributeInstance> instances) {
|
AllCasesSearchChildren(boolean lazy, List<CorrelationAttributeInstance> instances) {
|
||||||
super(lazy);
|
super(lazy);
|
||||||
this.setKeys(instances);
|
this.setKeys(instances);
|
||||||
}
|
}
|
@ -81,14 +81,14 @@
|
|||||||
<Component class="javax.swing.JLabel" name="correlationValueLabel">
|
<Component class="javax.swing.JLabel" name="correlationValueLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.correlationValueLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/allcasessearch/Bundle.properties" key="AllCasesSearchDialog.correlationValueLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="correlationValueTextField">
|
<Component class="javax.swing.JTextField" name="correlationValueTextField">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.correlationValueTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/allcasessearch/Bundle.properties" key="AllCasesSearchDialog.correlationValueTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
@ -98,15 +98,15 @@
|
|||||||
<Component class="javax.swing.JButton" name="searchButton">
|
<Component class="javax.swing.JButton" name="searchButton">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.searchButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/allcasessearch/Bundle.properties" key="AllCasesSearchDialog.searchButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<AccessibilityProperties>
|
<AccessibilityProperties>
|
||||||
<Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.searchButton.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/allcasessearch/Bundle.properties" key="AllCasesSearchDialog.searchButton.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="AccessibleContext.accessibleDescription" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="AccessibleContext.accessibleDescription" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.searchButton.AccessibleContext.accessibleDescription" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/allcasessearch/Bundle.properties" key="AllCasesSearchDialog.searchButton.AccessibleContext.accessibleDescription" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</AccessibilityProperties>
|
</AccessibilityProperties>
|
||||||
<Events>
|
<Events>
|
||||||
@ -129,7 +129,7 @@
|
|||||||
<Component class="javax.swing.JLabel" name="correlationTypeLabel">
|
<Component class="javax.swing.JLabel" name="correlationTypeLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.correlationTypeLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/allcasessearch/Bundle.properties" key="AllCasesSearchDialog.correlationTypeLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -139,14 +139,14 @@
|
|||||||
<Color blue="0" green="0" red="ff" type="rgb"/>
|
<Color blue="0" green="0" red="ff" type="rgb"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.errorLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/allcasessearch/Bundle.properties" key="AllCasesSearchDialog.errorLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="descriptionLabel">
|
<Component class="javax.swing.JLabel" name="descriptionLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.descriptionLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/allcasessearch/Bundle.properties" key="AllCasesSearchDialog.descriptionLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -154,7 +154,7 @@
|
|||||||
<Properties>
|
<Properties>
|
||||||
<Property name="horizontalAlignment" type="int" value="2"/>
|
<Property name="horizontalAlignment" type="int" value="2"/>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/othercasessearch/Bundle.properties" key="OtherCasesSearchDialog.casesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/allcasessearch/Bundle.properties" key="AllCasesSearchDialog.casesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
@ -16,7 +16,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.othercasessearch;
|
package org.sleuthkit.autopsy.allcasessearch;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.event.ItemEvent;
|
import java.awt.event.ItemEvent;
|
||||||
@ -48,31 +48,31 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
|||||||
import org.sleuthkit.autopsy.datamodel.EmptyNode;
|
import org.sleuthkit.autopsy.datamodel.EmptyNode;
|
||||||
|
|
||||||
@Messages({
|
@Messages({
|
||||||
"OtherCasesSearchDialog.dialogTitle.text=Search Other Cases",
|
"AllCasesSearchDialog.dialogTitle.text=Search All Cases",
|
||||||
"OtherCasesSearchDialog.resultsTitle.text=Other Cases",
|
"AllCasesSearchDialog.resultsTitle.text=All Cases",
|
||||||
"OtherCasesSearchDialog.resultsDescription.text=Other Cases Search",
|
"AllCasesSearchDialog.resultsDescription.text=All Cases Search",
|
||||||
"OtherCasesSearchDialog.emptyNode.text=No results found.",
|
"AllCasesSearchDialog.emptyNode.text=No results found.",
|
||||||
"OtherCasesSearchDialog.validation.invalidHash=The supplied value is not a valid MD5 hash.",
|
"AllCasesSearchDialog.validation.invalidHash=The supplied value is not a valid MD5 hash.",
|
||||||
"OtherCasesSearchDialog.validation.invalidEmail=The supplied value is not a valid e-mail address.",
|
"AllCasesSearchDialog.validation.invalidEmail=The supplied value is not a valid e-mail address.",
|
||||||
"OtherCasesSearchDialog.validation.invalidDomain=The supplied value is not a valid domain.",
|
"AllCasesSearchDialog.validation.invalidDomain=The supplied value is not a valid domain.",
|
||||||
"OtherCasesSearchDialog.validation.invalidPhone=The supplied value is not a valid phone number.",
|
"AllCasesSearchDialog.validation.invalidPhone=The supplied value is not a valid phone number.",
|
||||||
"OtherCasesSearchDialog.validation.invalidSsid=The supplied value is not a valid wireless network.",
|
"AllCasesSearchDialog.validation.invalidSsid=The supplied value is not a valid wireless network.",
|
||||||
"OtherCasesSearchDialog.validation.invalidMac=The supplied value is not a valid MAC address.",
|
"AllCasesSearchDialog.validation.invalidMac=The supplied value is not a valid MAC address.",
|
||||||
"OtherCasesSearchDialog.validation.invalidImei=The supplied value is not a valid IMEI number.",
|
"AllCasesSearchDialog.validation.invalidImei=The supplied value is not a valid IMEI number.",
|
||||||
"OtherCasesSearchDialog.validation.invalidImsi=The supplied value is not a valid IMSI number.",
|
"AllCasesSearchDialog.validation.invalidImsi=The supplied value is not a valid IMSI number.",
|
||||||
"OtherCasesSearchDialog.validation.invalidIccid=The supplied value is not a valid ICCID number.",
|
"AllCasesSearchDialog.validation.invalidIccid=The supplied value is not a valid ICCID number.",
|
||||||
"OtherCasesSearchDialog.validation.genericMessage=The supplied value is not valid.",
|
"AllCasesSearchDialog.validation.genericMessage=The supplied value is not valid.",
|
||||||
"# {0} - number of cases",
|
"# {0} - number of cases",
|
||||||
"OtherCasesSearchDialog.caseLabel.text=The current Central Repository contains {0} case(s)."
|
"AllCasesSearchDialog.caseLabel.text=The current Central Repository contains {0} case(s)."
|
||||||
})
|
})
|
||||||
/**
|
/**
|
||||||
* The Search Other Cases dialog allows users to search for specific types of
|
* The Search All Cases dialog allows users to search for specific types of
|
||||||
* correlation properties in the Central Repository.
|
* correlation properties in the Central Repository.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||||
final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
final class AllCasesSearchDialog extends javax.swing.JDialog {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(OtherCasesSearchDialog.class.getName());
|
private static final Logger logger = Logger.getLogger(AllCasesSearchDialog.class.getName());
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private final List<CorrelationAttributeInstance.Type> correlationTypes;
|
private final List<CorrelationAttributeInstance.Type> correlationTypes;
|
||||||
@ -82,8 +82,8 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
|||||||
/**
|
/**
|
||||||
* Creates a new instance of the Search Other Cases dialog.
|
* Creates a new instance of the Search Other Cases dialog.
|
||||||
*/
|
*/
|
||||||
OtherCasesSearchDialog() {
|
AllCasesSearchDialog() {
|
||||||
super((JFrame) WindowManager.getDefault().getMainWindow(), Bundle.OtherCasesSearchDialog_dialogTitle_text(), true);
|
super((JFrame) WindowManager.getDefault().getMainWindow(), Bundle.AllCasesSearchDialog_dialogTitle_text(), true);
|
||||||
this.correlationTypes = new ArrayList<>();
|
this.correlationTypes = new ArrayList<>();
|
||||||
initComponents();
|
initComponents();
|
||||||
customizeComponents();
|
customizeComponents();
|
||||||
@ -122,20 +122,20 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
|||||||
Collection<DataResultViewer> viewers = new ArrayList<>(1);
|
Collection<DataResultViewer> viewers = new ArrayList<>(1);
|
||||||
viewers.add(table);
|
viewers.add(table);
|
||||||
|
|
||||||
OtherCasesSearchNode searchNode = new OtherCasesSearchNode(correlationInstances);
|
AllCasesSearchNode searchNode = new AllCasesSearchNode(correlationInstances);
|
||||||
TableFilterNode tableFilterNode = new TableFilterNode(searchNode, true, searchNode.getName());
|
TableFilterNode tableFilterNode = new TableFilterNode(searchNode, true, searchNode.getName());
|
||||||
|
|
||||||
String resultsText = String.format("%s (%s; \"%s\")",
|
String resultsText = String.format("%s (%s; \"%s\")",
|
||||||
Bundle.OtherCasesSearchDialog_resultsTitle_text(), type.getDisplayName(), value);
|
Bundle.AllCasesSearchDialog_resultsTitle_text(), type.getDisplayName(), value);
|
||||||
final TopComponent searchResultWin;
|
final TopComponent searchResultWin;
|
||||||
if (correlationInstances.isEmpty()) {
|
if (correlationInstances.isEmpty()) {
|
||||||
Node emptyNode = new TableFilterNode(
|
Node emptyNode = new TableFilterNode(
|
||||||
new EmptyNode(Bundle.OtherCasesSearchDialog_emptyNode_text()), true);
|
new EmptyNode(Bundle.AllCasesSearchDialog_emptyNode_text()), true);
|
||||||
searchResultWin = DataResultTopComponent.createInstance(
|
searchResultWin = DataResultTopComponent.createInstance(
|
||||||
resultsText, Bundle.OtherCasesSearchDialog_resultsDescription_text(), emptyNode, 0);
|
resultsText, Bundle.AllCasesSearchDialog_resultsDescription_text(), emptyNode, 0);
|
||||||
} else {
|
} else {
|
||||||
searchResultWin = DataResultTopComponent.createInstance(
|
searchResultWin = DataResultTopComponent.createInstance(
|
||||||
resultsText, Bundle.OtherCasesSearchDialog_resultsDescription_text(), tableFilterNode, correlationInstances.size(), viewers);
|
resultsText, Bundle.AllCasesSearchDialog_resultsDescription_text(), tableFilterNode, correlationInstances.size(), viewers);
|
||||||
}
|
}
|
||||||
searchResultWin.requestActive(); // make it the active top component
|
searchResultWin.requestActive(); // make it the active top component
|
||||||
} catch (ExecutionException | InterruptedException ex) {
|
} catch (ExecutionException | InterruptedException ex) {
|
||||||
@ -166,16 +166,16 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
|||||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
setResizable(false);
|
setResizable(false);
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(correlationValueLabel, org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.correlationValueLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(correlationValueLabel, org.openide.util.NbBundle.getMessage(AllCasesSearchDialog.class, "AllCasesSearchDialog.correlationValueLabel.text")); // NOI18N
|
||||||
|
|
||||||
correlationValueTextField.setText(org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.correlationValueTextField.text")); // NOI18N
|
correlationValueTextField.setText(org.openide.util.NbBundle.getMessage(AllCasesSearchDialog.class, "AllCasesSearchDialog.correlationValueTextField.text")); // NOI18N
|
||||||
correlationValueTextField.addKeyListener(new java.awt.event.KeyAdapter() {
|
correlationValueTextField.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
public void keyReleased(java.awt.event.KeyEvent evt) {
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
valueFieldKeyReleaseListener(evt);
|
valueFieldKeyReleaseListener(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(searchButton, org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.searchButton.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(searchButton, org.openide.util.NbBundle.getMessage(AllCasesSearchDialog.class, "AllCasesSearchDialog.searchButton.text")); // NOI18N
|
||||||
searchButton.addActionListener(new java.awt.event.ActionListener() {
|
searchButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
searchButtonActionPerformed(evt);
|
searchButtonActionPerformed(evt);
|
||||||
@ -188,15 +188,15 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(correlationTypeLabel, org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.correlationTypeLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(correlationTypeLabel, org.openide.util.NbBundle.getMessage(AllCasesSearchDialog.class, "AllCasesSearchDialog.correlationTypeLabel.text")); // NOI18N
|
||||||
|
|
||||||
errorLabel.setForeground(new java.awt.Color(255, 0, 0));
|
errorLabel.setForeground(new java.awt.Color(255, 0, 0));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(errorLabel, org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.errorLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(errorLabel, org.openide.util.NbBundle.getMessage(AllCasesSearchDialog.class, "AllCasesSearchDialog.errorLabel.text")); // NOI18N
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel, org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.descriptionLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(descriptionLabel, org.openide.util.NbBundle.getMessage(AllCasesSearchDialog.class, "AllCasesSearchDialog.descriptionLabel.text")); // NOI18N
|
||||||
|
|
||||||
casesLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
casesLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(casesLabel, org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.casesLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(casesLabel, org.openide.util.NbBundle.getMessage(AllCasesSearchDialog.class, "AllCasesSearchDialog.casesLabel.text")); // NOI18N
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||||
getContentPane().setLayout(layout);
|
getContentPane().setLayout(layout);
|
||||||
@ -243,8 +243,8 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
|||||||
.addContainerGap())
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
|
|
||||||
searchButton.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.searchButton.AccessibleContext.accessibleName")); // NOI18N
|
searchButton.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(AllCasesSearchDialog.class, "AllCasesSearchDialog.searchButton.AccessibleContext.accessibleName")); // NOI18N
|
||||||
searchButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(OtherCasesSearchDialog.class, "OtherCasesSearchDialog.searchButton.AccessibleContext.accessibleDescription")); // NOI18N
|
searchButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(AllCasesSearchDialog.class, "AllCasesSearchDialog.searchButton.AccessibleContext.accessibleDescription")); // NOI18N
|
||||||
|
|
||||||
pack();
|
pack();
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
@ -260,34 +260,34 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
|||||||
String validationMessage;
|
String validationMessage;
|
||||||
switch (correlationType.getId()) {
|
switch (correlationType.getId()) {
|
||||||
case CorrelationAttributeInstance.FILES_TYPE_ID:
|
case CorrelationAttributeInstance.FILES_TYPE_ID:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidHash();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_invalidHash();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.DOMAIN_TYPE_ID:
|
case CorrelationAttributeInstance.DOMAIN_TYPE_ID:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidDomain();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_invalidDomain();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.EMAIL_TYPE_ID:
|
case CorrelationAttributeInstance.EMAIL_TYPE_ID:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidEmail();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_invalidEmail();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.PHONE_TYPE_ID:
|
case CorrelationAttributeInstance.PHONE_TYPE_ID:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidPhone();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_invalidPhone();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.SSID_TYPE_ID:
|
case CorrelationAttributeInstance.SSID_TYPE_ID:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidSsid();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_invalidSsid();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.MAC_TYPE_ID:
|
case CorrelationAttributeInstance.MAC_TYPE_ID:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidMac();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_invalidMac();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.IMEI_TYPE_ID:
|
case CorrelationAttributeInstance.IMEI_TYPE_ID:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidImei();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_invalidImei();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.IMSI_TYPE_ID:
|
case CorrelationAttributeInstance.IMSI_TYPE_ID:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidImsi();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_invalidImsi();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.ICCID_TYPE_ID:
|
case CorrelationAttributeInstance.ICCID_TYPE_ID:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_invalidIccid();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_invalidIccid();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
validationMessage = Bundle.OtherCasesSearchDialog_validation_genericMessage();
|
validationMessage = Bundle.AllCasesSearchDialog_validation_genericMessage();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -340,7 +340,7 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
|||||||
correlationTypes.clear();
|
correlationTypes.clear();
|
||||||
correlationTypes.addAll(dbManager.getDefinedCorrelationTypes());
|
correlationTypes.addAll(dbManager.getDefinedCorrelationTypes());
|
||||||
int numberOfCases = dbManager.getCases().size();
|
int numberOfCases = dbManager.getCases().size();
|
||||||
casesLabel.setText(Bundle.OtherCasesSearchDialog_caseLabel_text(numberOfCases));
|
casesLabel.setText(Bundle.AllCasesSearchDialog_caseLabel_text(numberOfCases));
|
||||||
} catch (EamDbException ex) {
|
} catch (EamDbException ex) {
|
||||||
logger.log(Level.SEVERE, "Unable to connect to the Central Repository database.", ex);
|
logger.log(Level.SEVERE, "Unable to connect to the Central Repository database.", ex);
|
||||||
}
|
}
|
||||||
@ -385,16 +385,16 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Messages({
|
@Messages({
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.filesExample=Example: \"f0e1d2c3b4a5968778695a4b3c2d1e0f\"",
|
"AllCasesSearchDialog.correlationValueTextField.filesExample=Example: \"f0e1d2c3b4a5968778695a4b3c2d1e0f\"",
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.domainExample=Example: \"domain.com\"",
|
"AllCasesSearchDialog.correlationValueTextField.domainExample=Example: \"domain.com\"",
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.emailExample=Example: \"user@host.com\"",
|
"AllCasesSearchDialog.correlationValueTextField.emailExample=Example: \"user@host.com\"",
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.phoneExample=Example: \"(800)123-4567\"",
|
"AllCasesSearchDialog.correlationValueTextField.phoneExample=Example: \"(800)123-4567\"",
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.usbExample=Example: \"4&1234567&0\"",
|
"AllCasesSearchDialog.correlationValueTextField.usbExample=Example: \"4&1234567&0\"",
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.ssidExample=Example: \"WirelessNetwork-5G\"",
|
"AllCasesSearchDialog.correlationValueTextField.ssidExample=Example: \"WirelessNetwork-5G\"",
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.macExample=Example: \"0C-14-F2-01-AF-45\"",
|
"AllCasesSearchDialog.correlationValueTextField.macExample=Example: \"0C-14-F2-01-AF-45\"",
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.imeiExample=Example: \"351756061523999\"",
|
"AllCasesSearchDialog.correlationValueTextField.imeiExample=Example: \"351756061523999\"",
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.imsiExample=Example: \"310150123456789\"",
|
"AllCasesSearchDialog.correlationValueTextField.imsiExample=Example: \"310150123456789\"",
|
||||||
"OtherCasesSearchDialog.correlationValueTextField.iccidExample=Example: \"89 91 19 1299 99 329451 0\""
|
"AllCasesSearchDialog.correlationValueTextField.iccidExample=Example: \"89 91 19 1299 99 329451 0\""
|
||||||
})
|
})
|
||||||
/**
|
/**
|
||||||
* Update the text prompt of the name text field based on the input type
|
* Update the text prompt of the name text field based on the input type
|
||||||
@ -407,34 +407,34 @@ final class OtherCasesSearchDialog extends javax.swing.JDialog {
|
|||||||
String text;
|
String text;
|
||||||
switch (selectedCorrelationType.getId()) {
|
switch (selectedCorrelationType.getId()) {
|
||||||
case CorrelationAttributeInstance.FILES_TYPE_ID:
|
case CorrelationAttributeInstance.FILES_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_filesExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_filesExample();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.DOMAIN_TYPE_ID:
|
case CorrelationAttributeInstance.DOMAIN_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_domainExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_domainExample();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.EMAIL_TYPE_ID:
|
case CorrelationAttributeInstance.EMAIL_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_emailExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_emailExample();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.PHONE_TYPE_ID:
|
case CorrelationAttributeInstance.PHONE_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_phoneExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_phoneExample();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.USBID_TYPE_ID:
|
case CorrelationAttributeInstance.USBID_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_usbExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_usbExample();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.SSID_TYPE_ID:
|
case CorrelationAttributeInstance.SSID_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_ssidExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_ssidExample();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.MAC_TYPE_ID:
|
case CorrelationAttributeInstance.MAC_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_macExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_macExample();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.IMEI_TYPE_ID:
|
case CorrelationAttributeInstance.IMEI_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_imeiExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_imeiExample();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.IMSI_TYPE_ID:
|
case CorrelationAttributeInstance.IMSI_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_imsiExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_imsiExample();
|
||||||
break;
|
break;
|
||||||
case CorrelationAttributeInstance.ICCID_TYPE_ID:
|
case CorrelationAttributeInstance.ICCID_TYPE_ID:
|
||||||
text = Bundle.OtherCasesSearchDialog_correlationValueTextField_iccidExample();
|
text = Bundle.AllCasesSearchDialog_correlationValueTextField_iccidExample();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
text = "";
|
text = "";
|
@ -16,7 +16,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.othercasessearch;
|
package org.sleuthkit.autopsy.allcasessearch;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.openide.nodes.AbstractNode;
|
import org.openide.nodes.AbstractNode;
|
||||||
@ -24,24 +24,24 @@ import org.openide.util.NbBundle.Messages;
|
|||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parent node to OtherCasesSearchChildren.
|
* Parent node to AllCasesSearchChildren.
|
||||||
*/
|
*/
|
||||||
class OtherCasesSearchNode extends AbstractNode {
|
class AllCasesSearchNode extends AbstractNode {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an instance of OtherCasesSearchNode.
|
* Create an instance of AllCasesSearchNode.
|
||||||
*
|
*
|
||||||
* @param keys The list of CorrelationAttributeInstances.
|
* @param keys The list of CorrelationAttributeInstances.
|
||||||
*/
|
*/
|
||||||
OtherCasesSearchNode(List<CorrelationAttributeInstance> keys) {
|
AllCasesSearchNode(List<CorrelationAttributeInstance> keys) {
|
||||||
super(new OtherCasesSearchChildren(true, keys));
|
super(new AllCasesSearchChildren(true, keys));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Messages({
|
@Messages({
|
||||||
"OtherCasesSearchNode.getName.text=Other Cases Search"
|
"AllCasesSearchNode.getName.text=Other Cases Search"
|
||||||
})
|
})
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return Bundle.OtherCasesSearchNode_getName_text();
|
return Bundle.AllCasesSearchNode_getName_text();
|
||||||
}
|
}
|
||||||
}
|
}
|
10
Core/src/org/sleuthkit/autopsy/allcasessearch/Bundle.properties
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
AllCasesSearchDialog.descriptionLabel.text=<html>Search the Central Repository for correlation properties with a specified value. The search is case insensitive.</html>
|
||||||
|
AllCasesSearchDialog.errorLabel.text=\
|
||||||
|
AllCasesSearchDialog.correlationTypeLabel.text=Correlation Property Type:
|
||||||
|
AllCasesSearchDialog.searchButton.AccessibleContext.accessibleDescription=
|
||||||
|
AllCasesSearchDialog.searchButton.AccessibleContext.accessibleName=Search
|
||||||
|
AllCasesSearchDialog.searchButton.text=Search
|
||||||
|
AllCasesSearchDialog.correlationValueTextField.text=
|
||||||
|
AllCasesSearchDialog.correlationValueLabel.text=Correlation Property Value:
|
||||||
|
AllCasesSearchDialog.casesLabel.text=\
|
@ -16,7 +16,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.othercasessearch;
|
package org.sleuthkit.autopsy.allcasessearch;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -29,13 +29,12 @@ import org.openide.util.NbBundle;
|
|||||||
import org.openide.util.lookup.Lookups;
|
import org.openide.util.lookup.Lookups;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationDataSource;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationDataSource;
|
||||||
import org.sleuthkit.autopsy.othercasessearch.Bundle;
|
|
||||||
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
|
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
|
||||||
import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor;
|
import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor;
|
||||||
import org.sleuthkit.autopsy.datamodel.NodeProperty;
|
import org.sleuthkit.autopsy.datamodel.NodeProperty;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used by the Other Cases Search feature to encapsulate instances of a given
|
* Used by the All Cases Search feature to encapsulate instances of a given
|
||||||
* search match.
|
* search match.
|
||||||
*/
|
*/
|
||||||
public final class CorrelationAttributeInstanceNode extends DisplayableItemNode {
|
public final class CorrelationAttributeInstanceNode extends DisplayableItemNode {
|
@ -232,10 +232,12 @@ LocalDiskSelectionDialog.okButton.text=OK
|
|||||||
LocalDiskPanel.localDiskLabel.text=Local Disk:
|
LocalDiskPanel.localDiskLabel.text=Local Disk:
|
||||||
LocalDiskPanel.imageWriterErrorLabel.text=Error Label
|
LocalDiskPanel.imageWriterErrorLabel.text=Error Label
|
||||||
LocalDiskSelectionDialog.title=Select Local Disk
|
LocalDiskSelectionDialog.title=Select Local Disk
|
||||||
ImageFilePanel.md5HashLabel.text=MD5 hash:
|
ImageFilePanel.md5HashLabel.text=MD5:
|
||||||
ImageFilePanel.sha1HashLabel.text=SHA-1 hash:
|
ImageFilePanel.sha1HashLabel.text=SHA-1:
|
||||||
ImageFilePanel.sha256HashLabel.text=SHA-256 hash:
|
ImageFilePanel.sha256HashLabel.text=SHA-256:
|
||||||
ImageFilePanel.sha256HashTextField.text=
|
ImageFilePanel.sha256HashTextField.text=
|
||||||
ImageFilePanel.sha1HashTextField.text=
|
ImageFilePanel.sha1HashTextField.text=
|
||||||
ImageFilePanel.md5HashTextField.text=
|
ImageFilePanel.md5HashTextField.text=
|
||||||
ImageFilePanel.errorLabel.text=Error Label
|
ImageFilePanel.errorLabel.text=Error Label
|
||||||
|
ImageFilePanel.hashValuesNoteLabel.text=NOTE: These values will not be validated when the data source is added.
|
||||||
|
ImageFilePanel.hashValuesLabel.text=Hash Values (optional):
|
||||||
|
@ -1120,12 +1120,7 @@ public class Case {
|
|||||||
/*
|
/*
|
||||||
* Enable the case-specific actions.
|
* Enable the case-specific actions.
|
||||||
*/
|
*/
|
||||||
|
CallableSystemAction.get(AddImageAction.class).setEnabled(true);
|
||||||
//Deny ability to add a data source if the special admin access file is present.
|
|
||||||
File denyAddDataSourcePermissions = new File(PlatformUtil.getUserConfigDirectory(), "_ndsp");
|
|
||||||
if(!denyAddDataSourcePermissions.exists()) {
|
|
||||||
CallableSystemAction.get(AddImageAction.class).setEnabled(true);
|
|
||||||
}
|
|
||||||
CallableSystemAction.get(CaseCloseAction.class).setEnabled(true);
|
CallableSystemAction.get(CaseCloseAction.class).setEnabled(true);
|
||||||
CallableSystemAction.get(CasePropertiesAction.class).setEnabled(true);
|
CallableSystemAction.get(CasePropertiesAction.class).setEnabled(true);
|
||||||
CallableSystemAction.get(CaseDeleteAction.class).setEnabled(true);
|
CallableSystemAction.get(CaseDeleteAction.class).setEnabled(true);
|
||||||
|
@ -46,6 +46,7 @@ import org.sleuthkit.autopsy.events.AutopsyEventPublisher;
|
|||||||
import org.sleuthkit.autopsy.ingest.IngestManager;
|
import org.sleuthkit.autopsy.ingest.IngestManager;
|
||||||
import org.sleuthkit.autopsy.ingest.events.DataSourceAnalysisCompletedEvent;
|
import org.sleuthkit.autopsy.ingest.events.DataSourceAnalysisCompletedEvent;
|
||||||
import org.sleuthkit.autopsy.ingest.events.DataSourceAnalysisStartedEvent;
|
import org.sleuthkit.autopsy.ingest.events.DataSourceAnalysisStartedEvent;
|
||||||
|
import org.sleuthkit.datamodel.Content;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A collaboration monitor listens to local events and translates them into
|
* A collaboration monitor listens to local events and translates them into
|
||||||
@ -231,9 +232,12 @@ final class CollaborationMonitor {
|
|||||||
* @param event A data source analysis started event.
|
* @param event A data source analysis started event.
|
||||||
*/
|
*/
|
||||||
synchronized void addDataSourceAnalysisTask(DataSourceAnalysisStartedEvent event) {
|
synchronized void addDataSourceAnalysisTask(DataSourceAnalysisStartedEvent event) {
|
||||||
String status = NbBundle.getMessage(CollaborationMonitor.class, "CollaborationMonitor.analyzingDataSourceStatus.msg", hostName, event.getDataSource().getName());
|
Content dataSource = event.getDataSource();
|
||||||
jobIdsTodataSourceAnalysisTasks.put(event.getDataSourceIngestJobId(), new Task(++nextTaskId, status));
|
if (dataSource != null) {
|
||||||
eventPublisher.publishRemotely(new CollaborationEvent(hostName, getCurrentTasks()));
|
String status = NbBundle.getMessage(CollaborationMonitor.class, "CollaborationMonitor.analyzingDataSourceStatus.msg", hostName, dataSource.getName());
|
||||||
|
jobIdsTodataSourceAnalysisTasks.put(event.getDataSourceIngestJobId(), new Task(++nextTaskId, status));
|
||||||
|
eventPublisher.publishRemotely(new CollaborationEvent(hostName, getCurrentTasks()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,29 +32,45 @@
|
|||||||
</Group>
|
</Group>
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="sha256HashLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="pathLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="sha1HashLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="noFatOrphansCheckbox" alignment="0" min="-2" pref="262" max="-2" attributes="0"/>
|
||||||
<Component id="md5HashLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="sectorSizeLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="timeZoneLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace min="0" pref="368" max="32767" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
|
||||||
<Component id="sha256HashTextField" pref="455" max="32767" attributes="0"/>
|
|
||||||
<Component id="sha1HashTextField" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="md5HashTextField" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="sectorSizeComboBox" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="timeZoneComboBox" alignment="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="pathLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="errorLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="errorLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="noFatOrphansCheckbox" alignment="0" min="-2" pref="262" max="-2" attributes="0"/>
|
<Group type="103" alignment="0" groupAlignment="1" max="-2" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="timeZoneLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Component id="timeZoneComboBox" min="-2" pref="455" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="sectorSizeLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="sectorSizeComboBox" min="-2" pref="455" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<Component id="md5HashLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Component id="md5HashTextField" min="-2" pref="455" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<Component id="sha1HashLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Component id="sha1HashTextField" min="-2" pref="455" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<Component id="sha256HashLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Component id="sha256HashTextField" min="-2" pref="455" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<Component id="hashValuesNoteLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="hashValuesLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace min="0" pref="325" max="32767" attributes="0"/>
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -79,6 +95,8 @@
|
|||||||
<Component id="sectorSizeComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="sectorSizeComboBox" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="sectorSizeLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="sectorSizeLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
|
<EmptySpace min="-2" pref="39" max="-2" attributes="0"/>
|
||||||
|
<Component id="hashValuesLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="md5HashTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="md5HashTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
@ -95,8 +113,10 @@
|
|||||||
<Component id="sha256HashLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="sha256HashLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="hashValuesNoteLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Component id="errorLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="errorLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace pref="23" max="32767" attributes="0"/>
|
<EmptySpace pref="51" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -186,6 +206,7 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.sha256HashLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.sha256HashLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="sha256HashTextField">
|
<Component class="javax.swing.JTextField" name="sha256HashTextField">
|
||||||
@ -193,6 +214,7 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.sha256HashTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.sha256HashTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="sha1HashTextField">
|
<Component class="javax.swing.JTextField" name="sha1HashTextField">
|
||||||
@ -200,6 +222,7 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.sha1HashTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.sha1HashTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="md5HashTextField">
|
<Component class="javax.swing.JTextField" name="md5HashTextField">
|
||||||
@ -207,6 +230,7 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.md5HashTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.md5HashTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="sha1HashLabel">
|
<Component class="javax.swing.JLabel" name="sha1HashLabel">
|
||||||
@ -214,6 +238,7 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.sha1HashLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.sha1HashLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="md5HashLabel">
|
<Component class="javax.swing.JLabel" name="md5HashLabel">
|
||||||
@ -221,6 +246,23 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.md5HashLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.md5HashLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="hashValuesLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.hashValuesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="hashValuesNoteLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="ImageFilePanel.hashValuesNoteLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
|
@ -156,6 +156,8 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
md5HashTextField = new javax.swing.JTextField();
|
md5HashTextField = new javax.swing.JTextField();
|
||||||
sha1HashLabel = new javax.swing.JLabel();
|
sha1HashLabel = new javax.swing.JLabel();
|
||||||
md5HashLabel = new javax.swing.JLabel();
|
md5HashLabel = new javax.swing.JLabel();
|
||||||
|
hashValuesLabel = new javax.swing.JLabel();
|
||||||
|
hashValuesNoteLabel = new javax.swing.JLabel();
|
||||||
|
|
||||||
setMinimumSize(new java.awt.Dimension(0, 65));
|
setMinimumSize(new java.awt.Dimension(0, 65));
|
||||||
setPreferredSize(new java.awt.Dimension(403, 65));
|
setPreferredSize(new java.awt.Dimension(403, 65));
|
||||||
@ -184,16 +186,28 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
org.openide.awt.Mnemonics.setLocalizedText(sectorSizeLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sectorSizeLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(sectorSizeLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sectorSizeLabel.text")); // NOI18N
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(sha256HashLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sha256HashLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(sha256HashLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sha256HashLabel.text")); // NOI18N
|
||||||
|
sha256HashLabel.setEnabled(false);
|
||||||
|
|
||||||
sha256HashTextField.setText(org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sha256HashTextField.text")); // NOI18N
|
sha256HashTextField.setText(org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sha256HashTextField.text")); // NOI18N
|
||||||
|
sha256HashTextField.setEnabled(false);
|
||||||
|
|
||||||
sha1HashTextField.setText(org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sha1HashTextField.text")); // NOI18N
|
sha1HashTextField.setText(org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sha1HashTextField.text")); // NOI18N
|
||||||
|
sha1HashTextField.setEnabled(false);
|
||||||
|
|
||||||
md5HashTextField.setText(org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.md5HashTextField.text")); // NOI18N
|
md5HashTextField.setText(org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.md5HashTextField.text")); // NOI18N
|
||||||
|
md5HashTextField.setEnabled(false);
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(sha1HashLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sha1HashLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(sha1HashLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.sha1HashLabel.text")); // NOI18N
|
||||||
|
sha1HashLabel.setEnabled(false);
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(md5HashLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.md5HashLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(md5HashLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.md5HashLabel.text")); // NOI18N
|
||||||
|
md5HashLabel.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(hashValuesLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.hashValuesLabel.text")); // NOI18N
|
||||||
|
hashValuesLabel.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(hashValuesNoteLabel, org.openide.util.NbBundle.getMessage(ImageFilePanel.class, "ImageFilePanel.hashValuesNoteLabel.text")); // NOI18N
|
||||||
|
hashValuesNoteLabel.setEnabled(false);
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
this.setLayout(layout);
|
this.setLayout(layout);
|
||||||
@ -206,25 +220,36 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
.addGap(2, 2, 2))
|
.addGap(2, 2, 2))
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(sha256HashLabel)
|
.addComponent(pathLabel)
|
||||||
.addComponent(sha1HashLabel)
|
.addComponent(noFatOrphansCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 262, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addComponent(md5HashLabel)
|
.addGap(0, 368, Short.MAX_VALUE))
|
||||||
.addComponent(sectorSizeLabel)
|
|
||||||
.addComponent(timeZoneLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
|
||||||
.addComponent(sha256HashTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 455, Short.MAX_VALUE)
|
|
||||||
.addComponent(sha1HashTextField)
|
|
||||||
.addComponent(md5HashTextField)
|
|
||||||
.addComponent(sectorSizeComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(timeZoneComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(pathLabel)
|
|
||||||
.addComponent(errorLabel)
|
.addComponent(errorLabel)
|
||||||
.addComponent(noFatOrphansCheckbox, javax.swing.GroupLayout.PREFERRED_SIZE, 262, javax.swing.GroupLayout.PREFERRED_SIZE))
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
||||||
.addGap(0, 325, Short.MAX_VALUE))
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(timeZoneLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(timeZoneComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 455, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(sectorSizeLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(sectorSizeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 455, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(md5HashLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(md5HashTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 455, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(sha1HashLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(sha1HashTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 455, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(sha256HashLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(sha256HashTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 455, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||||
|
.addComponent(hashValuesNoteLabel)
|
||||||
|
.addComponent(hashValuesLabel))
|
||||||
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
@ -244,6 +269,8 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(sectorSizeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(sectorSizeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(sectorSizeLabel))
|
.addComponent(sectorSizeLabel))
|
||||||
|
.addGap(39, 39, 39)
|
||||||
|
.addComponent(hashValuesLabel)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(md5HashTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(md5HashTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
@ -257,8 +284,10 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
.addComponent(sha256HashTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(sha256HashTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(sha256HashLabel))
|
.addComponent(sha256HashLabel))
|
||||||
.addGap(18, 18, 18)
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(hashValuesNoteLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
.addComponent(errorLabel)
|
.addComponent(errorLabel)
|
||||||
.addContainerGap(23, Short.MAX_VALUE))
|
.addContainerGap(51, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
@ -286,6 +315,7 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setContentPath(path);
|
setContentPath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,6 +325,8 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private javax.swing.JButton browseButton;
|
private javax.swing.JButton browseButton;
|
||||||
private javax.swing.JLabel errorLabel;
|
private javax.swing.JLabel errorLabel;
|
||||||
|
private javax.swing.JLabel hashValuesLabel;
|
||||||
|
private javax.swing.JLabel hashValuesNoteLabel;
|
||||||
private javax.swing.JLabel md5HashLabel;
|
private javax.swing.JLabel md5HashLabel;
|
||||||
private javax.swing.JTextField md5HashTextField;
|
private javax.swing.JTextField md5HashTextField;
|
||||||
private javax.swing.JCheckBox noFatOrphansCheckbox;
|
private javax.swing.JCheckBox noFatOrphansCheckbox;
|
||||||
@ -310,6 +342,25 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
private javax.swing.JLabel timeZoneLabel;
|
private javax.swing.JLabel timeZoneLabel;
|
||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable or disable all of the hash values components.
|
||||||
|
*
|
||||||
|
* @param enabled Enable components if true; otherwise disable.
|
||||||
|
*/
|
||||||
|
private void setHashValuesComponentsEnabled(boolean enabled) {
|
||||||
|
hashValuesLabel.setEnabled(enabled);
|
||||||
|
hashValuesNoteLabel.setEnabled(enabled);
|
||||||
|
|
||||||
|
md5HashLabel.setEnabled(enabled);
|
||||||
|
md5HashTextField.setEnabled(enabled);
|
||||||
|
|
||||||
|
sha1HashLabel.setEnabled(enabled);
|
||||||
|
sha1HashTextField.setEnabled(enabled);
|
||||||
|
|
||||||
|
sha256HashLabel.setEnabled(enabled);
|
||||||
|
sha256HashTextField.setEnabled(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the path of the user selected image.
|
* Get the path of the user selected image.
|
||||||
*
|
*
|
||||||
@ -383,7 +434,7 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
errorLabel.setVisible(false);
|
errorLabel.setVisible(false);
|
||||||
|
|
||||||
String path = getContentPaths();
|
String path = getContentPaths();
|
||||||
if (StringUtils.isBlank(path) || (!(new File(path).isFile() || DriveUtils.isPhysicalDrive(path) || DriveUtils.isPartition(path)))) {
|
if (!isImagePathValid()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,6 +463,16 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isImagePathValid() {
|
||||||
|
String path = getContentPaths();
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(path) || (!(new File(path).isFile() || DriveUtils.isPhysicalDrive(path) || DriveUtils.isPartition(path)))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void storeSettings() {
|
public void storeSettings() {
|
||||||
String imagePathName = getContentPaths();
|
String imagePathName = getContentPaths();
|
||||||
@ -446,13 +507,19 @@ public class ImageFilePanel extends JPanel implements DocumentListener {
|
|||||||
/**
|
/**
|
||||||
* Update functions are called by the pathTextField which has this set as
|
* Update functions are called by the pathTextField which has this set as
|
||||||
* it's DocumentEventListener. Each update function fires a property change
|
* it's DocumentEventListener. Each update function fires a property change
|
||||||
* to be caught by the parent panel.
|
* to be caught by the parent panel. Additionally, the hash values will be
|
||||||
*
|
* enabled or disabled depending on the pathTextField input.
|
||||||
*/
|
*/
|
||||||
@NbBundle.Messages({"ImageFilePanel.moduleErr=Module Error",
|
@NbBundle.Messages({"ImageFilePanel.moduleErr=Module Error",
|
||||||
"ImageFilePanel.moduleErr.msg=A module caused an error listening to ImageFilePanel updates."
|
"ImageFilePanel.moduleErr.msg=A module caused an error listening to ImageFilePanel updates."
|
||||||
+ " See log to determine which module. Some data could be incomplete.\n"})
|
+ " See log to determine which module. Some data could be incomplete.\n"})
|
||||||
private void updateHelper() {
|
private void updateHelper() {
|
||||||
|
if (isImagePathValid() && !getContentPaths().toLowerCase().endsWith(".e01")) {
|
||||||
|
setHashValuesComponentsEnabled(true);
|
||||||
|
} else {
|
||||||
|
setHashValuesComponentsEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
|
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,6 @@ import java.awt.event.WindowAdapter;
|
|||||||
import java.awt.event.WindowEvent;
|
import java.awt.event.WindowEvent;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import javax.swing.JFileChooser;
|
import javax.swing.JFileChooser;
|
||||||
@ -261,7 +260,7 @@ class MissingImageDialog extends javax.swing.JDialog {
|
|||||||
this.dispose();
|
this.dispose();
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
lbWarning.setText(NbBundle.getMessage(this.getClass(), "MissingImageDialog.ErrorSettingImage"));
|
lbWarning.setText(NbBundle.getMessage(this.getClass(), "MissingImageDialog.ErrorSettingImage"));
|
||||||
logger.log(Level.WARNING, "Error setting image paths", ex); //NON-NLS
|
logger.log(Level.SEVERE, "Error setting image paths", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
}//GEN-LAST:event_selectButtonActionPerformed
|
}//GEN-LAST:event_selectButtonActionPerformed
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ public class DataContentViewerOtherCasesTableCellRenderer implements TableCellRe
|
|||||||
foreground = Color.WHITE;
|
foreground = Color.WHITE;
|
||||||
background = Color.BLUE;
|
background = Color.BLUE;
|
||||||
} else {
|
} else {
|
||||||
String known_status = (String) table.getModel().getValueAt(row,
|
String known_status = (String) table.getModel().getValueAt(table.convertRowIndexToModel(row),
|
||||||
table.getColumn(DataContentViewerOtherCasesTableModel.TableColumns.KNOWN.columnName()).getModelIndex());
|
table.getColumn(DataContentViewerOtherCasesTableModel.TableColumns.KNOWN.columnName()).getModelIndex());
|
||||||
if (known_status.equals(TskData.FileKnown.BAD.getName())) {
|
if (known_status.equals(TskData.FileKnown.BAD.getName())) {
|
||||||
foreground = Color.WHITE;
|
foreground = Color.WHITE;
|
||||||
|
@ -58,8 +58,8 @@ abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
private final static Logger logger = Logger.getLogger(AbstractSqlEamDb.class.getName());
|
private final static Logger logger = Logger.getLogger(AbstractSqlEamDb.class.getName());
|
||||||
static final String SCHEMA_MAJOR_VERSION_KEY = "SCHEMA_VERSION";
|
static final String SCHEMA_MAJOR_VERSION_KEY = "SCHEMA_VERSION";
|
||||||
static final String SCHEMA_MINOR_VERSION_KEY = "SCHEMA_MINOR_VERSION";
|
static final String SCHEMA_MINOR_VERSION_KEY = "SCHEMA_MINOR_VERSION";
|
||||||
static final String CREATED_SCHEMA_MAJOR_VERSION_KEY = "CREATED_SCHEMA_MAJOR_VERSION";
|
static final String CREATION_SCHEMA_MAJOR_VERSION_KEY = "CREATION_SCHEMA_MAJOR_VERSION";
|
||||||
static final String CREATED_SCHEMA_MINOR_VERSION_KEY = "CREATED_SCHEMA_MINOR_VERSION";
|
static final String CREATION_SCHEMA_MINOR_VERSION_KEY = "CREATION_SCHEMA_MINOR_VERSION";
|
||||||
static final CaseDbSchemaVersionNumber CURRENT_DB_SCHEMA_VERSION = new CaseDbSchemaVersionNumber(1, 2);
|
static final CaseDbSchemaVersionNumber CURRENT_DB_SCHEMA_VERSION = new CaseDbSchemaVersionNumber(1, 2);
|
||||||
|
|
||||||
protected final List<CorrelationAttributeInstance.Type> defaultCorrelationTypes;
|
protected final List<CorrelationAttributeInstance.Type> defaultCorrelationTypes;
|
||||||
@ -3184,27 +3184,41 @@ abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
statement = conn.createStatement();
|
statement = conn.createStatement();
|
||||||
|
|
||||||
int minorVersion = 0;
|
int minorVersion = 0;
|
||||||
resultSet = statement.executeQuery("SELECT value FROM db_info WHERE name='SCHEMA_MINOR_VERSION'");
|
String minorVersionStr = null;
|
||||||
|
resultSet = statement.executeQuery("SELECT value FROM db_info WHERE name='" + AbstractSqlEamDb.SCHEMA_MINOR_VERSION_KEY + "'");
|
||||||
if (resultSet.next()) {
|
if (resultSet.next()) {
|
||||||
String minorVersionStr = resultSet.getString("value");
|
minorVersionStr = resultSet.getString("value");
|
||||||
try {
|
try {
|
||||||
minorVersion = Integer.parseInt(minorVersionStr);
|
minorVersion = Integer.parseInt(minorVersionStr);
|
||||||
} catch (NumberFormatException ex) {
|
} catch (NumberFormatException ex) {
|
||||||
throw new EamDbException("Bad value for schema minor version (" + minorVersionStr + ") - database is corrupt", ex);
|
throw new EamDbException("Bad value for schema minor version (" + minorVersionStr + ") - database is corrupt", ex);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new EamDbException("Failed to read schema minor version from db_info table");
|
||||||
}
|
}
|
||||||
|
|
||||||
int majorVersion = 0;
|
int majorVersion = 0;
|
||||||
resultSet = statement.executeQuery("SELECT value FROM db_info WHERE name='SCHEMA_VERSION'");
|
String majorVersionStr = null;
|
||||||
|
resultSet = statement.executeQuery("SELECT value FROM db_info WHERE name='" + AbstractSqlEamDb.SCHEMA_MAJOR_VERSION_KEY + "'");
|
||||||
if (resultSet.next()) {
|
if (resultSet.next()) {
|
||||||
String majorVersionStr = resultSet.getString("value");
|
majorVersionStr = resultSet.getString("value");
|
||||||
try {
|
try {
|
||||||
majorVersion = Integer.parseInt(majorVersionStr);
|
majorVersion = Integer.parseInt(majorVersionStr);
|
||||||
} catch (NumberFormatException ex) {
|
} catch (NumberFormatException ex) {
|
||||||
throw new EamDbException("Bad value for schema version (" + majorVersionStr + ") - database is corrupt", ex);
|
throw new EamDbException("Bad value for schema version (" + majorVersionStr + ") - database is corrupt", ex);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new EamDbException("Failed to read schema major version from db_info table");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IMPORTANT: The code that follows had a bug in it prior to Autopsy
|
||||||
|
* 4.10.0. The consequence of the bug is that the schema version
|
||||||
|
* number is always reset to 1.0 or 1.1 if a Central Repository is
|
||||||
|
* opened by an Autopsy 4.9.1 or earlier client. To cope with this,
|
||||||
|
* there is an effort in updates to 1.2 and greater to not retry
|
||||||
|
* schema updates that may already have been done once.
|
||||||
|
*/
|
||||||
CaseDbSchemaVersionNumber dbSchemaVersion = new CaseDbSchemaVersionNumber(majorVersion, minorVersion);
|
CaseDbSchemaVersionNumber dbSchemaVersion = new CaseDbSchemaVersionNumber(majorVersion, minorVersion);
|
||||||
if (dbSchemaVersion.equals(CURRENT_DB_SCHEMA_VERSION)) {
|
if (dbSchemaVersion.equals(CURRENT_DB_SCHEMA_VERSION)) {
|
||||||
logger.log(Level.INFO, "Central Repository is up to date");
|
logger.log(Level.INFO, "Central Repository is up to date");
|
||||||
@ -3215,7 +3229,11 @@ abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update from 1.0 to 1.1
|
EamDbPlatformEnum selectedPlatform = EamDbPlatformEnum.getSelectedPlatform();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update to 1.1
|
||||||
|
*/
|
||||||
if (dbSchemaVersion.compareTo(new CaseDbSchemaVersionNumber(1, 1)) < 0) {
|
if (dbSchemaVersion.compareTo(new CaseDbSchemaVersionNumber(1, 1)) < 0) {
|
||||||
statement.execute("ALTER TABLE reference_sets ADD COLUMN known_status INTEGER;"); //NON-NLS
|
statement.execute("ALTER TABLE reference_sets ADD COLUMN known_status INTEGER;"); //NON-NLS
|
||||||
statement.execute("ALTER TABLE reference_sets ADD COLUMN read_only BOOLEAN;"); //NON-NLS
|
statement.execute("ALTER TABLE reference_sets ADD COLUMN read_only BOOLEAN;"); //NON-NLS
|
||||||
@ -3226,9 +3244,11 @@ abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
// regardless of whether this succeeds.
|
// regardless of whether this succeeds.
|
||||||
EamDbUtil.insertDefaultOrganization(conn);
|
EamDbUtil.insertDefaultOrganization(conn);
|
||||||
}
|
}
|
||||||
//Update to 1.2
|
|
||||||
|
/*
|
||||||
|
* Update to 1.2
|
||||||
|
*/
|
||||||
if (dbSchemaVersion.compareTo(new CaseDbSchemaVersionNumber(1, 2)) < 0) {
|
if (dbSchemaVersion.compareTo(new CaseDbSchemaVersionNumber(1, 2)) < 0) {
|
||||||
EamDbPlatformEnum selectedPlatform = EamDbPlatformEnum.getSelectedPlatform();
|
|
||||||
final String addIntegerColumnTemplate = "ALTER TABLE %s ADD COLUMN %s INTEGER;"; //NON-NLS
|
final String addIntegerColumnTemplate = "ALTER TABLE %s ADD COLUMN %s INTEGER;"; //NON-NLS
|
||||||
final String addSsidTableTemplate;
|
final String addSsidTableTemplate;
|
||||||
final String addCaseIdIndexTemplate;
|
final String addCaseIdIndexTemplate;
|
||||||
@ -3362,26 +3382,50 @@ abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Put values into the db_info table indicating that the
|
* Drop the db_info table and add it back in with the name
|
||||||
* creation schema version is not known.
|
* column having a UNIQUE constraint. The name column could now
|
||||||
|
* be used as the primary key, but the essentially useless id
|
||||||
|
* column is retained for the sake of backwards compatibility.
|
||||||
|
* Note that the creation schema version number is set to 0.0
|
||||||
|
* to indicate that it is unknown.
|
||||||
*/
|
*/
|
||||||
statement.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATED_SCHEMA_MAJOR_VERSION_KEY + "', '0')");
|
String creationMajorVer;
|
||||||
statement.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATED_SCHEMA_MINOR_VERSION_KEY + "', '0')");
|
resultSet = statement.executeQuery("SELECT value FROM db_info WHERE name = '" + AbstractSqlEamDb.CREATION_SCHEMA_MAJOR_VERSION_KEY + "'");
|
||||||
|
if (resultSet.next()) {
|
||||||
}
|
creationMajorVer = resultSet.getString("value");
|
||||||
if (!updateSchemaVersion(conn)) {
|
} else {
|
||||||
throw new EamDbException("Error updating schema version");
|
creationMajorVer = "0";
|
||||||
|
}
|
||||||
|
String creationMinorVer;
|
||||||
|
resultSet = statement.executeQuery("SELECT value FROM db_info WHERE name = '" + AbstractSqlEamDb.CREATION_SCHEMA_MINOR_VERSION_KEY + "'");
|
||||||
|
if (resultSet.next()) {
|
||||||
|
creationMinorVer = resultSet.getString("value");
|
||||||
|
} else {
|
||||||
|
creationMinorVer = "0";
|
||||||
|
}
|
||||||
|
statement.execute("DROP TABLE db_info");
|
||||||
|
if (selectedPlatform == EamDbPlatformEnum.POSTGRESQL) {
|
||||||
|
statement.execute("CREATE TABLE db_info (id SERIAL, name TEXT UNIQUE NOT NULL, value TEXT NOT NULL)");
|
||||||
|
} else {
|
||||||
|
statement.execute("CREATE TABLE db_info (id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL, value TEXT NOT NULL)");
|
||||||
|
}
|
||||||
|
statement.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MAJOR_VERSION_KEY + "','" + majorVersionStr + "')");
|
||||||
|
statement.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MINOR_VERSION_KEY + "','" + minorVersionStr + "')");
|
||||||
|
statement.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATION_SCHEMA_MAJOR_VERSION_KEY + "','" + creationMajorVer + "')");
|
||||||
|
statement.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATION_SCHEMA_MINOR_VERSION_KEY + "','" + creationMinorVer + "')");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateSchemaVersion(conn);
|
||||||
conn.commit();
|
conn.commit();
|
||||||
logger.log(Level.INFO, "Central Repository upgraded to version " + CURRENT_DB_SCHEMA_VERSION);
|
logger.log(Level.INFO, String.format("Central Repository schema updated to version %s", CURRENT_DB_SCHEMA_VERSION));
|
||||||
|
|
||||||
} catch (SQLException | EamDbException ex) {
|
} catch (SQLException | EamDbException ex) {
|
||||||
try {
|
try {
|
||||||
if (conn != null) {
|
if (conn != null) {
|
||||||
conn.rollback();
|
conn.rollback();
|
||||||
}
|
}
|
||||||
} catch (SQLException ex2) {
|
} catch (SQLException ex2) {
|
||||||
logger.log(Level.SEVERE, "Database rollback failed", ex2);
|
logger.log(Level.SEVERE, String.format("Central Repository rollback of failed schema update to %s failed", CURRENT_DB_SCHEMA_VERSION), ex2);
|
||||||
}
|
}
|
||||||
throw ex;
|
throw ex;
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -27,6 +27,7 @@ import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
|||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
|
||||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
|
import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
@ -76,85 +77,62 @@ public class EamArtifactUtil {
|
|||||||
artifactForInstance = artifact;
|
artifactForInstance = artifact;
|
||||||
}
|
}
|
||||||
if (artifactForInstance != null) {
|
if (artifactForInstance != null) {
|
||||||
switch (BlackboardArtifact.ARTIFACT_TYPE.fromID(artifactForInstance.getArtifactTypeID())) {
|
int artifactTypeID = artifactForInstance.getArtifactTypeID();
|
||||||
case TSK_KEYWORD_HIT: {
|
if (artifactTypeID == ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) {
|
||||||
BlackboardAttribute setNameAttr = artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME));
|
BlackboardAttribute setNameAttr = artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME));
|
||||||
if (setNameAttr != null
|
if (setNameAttr != null
|
||||||
&& EamArtifactUtil.getEmailAddressAttrString().equals(setNameAttr.getValueString())) {
|
&& EamArtifactUtil.getEmailAddressAttrString().equals(setNameAttr.getValueString())) {
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD, CorrelationAttributeInstance.EMAIL_TYPE_ID);
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD, CorrelationAttributeInstance.EMAIL_TYPE_ID);
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case TSK_WEB_BOOKMARK:
|
} else if (artifactTypeID == ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID()
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN, CorrelationAttributeInstance.DOMAIN_TYPE_ID);
|
|| artifactTypeID == ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID()
|
||||||
break;
|
|| artifactTypeID == ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID()
|
||||||
case TSK_WEB_COOKIE:
|
|| artifactTypeID == ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()) {
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN, CorrelationAttributeInstance.DOMAIN_TYPE_ID);
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN, CorrelationAttributeInstance.DOMAIN_TYPE_ID);
|
||||||
break;
|
} else if (artifactTypeID == ARTIFACT_TYPE.TSK_CONTACT.getTypeID()
|
||||||
case TSK_WEB_DOWNLOAD:
|
|| artifactTypeID == ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN, CorrelationAttributeInstance.DOMAIN_TYPE_ID);
|
|| artifactTypeID == ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) {
|
||||||
break;
|
|
||||||
case TSK_WEB_HISTORY:
|
String value = null;
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN, CorrelationAttributeInstance.DOMAIN_TYPE_ID);
|
if (null != artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER))) {
|
||||||
break;
|
value = artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)).getValueString();
|
||||||
case TSK_CONTACT:
|
} else if (null != artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM))) {
|
||||||
//generates the same correlation attrs as tsk_message
|
value = artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)).getValueString();
|
||||||
case TSK_CALLLOG:
|
} else if (null != artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO))) {
|
||||||
//generates the same correlation attrs as tsk_message
|
value = artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)).getValueString();
|
||||||
case TSK_MESSAGE: {
|
}
|
||||||
String value = null;
|
// Remove all non-numeric symbols to semi-normalize phone numbers, preserving leading "+" character
|
||||||
if (null != artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER))) {
|
if (value != null) {
|
||||||
value = artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)).getValueString();
|
String newValue = value.replaceAll("\\D", "");
|
||||||
} else if (null != artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM))) {
|
if (value.startsWith("+")) {
|
||||||
value = artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)).getValueString();
|
newValue = "+" + newValue;
|
||||||
} else if (null != artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO))) {
|
|
||||||
value = artifactForInstance.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)).getValueString();
|
|
||||||
}
|
}
|
||||||
// Remove all non-numeric symbols to semi-normalize phone numbers, preserving leading "+" character
|
value = newValue;
|
||||||
if (value != null) {
|
// Only add the correlation attribute if the resulting phone number large enough to be of use
|
||||||
String newValue = value.replaceAll("\\D", "");
|
// (these 3-5 digit numbers can be valid, but are not useful for correlation)
|
||||||
if (value.startsWith("+")) {
|
if (value.length() > 5) {
|
||||||
newValue = "+" + newValue;
|
CorrelationAttributeInstance inst = makeCorrelationAttributeInstanceUsingTypeValue(artifactForInstance, EamDb.getInstance().getCorrelationTypeById(CorrelationAttributeInstance.PHONE_TYPE_ID), value);
|
||||||
}
|
if (inst != null) {
|
||||||
value = newValue;
|
eamArtifacts.add(inst);
|
||||||
// Only add the correlation attribute if the resulting phone number large enough to be of use
|
|
||||||
// (these 3-5 digit numbers can be valid, but are not useful for correlation)
|
|
||||||
if (value.length() > 5) {
|
|
||||||
CorrelationAttributeInstance inst = makeCorrelationAttributeInstanceUsingTypeValue(artifactForInstance, EamDb.getInstance().getCorrelationTypeById(CorrelationAttributeInstance.PHONE_TYPE_ID), value);
|
|
||||||
if (inst != null) {
|
|
||||||
eamArtifacts.add(inst);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case TSK_DEVICE_ATTACHED:
|
} else if (artifactTypeID == ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()) {
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID, CorrelationAttributeInstance.USBID_TYPE_ID);
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID, CorrelationAttributeInstance.USBID_TYPE_ID);
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MAC_ADDRESS, CorrelationAttributeInstance.MAC_TYPE_ID);
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MAC_ADDRESS, CorrelationAttributeInstance.MAC_TYPE_ID);
|
||||||
break;
|
} else if (artifactTypeID == ARTIFACT_TYPE.TSK_WIFI_NETWORK.getTypeID()) {
|
||||||
case TSK_WIFI_NETWORK:
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SSID, CorrelationAttributeInstance.SSID_TYPE_ID);
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SSID, CorrelationAttributeInstance.SSID_TYPE_ID);
|
} else if (artifactTypeID == ARTIFACT_TYPE.TSK_WIFI_NETWORK_ADAPTER.getTypeID()
|
||||||
break;
|
|| artifactTypeID == ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID()
|
||||||
case TSK_WIFI_NETWORK_ADAPTER:
|
|| artifactTypeID == ARTIFACT_TYPE.TSK_BLUETOOTH_ADAPTER.getTypeID()) {
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MAC_ADDRESS, CorrelationAttributeInstance.MAC_TYPE_ID);
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MAC_ADDRESS, CorrelationAttributeInstance.MAC_TYPE_ID);
|
||||||
break;
|
} else if (artifactTypeID == ARTIFACT_TYPE.TSK_DEVICE_INFO.getTypeID()) {
|
||||||
case TSK_BLUETOOTH_PAIRING:
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IMEI, CorrelationAttributeInstance.IMEI_TYPE_ID);
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MAC_ADDRESS, CorrelationAttributeInstance.MAC_TYPE_ID);
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IMSI, CorrelationAttributeInstance.IMSI_TYPE_ID);
|
||||||
break;
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ICCID, CorrelationAttributeInstance.ICCID_TYPE_ID);
|
||||||
case TSK_BLUETOOTH_ADAPTER:
|
} else if (artifactTypeID == ARTIFACT_TYPE.TSK_SIM_ATTACHED.getTypeID()) {
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MAC_ADDRESS, CorrelationAttributeInstance.MAC_TYPE_ID);
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IMSI, CorrelationAttributeInstance.IMSI_TYPE_ID);
|
||||||
break;
|
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ICCID, CorrelationAttributeInstance.ICCID_TYPE_ID);
|
||||||
case TSK_DEVICE_INFO:
|
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IMEI, CorrelationAttributeInstance.IMEI_TYPE_ID);
|
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IMSI, CorrelationAttributeInstance.IMSI_TYPE_ID);
|
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ICCID, CorrelationAttributeInstance.ICCID_TYPE_ID);
|
|
||||||
break;
|
|
||||||
case TSK_SIM_ATTACHED:
|
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IMSI, CorrelationAttributeInstance.IMSI_TYPE_ID);
|
|
||||||
addCorrelationAttributeToList(eamArtifacts, artifactForInstance, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ICCID, CorrelationAttributeInstance.ICCID_TYPE_ID);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (EamDbException ex) {
|
} catch (EamDbException ex) {
|
||||||
|
0
Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/EamDb.java
Normal file → Executable file
@ -126,42 +126,17 @@ public class EamDbUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store the schema version into the db_info table.
|
* Writes the current schema version into the database.
|
||||||
*
|
|
||||||
* This should be called immediately following the database schema being
|
|
||||||
* loaded.
|
|
||||||
*
|
*
|
||||||
* @param conn Open connection to use.
|
* @param conn Open connection to use.
|
||||||
*
|
*
|
||||||
* @return true on success, else false
|
* @throws SQLException If there is an error doing the update.
|
||||||
*/
|
*/
|
||||||
static boolean updateSchemaVersion(Connection conn) {
|
static void updateSchemaVersion(Connection conn) throws SQLException {
|
||||||
|
try (Statement statement = conn.createStatement()) {
|
||||||
Statement statement;
|
statement.execute("UPDATE db_info SET value = '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "' WHERE name = '" + AbstractSqlEamDb.SCHEMA_MAJOR_VERSION_KEY + "'");
|
||||||
ResultSet resultSet;
|
statement.execute("UPDATE db_info SET value = '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "' WHERE name = '" + AbstractSqlEamDb.SCHEMA_MINOR_VERSION_KEY + "'");
|
||||||
try {
|
|
||||||
statement = conn.createStatement();
|
|
||||||
resultSet = statement.executeQuery("SELECT id FROM db_info WHERE name='SCHEMA_VERSION'");
|
|
||||||
if (resultSet.next()) {
|
|
||||||
int id = resultSet.getInt("id");
|
|
||||||
statement.execute("UPDATE db_info SET value=" + CURRENT_DB_SCHEMA_VERSION.getMajor() + " WHERE id=" + id);
|
|
||||||
} else {
|
|
||||||
statement.execute("INSERT INTO db_info (name, value) VALUES ('SCHEMA_VERSION', '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "')");
|
|
||||||
}
|
|
||||||
|
|
||||||
resultSet = statement.executeQuery("SELECT id FROM db_info WHERE name='SCHEMA_MINOR_VERSION'");
|
|
||||||
if (resultSet.next()) {
|
|
||||||
int id = resultSet.getInt("id");
|
|
||||||
statement.execute("UPDATE db_info SET value=" + CURRENT_DB_SCHEMA_VERSION.getMinor() + " WHERE id=" + id);
|
|
||||||
} else {
|
|
||||||
statement.execute("INSERT INTO db_info (name, value) VALUES ('SCHEMA_MINOR_VERSION', '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "')");
|
|
||||||
}
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
LOGGER.log(Level.SEVERE, "Error adding schema version to db_info.", ex);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -191,9 +166,9 @@ public class EamDbUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Upgrade the current central reposity to the newest version. If the upgrade
|
* Upgrade the current Central Reposity schema to the newest version. If the
|
||||||
* fails, the central repository will be disabled and the current settings
|
* upgrade fails, the Central Repository will be disabled and the current
|
||||||
* will be cleared.
|
* settings will be cleared.
|
||||||
*
|
*
|
||||||
* @return true if the upgrade succeeds, false otherwise.
|
* @return true if the upgrade succeeds, false otherwise.
|
||||||
*/
|
*/
|
||||||
@ -201,7 +176,7 @@ public class EamDbUtil {
|
|||||||
if (!EamDb.isEnabled()) {
|
if (!EamDb.isEnabled()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
CoordinationService.Lock lock = null;
|
CoordinationService.Lock lock = null;
|
||||||
try {
|
try {
|
||||||
EamDb db = EamDb.getInstance();
|
EamDb db = EamDb.getInstance();
|
||||||
@ -217,23 +192,23 @@ public class EamDbUtil {
|
|||||||
LOGGER.log(Level.SEVERE, "Error updating central repository", ex);
|
LOGGER.log(Level.SEVERE, "Error updating central repository", ex);
|
||||||
|
|
||||||
// Disable the central repo and clear the current settings.
|
// Disable the central repo and clear the current settings.
|
||||||
try{
|
try {
|
||||||
if (null != EamDb.getInstance()) {
|
if (null != EamDb.getInstance()) {
|
||||||
EamDb.getInstance().shutdownConnections();
|
EamDb.getInstance().shutdownConnections();
|
||||||
}
|
}
|
||||||
} catch (EamDbException ex2){
|
} catch (EamDbException ex2) {
|
||||||
LOGGER.log(Level.SEVERE, "Error shutting down central repo connection pool", ex);
|
LOGGER.log(Level.SEVERE, "Error shutting down central repo connection pool", ex);
|
||||||
}
|
}
|
||||||
setUseCentralRepo(false);
|
setUseCentralRepo(false);
|
||||||
EamDbPlatformEnum.setSelectedPlatform(EamDbPlatformEnum.DISABLED.name());
|
EamDbPlatformEnum.setSelectedPlatform(EamDbPlatformEnum.DISABLED.name());
|
||||||
EamDbPlatformEnum.saveSelectedPlatform();
|
EamDbPlatformEnum.saveSelectedPlatform();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
} finally {
|
} finally {
|
||||||
if(lock != null){
|
if (lock != null) {
|
||||||
try{
|
try {
|
||||||
lock.release();
|
lock.release();
|
||||||
} catch (CoordinationServiceException ex){
|
} catch (CoordinationServiceException ex) {
|
||||||
LOGGER.log(Level.SEVERE, "Error releasing database lock", ex);
|
LOGGER.log(Level.SEVERE, "Error releasing database lock", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -254,6 +229,7 @@ public class EamDbUtil {
|
|||||||
* Check whether the given org is the default organization.
|
* Check whether the given org is the default organization.
|
||||||
*
|
*
|
||||||
* @param org
|
* @param org
|
||||||
|
*
|
||||||
* @return true if it is the default org, false otherwise
|
* @return true if it is the default org, false otherwise
|
||||||
*/
|
*/
|
||||||
public static boolean isDefaultOrg(EamOrganization org) {
|
public static boolean isDefaultOrg(EamOrganization org) {
|
||||||
@ -264,6 +240,7 @@ public class EamDbUtil {
|
|||||||
* Add the default organization to the database
|
* Add the default organization to the database
|
||||||
*
|
*
|
||||||
* @param conn
|
* @param conn
|
||||||
|
*
|
||||||
* @return true if successful, false otherwise
|
* @return true if successful, false otherwise
|
||||||
*/
|
*/
|
||||||
static boolean insertDefaultOrganization(Connection conn) {
|
static boolean insertDefaultOrganization(Connection conn) {
|
||||||
@ -294,7 +271,7 @@ public class EamDbUtil {
|
|||||||
* If the Central Repos use has been enabled.
|
* If the Central Repos use has been enabled.
|
||||||
*
|
*
|
||||||
* @return true if the Central Repo may be configured, false if it should
|
* @return true if the Central Repo may be configured, false if it should
|
||||||
* not be able to be
|
* not be able to be
|
||||||
*/
|
*/
|
||||||
public static boolean useCentralRepo() {
|
public static boolean useCentralRepo() {
|
||||||
return Boolean.parseBoolean(ModuleSettings.getConfigSetting(CENTRAL_REPO_NAME, CENTRAL_REPO_USE_KEY));
|
return Boolean.parseBoolean(ModuleSettings.getConfigSetting(CENTRAL_REPO_NAME, CENTRAL_REPO_USE_KEY));
|
||||||
@ -305,7 +282,7 @@ public class EamDbUtil {
|
|||||||
* configured.
|
* configured.
|
||||||
*
|
*
|
||||||
* @param centralRepoCheckBoxIsSelected - true if the central repo can be
|
* @param centralRepoCheckBoxIsSelected - true if the central repo can be
|
||||||
* used
|
* used
|
||||||
*/
|
*/
|
||||||
public static void setUseCentralRepo(boolean centralRepoCheckBoxIsSelected) {
|
public static void setUseCentralRepo(boolean centralRepoCheckBoxIsSelected) {
|
||||||
ModuleSettings.setConfigSetting(CENTRAL_REPO_NAME, CENTRAL_REPO_USE_KEY, Boolean.toString(centralRepoCheckBoxIsSelected));
|
ModuleSettings.setConfigSetting(CENTRAL_REPO_NAME, CENTRAL_REPO_USE_KEY, Boolean.toString(centralRepoCheckBoxIsSelected));
|
||||||
@ -364,7 +341,7 @@ public class EamDbUtil {
|
|||||||
* Close the prepared statement.
|
* Close the prepared statement.
|
||||||
*
|
*
|
||||||
* @param preparedStatement The prepared statement to be closed.
|
* @param preparedStatement The prepared statement to be closed.
|
||||||
*
|
*
|
||||||
* @deprecated Use closeStatement() instead.
|
* @deprecated Use closeStatement() instead.
|
||||||
*
|
*
|
||||||
* @throws EamDbException
|
* @throws EamDbException
|
||||||
|
0
Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PostgresEamDb.java
Normal file → Executable file
@ -406,13 +406,6 @@ public final class PostgresEamDbSettings {
|
|||||||
String instancesKnownStatusIdx = getAddKnownStatusIndexTemplate();
|
String instancesKnownStatusIdx = getAddKnownStatusIndexTemplate();
|
||||||
String instancesObjectIdIdx = getAddObjectIdIndexTemplate();
|
String instancesObjectIdIdx = getAddObjectIdIndexTemplate();
|
||||||
|
|
||||||
StringBuilder createDbInfoTable = new StringBuilder();
|
|
||||||
createDbInfoTable.append("CREATE TABLE IF NOT EXISTS db_info (");
|
|
||||||
createDbInfoTable.append("id SERIAL PRIMARY KEY NOT NULL,");
|
|
||||||
createDbInfoTable.append("name text NOT NULL,");
|
|
||||||
createDbInfoTable.append("value text NOT NULL");
|
|
||||||
createDbInfoTable.append(")");
|
|
||||||
|
|
||||||
// NOTE: the db_info table currenly only has 1 row, so having an index
|
// NOTE: the db_info table currenly only has 1 row, so having an index
|
||||||
// provides no benefit.
|
// provides no benefit.
|
||||||
Connection conn = null;
|
Connection conn = null;
|
||||||
@ -438,11 +431,16 @@ public final class PostgresEamDbSettings {
|
|||||||
|
|
||||||
stmt.execute(createCorrelationTypesTable.toString());
|
stmt.execute(createCorrelationTypesTable.toString());
|
||||||
|
|
||||||
stmt.execute(createDbInfoTable.toString());
|
/*
|
||||||
|
* Note that the essentially useless id column in the following
|
||||||
|
* table is required for backwards compatibility. Otherwise, the
|
||||||
|
* name column could be the primary key.
|
||||||
|
*/
|
||||||
|
stmt.execute("CREATE TABLE db_info (id SERIAL, name TEXT UNIQUE NOT NULL, value TEXT NOT NULL)");
|
||||||
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MAJOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "')");
|
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MAJOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "')");
|
||||||
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MINOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "')");
|
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MINOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "')");
|
||||||
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATED_SCHEMA_MAJOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "')");
|
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATION_SCHEMA_MAJOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "')");
|
||||||
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATED_SCHEMA_MINOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "')");
|
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATION_SCHEMA_MINOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "')");
|
||||||
|
|
||||||
// Create a separate instance and reference table for each correlation type
|
// Create a separate instance and reference table for each correlation type
|
||||||
List<CorrelationAttributeInstance.Type> DEFAULT_CORRELATION_TYPES = CorrelationAttributeInstance.getDefaultCorrelationTypes();
|
List<CorrelationAttributeInstance.Type> DEFAULT_CORRELATION_TYPES = CorrelationAttributeInstance.getDefaultCorrelationTypes();
|
||||||
|
@ -291,7 +291,7 @@ public final class SqliteEamDbSettings {
|
|||||||
createDataSourcesTable.append("datasource_obj_id integer,");
|
createDataSourcesTable.append("datasource_obj_id integer,");
|
||||||
createDataSourcesTable.append("md5 text DEFAULT NULL,");
|
createDataSourcesTable.append("md5 text DEFAULT NULL,");
|
||||||
createDataSourcesTable.append("sha1 text DEFAULT NULL,");
|
createDataSourcesTable.append("sha1 text DEFAULT NULL,");
|
||||||
createDataSourcesTable.append("sha256 text DEFAULT NULL,");
|
createDataSourcesTable.append("sha256 text DEFAULT NULL,");
|
||||||
createDataSourcesTable.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,");
|
createDataSourcesTable.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,");
|
||||||
createDataSourcesTable.append("CONSTRAINT datasource_unique UNIQUE (case_id, device_id, name)");
|
createDataSourcesTable.append("CONSTRAINT datasource_unique UNIQUE (case_id, device_id, name)");
|
||||||
createDataSourcesTable.append(")");
|
createDataSourcesTable.append(")");
|
||||||
@ -348,13 +348,6 @@ public final class SqliteEamDbSettings {
|
|||||||
String instancesValueIdx = getAddValueIndexTemplate();
|
String instancesValueIdx = getAddValueIndexTemplate();
|
||||||
String instancesKnownStatusIdx = getAddKnownStatusIndexTemplate();
|
String instancesKnownStatusIdx = getAddKnownStatusIndexTemplate();
|
||||||
String instancesObjectIdIdx = getAddObjectIdIndexTemplate();
|
String instancesObjectIdIdx = getAddObjectIdIndexTemplate();
|
||||||
|
|
||||||
StringBuilder createDbInfoTable = new StringBuilder();
|
|
||||||
createDbInfoTable.append("CREATE TABLE IF NOT EXISTS db_info (");
|
|
||||||
createDbInfoTable.append("id integer primary key NOT NULL,");
|
|
||||||
createDbInfoTable.append("name text NOT NULL,");
|
|
||||||
createDbInfoTable.append("value text NOT NULL");
|
|
||||||
createDbInfoTable.append(")");
|
|
||||||
|
|
||||||
// NOTE: the db_info table currenly only has 1 row, so having an index
|
// NOTE: the db_info table currenly only has 1 row, so having an index
|
||||||
// provides no benefit.
|
// provides no benefit.
|
||||||
@ -387,11 +380,16 @@ public final class SqliteEamDbSettings {
|
|||||||
|
|
||||||
stmt.execute(createCorrelationTypesTable.toString());
|
stmt.execute(createCorrelationTypesTable.toString());
|
||||||
|
|
||||||
stmt.execute(createDbInfoTable.toString());
|
/*
|
||||||
|
* Note that the essentially useless id column in the following
|
||||||
|
* table is required for backwards compatibility. Otherwise, the
|
||||||
|
* name column could be the primary key.
|
||||||
|
*/
|
||||||
|
stmt.execute("CREATE TABLE db_info (id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL, value TEXT NOT NULL)");
|
||||||
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MAJOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "')");
|
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MAJOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "')");
|
||||||
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MINOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "')");
|
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.SCHEMA_MINOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "')");
|
||||||
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATED_SCHEMA_MAJOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "')");
|
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATION_SCHEMA_MAJOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMajor() + "')");
|
||||||
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATED_SCHEMA_MINOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "')");
|
stmt.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATION_SCHEMA_MINOR_VERSION_KEY + "', '" + CURRENT_DB_SCHEMA_VERSION.getMinor() + "')");
|
||||||
|
|
||||||
// Create a separate instance and reference table for each artifact type
|
// Create a separate instance and reference table for each artifact type
|
||||||
List<CorrelationAttributeInstance.Type> DEFAULT_CORRELATION_TYPES = CorrelationAttributeInstance.getDefaultCorrelationTypes();
|
List<CorrelationAttributeInstance.Type> DEFAULT_CORRELATION_TYPES = CorrelationAttributeInstance.getDefaultCorrelationTypes();
|
||||||
@ -427,7 +425,7 @@ public final class SqliteEamDbSettings {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the template String for creating a new _instances table in a Sqlite
|
* Get the template String for creating a new _instances table in a Sqlite
|
||||||
* central repository. %s will exist in the template where the name of the
|
* central repository. %s will exist in the template where the name of the
|
||||||
@ -511,8 +509,8 @@ public final class SqliteEamDbSettings {
|
|||||||
* instance table. %s will exist in the template where the name of the new
|
* instance table. %s will exist in the template where the name of the new
|
||||||
* table will be addedd.
|
* table will be addedd.
|
||||||
*
|
*
|
||||||
* @return a String which is a template for adding an index to the file_obj_id
|
* @return a String which is a template for adding an index to the
|
||||||
* column of a _instances table
|
* file_obj_id column of a _instances table
|
||||||
*/
|
*/
|
||||||
static String getAddObjectIdIndexTemplate() {
|
static String getAddObjectIdIndexTemplate() {
|
||||||
// Each "%s" will be replaced with the relevant TYPE_instances table name.
|
// Each "%s" will be replaced with the relevant TYPE_instances table name.
|
||||||
|
@ -81,7 +81,7 @@ final public class CentralRepoCommonAttributeInstance extends AbstractCommonAttr
|
|||||||
|
|
||||||
// Find the correct data source
|
// Find the correct data source
|
||||||
Optional<DataSource> dataSource = tskDb.getDataSources().stream()
|
Optional<DataSource> dataSource = tskDb.getDataSources().stream()
|
||||||
.filter(p -> p.getDeviceId().equals(currentAttribute.getCorrelationDataSource().getDeviceID()))
|
.filter(p -> p.getId() == currentAttribute.getCorrelationDataSource().getDataSourceObjectID())
|
||||||
.findFirst();
|
.findFirst();
|
||||||
if (!dataSource.isPresent()) {
|
if (!dataSource.isPresent()) {
|
||||||
LOGGER.log(Level.WARNING, String.format("Unable to find data source with device ID %s in the current case", currentAttribute.getCorrelationDataSource().getDeviceID()));
|
LOGGER.log(Level.WARNING, String.format("Unable to find data source with device ID %s in the current case", currentAttribute.getCorrelationDataSource().getDeviceID()));
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
package org.sleuthkit.autopsy.commonfilesearch;
|
package org.sleuthkit.autopsy.commonfilesearch;
|
||||||
|
|
||||||
import org.sleuthkit.autopsy.guiutils.DataSourceComboBoxModel;
|
import org.sleuthkit.autopsy.guiutils.DataSourceComboBoxModel;
|
||||||
import org.sleuthkit.autopsy.guiutils.DataSourceLoader;
|
import org.sleuthkit.autopsy.datamodel.utils.DataSourceLoader;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -331,8 +331,8 @@ final class InterCaseSearchResultsProcessor {
|
|||||||
CorrelationCase correlationCase = EamDb.getInstance().getCaseById(InstanceTableCallback.getCaseId(resultSet));
|
CorrelationCase correlationCase = EamDb.getInstance().getCaseById(InstanceTableCallback.getCaseId(resultSet));
|
||||||
String caseName = correlationCase.getDisplayName();
|
String caseName = correlationCase.getDisplayName();
|
||||||
CorrelationDataSource correlationDatasource = EamDb.getInstance().getDataSourceById(correlationCase, InstanceTableCallback.getDataSourceId(resultSet));
|
CorrelationDataSource correlationDatasource = EamDb.getInstance().getDataSourceById(correlationCase, InstanceTableCallback.getDataSourceId(resultSet));
|
||||||
// String dataSourceName = correlationDatasource.getName();
|
//label datasource with it's id for uniqueness done in same manner as ImageGallery does in the DataSourceCell class
|
||||||
String dataSourceNameKey = correlationDatasource.getName() + correlationDatasource.getDataSourceObjectID();
|
String dataSourceNameKey = correlationDatasource.getName() + " (Id: " + correlationDatasource.getDataSourceObjectID() + ")";
|
||||||
if (!caseCollatedDataSourceCollections.containsKey(caseName)) {
|
if (!caseCollatedDataSourceCollections.containsKey(caseName)) {
|
||||||
caseCollatedDataSourceCollections.put(caseName, new HashMap<String, CommonAttributeValueList>());
|
caseCollatedDataSourceCollections.put(caseName, new HashMap<String, CommonAttributeValueList>());
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ public class FileViewer extends javax.swing.JPanel implements DataContentViewer
|
|||||||
private final Map<String, FileTypeViewer> mimeTypeToViewerMap = new HashMap<>();
|
private final Map<String, FileTypeViewer> mimeTypeToViewerMap = new HashMap<>();
|
||||||
|
|
||||||
// TBD: This hardcoded list of viewers should be replaced with a dynamic lookup
|
// TBD: This hardcoded list of viewers should be replaced with a dynamic lookup
|
||||||
private static final FileTypeViewer[] KNOWN_VIEWERS = new FileTypeViewer[]{
|
private final FileTypeViewer[] KNOWN_VIEWERS = new FileTypeViewer[]{
|
||||||
new SQLiteViewer(),
|
new SQLiteViewer(),
|
||||||
new PListViewer(),
|
new PListViewer(),
|
||||||
new MediaFileViewer()
|
new MediaFileViewer()
|
||||||
|
@ -27,7 +27,6 @@ import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
|
|||||||
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.Image;
|
import org.sleuthkit.datamodel.Image;
|
||||||
import org.sleuthkit.datamodel.DataSource;
|
|
||||||
import org.sleuthkit.datamodel.FsContent;
|
import org.sleuthkit.datamodel.FsContent;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM;
|
import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM;
|
||||||
@ -116,7 +115,7 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void addRow(StringBuilder sb, String key, String value) {
|
private void addRow(StringBuilder sb, String key, String value) {
|
||||||
sb.append("<tr><td>"); //NON-NLS
|
sb.append("<tr><td valign=\"top\">"); //NON-NLS
|
||||||
sb.append(key);
|
sb.append(key);
|
||||||
sb.append("</td><td>"); //NON-NLS
|
sb.append("</td><td>"); //NON-NLS
|
||||||
sb.append(value);
|
sb.append(value);
|
||||||
@ -238,6 +237,18 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer {
|
|||||||
addRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.timezone"), image.getTimeZone());
|
addRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.timezone"), image.getTimeZone());
|
||||||
addRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.deviceId"), image.getDeviceId());
|
addRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.deviceId"), image.getDeviceId());
|
||||||
addRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.internalid"), Long.toString(image.getId()));
|
addRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.internalid"), Long.toString(image.getId()));
|
||||||
|
|
||||||
|
// Add all the data source paths to the "Local Path" value cell.
|
||||||
|
String[] imagePaths = image.getPaths();
|
||||||
|
StringBuilder pathValues = new StringBuilder("<div>");
|
||||||
|
pathValues.append(imagePaths[0]);
|
||||||
|
pathValues.append("</div>");
|
||||||
|
for (int i=1; i < imagePaths.length; i++) {
|
||||||
|
pathValues.append("<div>");
|
||||||
|
pathValues.append(imagePaths[i]);
|
||||||
|
pathValues.append("</div>");
|
||||||
|
}
|
||||||
|
addRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.localPath"), pathValues.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
setText(sb.toString());
|
setText(sb.toString());
|
||||||
|
@ -457,10 +457,10 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
|||||||
*/
|
*/
|
||||||
private void initReader() {
|
private void initReader() {
|
||||||
viewReader = new SQLiteTableReader.Builder(sqliteDbFile)
|
viewReader = new SQLiteTableReader.Builder(sqliteDbFile)
|
||||||
.onColumnNames((columnName) -> {
|
.forAllColumnNames((columnName) -> {
|
||||||
currentTableHeader.add(columnName);
|
currentTableHeader.add(columnName);
|
||||||
})
|
})
|
||||||
.forAll(getForAllStrategy()).build();
|
.forAllTableValues(getForAllStrategy()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -510,8 +510,8 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
|||||||
String tableName = (String) this.tablesDropdownList.getSelectedItem();
|
String tableName = (String) this.tablesDropdownList.getSelectedItem();
|
||||||
try (FileOutputStream out = new FileOutputStream(csvFile, false)) {
|
try (FileOutputStream out = new FileOutputStream(csvFile, false)) {
|
||||||
try (SQLiteTableReader sqliteStream = new SQLiteTableReader.Builder(sqliteDbFile)
|
try (SQLiteTableReader sqliteStream = new SQLiteTableReader.Builder(sqliteDbFile)
|
||||||
.onColumnNames(getColumnNameCSVStrategy(out))
|
.forAllColumnNames(getColumnNameCSVStrategy(out))
|
||||||
.forAll(getForAllCSVStrategy(out)).build()) {
|
.forAllTableValues(getForAllCSVStrategy(out)).build()) {
|
||||||
totalColumnCount = sqliteStream.getColumnCount(tableName);
|
totalColumnCount = sqliteStream.getColumnCount(tableName);
|
||||||
sqliteStream.read(tableName);
|
sqliteStream.read(tableName);
|
||||||
}
|
}
|
||||||
|
@ -357,6 +357,24 @@ public final class CoordinationService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a specified node.
|
||||||
|
*
|
||||||
|
* @param category The desired category in the namespace.
|
||||||
|
* @param nodePath The node to be deleted.
|
||||||
|
*
|
||||||
|
* @throws CoordinationServiceException If there is an error deleting the
|
||||||
|
* node.
|
||||||
|
*/
|
||||||
|
void deleteNode(CategoryNode category, String nodePath) throws CoordinationServiceException {
|
||||||
|
String fullNodePath = getFullyQualifiedNodePath(category, nodePath);
|
||||||
|
try {
|
||||||
|
curator.delete().forPath(fullNodePath);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
throw new CoordinationServiceException(String.format("Failed to delete node %s", fullNodePath), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a list of the child nodes of a category in the namespace.
|
* Gets a list of the child nodes of a category in the namespace.
|
||||||
*
|
*
|
||||||
|
@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.core;
|
|||||||
|
|
||||||
import java.awt.Cursor;
|
import java.awt.Cursor;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
@ -29,6 +30,8 @@ import java.util.logging.Handler;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.embed.swing.JFXPanel;
|
import javafx.embed.swing.JFXPanel;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.openide.modules.InstalledFileLocator;
|
||||||
import org.openide.modules.ModuleInstall;
|
import org.openide.modules.ModuleInstall;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.windows.WindowManager;
|
import org.openide.windows.WindowManager;
|
||||||
@ -285,12 +288,34 @@ public class Installer extends ModuleInstall {
|
|||||||
File pythonModulesDir = new File(PlatformUtil.getUserPythonModulesPath());
|
File pythonModulesDir = new File(PlatformUtil.getUserPythonModulesPath());
|
||||||
pythonModulesDir.mkdir();
|
pythonModulesDir.mkdir();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make a folder in the config directory for Ocr Language Packs if one does
|
||||||
|
* not exist.
|
||||||
|
*/
|
||||||
|
private static void ensureOcrLanguagePacksFolderExists() {
|
||||||
|
File ocrLanguagePacksDir = new File(PlatformUtil.getOcrLanguagePacksPath());
|
||||||
|
boolean createDirectory = ocrLanguagePacksDir.mkdir();
|
||||||
|
|
||||||
|
//If the directory did not exist, copy the tessdata folder over so we
|
||||||
|
//support english.
|
||||||
|
if(createDirectory) {
|
||||||
|
File tessdataDir = InstalledFileLocator.getDefault().locate(
|
||||||
|
"Tesseract-OCR/tessdata", Installer.class.getPackage().getName(), false);
|
||||||
|
try {
|
||||||
|
FileUtils.copyDirectory(tessdataDir, ocrLanguagePacksDir);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
logger.log(Level.SEVERE, "Copying over default language packs for Tesseract failed.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void restored() {
|
public void restored() {
|
||||||
super.restored();
|
super.restored();
|
||||||
ensurePythonModulesFolderExists();
|
ensurePythonModulesFolderExists();
|
||||||
ensureClassifierFolderExists();
|
ensureClassifierFolderExists();
|
||||||
|
ensureOcrLanguagePacksFolderExists();
|
||||||
initJavaFx();
|
initJavaFx();
|
||||||
for (ModuleInstall mi : packageInstallers) {
|
for (ModuleInstall mi : packageInstallers) {
|
||||||
try {
|
try {
|
||||||
|
@ -173,9 +173,8 @@ ViewPreferencesPanel.currentSessionSettingsPanel.border.title=Current Session Se
|
|||||||
ViewPreferencesPanel.hideRejectedResultsCheckbox.text=Hide rejected results
|
ViewPreferencesPanel.hideRejectedResultsCheckbox.text=Hide rejected results
|
||||||
ViewPreferencesPanel.selectFileLabel.text=When selecting a file:
|
ViewPreferencesPanel.selectFileLabel.text=When selecting a file:
|
||||||
ViewPreferencesPanel.globalSettingsPanel.border.title=Global Settings
|
ViewPreferencesPanel.globalSettingsPanel.border.title=Global Settings
|
||||||
ViewPreferencesPanel.translateNamesInTableRadioButton.text=Table
|
|
||||||
ViewPreferencesPanel.commentsOccurencesColumnWrapAroundText.text=to reduce loading times
|
ViewPreferencesPanel.commentsOccurencesColumnWrapAroundText.text=to reduce loading times
|
||||||
ViewPreferencesPanel.translateTextLabel.text=Translate text in the:
|
ViewPreferencesPanel.translateTextLabel.text=Translate text:
|
||||||
ViewPreferencesPanel.commentsOccurencesColumnsCheckbox.text=C(omments) and O(ccurences) columns
|
ViewPreferencesPanel.commentsOccurencesColumnsCheckbox.text=C(omments) and O(ccurences) columns
|
||||||
ViewPreferencesPanel.centralRepoLabel.text=Do not use Central Repository for:
|
ViewPreferencesPanel.centralRepoLabel.text=Do not use Central Repository for:
|
||||||
ViewPreferencesPanel.hideOtherUsersTagsLabel.text=Hide other users' tags in the:
|
ViewPreferencesPanel.hideOtherUsersTagsLabel.text=Hide other users' tags in the:
|
||||||
@ -193,3 +192,4 @@ ViewPreferencesPanel.keepCurrentViewerRadioButton.toolTipText=For example, stay
|
|||||||
ViewPreferencesPanel.keepCurrentViewerRadioButton.text=Stay on the same file viewer
|
ViewPreferencesPanel.keepCurrentViewerRadioButton.text=Stay on the same file viewer
|
||||||
ViewPreferencesPanel.useBestViewerRadioButton.toolTipText=For example, change from Hex to Media when a JPEG is selected.
|
ViewPreferencesPanel.useBestViewerRadioButton.toolTipText=For example, change from Hex to Media when a JPEG is selected.
|
||||||
ViewPreferencesPanel.useBestViewerRadioButton.text=Change to the most specific file viewer
|
ViewPreferencesPanel.useBestViewerRadioButton.text=Change to the most specific file viewer
|
||||||
|
ViewPreferencesPanel.fileNameTranslationColumnCheckbox.text=Add column in result viewer for file name translation
|
||||||
|
@ -144,11 +144,11 @@
|
|||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace min="10" pref="10" max="-2" attributes="0"/>
|
<EmptySpace min="10" pref="10" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="fileNameTranslationColumnCheckbox" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="keepCurrentViewerRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="keepCurrentViewerRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="useBestViewerRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="useBestViewerRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="useLocalTimeRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="useLocalTimeRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="useAnotherTimeRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="useAnotherTimeRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="translateNamesInTableRadioButton" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
@ -203,7 +203,7 @@
|
|||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="translateTextLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="translateTextLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="translateNamesInTableRadioButton" min="-2" max="-2" attributes="0"/>
|
<Component id="fileNameTranslationColumnCheckbox" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
@ -397,14 +397,14 @@
|
|||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JRadioButton" name="translateNamesInTableRadioButton">
|
<Component class="javax.swing.JCheckBox" name="fileNameTranslationColumnCheckbox">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="ViewPreferencesPanel.translateNamesInTableRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="ViewPreferencesPanel.fileNameTranslationColumnCheckbox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="translateNamesInTableRadioButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fileNameTranslationColumnCheckboxActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
|
@ -80,10 +80,10 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
commentsOccurencesColumnsCheckbox.setSelected(UserPreferences.hideCentralRepoCommentsAndOccurrences());
|
commentsOccurencesColumnsCheckbox.setSelected(UserPreferences.hideCentralRepoCommentsAndOccurrences());
|
||||||
|
|
||||||
hideOtherUsersTagsCheckbox.setSelected(UserPreferences.showOnlyCurrentUserTags());
|
hideOtherUsersTagsCheckbox.setSelected(UserPreferences.showOnlyCurrentUserTags());
|
||||||
translateNamesInTableRadioButton.setSelected(UserPreferences.displayTranslatedFileNames());
|
fileNameTranslationColumnCheckbox.setSelected(UserPreferences.displayTranslatedFileNames());
|
||||||
|
|
||||||
TextTranslationService tts = TextTranslationService.getInstance();
|
TextTranslationService tts = TextTranslationService.getInstance();
|
||||||
translateNamesInTableRadioButton.setEnabled(tts.hasProvider());
|
fileNameTranslationColumnCheckbox.setEnabled(tts.hasProvider());
|
||||||
|
|
||||||
// Current Case Settings
|
// Current Case Settings
|
||||||
boolean caseIsOpen = Case.isCaseOpen();
|
boolean caseIsOpen = Case.isCaseOpen();
|
||||||
@ -113,7 +113,7 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
UserPreferences.setHideSlackFilesInViewsTree(viewsHideSlackCheckbox.isSelected());
|
UserPreferences.setHideSlackFilesInViewsTree(viewsHideSlackCheckbox.isSelected());
|
||||||
UserPreferences.setShowOnlyCurrentUserTags(hideOtherUsersTagsCheckbox.isSelected());
|
UserPreferences.setShowOnlyCurrentUserTags(hideOtherUsersTagsCheckbox.isSelected());
|
||||||
UserPreferences.setHideCentralRepoCommentsAndOccurrences(commentsOccurencesColumnsCheckbox.isSelected());
|
UserPreferences.setHideCentralRepoCommentsAndOccurrences(commentsOccurencesColumnsCheckbox.isSelected());
|
||||||
UserPreferences.setDisplayTranslatedFileNames(translateNamesInTableRadioButton.isSelected());
|
UserPreferences.setDisplayTranslatedFileNames(fileNameTranslationColumnCheckbox.isSelected());
|
||||||
|
|
||||||
storeGroupItemsInTreeByDataSource();
|
storeGroupItemsInTreeByDataSource();
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
timeZoneList = new javax.swing.JList<>();
|
timeZoneList = new javax.swing.JList<>();
|
||||||
translateTextLabel = new javax.swing.JLabel();
|
translateTextLabel = new javax.swing.JLabel();
|
||||||
commentsOccurencesColumnWrapAroundText = new javax.swing.JLabel();
|
commentsOccurencesColumnWrapAroundText = new javax.swing.JLabel();
|
||||||
translateNamesInTableRadioButton = new javax.swing.JRadioButton();
|
fileNameTranslationColumnCheckbox = new javax.swing.JCheckBox();
|
||||||
currentCaseSettingsPanel = new javax.swing.JPanel();
|
currentCaseSettingsPanel = new javax.swing.JPanel();
|
||||||
groupByDataSourceCheckbox = new javax.swing.JCheckBox();
|
groupByDataSourceCheckbox = new javax.swing.JCheckBox();
|
||||||
currentSessionSettingsPanel = new javax.swing.JPanel();
|
currentSessionSettingsPanel = new javax.swing.JPanel();
|
||||||
@ -277,10 +277,10 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(commentsOccurencesColumnWrapAroundText, org.openide.util.NbBundle.getMessage(ViewPreferencesPanel.class, "ViewPreferencesPanel.commentsOccurencesColumnWrapAroundText.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(commentsOccurencesColumnWrapAroundText, org.openide.util.NbBundle.getMessage(ViewPreferencesPanel.class, "ViewPreferencesPanel.commentsOccurencesColumnWrapAroundText.text")); // NOI18N
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(translateNamesInTableRadioButton, org.openide.util.NbBundle.getMessage(ViewPreferencesPanel.class, "ViewPreferencesPanel.translateNamesInTableRadioButton.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(fileNameTranslationColumnCheckbox, org.openide.util.NbBundle.getMessage(ViewPreferencesPanel.class, "ViewPreferencesPanel.fileNameTranslationColumnCheckbox.text")); // NOI18N
|
||||||
translateNamesInTableRadioButton.addActionListener(new java.awt.event.ActionListener() {
|
fileNameTranslationColumnCheckbox.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
translateNamesInTableRadioButtonActionPerformed(evt);
|
fileNameTranslationColumnCheckboxActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -329,11 +329,11 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
.addGroup(globalSettingsPanelLayout.createSequentialGroup()
|
.addGroup(globalSettingsPanelLayout.createSequentialGroup()
|
||||||
.addGap(10, 10, 10)
|
.addGap(10, 10, 10)
|
||||||
.addGroup(globalSettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(globalSettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(fileNameTranslationColumnCheckbox)
|
||||||
.addComponent(keepCurrentViewerRadioButton)
|
.addComponent(keepCurrentViewerRadioButton)
|
||||||
.addComponent(useBestViewerRadioButton)
|
.addComponent(useBestViewerRadioButton)
|
||||||
.addComponent(useLocalTimeRadioButton)
|
.addComponent(useLocalTimeRadioButton)
|
||||||
.addComponent(useAnotherTimeRadioButton)
|
.addComponent(useAnotherTimeRadioButton))))))
|
||||||
.addComponent(translateNamesInTableRadioButton))))))
|
|
||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
globalSettingsPanelLayout.setVerticalGroup(
|
globalSettingsPanelLayout.setVerticalGroup(
|
||||||
@ -380,7 +380,7 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(translateTextLabel)
|
.addComponent(translateTextLabel)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(translateNamesInTableRadioButton)))
|
.addComponent(fileNameTranslationColumnCheckbox)))
|
||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -487,14 +487,6 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
}
|
}
|
||||||
}//GEN-LAST:event_hideRejectedResultsCheckboxActionPerformed
|
}//GEN-LAST:event_hideRejectedResultsCheckboxActionPerformed
|
||||||
|
|
||||||
private void translateNamesInTableRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_translateNamesInTableRadioButtonActionPerformed
|
|
||||||
if (immediateUpdates) {
|
|
||||||
UserPreferences.setDisplayTranslatedFileNames(translateNamesInTableRadioButton.isSelected());
|
|
||||||
} else {
|
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
|
||||||
}
|
|
||||||
}//GEN-LAST:event_translateNamesInTableRadioButtonActionPerformed
|
|
||||||
|
|
||||||
private void timeZoneListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_timeZoneListValueChanged
|
private void timeZoneListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_timeZoneListValueChanged
|
||||||
if (immediateUpdates && useAnotherTimeRadioButton.isSelected()) {
|
if (immediateUpdates && useAnotherTimeRadioButton.isSelected()) {
|
||||||
UserPreferences.setTimeZoneForDisplays(timeZoneList.getSelectedValue().substring(11).trim());
|
UserPreferences.setTimeZoneForDisplays(timeZoneList.getSelectedValue().substring(11).trim());
|
||||||
@ -593,6 +585,14 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
}
|
}
|
||||||
}//GEN-LAST:event_useBestViewerRadioButtonActionPerformed
|
}//GEN-LAST:event_useBestViewerRadioButtonActionPerformed
|
||||||
|
|
||||||
|
private void fileNameTranslationColumnCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileNameTranslationColumnCheckboxActionPerformed
|
||||||
|
if (immediateUpdates) {
|
||||||
|
UserPreferences.setDisplayTranslatedFileNames(fileNameTranslationColumnCheckbox.isSelected());
|
||||||
|
} else {
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_fileNameTranslationColumnCheckboxActionPerformed
|
||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private javax.swing.JLabel centralRepoLabel;
|
private javax.swing.JLabel centralRepoLabel;
|
||||||
@ -603,6 +603,7 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
private javax.swing.JCheckBox dataSourcesHideKnownCheckbox;
|
private javax.swing.JCheckBox dataSourcesHideKnownCheckbox;
|
||||||
private javax.swing.JCheckBox dataSourcesHideSlackCheckbox;
|
private javax.swing.JCheckBox dataSourcesHideSlackCheckbox;
|
||||||
private javax.swing.JLabel displayTimeLabel;
|
private javax.swing.JLabel displayTimeLabel;
|
||||||
|
private javax.swing.JCheckBox fileNameTranslationColumnCheckbox;
|
||||||
private javax.swing.JPanel globalSettingsPanel;
|
private javax.swing.JPanel globalSettingsPanel;
|
||||||
private javax.swing.JCheckBox groupByDataSourceCheckbox;
|
private javax.swing.JCheckBox groupByDataSourceCheckbox;
|
||||||
private javax.swing.JLabel hideKnownFilesLabel;
|
private javax.swing.JLabel hideKnownFilesLabel;
|
||||||
@ -614,7 +615,6 @@ public class ViewPreferencesPanel extends JPanel implements OptionsPanel {
|
|||||||
private javax.swing.JRadioButton keepCurrentViewerRadioButton;
|
private javax.swing.JRadioButton keepCurrentViewerRadioButton;
|
||||||
private javax.swing.JLabel selectFileLabel;
|
private javax.swing.JLabel selectFileLabel;
|
||||||
private javax.swing.JList<String> timeZoneList;
|
private javax.swing.JList<String> timeZoneList;
|
||||||
private javax.swing.JRadioButton translateNamesInTableRadioButton;
|
|
||||||
private javax.swing.JLabel translateTextLabel;
|
private javax.swing.JLabel translateTextLabel;
|
||||||
private javax.swing.JRadioButton useAnotherTimeRadioButton;
|
private javax.swing.JRadioButton useAnotherTimeRadioButton;
|
||||||
private javax.swing.JRadioButton useBestViewerRadioButton;
|
private javax.swing.JRadioButton useBestViewerRadioButton;
|
||||||
|
@ -52,6 +52,7 @@ public class PlatformUtil {
|
|||||||
|
|
||||||
private static final String PYTHON_MODULES_SUBDIRECTORY = "python_modules"; //NON-NLS
|
private static final String PYTHON_MODULES_SUBDIRECTORY = "python_modules"; //NON-NLS
|
||||||
private static final String CLASSIFIERS_SUBDIRECTORY = "object_detection_classifiers"; //NON-NLS
|
private static final String CLASSIFIERS_SUBDIRECTORY = "object_detection_classifiers"; //NON-NLS
|
||||||
|
private static final String OCR_LANGUAGE_SUBDIRECTORY = "ocr_language_packs"; //NON-NLS
|
||||||
private static String javaPath = null;
|
private static String javaPath = null;
|
||||||
public static final String OS_NAME_UNKNOWN = NbBundle.getMessage(PlatformUtil.class, "PlatformUtil.nameUnknown");
|
public static final String OS_NAME_UNKNOWN = NbBundle.getMessage(PlatformUtil.class, "PlatformUtil.nameUnknown");
|
||||||
public static final String OS_VERSION_UNKNOWN = NbBundle.getMessage(PlatformUtil.class, "PlatformUtil.verUnknown");
|
public static final String OS_VERSION_UNKNOWN = NbBundle.getMessage(PlatformUtil.class, "PlatformUtil.verUnknown");
|
||||||
@ -116,6 +117,15 @@ public class PlatformUtil {
|
|||||||
public static String getUserPythonModulesPath() {
|
public static String getUserPythonModulesPath() {
|
||||||
return getUserDirectory().getAbsolutePath() + File.separator + PYTHON_MODULES_SUBDIRECTORY;
|
return getUserDirectory().getAbsolutePath() + File.separator + PYTHON_MODULES_SUBDIRECTORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get root path where the user's Ocr language packs are stored.
|
||||||
|
*
|
||||||
|
* @return Absolute path to the Ocr language packs root directory.
|
||||||
|
*/
|
||||||
|
public static String getOcrLanguagePacksPath() {
|
||||||
|
return getUserDirectory().getAbsolutePath() + File.separator + OCR_LANGUAGE_SUBDIRECTORY;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get root path where the user's object detection classifiers are stored.
|
* Get root path where the user's object detection classifiers are stored.
|
||||||
|
@ -42,30 +42,14 @@ import org.sleuthkit.datamodel.SleuthkitCase;
|
|||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads row by row through SQLite tables and performs user-defined actions on
|
* Reads through SQLite tables row by row. Functions performed on the
|
||||||
* the row values. Table values are processed by data type. Users configure
|
* data must be declared up front to the Builder. For example:
|
||||||
* these actions for certain data types in the Builder. Example usage:
|
|
||||||
*
|
|
||||||
* SQLiteTableReader reader = new SQLiteTableReader.Builder(file)
|
|
||||||
* .onInteger((i)
|
|
||||||
* -> { System.out.println(i); })
|
|
||||||
* .build();
|
|
||||||
*
|
|
||||||
* reader.read(tableName);
|
|
||||||
*
|
|
||||||
* or
|
|
||||||
*
|
|
||||||
* SQLiteTableReader reader = new SQLiteTableReader.Builder(file)
|
|
||||||
* .onInteger(new Consumer<Integer>() {
|
|
||||||
* (atSymbol)Override public void accept(Integer i) {
|
|
||||||
* System.out.println(i);
|
|
||||||
* }
|
|
||||||
* }).build();
|
|
||||||
*
|
*
|
||||||
* reader.reader(tableName);
|
* tableReader = new SQLiteTableReader.Builder(file).forAllColumnNames(System.out::println);
|
||||||
*
|
* tableReader.read("Sample Table X");
|
||||||
* Invocation of read(String tableName) reads row by row. When an Integer is
|
*
|
||||||
* encountered, its value will be passed to the Consumer that was defined above.
|
* By declaring the functions up front, the SQLiteTableReader instance can stream the
|
||||||
|
* table contents in the most memory efficient manner.
|
||||||
*/
|
*/
|
||||||
public class SQLiteTableReader implements AutoCloseable {
|
public class SQLiteTableReader implements AutoCloseable {
|
||||||
|
|
||||||
@ -76,13 +60,13 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
|
|
||||||
private final AbstractFile file;
|
private final AbstractFile file;
|
||||||
|
|
||||||
private Consumer<String> onColumnNameAction;
|
private Consumer<String> forAllColumnNamesConsumer;
|
||||||
private Consumer<String> onStringAction;
|
private Consumer<String> forAllStringValuesConsumer;
|
||||||
private Consumer<Long> onLongAction;
|
private Consumer<Long> forAllLongValuesConsumer;
|
||||||
private Consumer<Integer> onIntegerAction;
|
private Consumer<Integer> forAllIntegerValuesConsumer;
|
||||||
private Consumer<Double> onFloatAction;
|
private Consumer<Double> forAllFloatValuesConsumer;
|
||||||
private Consumer<byte[]> onBlobAction;
|
private Consumer<byte[]> forAllBlobValuesConsumer;
|
||||||
private Consumer<Object> forAllAction;
|
private Consumer<Object> forAllTableValuesConsumer;
|
||||||
|
|
||||||
static <T> Consumer<T> doNothing() {
|
static <T> Consumer<T> doNothing() {
|
||||||
return NOOP -> {};
|
return NOOP -> {};
|
||||||
@ -96,13 +80,13 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
public Builder(AbstractFile file) {
|
public Builder(AbstractFile file) {
|
||||||
this.file = file;
|
this.file = file;
|
||||||
|
|
||||||
this.onColumnNameAction = Builder.doNothing();
|
this.forAllColumnNamesConsumer = Builder.doNothing();
|
||||||
this.onStringAction = Builder.doNothing();
|
this.forAllStringValuesConsumer = Builder.doNothing();
|
||||||
this.onLongAction = Builder.doNothing();
|
this.forAllLongValuesConsumer = Builder.doNothing();
|
||||||
this.onIntegerAction = Builder.doNothing();
|
this.forAllIntegerValuesConsumer = Builder.doNothing();
|
||||||
this.onFloatAction = Builder.doNothing();
|
this.forAllFloatValuesConsumer = Builder.doNothing();
|
||||||
this.onBlobAction = Builder.doNothing();
|
this.forAllBlobValuesConsumer = Builder.doNothing();
|
||||||
this.forAllAction = Builder.doNothing();
|
this.forAllTableValuesConsumer = Builder.doNothing();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -113,8 +97,8 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
*
|
*
|
||||||
* @return Builder reference
|
* @return Builder reference
|
||||||
*/
|
*/
|
||||||
public Builder onColumnNames(Consumer<String> action) {
|
public Builder forAllColumnNames(Consumer<String> action) {
|
||||||
this.onColumnNameAction = action;
|
this.forAllColumnNamesConsumer = action;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,8 +110,8 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
*
|
*
|
||||||
* @return Builder reference
|
* @return Builder reference
|
||||||
*/
|
*/
|
||||||
public Builder onString(Consumer<String> action) {
|
public Builder forAllStringValues(Consumer<String> action) {
|
||||||
this.onStringAction = action;
|
this.forAllStringValuesConsumer = action;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,8 +123,8 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
*
|
*
|
||||||
* @return Builder reference
|
* @return Builder reference
|
||||||
*/
|
*/
|
||||||
public Builder onInteger(Consumer<Integer> action) {
|
public Builder forAllIntegerValues(Consumer<Integer> action) {
|
||||||
this.onIntegerAction = action;
|
this.forAllIntegerValuesConsumer = action;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,8 +136,8 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
*
|
*
|
||||||
* @return Builder reference
|
* @return Builder reference
|
||||||
*/
|
*/
|
||||||
public Builder onFloat(Consumer<Double> action) {
|
public Builder forAllFloatValues(Consumer<Double> action) {
|
||||||
this.onFloatAction = action;
|
this.forAllFloatValuesConsumer = action;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,8 +149,8 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
*
|
*
|
||||||
* @return Builder reference
|
* @return Builder reference
|
||||||
*/
|
*/
|
||||||
public Builder onLong(Consumer<Long> action) {
|
public Builder forAllLongValues(Consumer<Long> action) {
|
||||||
this.onLongAction = action;
|
this.forAllLongValuesConsumer = action;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,8 +162,8 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
*
|
*
|
||||||
* @return Builder reference
|
* @return Builder reference
|
||||||
*/
|
*/
|
||||||
public Builder onBlob(Consumer<byte[]> action) {
|
public Builder forAllBlobValues(Consumer<byte[]> action) {
|
||||||
this.onBlobAction = action;
|
this.forAllBlobValuesConsumer = action;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,8 +176,8 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
*
|
*
|
||||||
* @return Builder reference
|
* @return Builder reference
|
||||||
*/
|
*/
|
||||||
public Builder forAll(Consumer<Object> action) {
|
public Builder forAllTableValues(Consumer<Object> action) {
|
||||||
this.forAllAction = action;
|
this.forAllTableValuesConsumer = action;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,7 +350,7 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
if (condition.getAsBoolean()) {
|
if (condition.getAsBoolean()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
builder.onColumnNameAction.accept(currentMetadata
|
builder.forAllColumnNamesConsumer.accept(currentMetadata
|
||||||
.getColumnName(++columnNameIndex));
|
.getColumnName(++columnNameIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -379,18 +363,18 @@ public class SQLiteTableReader implements AutoCloseable {
|
|||||||
|
|
||||||
Object item = queryResults.getObject(++currRowColumnIndex);
|
Object item = queryResults.getObject(++currRowColumnIndex);
|
||||||
if (item instanceof String) {
|
if (item instanceof String) {
|
||||||
builder.onStringAction.accept((String) item);
|
builder.forAllStringValuesConsumer.accept((String) item);
|
||||||
} else if (item instanceof Integer) {
|
} else if (item instanceof Integer) {
|
||||||
builder.onIntegerAction.accept((Integer) item);
|
builder.forAllIntegerValuesConsumer.accept((Integer) item);
|
||||||
} else if (item instanceof Double) {
|
} else if (item instanceof Double) {
|
||||||
builder.onFloatAction.accept((Double) item);
|
builder.forAllFloatValuesConsumer.accept((Double) item);
|
||||||
} else if (item instanceof Long) {
|
} else if (item instanceof Long) {
|
||||||
builder.onLongAction.accept((Long) item);
|
builder.forAllLongValuesConsumer.accept((Long) item);
|
||||||
} else if (item instanceof byte[]) {
|
} else if (item instanceof byte[]) {
|
||||||
builder.onBlobAction.accept((byte[]) item);
|
builder.forAllBlobValuesConsumer.accept((byte[]) item);
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.forAllAction.accept(item);
|
builder.forAllTableValuesConsumer.accept(item);
|
||||||
}
|
}
|
||||||
unfinishedRow = false;
|
unfinishedRow = false;
|
||||||
//Wrap column index back around if we've reached the end of the row
|
//Wrap column index back around if we've reached the end of the row
|
||||||
|
@ -31,7 +31,7 @@ import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootChildren.FileSizeNod
|
|||||||
import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootNode;
|
import org.sleuthkit.autopsy.datamodel.FileSize.FileSizeRootNode;
|
||||||
import org.sleuthkit.autopsy.datamodel.FileTypes.FileTypesNode;
|
import org.sleuthkit.autopsy.datamodel.FileTypes.FileTypesNode;
|
||||||
import org.sleuthkit.autopsy.datamodel.accounts.Accounts;
|
import org.sleuthkit.autopsy.datamodel.accounts.Accounts;
|
||||||
import org.sleuthkit.autopsy.othercasessearch.CorrelationAttributeInstanceNode;
|
import org.sleuthkit.autopsy.allcasessearch.CorrelationAttributeInstanceNode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Visitor pattern that goes over all nodes in the directory tree. This includes
|
* Visitor pattern that goes over all nodes in the directory tree. This includes
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.guiutils;
|
package org.sleuthkit.autopsy.datamodel.utils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
@ -46,10 +46,10 @@ import java.awt.GridLayout;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import org.openide.modules.Places;
|
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dashboard for viewing metrics and controlling the health monitor.
|
* Dashboard for viewing metrics and controlling the health monitor.
|
||||||
@ -58,8 +58,8 @@ public class HealthMonitorDashboard {
|
|||||||
|
|
||||||
private final static Logger logger = Logger.getLogger(HealthMonitorDashboard.class.getName());
|
private final static Logger logger = Logger.getLogger(HealthMonitorDashboard.class.getName());
|
||||||
|
|
||||||
private final static String ADMIN_ACCESS_FILE_NAME = "adminAccess"; // NON-NLS
|
private final static String ADMIN_ACCESS_FILE_NAME = "_aiaa"; // NON-NLS
|
||||||
private final static String ADMIN_ACCESS_FILE_PATH = Paths.get(Places.getUserDirectory().getAbsolutePath(), ADMIN_ACCESS_FILE_NAME).toString();
|
private final static String ADMIN_ACCESS_FILE_PATH = Paths.get(PlatformUtil.getUserConfigDirectory(), ADMIN_ACCESS_FILE_NAME).toString();
|
||||||
|
|
||||||
Map<String, List<HealthMonitor.DatabaseTimingResult>> timingData;
|
Map<String, List<HealthMonitor.DatabaseTimingResult>> timingData;
|
||||||
List<HealthMonitor.UserData> userData;
|
List<HealthMonitor.UserData> userData;
|
||||||
|
@ -39,6 +39,7 @@ public abstract class DataSourceAnalysisEvent extends AutopsyEvent implements Se
|
|||||||
private final long ingestJobId;
|
private final long ingestJobId;
|
||||||
private final long dataSourceIngestJobId;
|
private final long dataSourceIngestJobId;
|
||||||
private transient Content dataSource;
|
private transient Content dataSource;
|
||||||
|
private final long dataSourceObjectId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs an instance of the base class for events published in
|
* Constructs an instance of the base class for events published in
|
||||||
@ -56,6 +57,7 @@ public abstract class DataSourceAnalysisEvent extends AutopsyEvent implements Se
|
|||||||
this.ingestJobId = ingestJobId;
|
this.ingestJobId = ingestJobId;
|
||||||
this.dataSourceIngestJobId = dataSourceIngestJobId;
|
this.dataSourceIngestJobId = dataSourceIngestJobId;
|
||||||
this.dataSource = dataSource;
|
this.dataSource = dataSource;
|
||||||
|
this.dataSourceObjectId = dataSource.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -81,7 +83,8 @@ public abstract class DataSourceAnalysisEvent extends AutopsyEvent implements Se
|
|||||||
/**
|
/**
|
||||||
* Gets the data source associated with this event.
|
* Gets the data source associated with this event.
|
||||||
*
|
*
|
||||||
* @return The data source.
|
* @return The data source or null if there is an error getting the data
|
||||||
|
* source from an event published by a remote node.
|
||||||
*/
|
*/
|
||||||
public Content getDataSource() {
|
public Content getDataSource() {
|
||||||
/**
|
/**
|
||||||
@ -96,11 +99,10 @@ public abstract class DataSourceAnalysisEvent extends AutopsyEvent implements Se
|
|||||||
return dataSource;
|
return dataSource;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
long id = (Long) super.getNewValue();
|
dataSource = Case.getCurrentCaseThrows().getSleuthkitCase().getContentById(dataSourceObjectId);
|
||||||
dataSource = Case.getCurrentCaseThrows().getSleuthkitCase().getContentById(id);
|
|
||||||
return dataSource;
|
return dataSource;
|
||||||
} catch (NoCurrentCaseException | TskCoreException ex) {
|
} catch (NoCurrentCaseException | TskCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Error doing lazy load for remote event", ex); //NON-NLS
|
logger.log(Level.SEVERE, String.format("Error doing lazy load of data source (objId=%d) for remote event", this.dataSourceObjectId), ex); //NON-NLS
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -243,12 +243,15 @@ class ReportCaseUco implements GeneralReportModule {
|
|||||||
catalog.writeStringField("@type", "Trace");
|
catalog.writeStringField("@type", "Trace");
|
||||||
|
|
||||||
catalog.writeFieldName("propertyBundle");
|
catalog.writeFieldName("propertyBundle");
|
||||||
catalog.writeStartArray();
|
catalog.writeStartArray();
|
||||||
|
|
||||||
catalog.writeStartObject();
|
catalog.writeStartObject();
|
||||||
|
|
||||||
|
// replace double slashes with single ones
|
||||||
|
caseDirPath = caseDirPath.replaceAll("\\\\", "/");
|
||||||
|
|
||||||
catalog.writeStringField("@type", "File");
|
catalog.writeStringField("@type", "File");
|
||||||
if (dbType == TskData.DbType.SQLITE) {
|
if (dbType == TskData.DbType.SQLITE) {
|
||||||
catalog.writeStringField("filePath", caseDirPath + java.io.File.separator + dbFileName);
|
catalog.writeStringField("filePath", caseDirPath + "/" + dbFileName);
|
||||||
catalog.writeBooleanField("isDirectory", false);
|
catalog.writeBooleanField("isDirectory", false);
|
||||||
} else {
|
} else {
|
||||||
catalog.writeStringField("filePath", caseDirPath);
|
catalog.writeStringField("filePath", caseDirPath);
|
||||||
@ -300,7 +303,7 @@ class ReportCaseUco implements GeneralReportModule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return saveDataSourceInCaseUcoFormat(jsonGenerator, imageName, imageSize, selectedDataSourceId, caseTraceId);
|
return saveDataSourceInCaseUcoFormat(jsonGenerator, imageName, imageSize, selectedDataSourceId, caseTraceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,6 +320,10 @@ class ReportCaseUco implements GeneralReportModule {
|
|||||||
|
|
||||||
catalog.writeStartObject();
|
catalog.writeStartObject();
|
||||||
catalog.writeStringField("@type", "File");
|
catalog.writeStringField("@type", "File");
|
||||||
|
|
||||||
|
// replace double back slashes with single ones
|
||||||
|
imageName = imageName.replaceAll("\\\\", "/");
|
||||||
|
|
||||||
catalog.writeStringField("filePath", imageName);
|
catalog.writeStringField("filePath", imageName);
|
||||||
catalog.writeEndObject();
|
catalog.writeEndObject();
|
||||||
|
|
||||||
@ -391,7 +398,7 @@ class ReportCaseUco implements GeneralReportModule {
|
|||||||
catalog.writeStartArray();
|
catalog.writeStartArray();
|
||||||
catalog.writeStartObject();
|
catalog.writeStartObject();
|
||||||
catalog.writeStringField("@type", "Hash");
|
catalog.writeStringField("@type", "Hash");
|
||||||
catalog.writeStringField("hashMethod", "SHA256");
|
catalog.writeStringField("hashMethod", "MD5");
|
||||||
catalog.writeStringField("hashValue", md5Hash);
|
catalog.writeStringField("hashValue", md5Hash);
|
||||||
catalog.writeEndObject();
|
catalog.writeEndObject();
|
||||||
catalog.writeEndArray();
|
catalog.writeEndArray();
|
||||||
|
@ -24,7 +24,7 @@ import java.util.Map;
|
|||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import javax.swing.ComboBoxModel;
|
import javax.swing.ComboBoxModel;
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.guiutils.DataSourceLoader;
|
import org.sleuthkit.autopsy.datamodel.utils.DataSourceLoader;
|
||||||
import org.sleuthkit.autopsy.guiutils.DataSourceComboBoxModel;
|
import org.sleuthkit.autopsy.guiutils.DataSourceComboBoxModel;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
|
@ -185,10 +185,10 @@ class SevenZipExtractor {
|
|||||||
//As a result, many corrupted files have wonky compression ratios and could flood the UI
|
//As a result, many corrupted files have wonky compression ratios and could flood the UI
|
||||||
//with false zip bomb notifications. The decision was made to skip compression ratio checks
|
//with false zip bomb notifications. The decision was made to skip compression ratio checks
|
||||||
//for unallocated zip files. Instead, we let the depth be an indicator of a zip bomb.
|
//for unallocated zip files. Instead, we let the depth be an indicator of a zip bomb.
|
||||||
if(archiveFile.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.UNALLOC)) {
|
if (archiveFile.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.UNALLOC)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final Long archiveItemSize = (Long) inArchive.getProperty(
|
final Long archiveItemSize = (Long) inArchive.getProperty(
|
||||||
inArchiveItemIndex, PropID.SIZE);
|
inArchiveItemIndex, PropID.SIZE);
|
||||||
@ -253,14 +253,14 @@ class SevenZipExtractor {
|
|||||||
attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_COMMENT,
|
attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_COMMENT,
|
||||||
EmbeddedFileExtractorModuleFactory.getModuleName(),
|
EmbeddedFileExtractorModuleFactory.getModuleName(),
|
||||||
details));
|
details));
|
||||||
|
|
||||||
SleuthkitCase tskCase = Case.getCurrentCaseThrows().getSleuthkitCase();
|
SleuthkitCase tskCase = Case.getCurrentCaseThrows().getSleuthkitCase();
|
||||||
org.sleuthkit.datamodel.Blackboard tskBlackboard = tskCase.getBlackboard();
|
org.sleuthkit.datamodel.Blackboard tskBlackboard = tskCase.getBlackboard();
|
||||||
// Create artifact if it doesn't already exist.
|
// Create artifact if it doesn't already exist.
|
||||||
if (!tskBlackboard.artifactExists(archiveFile, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, attributes)) {
|
if (!tskBlackboard.artifactExists(archiveFile, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, attributes)) {
|
||||||
BlackboardArtifact artifact = archiveFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
|
BlackboardArtifact artifact = archiveFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
|
||||||
artifact.addAttributes(attributes);
|
artifact.addAttributes(attributes);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// index the artifact for keyword search
|
// index the artifact for keyword search
|
||||||
blackboard.indexArtifact(artifact);
|
blackboard.indexArtifact(artifact);
|
||||||
@ -269,9 +269,9 @@ class SevenZipExtractor {
|
|||||||
MessageNotifyUtil.Notify.error(
|
MessageNotifyUtil.Notify.error(
|
||||||
Bundle.SevenZipExtractor_indexError_message(), artifact.getDisplayName());
|
Bundle.SevenZipExtractor_indexError_message(), artifact.getDisplayName());
|
||||||
}
|
}
|
||||||
|
|
||||||
services.postMessage(IngestMessage.createWarningMessage(EmbeddedFileExtractorModuleFactory.getModuleName(), msg, details));
|
services.postMessage(IngestMessage.createWarningMessage(EmbeddedFileExtractorModuleFactory.getModuleName(), msg, details));
|
||||||
|
|
||||||
services.fireModuleDataEvent(new ModuleDataEvent(EmbeddedFileExtractorModuleFactory.getModuleName(), BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT));
|
services.fireModuleDataEvent(new ModuleDataEvent(EmbeddedFileExtractorModuleFactory.getModuleName(), BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT));
|
||||||
}
|
}
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
@ -370,11 +370,7 @@ class SevenZipExtractor {
|
|||||||
* @return the archiveFilePath to be used by the unpack method
|
* @return the archiveFilePath to be used by the unpack method
|
||||||
*/
|
*/
|
||||||
private String getArchiveFilePath(AbstractFile archiveFile) {
|
private String getArchiveFilePath(AbstractFile archiveFile) {
|
||||||
try {
|
return archiveFile.getParentPath() + archiveFile.getName();
|
||||||
return archiveFile.getUniquePath();
|
|
||||||
} catch (TskCoreException ex) {
|
|
||||||
return archiveFile.getParentPath() + archiveFile.getName();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -808,37 +804,37 @@ class SevenZipExtractor {
|
|||||||
.mapToInt(Integer::intValue)
|
.mapToInt(Integer::intValue)
|
||||||
.toArray();
|
.toArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UnpackStream used by the SevenZipBindings to do archive extraction. A memory
|
* UnpackStream used by the SevenZipBindings to do archive extraction. A
|
||||||
* leak exists in the SevenZip library that will not let go of the streams until
|
* memory leak exists in the SevenZip library that will not let go of the
|
||||||
* the entire archive extraction is complete. Instead of creating a new UnpackStream
|
* streams until the entire archive extraction is complete. Instead of
|
||||||
* for every file in the archive, instead we just rebase our EncodedFileOutputStream pointer
|
* creating a new UnpackStream for every file in the archive, instead we
|
||||||
* for every new file.
|
* just rebase our EncodedFileOutputStream pointer for every new file.
|
||||||
*/
|
*/
|
||||||
private final static class UnpackStream implements ISequentialOutStream {
|
private final static class UnpackStream implements ISequentialOutStream {
|
||||||
|
|
||||||
private EncodedFileOutputStream output;
|
private EncodedFileOutputStream output;
|
||||||
private String localAbsPath;
|
private String localAbsPath;
|
||||||
private int bytesWritten;
|
private int bytesWritten;
|
||||||
|
|
||||||
UnpackStream(String localAbsPath) throws IOException {
|
UnpackStream(String localAbsPath) throws IOException {
|
||||||
this.output = new EncodedFileOutputStream(new FileOutputStream(localAbsPath), TskData.EncodingType.XOR1);
|
this.output = new EncodedFileOutputStream(new FileOutputStream(localAbsPath), TskData.EncodingType.XOR1);
|
||||||
this.localAbsPath = localAbsPath;
|
this.localAbsPath = localAbsPath;
|
||||||
this.bytesWritten = 0;
|
this.bytesWritten = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNewOutputStream(String localAbsPath) throws IOException {
|
public void setNewOutputStream(String localAbsPath) throws IOException {
|
||||||
this.output.close();
|
this.output.close();
|
||||||
this.output = new EncodedFileOutputStream(new FileOutputStream(localAbsPath), TskData.EncodingType.XOR1);
|
this.output = new EncodedFileOutputStream(new FileOutputStream(localAbsPath), TskData.EncodingType.XOR1);
|
||||||
this.localAbsPath = localAbsPath;
|
this.localAbsPath = localAbsPath;
|
||||||
this.bytesWritten = 0;
|
this.bytesWritten = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getSize() {
|
public int getSize() {
|
||||||
return bytesWritten;
|
return bytesWritten;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int write(byte[] bytes) throws SevenZipException {
|
public int write(byte[] bytes) throws SevenZipException {
|
||||||
try {
|
try {
|
||||||
@ -846,19 +842,19 @@ class SevenZipExtractor {
|
|||||||
this.bytesWritten += bytes.length;
|
this.bytesWritten += bytes.length;
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
throw new SevenZipException(
|
throw new SevenZipException(
|
||||||
NbBundle.getMessage(SevenZipExtractor.class,
|
NbBundle.getMessage(SevenZipExtractor.class,
|
||||||
"EmbeddedFileExtractorIngestModule.ArchiveExtractor.UnpackStream.write.exception.msg",
|
"EmbeddedFileExtractorIngestModule.ArchiveExtractor.UnpackStream.write.exception.msg",
|
||||||
localAbsPath), ex);
|
localAbsPath), ex);
|
||||||
}
|
}
|
||||||
return bytes.length;
|
return bytes.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
try(EncodedFileOutputStream out = output) {
|
try (EncodedFileOutputStream out = output) {
|
||||||
out.flush();
|
out.flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -955,7 +951,7 @@ class SevenZipExtractor {
|
|||||||
|
|
||||||
final String localAbsPath = archiveDetailsMap.get(
|
final String localAbsPath = archiveDetailsMap.get(
|
||||||
inArchiveItemIndex).getLocalAbsPath();
|
inArchiveItemIndex).getLocalAbsPath();
|
||||||
|
|
||||||
//If the Unpackstream has been allocated, then set the Outputstream
|
//If the Unpackstream has been allocated, then set the Outputstream
|
||||||
//to another file rather than creating a new unpack stream. The 7Zip
|
//to another file rather than creating a new unpack stream. The 7Zip
|
||||||
//binding has a memory leak, so creating new unpack streams will not be
|
//binding has a memory leak, so creating new unpack streams will not be
|
||||||
|
@ -215,11 +215,15 @@ final class CustomFileTypesManager {
|
|||||||
signatureList.add(new Signature(byteArray, 522L));
|
signatureList.add(new Signature(byteArray, 522L));
|
||||||
fileType = new FileType("image/x-pict", signatureList); //NON-NLS
|
fileType = new FileType("image/x-pict", signatureList); //NON-NLS
|
||||||
autopsyDefinedFileTypes.add(fileType);
|
autopsyDefinedFileTypes.add(fileType);
|
||||||
|
|
||||||
|
/* NOTE: see JIRA-4269. This MIME type seems to match a lot of random file types,
|
||||||
|
including ZIP archives. As a result those files get assigned this MIME type instead
|
||||||
|
of having their MIME type detected by Tika.
|
||||||
byteArray = DatatypeConverter.parseHexBinary("1100"); //NON-NLS
|
byteArray = DatatypeConverter.parseHexBinary("1100"); //NON-NLS
|
||||||
signatureList.clear();
|
signatureList.clear();
|
||||||
signatureList.add(new Signature(byteArray, 522L));
|
signatureList.add(new Signature(byteArray, 522L));
|
||||||
fileType = new FileType("image/x-pict", signatureList); //NON-NLS
|
fileType = new FileType("image/x-pict", signatureList); //NON-NLS
|
||||||
autopsyDefinedFileTypes.add(fileType);
|
autopsyDefinedFileTypes.add(fileType);*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add type for pam.
|
* Add type for pam.
|
||||||
|
@ -194,12 +194,10 @@ AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHa
|
|||||||
AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash.msg=Error adding valid hashes to the hash set:
|
AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash.msg=Error adding valid hashes to the hash set:
|
||||||
HashLookupSettingsPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes.
|
HashLookupSettingsPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes.
|
||||||
HashLookupSettingsPanel.addHashesToDatabaseButton.text=Add Hashes to Hash Set
|
HashLookupSettingsPanel.addHashesToDatabaseButton.text=Add Hashes to Hash Set
|
||||||
HashLookupSettingsPanel.indexPathLabel.text=
|
|
||||||
HashLookupSettingsPanel.indexPathLabelLabel.text=Index Path:
|
HashLookupSettingsPanel.indexPathLabelLabel.text=Index Path:
|
||||||
HashLookupSettingsPanel.createDatabaseButton.toolTipText=
|
HashLookupSettingsPanel.createDatabaseButton.toolTipText=
|
||||||
HashLookupSettingsPanel.createDatabaseButton.text=New Hash Set
|
HashLookupSettingsPanel.createDatabaseButton.text=New Hash Set
|
||||||
HashLookupSettingsPanel.optionsLabel.text=Options
|
HashLookupSettingsPanel.informationLabel.text=Hash Set Details
|
||||||
HashLookupSettingsPanel.informationLabel.text=Information
|
|
||||||
HashLookupSettingsPanel.sendIngestMessagesCheckBox.text=Send ingest inbox message for each hit
|
HashLookupSettingsPanel.sendIngestMessagesCheckBox.text=Send ingest inbox message for each hit
|
||||||
HashLookupSettingsPanel.indexButton.text=Index
|
HashLookupSettingsPanel.indexButton.text=Index
|
||||||
HashLookupSettingsPanel.indexLabel.text=Index Status:
|
HashLookupSettingsPanel.indexLabel.text=Index Status:
|
||||||
@ -246,3 +244,4 @@ HashDbCreateDatabaseDialog.databasePathLabel.text=Hash Set Path:
|
|||||||
AddHashValuesToDatabaseDialog.okButton.text_2=OK
|
AddHashValuesToDatabaseDialog.okButton.text_2=OK
|
||||||
HashDbImportDatabaseDialog.saveInUserConfigFolderCheckbox.text=Copy hash set into user configuration folder
|
HashDbImportDatabaseDialog.saveInUserConfigFolderCheckbox.text=Copy hash set into user configuration folder
|
||||||
HashDbImportDatabaseDialog.saveInUserConfigFolderCheckbox.toolTipText=In Live Triage situations, this option ensures that path to the hash set will be valid
|
HashDbImportDatabaseDialog.saveInUserConfigFolderCheckbox.toolTipText=In Live Triage situations, this option ensures that path to the hash set will be valid
|
||||||
|
HashLookupSettingsPanel.indexPathLabel.text=
|
||||||
|
@ -187,10 +187,8 @@ AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHa
|
|||||||
HashLookupSettingsPanel.deleteDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u524a\u9664
|
HashLookupSettingsPanel.deleteDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u524a\u9664
|
||||||
HashLookupSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u3067\u3059\u3002\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
|
HashLookupSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u3067\u3059\u3002\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
|
||||||
HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
|
HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
|
||||||
HashLookupSettingsPanel.indexPathLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
|
|
||||||
HashLookupSettingsPanel.indexPathLabelLabel.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30d1\u30b9\uff1a
|
HashLookupSettingsPanel.indexPathLabelLabel.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30d1\u30b9\uff1a
|
||||||
HashLookupSettingsPanel.createDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210
|
HashLookupSettingsPanel.createDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210
|
||||||
HashLookupSettingsPanel.optionsLabel.text=\u30aa\u30d7\u30b7\u30e7\u30f3
|
|
||||||
HashLookupSettingsPanel.informationLabel.text=\u60c5\u5831
|
HashLookupSettingsPanel.informationLabel.text=\u60c5\u5831
|
||||||
HashLookupSettingsPanel.sendIngestMessagesCheckBox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b
|
HashLookupSettingsPanel.sendIngestMessagesCheckBox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b
|
||||||
HashLookupSettingsPanel.indexButton.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9
|
HashLookupSettingsPanel.indexButton.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9
|
||||||
@ -206,3 +204,4 @@ HashLookupSettingsPanel.hashDatabasesLabel.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u
|
|||||||
HashLookupSettingsPanel.importDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
|
HashLookupSettingsPanel.importDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
|
||||||
HashDbCreateDatabaseDialog.databasePathLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a
|
HashDbCreateDatabaseDialog.databasePathLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a
|
||||||
AddHashValuesToDatabaseDialog.okButton.text_2=OK
|
AddHashValuesToDatabaseDialog.okButton.text_2=OK
|
||||||
|
HashLookupSettingsPanel.indexPathLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
|
||||||
|
@ -66,10 +66,7 @@
|
|||||||
<Layout>
|
<Layout>
|
||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="1" attributes="0">
|
<Component id="jScrollPane2" alignment="0" max="32767" attributes="0"/>
|
||||||
<Component id="jScrollPane2" max="32767" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
<DimensionLayout dim="1">
|
<DimensionLayout dim="1">
|
||||||
@ -89,80 +86,35 @@
|
|||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace min="1" pref="1" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="1" max="-2" attributes="0"/>
|
||||||
<Component id="jScrollPane1" min="-2" max="-2" attributes="0"/>
|
<Component id="jScrollPane1" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="1" attributes="0">
|
||||||
<Component id="informationLabel" max="32767" attributes="0"/>
|
<Component id="informationLabel" pref="0" max="32767" attributes="0"/>
|
||||||
<EmptySpace min="-2" pref="309" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="356" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="indexButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="addHashesToDatabaseButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" attributes="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="informationScrollPanel" alignment="0" pref="420" max="32767" attributes="0"/>
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace min="10" pref="10" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Component id="indexLabel" linkSize="1" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="indexPathLabelLabel" linkSize="1" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace min="-2" pref="55" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Component id="hashDbIndexStatusLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="indexPathLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<Component id="indexButton" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="10" pref="10" max="-2" attributes="0"/>
|
|
||||||
<Component id="addHashesToDatabaseButton" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Component id="locationLabel" linkSize="1" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="typeLabel" linkSize="1" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="versionLabel" linkSize="1" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="orgLabel" linkSize="1" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="readOnlyLabel" linkSize="1" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="nameLabel" linkSize="1" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace min="-2" pref="55" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Component id="hashDbNameLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbTypeLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbLocationLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbVersionLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbOrgLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbReadOnlyLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<EmptySpace min="-2" pref="70" max="-2" attributes="0"/>
|
|
||||||
<Component id="informationSeparator" min="-2" pref="305" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Group type="102" alignment="1" attributes="0">
|
|
||||||
<Component id="optionsLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="optionsSeparator" min="-2" pref="334" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<EmptySpace min="-2" pref="25" max="-2" attributes="0"/>
|
|
||||||
<Component id="sendIngestMessagesCheckBox" min="-2" max="-2" attributes="0"/>
|
<Component id="sendIngestMessagesCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="ingestWarningLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
|
|
||||||
<Component id="ingestWarningLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace pref="24" max="32767" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
@ -191,63 +143,14 @@
|
|||||||
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Component id="informationLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="informationLabel" min="-2" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Component id="informationScrollPanel" min="-2" pref="185" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" pref="7" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
<Component id="informationSeparator" min="-2" pref="3" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace min="-2" pref="7" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="nameLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbNameLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="typeLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbTypeLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="locationLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbLocationLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="versionLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbVersionLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="orgLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbOrgLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace min="-2" pref="7" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="readOnlyLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbReadOnlyLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="indexPathLabelLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="indexPathLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="indexLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="hashDbIndexStatusLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="indexButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="indexButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="addHashesToDatabaseButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="addHashesToDatabaseButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Component id="optionsLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="optionsSeparator" alignment="1" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Component id="sendIngestMessagesCheckBox" min="-2" max="-2" attributes="0"/>
|
<Component id="sendIngestMessagesCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
@ -268,18 +171,15 @@
|
|||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
</Layout>
|
</Layout>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Component class="javax.swing.JLabel" name="ingestWarningLabel">
|
<Component class="javax.swing.JLabel" name="hashDatabasesLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
<FontInfo relative="true">
|
<FontInfo relative="true">
|
||||||
<Font bold="false" component="ingestWarningLabel" property="font" relativeSize="false" size="11"/>
|
<Font bold="false" component="hashDatabasesLabel" property="font" relativeSize="false" size="11"/>
|
||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.ingestWarningLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDatabasesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -318,18 +218,21 @@
|
|||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Component class="javax.swing.JButton" name="deleteDatabaseButton">
|
<Component class="javax.swing.JButton" name="createDatabaseButton">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
<FontInfo relative="true">
|
<FontInfo relative="true">
|
||||||
<Font bold="false" component="deleteDatabaseButton" property="font" relativeSize="false" size="11"/>
|
<Font bold="false" component="createDatabaseButton" property="font" relativeSize="false" size="11"/>
|
||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/modules/hashdatabase/delete16.png"/>
|
<Image iconType="3" name="/org/sleuthkit/autopsy/modules/hashdatabase/new16.png"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.deleteDatabaseButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.createDatabaseButton.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/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.createDatabaseButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
<Dimension value="[140, 25]"/>
|
<Dimension value="[140, 25]"/>
|
||||||
@ -339,7 +242,7 @@
|
|||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="deleteDatabaseButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="createDatabaseButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JButton" name="importDatabaseButton">
|
<Component class="javax.swing.JButton" name="importDatabaseButton">
|
||||||
@ -369,114 +272,316 @@
|
|||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="importDatabaseButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="importDatabaseButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="hashDatabasesLabel">
|
<Component class="javax.swing.JButton" name="deleteDatabaseButton">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
<FontInfo relative="true">
|
<FontInfo relative="true">
|
||||||
<Font bold="false" component="hashDatabasesLabel" property="font" relativeSize="false" size="11"/>
|
<Font bold="false" component="deleteDatabaseButton" property="font" relativeSize="false" size="11"/>
|
||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/modules/hashdatabase/delete16.png"/>
|
||||||
|
</Property>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDatabasesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.deleteDatabaseButton.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="[140, 25]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[140, 25]"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="deleteDatabaseButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="nameLabel">
|
<Component class="javax.swing.JLabel" name="informationLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
<FontInfo relative="true">
|
<FontInfo relative="true">
|
||||||
<Font bold="false" component="nameLabel" property="font" relativeSize="false" size="11"/>
|
<Font bold="false" component="informationLabel" property="font" relativeSize="false" size="11"/>
|
||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.nameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.informationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="hashDbNameLabel">
|
<Container class="javax.swing.JScrollPane" name="informationScrollPanel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Property name="verticalScrollBarPolicy" type="int" value="21"/>
|
||||||
<FontInfo relative="true">
|
|
||||||
<Font bold="false" component="hashDbNameLabel" property="font" relativeSize="false" size="11"/>
|
|
||||||
</FontInfo>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbNameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="hashDbLocationLabel">
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
<Properties>
|
<SubComponents>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Container class="javax.swing.JPanel" name="informationPanel">
|
||||||
<FontInfo relative="true">
|
|
||||||
<Font bold="false" component="hashDbLocationLabel" property="font" relativeSize="false" size="11"/>
|
<Layout>
|
||||||
</FontInfo>
|
<DimensionLayout dim="0">
|
||||||
</Property>
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Group type="102" attributes="0">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbLocationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Property>
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
</Properties>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
</Component>
|
<Component id="locationLabel" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
<Component class="javax.swing.JLabel" name="locationLabel">
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Properties>
|
<Component id="hashDbLocationLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
</Group>
|
||||||
<FontInfo relative="true">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Font bold="false" component="locationLabel" property="font" relativeSize="false" size="11"/>
|
<Component id="nameLabel" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
</FontInfo>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
</Property>
|
<Component id="hashDbNameLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
</Group>
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.locationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
</Property>
|
<Component id="typeLabel" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
</Properties>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
</Component>
|
<Component id="hashDbTypeLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component class="javax.swing.JLabel" name="typeLabel">
|
</Group>
|
||||||
<Properties>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Component id="versionLabel" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
<FontInfo relative="true">
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Font bold="false" component="typeLabel" property="font" relativeSize="false" size="11"/>
|
<Component id="hashDbVersionLabel" min="-2" max="-2" attributes="0"/>
|
||||||
</FontInfo>
|
</Group>
|
||||||
</Property>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Component id="orgLabel" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.typeLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
</Property>
|
<Component id="hashDbOrgLabel" min="-2" max="-2" attributes="0"/>
|
||||||
</Properties>
|
</Group>
|
||||||
</Component>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Component class="javax.swing.JLabel" name="hashDbTypeLabel">
|
<Component id="readOnlyLabel" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
<Properties>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Component id="hashDbReadOnlyLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<FontInfo relative="true">
|
</Group>
|
||||||
<Font bold="false" component="hashDbTypeLabel" property="font" relativeSize="false" size="11"/>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
</FontInfo>
|
<Component id="indexLabel" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
</Property>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Component id="hashDbIndexStatusLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbTypeLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
</Group>
|
||||||
</Property>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
</Properties>
|
<Component id="indexPathLabelLabel" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
</Component>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Component class="javax.swing.JLabel" name="hashDbIndexStatusLabel">
|
<Component id="indexPathLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Properties>
|
</Group>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
</Group>
|
||||||
<FontInfo relative="true">
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
<Font bold="false" component="hashDbIndexStatusLabel" property="font" relativeSize="false" size="11"/>
|
</Group>
|
||||||
</FontInfo>
|
</Group>
|
||||||
</Property>
|
</DimensionLayout>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<DimensionLayout dim="1">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbIndexStatusLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
</Property>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
</Properties>
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
</Component>
|
<Component id="nameLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component class="javax.swing.JLabel" name="indexLabel">
|
<Component id="hashDbNameLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Properties>
|
</Group>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<FontInfo relative="true">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Font bold="false" component="indexLabel" property="font" relativeSize="false" size="11"/>
|
<Component id="typeLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</FontInfo>
|
<Component id="hashDbTypeLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Property>
|
</Group>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.indexLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
</Property>
|
<Component id="locationLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Properties>
|
<Component id="hashDbLocationLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Component>
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="versionLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="hashDbVersionLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="orgLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="hashDbOrgLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="readOnlyLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="hashDbReadOnlyLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="indexPathLabelLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="indexPathLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="indexLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="hashDbIndexStatusLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="0" pref="49" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="nameLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="nameLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.nameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="hashDbNameLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="hashDbNameLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbNameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="typeLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="typeLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.typeLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="hashDbTypeLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="hashDbTypeLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbTypeLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="locationLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="locationLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.locationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="hashDbLocationLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="hashDbLocationLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbLocationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="versionLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.versionLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="hashDbVersionLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbVersionLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="orgLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.orgLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="hashDbOrgLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbOrgLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="readOnlyLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.readOnlyLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="hashDbReadOnlyLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbReadOnlyLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="indexPathLabelLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="indexPathLabelLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.indexPathLabelLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="indexPathLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="indexPathLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.indexPathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="indexLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="indexLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.indexLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="hashDbIndexStatusLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="hashDbIndexStatusLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbIndexStatusLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
<Component class="javax.swing.JButton" name="indexButton">
|
<Component class="javax.swing.JButton" name="indexButton">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
@ -493,100 +598,6 @@
|
|||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="indexButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="indexButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JCheckBox" name="sendIngestMessagesCheckBox">
|
|
||||||
<Properties>
|
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
|
||||||
<FontInfo relative="true">
|
|
||||||
<Font bold="false" component="sendIngestMessagesCheckBox" property="font" relativeSize="false" size="11"/>
|
|
||||||
</FontInfo>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.sendIngestMessagesCheckBox.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="sendIngestMessagesCheckBoxActionPerformed"/>
|
|
||||||
</Events>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="informationLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
|
||||||
<FontInfo relative="true">
|
|
||||||
<Font bold="false" component="informationLabel" property="font" relativeSize="false" size="11"/>
|
|
||||||
</FontInfo>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.informationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="optionsLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
|
||||||
<FontInfo relative="true">
|
|
||||||
<Font bold="false" component="optionsLabel" property="font" relativeSize="false" size="11"/>
|
|
||||||
</FontInfo>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.optionsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JSeparator" name="informationSeparator">
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JSeparator" name="optionsSeparator">
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JButton" name="createDatabaseButton">
|
|
||||||
<Properties>
|
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
|
||||||
<FontInfo relative="true">
|
|
||||||
<Font bold="false" component="createDatabaseButton" property="font" relativeSize="false" size="11"/>
|
|
||||||
</FontInfo>
|
|
||||||
</Property>
|
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/modules/hashdatabase/new16.png"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.createDatabaseButton.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/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.createDatabaseButton.toolTipText" 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="[140, 25]"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
|
||||||
<Dimension value="[140, 25]"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<Events>
|
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="createDatabaseButtonActionPerformed"/>
|
|
||||||
</Events>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="indexPathLabelLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
|
||||||
<FontInfo relative="true">
|
|
||||||
<Font bold="false" component="indexPathLabelLabel" property="font" relativeSize="false" size="11"/>
|
|
||||||
</FontInfo>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.indexPathLabelLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="indexPathLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
|
||||||
<FontInfo relative="true">
|
|
||||||
<Font bold="false" component="indexPathLabel" property="font" relativeSize="false" size="11"/>
|
|
||||||
</FontInfo>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.indexPathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JButton" name="addHashesToDatabaseButton">
|
<Component class="javax.swing.JButton" name="addHashesToDatabaseButton">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
@ -603,45 +614,33 @@
|
|||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="addHashesToDatabaseButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="addHashesToDatabaseButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="versionLabel">
|
<Component class="javax.swing.JCheckBox" name="sendIngestMessagesCheckBox">
|
||||||
<Properties>
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="sendIngestMessagesCheckBox" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.versionLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.sendIngestMessagesCheckBox.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="sendIngestMessagesCheckBoxActionPerformed"/>
|
||||||
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="hashDbVersionLabel">
|
<Component class="javax.swing.JLabel" name="ingestWarningLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbVersionLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="ingestWarningLabel" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
</Component>
|
<Image iconType="3" name="/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"/>
|
||||||
<Component class="javax.swing.JLabel" name="orgLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.orgLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="hashDbOrgLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbOrgLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.ingestWarningLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="readOnlyLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.readOnlyLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="hashDbReadOnlyLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties" key="HashLookupSettingsPanel.hashDbReadOnlyLabel.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
|
@ -142,8 +142,6 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
// Update ingest options.
|
// Update ingest options.
|
||||||
sendIngestMessagesCheckBox.setSelected(false);
|
sendIngestMessagesCheckBox.setSelected(false);
|
||||||
sendIngestMessagesCheckBox.setEnabled(false);
|
sendIngestMessagesCheckBox.setEnabled(false);
|
||||||
optionsLabel.setEnabled(false);
|
|
||||||
optionsSeparator.setEnabled(false);
|
|
||||||
|
|
||||||
// Update database action buttons.
|
// Update database action buttons.
|
||||||
createDatabaseButton.setEnabled(true);
|
createDatabaseButton.setEnabled(true);
|
||||||
@ -194,14 +192,14 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
deleteDatabaseButton.setEnabled(!ingestIsRunning);
|
deleteDatabaseButton.setEnabled(!ingestIsRunning);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
hashDbLocationLabel.setText(shortenPath(db.getDatabasePath()));
|
hashDbLocationLabel.setText(db.getDatabasePath());
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
Logger.getLogger(HashLookupSettingsPanel.class.getName()).log(Level.SEVERE, "Error getting hash set path of " + db.getHashSetName() + " hash set", ex); //NON-NLS
|
Logger.getLogger(HashLookupSettingsPanel.class.getName()).log(Level.SEVERE, "Error getting hash set path of " + db.getHashSetName() + " hash set", ex); //NON-NLS
|
||||||
hashDbLocationLabel.setText(ERROR_GETTING_PATH_TEXT);
|
hashDbLocationLabel.setText(ERROR_GETTING_PATH_TEXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
indexPathLabel.setText(shortenPath(hashDb.getIndexPath()));
|
indexPathLabel.setText(hashDb.getIndexPath());
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
Logger.getLogger(HashLookupSettingsPanel.class.getName()).log(Level.SEVERE, "Error getting index path of " + db.getHashSetName() + " hash set", ex); //NON-NLS
|
Logger.getLogger(HashLookupSettingsPanel.class.getName()).log(Level.SEVERE, "Error getting index path of " + db.getHashSetName() + " hash set", ex); //NON-NLS
|
||||||
indexPathLabel.setText(ERROR_GETTING_PATH_TEXT);
|
indexPathLabel.setText(ERROR_GETTING_PATH_TEXT);
|
||||||
@ -270,8 +268,6 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
// Update ingest option components.
|
// Update ingest option components.
|
||||||
sendIngestMessagesCheckBox.setSelected(db.getSendIngestMessages());
|
sendIngestMessagesCheckBox.setSelected(db.getSendIngestMessages());
|
||||||
sendIngestMessagesCheckBox.setEnabled(!ingestIsRunning && db.getKnownFilesType().equals(KnownFilesType.KNOWN_BAD));
|
sendIngestMessagesCheckBox.setEnabled(!ingestIsRunning && db.getKnownFilesType().equals(KnownFilesType.KNOWN_BAD));
|
||||||
optionsLabel.setEnabled(!ingestIsRunning);
|
|
||||||
optionsSeparator.setEnabled(!ingestIsRunning);
|
|
||||||
|
|
||||||
// Update database action buttons.
|
// Update database action buttons.
|
||||||
createDatabaseButton.setEnabled(true);
|
createDatabaseButton.setEnabled(true);
|
||||||
@ -281,14 +277,6 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
ingestWarningLabel.setVisible(ingestIsRunning);
|
ingestWarningLabel.setVisible(ingestIsRunning);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String shortenPath(String path) {
|
|
||||||
String shortenedPath = path;
|
|
||||||
if (shortenedPath.length() > 50) {
|
|
||||||
shortenedPath = shortenedPath.substring(0, 10 + shortenedPath.substring(10).indexOf(File.separator) + 1) + "..." + shortenedPath.substring((shortenedPath.length() - 20) + shortenedPath.substring(shortenedPath.length() - 20).indexOf(File.separator));
|
|
||||||
}
|
|
||||||
return shortenedPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isLocalIngestJobEvent(PropertyChangeEvent evt) {
|
private boolean isLocalIngestJobEvent(PropertyChangeEvent evt) {
|
||||||
if (evt instanceof AutopsyEvent) {
|
if (evt instanceof AutopsyEvent) {
|
||||||
AutopsyEvent event = (AutopsyEvent) evt;
|
AutopsyEvent event = (AutopsyEvent) evt;
|
||||||
@ -591,36 +579,35 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
jButton3 = new javax.swing.JButton();
|
jButton3 = new javax.swing.JButton();
|
||||||
jScrollPane2 = new javax.swing.JScrollPane();
|
jScrollPane2 = new javax.swing.JScrollPane();
|
||||||
jPanel1 = new javax.swing.JPanel();
|
jPanel1 = new javax.swing.JPanel();
|
||||||
ingestWarningLabel = new javax.swing.JLabel();
|
hashDatabasesLabel = new javax.swing.JLabel();
|
||||||
jScrollPane1 = new javax.swing.JScrollPane();
|
jScrollPane1 = new javax.swing.JScrollPane();
|
||||||
hashSetTable = new HashSetTable();
|
hashSetTable = new HashSetTable();
|
||||||
deleteDatabaseButton = new javax.swing.JButton();
|
createDatabaseButton = new javax.swing.JButton();
|
||||||
importDatabaseButton = new javax.swing.JButton();
|
importDatabaseButton = new javax.swing.JButton();
|
||||||
hashDatabasesLabel = new javax.swing.JLabel();
|
deleteDatabaseButton = new javax.swing.JButton();
|
||||||
|
informationLabel = new javax.swing.JLabel();
|
||||||
|
informationScrollPanel = new javax.swing.JScrollPane();
|
||||||
|
informationPanel = new javax.swing.JPanel();
|
||||||
nameLabel = new javax.swing.JLabel();
|
nameLabel = new javax.swing.JLabel();
|
||||||
hashDbNameLabel = new javax.swing.JLabel();
|
hashDbNameLabel = new javax.swing.JLabel();
|
||||||
hashDbLocationLabel = new javax.swing.JLabel();
|
|
||||||
locationLabel = new javax.swing.JLabel();
|
|
||||||
typeLabel = new javax.swing.JLabel();
|
typeLabel = new javax.swing.JLabel();
|
||||||
hashDbTypeLabel = new javax.swing.JLabel();
|
hashDbTypeLabel = new javax.swing.JLabel();
|
||||||
hashDbIndexStatusLabel = new javax.swing.JLabel();
|
locationLabel = new javax.swing.JLabel();
|
||||||
indexLabel = new javax.swing.JLabel();
|
hashDbLocationLabel = new javax.swing.JLabel();
|
||||||
indexButton = new javax.swing.JButton();
|
|
||||||
sendIngestMessagesCheckBox = new javax.swing.JCheckBox();
|
|
||||||
informationLabel = new javax.swing.JLabel();
|
|
||||||
optionsLabel = new javax.swing.JLabel();
|
|
||||||
informationSeparator = new javax.swing.JSeparator();
|
|
||||||
optionsSeparator = new javax.swing.JSeparator();
|
|
||||||
createDatabaseButton = new javax.swing.JButton();
|
|
||||||
indexPathLabelLabel = new javax.swing.JLabel();
|
|
||||||
indexPathLabel = new javax.swing.JLabel();
|
|
||||||
addHashesToDatabaseButton = new javax.swing.JButton();
|
|
||||||
versionLabel = new javax.swing.JLabel();
|
versionLabel = new javax.swing.JLabel();
|
||||||
hashDbVersionLabel = new javax.swing.JLabel();
|
hashDbVersionLabel = new javax.swing.JLabel();
|
||||||
orgLabel = new javax.swing.JLabel();
|
orgLabel = new javax.swing.JLabel();
|
||||||
hashDbOrgLabel = new javax.swing.JLabel();
|
hashDbOrgLabel = new javax.swing.JLabel();
|
||||||
readOnlyLabel = new javax.swing.JLabel();
|
readOnlyLabel = new javax.swing.JLabel();
|
||||||
hashDbReadOnlyLabel = new javax.swing.JLabel();
|
hashDbReadOnlyLabel = new javax.swing.JLabel();
|
||||||
|
indexPathLabelLabel = new javax.swing.JLabel();
|
||||||
|
indexPathLabel = new javax.swing.JLabel();
|
||||||
|
indexLabel = new javax.swing.JLabel();
|
||||||
|
hashDbIndexStatusLabel = new javax.swing.JLabel();
|
||||||
|
indexButton = new javax.swing.JButton();
|
||||||
|
addHashesToDatabaseButton = new javax.swing.JButton();
|
||||||
|
sendIngestMessagesCheckBox = new javax.swing.JCheckBox();
|
||||||
|
ingestWarningLabel = new javax.swing.JLabel();
|
||||||
|
|
||||||
jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.jLabel2.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.jLabel2.text")); // NOI18N
|
||||||
@ -634,9 +621,8 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
jButton3.setFont(jButton3.getFont().deriveFont(jButton3.getFont().getStyle() & ~java.awt.Font.BOLD, 14));
|
jButton3.setFont(jButton3.getFont().deriveFont(jButton3.getFont().getStyle() & ~java.awt.Font.BOLD, 14));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(jButton3, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.jButton3.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(jButton3, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.jButton3.text")); // NOI18N
|
||||||
|
|
||||||
ingestWarningLabel.setFont(ingestWarningLabel.getFont().deriveFont(ingestWarningLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
hashDatabasesLabel.setFont(hashDatabasesLabel.getFont().deriveFont(hashDatabasesLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
ingestWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"))); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(hashDatabasesLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDatabasesLabel.text")); // NOI18N
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(ingestWarningLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.ingestWarningLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
hashSetTable.setFont(hashSetTable.getFont().deriveFont(hashSetTable.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
hashSetTable.setFont(hashSetTable.getFont().deriveFont(hashSetTable.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
hashSetTable.setModel(new javax.swing.table.DefaultTableModel(
|
hashSetTable.setModel(new javax.swing.table.DefaultTableModel(
|
||||||
@ -656,14 +642,15 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
});
|
});
|
||||||
jScrollPane1.setViewportView(hashSetTable);
|
jScrollPane1.setViewportView(hashSetTable);
|
||||||
|
|
||||||
deleteDatabaseButton.setFont(deleteDatabaseButton.getFont().deriveFont(deleteDatabaseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
createDatabaseButton.setFont(createDatabaseButton.getFont().deriveFont(createDatabaseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
deleteDatabaseButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/hashdatabase/delete16.png"))); // NOI18N
|
createDatabaseButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/hashdatabase/new16.png"))); // NOI18N
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(deleteDatabaseButton, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.deleteDatabaseButton.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(createDatabaseButton, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.createDatabaseButton.text")); // NOI18N
|
||||||
deleteDatabaseButton.setMaximumSize(new java.awt.Dimension(140, 25));
|
createDatabaseButton.setToolTipText(org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.createDatabaseButton.toolTipText")); // NOI18N
|
||||||
deleteDatabaseButton.setMinimumSize(new java.awt.Dimension(140, 25));
|
createDatabaseButton.setMaximumSize(new java.awt.Dimension(140, 25));
|
||||||
deleteDatabaseButton.addActionListener(new java.awt.event.ActionListener() {
|
createDatabaseButton.setMinimumSize(new java.awt.Dimension(140, 25));
|
||||||
|
createDatabaseButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
deleteDatabaseButtonActionPerformed(evt);
|
createDatabaseButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -679,8 +666,21 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
hashDatabasesLabel.setFont(hashDatabasesLabel.getFont().deriveFont(hashDatabasesLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
deleteDatabaseButton.setFont(deleteDatabaseButton.getFont().deriveFont(deleteDatabaseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(hashDatabasesLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDatabasesLabel.text")); // NOI18N
|
deleteDatabaseButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/hashdatabase/delete16.png"))); // NOI18N
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(deleteDatabaseButton, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.deleteDatabaseButton.text")); // NOI18N
|
||||||
|
deleteDatabaseButton.setMaximumSize(new java.awt.Dimension(140, 25));
|
||||||
|
deleteDatabaseButton.setMinimumSize(new java.awt.Dimension(140, 25));
|
||||||
|
deleteDatabaseButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
deleteDatabaseButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
informationLabel.setFont(informationLabel.getFont().deriveFont(informationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(informationLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.informationLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
informationScrollPanel.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
|
||||||
|
|
||||||
nameLabel.setFont(nameLabel.getFont().deriveFont(nameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
nameLabel.setFont(nameLabel.getFont().deriveFont(nameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(nameLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.nameLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(nameLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.nameLabel.text")); // NOI18N
|
||||||
@ -688,73 +688,17 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
hashDbNameLabel.setFont(hashDbNameLabel.getFont().deriveFont(hashDbNameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
hashDbNameLabel.setFont(hashDbNameLabel.getFont().deriveFont(hashDbNameLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(hashDbNameLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbNameLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(hashDbNameLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbNameLabel.text")); // NOI18N
|
||||||
|
|
||||||
hashDbLocationLabel.setFont(hashDbLocationLabel.getFont().deriveFont(hashDbLocationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(hashDbLocationLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbLocationLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
locationLabel.setFont(locationLabel.getFont().deriveFont(locationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(locationLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.locationLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
typeLabel.setFont(typeLabel.getFont().deriveFont(typeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
typeLabel.setFont(typeLabel.getFont().deriveFont(typeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(typeLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.typeLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(typeLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.typeLabel.text")); // NOI18N
|
||||||
|
|
||||||
hashDbTypeLabel.setFont(hashDbTypeLabel.getFont().deriveFont(hashDbTypeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
hashDbTypeLabel.setFont(hashDbTypeLabel.getFont().deriveFont(hashDbTypeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(hashDbTypeLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbTypeLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(hashDbTypeLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbTypeLabel.text")); // NOI18N
|
||||||
|
|
||||||
hashDbIndexStatusLabel.setFont(hashDbIndexStatusLabel.getFont().deriveFont(hashDbIndexStatusLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
locationLabel.setFont(locationLabel.getFont().deriveFont(locationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(hashDbIndexStatusLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbIndexStatusLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(locationLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.locationLabel.text")); // NOI18N
|
||||||
|
|
||||||
indexLabel.setFont(indexLabel.getFont().deriveFont(indexLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
hashDbLocationLabel.setFont(hashDbLocationLabel.getFont().deriveFont(hashDbLocationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(indexLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.indexLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(hashDbLocationLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbLocationLabel.text")); // NOI18N
|
||||||
|
|
||||||
indexButton.setFont(indexButton.getFont().deriveFont(indexButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(indexButton, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.indexButton.text")); // NOI18N
|
|
||||||
indexButton.setEnabled(false);
|
|
||||||
indexButton.addActionListener(new java.awt.event.ActionListener() {
|
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
||||||
indexButtonActionPerformed(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
sendIngestMessagesCheckBox.setFont(sendIngestMessagesCheckBox.getFont().deriveFont(sendIngestMessagesCheckBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(sendIngestMessagesCheckBox, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.sendIngestMessagesCheckBox.text")); // NOI18N
|
|
||||||
sendIngestMessagesCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
||||||
sendIngestMessagesCheckBoxActionPerformed(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
informationLabel.setFont(informationLabel.getFont().deriveFont(informationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(informationLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.informationLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
optionsLabel.setFont(optionsLabel.getFont().deriveFont(optionsLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(optionsLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.optionsLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
createDatabaseButton.setFont(createDatabaseButton.getFont().deriveFont(createDatabaseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
createDatabaseButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/hashdatabase/new16.png"))); // NOI18N
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(createDatabaseButton, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.createDatabaseButton.text")); // NOI18N
|
|
||||||
createDatabaseButton.setToolTipText(org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.createDatabaseButton.toolTipText")); // NOI18N
|
|
||||||
createDatabaseButton.setMaximumSize(new java.awt.Dimension(140, 25));
|
|
||||||
createDatabaseButton.setMinimumSize(new java.awt.Dimension(140, 25));
|
|
||||||
createDatabaseButton.addActionListener(new java.awt.event.ActionListener() {
|
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
||||||
createDatabaseButtonActionPerformed(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
indexPathLabelLabel.setFont(indexPathLabelLabel.getFont().deriveFont(indexPathLabelLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(indexPathLabelLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.indexPathLabelLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
indexPathLabel.setFont(indexPathLabel.getFont().deriveFont(indexPathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(indexPathLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.indexPathLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
addHashesToDatabaseButton.setFont(addHashesToDatabaseButton.getFont().deriveFont(addHashesToDatabaseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(addHashesToDatabaseButton, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.addHashesToDatabaseButton.text")); // NOI18N
|
|
||||||
addHashesToDatabaseButton.setEnabled(false);
|
|
||||||
addHashesToDatabaseButton.addActionListener(new java.awt.event.ActionListener() {
|
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
||||||
addHashesToDatabaseButtonActionPerformed(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(versionLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.versionLabel.text_1")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(versionLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.versionLabel.text_1")); // NOI18N
|
||||||
|
|
||||||
@ -768,6 +712,131 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(hashDbReadOnlyLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbReadOnlyLabel.text_1")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(hashDbReadOnlyLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbReadOnlyLabel.text_1")); // NOI18N
|
||||||
|
|
||||||
|
indexPathLabelLabel.setFont(indexPathLabelLabel.getFont().deriveFont(indexPathLabelLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(indexPathLabelLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.indexPathLabelLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
indexPathLabel.setFont(indexPathLabel.getFont().deriveFont(indexPathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(indexPathLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.indexPathLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
indexLabel.setFont(indexLabel.getFont().deriveFont(indexLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(indexLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.indexLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
hashDbIndexStatusLabel.setFont(hashDbIndexStatusLabel.getFont().deriveFont(hashDbIndexStatusLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(hashDbIndexStatusLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.hashDbIndexStatusLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
javax.swing.GroupLayout informationPanelLayout = new javax.swing.GroupLayout(informationPanel);
|
||||||
|
informationPanel.setLayout(informationPanelLayout);
|
||||||
|
informationPanelLayout.setHorizontalGroup(
|
||||||
|
informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(locationLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(hashDbLocationLabel))
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(nameLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(hashDbNameLabel))
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(typeLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(hashDbTypeLabel))
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(versionLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(hashDbVersionLabel))
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(orgLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(hashDbOrgLabel))
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(readOnlyLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(hashDbReadOnlyLabel))
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(indexLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(hashDbIndexStatusLabel))
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(indexPathLabelLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(indexPathLabel)))
|
||||||
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
|
||||||
|
informationPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {indexLabel, indexPathLabelLabel, locationLabel, nameLabel, orgLabel, readOnlyLabel, typeLabel, versionLabel});
|
||||||
|
|
||||||
|
informationPanelLayout.setVerticalGroup(
|
||||||
|
informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(informationPanelLayout.createSequentialGroup()
|
||||||
|
.addGroup(informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(nameLabel)
|
||||||
|
.addComponent(hashDbNameLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(typeLabel)
|
||||||
|
.addComponent(hashDbTypeLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(locationLabel)
|
||||||
|
.addComponent(hashDbLocationLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(versionLabel)
|
||||||
|
.addComponent(hashDbVersionLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(orgLabel)
|
||||||
|
.addComponent(hashDbOrgLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(readOnlyLabel)
|
||||||
|
.addComponent(hashDbReadOnlyLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(indexPathLabelLabel)
|
||||||
|
.addComponent(indexPathLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(informationPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(indexLabel)
|
||||||
|
.addComponent(hashDbIndexStatusLabel))
|
||||||
|
.addGap(0, 49, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
|
||||||
|
informationScrollPanel.setViewportView(informationPanel);
|
||||||
|
|
||||||
|
indexButton.setFont(indexButton.getFont().deriveFont(indexButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(indexButton, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.indexButton.text")); // NOI18N
|
||||||
|
indexButton.setEnabled(false);
|
||||||
|
indexButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
indexButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
addHashesToDatabaseButton.setFont(addHashesToDatabaseButton.getFont().deriveFont(addHashesToDatabaseButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(addHashesToDatabaseButton, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.addHashesToDatabaseButton.text")); // NOI18N
|
||||||
|
addHashesToDatabaseButton.setEnabled(false);
|
||||||
|
addHashesToDatabaseButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
addHashesToDatabaseButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
sendIngestMessagesCheckBox.setFont(sendIngestMessagesCheckBox.getFont().deriveFont(sendIngestMessagesCheckBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(sendIngestMessagesCheckBox, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.sendIngestMessagesCheckBox.text")); // NOI18N
|
||||||
|
sendIngestMessagesCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
sendIngestMessagesCheckBoxActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ingestWarningLabel.setFont(ingestWarningLabel.getFont().deriveFont(ingestWarningLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
ingestWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/hashdatabase/warning16.png"))); // NOI18N
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(ingestWarningLabel, org.openide.util.NbBundle.getMessage(HashLookupSettingsPanel.class, "HashLookupSettingsPanel.ingestWarningLabel.text")); // NOI18N
|
||||||
|
|
||||||
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
|
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
|
||||||
jPanel1.setLayout(jPanel1Layout);
|
jPanel1.setLayout(jPanel1Layout);
|
||||||
jPanel1Layout.setHorizontalGroup(
|
jPanel1Layout.setHorizontalGroup(
|
||||||
@ -780,57 +849,23 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
||||||
|
.addComponent(informationLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
||||||
|
.addGap(356, 356, 356))
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||||
.addComponent(informationLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addComponent(indexButton)
|
||||||
.addGap(309, 309, 309))
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(addHashesToDatabaseButton)
|
||||||
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(informationScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 420, Short.MAX_VALUE)
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||||
.addGap(10, 10, 10)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addComponent(sendIngestMessagesCheckBox)
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addComponent(ingestWarningLabel))
|
||||||
.addComponent(indexLabel)
|
.addGap(0, 0, Short.MAX_VALUE)))
|
||||||
.addComponent(indexPathLabelLabel))
|
.addContainerGap())))
|
||||||
.addGap(55, 55, 55)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(hashDbIndexStatusLabel)
|
|
||||||
.addComponent(indexPathLabel)))
|
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
|
||||||
.addComponent(indexButton)
|
|
||||||
.addGap(10, 10, 10)
|
|
||||||
.addComponent(addHashesToDatabaseButton))
|
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(locationLabel)
|
|
||||||
.addComponent(typeLabel)
|
|
||||||
.addComponent(versionLabel)
|
|
||||||
.addComponent(orgLabel)
|
|
||||||
.addComponent(readOnlyLabel)
|
|
||||||
.addComponent(nameLabel))
|
|
||||||
.addGap(55, 55, 55)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(hashDbNameLabel)
|
|
||||||
.addComponent(hashDbTypeLabel)
|
|
||||||
.addComponent(hashDbLocationLabel)
|
|
||||||
.addComponent(hashDbVersionLabel)
|
|
||||||
.addComponent(hashDbOrgLabel)
|
|
||||||
.addComponent(hashDbReadOnlyLabel)))))
|
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
|
||||||
.addGap(70, 70, 70)
|
|
||||||
.addComponent(informationSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 305, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
|
||||||
.addComponent(optionsLabel)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(optionsSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 334, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
|
||||||
.addGap(25, 25, 25)
|
|
||||||
.addComponent(sendIngestMessagesCheckBox))
|
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
|
||||||
.addGap(10, 10, 10)
|
|
||||||
.addComponent(ingestWarningLabel))))
|
|
||||||
.addContainerGap(24, Short.MAX_VALUE))))
|
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(hashDatabasesLabel)
|
.addComponent(hashDatabasesLabel)
|
||||||
@ -842,9 +877,6 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
.addComponent(deleteDatabaseButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
.addComponent(deleteDatabaseButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||||
.addGap(0, 0, Short.MAX_VALUE))))
|
.addGap(0, 0, Short.MAX_VALUE))))
|
||||||
);
|
);
|
||||||
|
|
||||||
jPanel1Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {indexLabel, indexPathLabelLabel, locationLabel, nameLabel, orgLabel, readOnlyLabel, typeLabel, versionLabel});
|
|
||||||
|
|
||||||
jPanel1Layout.setVerticalGroup(
|
jPanel1Layout.setVerticalGroup(
|
||||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||||
@ -853,51 +885,13 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
.addGap(6, 6, 6)
|
.addGap(6, 6, 6)
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addComponent(informationLabel)
|
||||||
.addComponent(informationLabel)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addComponent(informationScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 185, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addGap(7, 7, 7)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(informationSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 3, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
|
||||||
.addGap(7, 7, 7)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(nameLabel)
|
|
||||||
.addComponent(hashDbNameLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(typeLabel)
|
|
||||||
.addComponent(hashDbTypeLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(locationLabel)
|
|
||||||
.addComponent(hashDbLocationLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(versionLabel)
|
|
||||||
.addComponent(hashDbVersionLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(orgLabel)
|
|
||||||
.addComponent(hashDbOrgLabel))
|
|
||||||
.addGap(7, 7, 7)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(readOnlyLabel)
|
|
||||||
.addComponent(hashDbReadOnlyLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(indexPathLabelLabel)
|
|
||||||
.addComponent(indexPathLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(indexLabel)
|
|
||||||
.addComponent(hashDbIndexStatusLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(indexButton)
|
.addComponent(indexButton)
|
||||||
.addComponent(addHashesToDatabaseButton))
|
.addComponent(addHashesToDatabaseButton))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(optionsLabel)
|
|
||||||
.addComponent(optionsSeparator, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
||||||
.addGap(18, 18, 18)
|
.addGap(18, 18, 18)
|
||||||
.addComponent(sendIngestMessagesCheckBox)
|
.addComponent(sendIngestMessagesCheckBox)
|
||||||
.addGap(18, 18, 18)
|
.addGap(18, 18, 18)
|
||||||
@ -918,9 +912,7 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
this.setLayout(layout);
|
this.setLayout(layout);
|
||||||
layout.setHorizontalGroup(
|
layout.setHorizontalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
.addComponent(jScrollPane2)
|
||||||
.addComponent(jScrollPane2)
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
);
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
@ -1059,7 +1051,8 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
private javax.swing.JLabel indexPathLabel;
|
private javax.swing.JLabel indexPathLabel;
|
||||||
private javax.swing.JLabel indexPathLabelLabel;
|
private javax.swing.JLabel indexPathLabelLabel;
|
||||||
private javax.swing.JLabel informationLabel;
|
private javax.swing.JLabel informationLabel;
|
||||||
private javax.swing.JSeparator informationSeparator;
|
private javax.swing.JPanel informationPanel;
|
||||||
|
private javax.swing.JScrollPane informationScrollPanel;
|
||||||
private javax.swing.JLabel ingestWarningLabel;
|
private javax.swing.JLabel ingestWarningLabel;
|
||||||
private javax.swing.JButton jButton3;
|
private javax.swing.JButton jButton3;
|
||||||
private javax.swing.JLabel jLabel2;
|
private javax.swing.JLabel jLabel2;
|
||||||
@ -1070,8 +1063,6 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan
|
|||||||
private javax.swing.JScrollPane jScrollPane2;
|
private javax.swing.JScrollPane jScrollPane2;
|
||||||
private javax.swing.JLabel locationLabel;
|
private javax.swing.JLabel locationLabel;
|
||||||
private javax.swing.JLabel nameLabel;
|
private javax.swing.JLabel nameLabel;
|
||||||
private javax.swing.JLabel optionsLabel;
|
|
||||||
private javax.swing.JSeparator optionsSeparator;
|
|
||||||
private javax.swing.JLabel orgLabel;
|
private javax.swing.JLabel orgLabel;
|
||||||
private javax.swing.JLabel readOnlyLabel;
|
private javax.swing.JLabel readOnlyLabel;
|
||||||
private javax.swing.JCheckBox sendIngestMessagesCheckBox;
|
private javax.swing.JCheckBox sendIngestMessagesCheckBox;
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
|
|
||||||
OtherCasesSearchDialog.searchButton.AccessibleContext.accessibleDescription=
|
|
||||||
OtherCasesSearchDialog.searchButton.AccessibleContext.accessibleName=Search
|
|
||||||
OtherCasesSearchDialog.searchButton.text=Search
|
|
||||||
OtherCasesSearchDialog.correlationValueTextField.text=
|
|
||||||
OtherCasesSearchDialog.correlationValueLabel.text=Correlation Property Value:
|
|
||||||
OtherCasesSearchDialog.descriptionLabel.text=<html>Search the Central Repository for correlation properties with a specified value. The search is case insensitive.</html>
|
|
||||||
OtherCasesSearchDialog.errorLabel.text=\
|
|
||||||
OtherCasesSearchDialog.correlationTypeLabel.text=Correlation Property Type:
|
|
||||||
OtherCasesSearchDialog.casesLabel.text=\
|
|
@ -32,16 +32,16 @@ import org.sleuthkit.datamodel.TskCoreException;
|
|||||||
* Extracts text from artifacts by concatenating the values of all of the
|
* Extracts text from artifacts by concatenating the values of all of the
|
||||||
* artifact's attributes.
|
* artifact's attributes.
|
||||||
*/
|
*/
|
||||||
class ArtifactTextExtractor extends TextExtractor {
|
class ArtifactTextExtractor implements TextExtractor {
|
||||||
|
|
||||||
private final BlackboardArtifact artifact;
|
private final BlackboardArtifact artifact;
|
||||||
|
|
||||||
public ArtifactTextExtractor(Content artifact) {
|
public ArtifactTextExtractor(BlackboardArtifact artifact) {
|
||||||
this.artifact = (BlackboardArtifact) artifact;
|
this.artifact = artifact;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Reader getReader() throws ExtractionException {
|
public Reader getReader() throws InitReaderException {
|
||||||
// Concatenate the string values of all attributes into a single
|
// Concatenate the string values of all attributes into a single
|
||||||
// "content" string to be indexed.
|
// "content" string to be indexed.
|
||||||
StringBuilder artifactContents = new StringBuilder();
|
StringBuilder artifactContents = new StringBuilder();
|
||||||
@ -50,10 +50,10 @@ class ArtifactTextExtractor extends TextExtractor {
|
|||||||
try {
|
try {
|
||||||
dataSource = artifact.getDataSource();
|
dataSource = artifact.getDataSource();
|
||||||
} catch (TskCoreException tskCoreException) {
|
} catch (TskCoreException tskCoreException) {
|
||||||
throw new ExtractionException("Unable to get datasource for artifact: " + artifact.toString(), tskCoreException);
|
throw new InitReaderException("Unable to get datasource for artifact: " + artifact.toString(), tskCoreException);
|
||||||
}
|
}
|
||||||
if (dataSource == null) {
|
if (dataSource == null) {
|
||||||
throw new ExtractionException("Datasource was null for artifact: " + artifact.toString());
|
throw new InitReaderException("Datasource was null for artifact: " + artifact.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -75,7 +75,7 @@ class ArtifactTextExtractor extends TextExtractor {
|
|||||||
artifactContents.append(System.lineSeparator());
|
artifactContents.append(System.lineSeparator());
|
||||||
}
|
}
|
||||||
} catch (TskCoreException tskCoreException) {
|
} catch (TskCoreException tskCoreException) {
|
||||||
throw new ExtractionException("Unable to get attributes for artifact: " + artifact.toString(), tskCoreException);
|
throw new InitReaderException("Unable to get attributes for artifact: " + artifact.toString(), tskCoreException);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new InputStreamReader(IOUtils.toInputStream(artifactContents,
|
return new InputStreamReader(IOUtils.toInputStream(artifactContents,
|
||||||
@ -83,7 +83,7 @@ class ArtifactTextExtractor extends TextExtractor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isSupported(Content file, String detectedFormat) {
|
public boolean isSupported() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
Core/src/org/sleuthkit/autopsy/textextractors/Bundle.properties
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
AbstractFileTikaTextExtract.index.tikaParseTimeout.text=Exception\: Tika parse timeout for content\: {0}, {1}
|
||||||
|
AbstractFileTikaTextExtract.index.exception.tikaParse.msg=Exception\: Unexpected exception from Tika parse task execution for file\: {0}, {1}
|
2
Core/src/org/sleuthkit/autopsy/textextractors/Bundle_ja.properties
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
AbstractFileTikaTextExtract.index.exception.tikaParse.msg=\u4f8b\u5916\uff1a\u30d5\u30a1\u30a4\u30eb\uff1a{0}, {1}\u306eApache Tika\u30d1\u30fc\u30b9\u30bf\u30b9\u30af\u5b9f\u884c\u4e2d\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916
|
||||||
|
AbstractFileTikaTextExtract.index.tikaParseTimeout.text=\u4f8b\u5916\uff1a\u30b3\u30f3\u30c6\u30f3\u30c4\uff1a{0}, {1}\u306eApache Tika\u30d1\u30fc\u30b9\u306e\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8
|
@ -32,17 +32,17 @@ import net.htmlparser.jericho.Source;
|
|||||||
import net.htmlparser.jericho.StartTag;
|
import net.htmlparser.jericho.StartTag;
|
||||||
import net.htmlparser.jericho.StartTagType;
|
import net.htmlparser.jericho.StartTagType;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.ReadContentInputStream;
|
import org.sleuthkit.datamodel.ReadContentInputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extracts text from HTML content.
|
* Extracts text from HTML content.
|
||||||
*/
|
*/
|
||||||
final class HtmlTextExtractor extends TextExtractor {
|
final class HtmlTextExtractor implements TextExtractor {
|
||||||
|
|
||||||
static final private Logger logger = Logger.getLogger(HtmlTextExtractor.class.getName());
|
static final private Logger logger = Logger.getLogger(HtmlTextExtractor.class.getName());
|
||||||
private final int MAX_SIZE;
|
private final int MAX_SIZE;
|
||||||
private final Content file;
|
private final AbstractFile file;
|
||||||
|
|
||||||
static final List<String> WEB_MIME_TYPES = Arrays.asList(
|
static final List<String> WEB_MIME_TYPES = Arrays.asList(
|
||||||
"application/javascript", //NON-NLS
|
"application/javascript", //NON-NLS
|
||||||
@ -62,7 +62,7 @@ final class HtmlTextExtractor extends TextExtractor {
|
|||||||
* Creates a default instance of the HtmlTextExtractor. Supported file size
|
* Creates a default instance of the HtmlTextExtractor. Supported file size
|
||||||
* is 50MB.
|
* is 50MB.
|
||||||
*/
|
*/
|
||||||
public HtmlTextExtractor(Content file) {
|
public HtmlTextExtractor(AbstractFile file) {
|
||||||
//Set default to be 50 MB.
|
//Set default to be 50 MB.
|
||||||
MAX_SIZE = 50_000_000;
|
MAX_SIZE = 50_000_000;
|
||||||
this.file = file;
|
this.file = file;
|
||||||
@ -77,10 +77,10 @@ final class HtmlTextExtractor extends TextExtractor {
|
|||||||
* @return flag indicating support
|
* @return flag indicating support
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isSupported(Content content, String detectedFormat) {
|
public boolean isSupported() {
|
||||||
return detectedFormat != null
|
return file.getMIMEType() != null
|
||||||
&& WEB_MIME_TYPES.contains(detectedFormat)
|
&& WEB_MIME_TYPES.contains(file.getMIMEType())
|
||||||
&& content.getSize() <= MAX_SIZE;
|
&& file.getSize() <= MAX_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -93,7 +93,7 @@ final class HtmlTextExtractor extends TextExtractor {
|
|||||||
* @throws TextExtractorException
|
* @throws TextExtractorException
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Reader getReader() throws ExtractionException {
|
public Reader getReader() throws InitReaderException {
|
||||||
//TODO JIRA-4467, there is only harm in excluding HTML documents greater
|
//TODO JIRA-4467, there is only harm in excluding HTML documents greater
|
||||||
//than 50MB due to our troubled approach of extraction.
|
//than 50MB due to our troubled approach of extraction.
|
||||||
ReadContentInputStream stream = new ReadContentInputStream(file);
|
ReadContentInputStream stream = new ReadContentInputStream(file);
|
||||||
@ -190,7 +190,7 @@ final class HtmlTextExtractor extends TextExtractor {
|
|||||||
return new StringReader(stringBuilder.toString());
|
return new StringReader(stringBuilder.toString());
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
logger.log(Level.WARNING, "Error extracting HTML from content.", ex);
|
logger.log(Level.WARNING, "Error extracting HTML from content.", ex);
|
||||||
throw new ExtractionException("Error extracting HTML from content.", ex);
|
throw new InitReaderException("Error extracting HTML from content.", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,6 @@ import org.sleuthkit.autopsy.coreutils.SQLiteTableReaderException;
|
|||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.coreutils.SQLiteTableReader;
|
import org.sleuthkit.autopsy.coreutils.SQLiteTableReader;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.Content;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extracts text from SQLite database files.
|
* Extracts text from SQLite database files.
|
||||||
@ -39,14 +38,14 @@ import org.sleuthkit.datamodel.Content;
|
|||||||
* 2) Tables that contain spaces in their name are not extracted
|
* 2) Tables that contain spaces in their name are not extracted
|
||||||
* 3) Table names are not included in its output text
|
* 3) Table names are not included in its output text
|
||||||
*/
|
*/
|
||||||
final class SqliteTextExtractor extends TextExtractor {
|
final class SqliteTextExtractor implements TextExtractor {
|
||||||
|
|
||||||
private static final String SQLITE_MIMETYPE = "application/x-sqlite3";
|
private static final String SQLITE_MIMETYPE = "application/x-sqlite3";
|
||||||
private static final Logger logger = Logger.getLogger(SqliteTextExtractor.class.getName());
|
private static final Logger logger = Logger.getLogger(SqliteTextExtractor.class.getName());
|
||||||
private final AbstractFile file;
|
private final AbstractFile file;
|
||||||
|
|
||||||
public SqliteTextExtractor(Content file) {
|
public SqliteTextExtractor(AbstractFile file) {
|
||||||
this.file = (AbstractFile) file;
|
this.file = file;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Supports only the sqlite mimetypes
|
* Supports only the sqlite mimetypes
|
||||||
@ -57,8 +56,8 @@ final class SqliteTextExtractor extends TextExtractor {
|
|||||||
* @return true if x-sqlite3
|
* @return true if x-sqlite3
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isSupported(Content file, String detectedFormat) {
|
public boolean isSupported() {
|
||||||
return SQLITE_MIMETYPE.equals(detectedFormat);
|
return SQLITE_MIMETYPE.equals(file.getMIMEType());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,7 +70,7 @@ final class SqliteTextExtractor extends TextExtractor {
|
|||||||
* @throws TextExtractorException
|
* @throws TextExtractorException
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Reader getReader() throws ExtractionException {
|
public Reader getReader() throws InitReaderException {
|
||||||
return new SQLiteStreamReader(file);
|
return new SQLiteStreamReader(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,8 +104,8 @@ final class SqliteTextExtractor extends TextExtractor {
|
|||||||
public SQLiteStreamReader(AbstractFile file) {
|
public SQLiteStreamReader(AbstractFile file) {
|
||||||
this.file = file;
|
this.file = file;
|
||||||
reader = new SQLiteTableReader.Builder(file)
|
reader = new SQLiteTableReader.Builder(file)
|
||||||
.onColumnNames(getColumnNameStrategy())
|
.forAllColumnNames(getColumnNameStrategy())
|
||||||
.forAll(getForAllTableValuesStrategy()).build();
|
.forAllTableValues(getForAllTableValuesStrategy()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,7 +28,7 @@ import java.util.Objects;
|
|||||||
import org.openide.util.Lookup;
|
import org.openide.util.Lookup;
|
||||||
import org.sleuthkit.autopsy.coreutils.StringExtract;
|
import org.sleuthkit.autopsy.coreutils.StringExtract;
|
||||||
import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT;
|
import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT;
|
||||||
import org.sleuthkit.autopsy.textextractors.extractionconfigs.DefaultExtractionConfig;
|
import org.sleuthkit.autopsy.textextractors.configs.StringsConfig;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskException;
|
import org.sleuthkit.datamodel.TskException;
|
||||||
@ -36,7 +36,7 @@ import org.sleuthkit.datamodel.TskException;
|
|||||||
/**
|
/**
|
||||||
* Extracts raw strings from content.
|
* Extracts raw strings from content.
|
||||||
*/
|
*/
|
||||||
final class StringsTextExtractor extends TextExtractor {
|
final class StringsTextExtractor implements TextExtractor {
|
||||||
|
|
||||||
private boolean extractUTF8;
|
private boolean extractUTF8;
|
||||||
private boolean extractUTF16;
|
private boolean extractUTF16;
|
||||||
@ -78,8 +78,6 @@ final class StringsTextExtractor extends TextExtractor {
|
|||||||
*
|
*
|
||||||
* @return A reader instance that content text can be obtained from
|
* @return A reader instance that content text can be obtained from
|
||||||
*
|
*
|
||||||
* @throws
|
|
||||||
* org.sleuthkit.autopsy.textextractors.TextExtractor.TextExtractorException
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public InputStreamReader getReader() {
|
public InputStreamReader getReader() {
|
||||||
@ -100,15 +98,15 @@ final class StringsTextExtractor extends TextExtractor {
|
|||||||
* Determines how the extraction process will proceed given the settings
|
* Determines how the extraction process will proceed given the settings
|
||||||
* stored in this context instance.
|
* stored in this context instance.
|
||||||
*
|
*
|
||||||
* See the DefaultExtractionConfig class in the extractionconfigs package
|
* See the StringsConfig class in the extractionconfigs package for
|
||||||
* for available settings.
|
* available settings.
|
||||||
*
|
*
|
||||||
* @param context Lookup instance containing config classes
|
* @param context Lookup instance containing config classes
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setExtractionSettings(Lookup context) {
|
public void setExtractionSettings(Lookup context) {
|
||||||
if (context != null) {
|
if (context != null) {
|
||||||
DefaultExtractionConfig configInstance = context.lookup(DefaultExtractionConfig.class);
|
StringsConfig configInstance = context.lookup(StringsConfig.class);
|
||||||
if (configInstance == null) {
|
if (configInstance == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -118,8 +116,8 @@ final class StringsTextExtractor extends TextExtractor {
|
|||||||
if (Objects.nonNull(configInstance.getExtractUTF16())) {
|
if (Objects.nonNull(configInstance.getExtractUTF16())) {
|
||||||
extractUTF16 = configInstance.getExtractUTF16();
|
extractUTF16 = configInstance.getExtractUTF16();
|
||||||
}
|
}
|
||||||
if (Objects.nonNull(configInstance.getExtractScripts())) {
|
if (Objects.nonNull(configInstance.getLanguageScripts())) {
|
||||||
setScripts(configInstance.getExtractScripts());
|
setScripts(configInstance.getLanguageScripts());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,15 +127,10 @@ final class StringsTextExtractor extends TextExtractor {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isEnabled() {
|
public boolean isSupported() {
|
||||||
return extractUTF8 || extractUTF16;
|
return extractUTF8 || extractUTF16;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
boolean isSupported(Content file, String detectedFormat) {
|
|
||||||
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Content input string stream reader/converter - given Content, extract
|
* Content input string stream reader/converter - given Content, extract
|
||||||
* strings from it and return encoded bytes via read()
|
* strings from it and return encoded bytes via read()
|
||||||
|
@ -20,55 +20,37 @@ package org.sleuthkit.autopsy.textextractors;
|
|||||||
|
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
import org.openide.util.Lookup;
|
import org.openide.util.Lookup;
|
||||||
import org.sleuthkit.datamodel.Content;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extracts the text out of {@link org.sleuthkit.datamodel.Content} instances
|
* Extracts the text out of Content instances and exposes them as a Reader.
|
||||||
* and exposes them as a {@link java.io.Reader}. Concrete implementations can be
|
* Concrete implementations can be obtained from
|
||||||
* obtained from
|
* {@link org.sleuthkit.autopsy.textextractors.TextExtractorFactory}
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractorFactory#getExtractor(org.sleuthkit.datamodel.Content)}
|
|
||||||
* or
|
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractorFactory#getExtractor(org.sleuthkit.datamodel.Content, org.openide.util.Lookup)}.
|
|
||||||
*
|
|
||||||
* @see org.sleuthkit.autopsy.textextractors.TextExtractorFactory
|
|
||||||
*/
|
*/
|
||||||
public abstract class TextExtractor {
|
public interface TextExtractor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if the file content is supported by the extractor.
|
* Determines if this extractor supports the given Content and
|
||||||
*
|
* configurations passed into it in
|
||||||
* @param file to test if its content should be supported
|
|
||||||
* @param detectedFormat mime-type with detected format (such as text/plain)
|
|
||||||
* or null if not detected
|
|
||||||
*
|
|
||||||
* @return true if the file content is supported, false otherwise
|
|
||||||
*/
|
|
||||||
abstract boolean isSupported(Content file, String detectedFormat);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if the TextExtractor instance is enabled to read content.
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
boolean isEnabled() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a {@link java.io.Reader} that will iterate over the text extracted
|
|
||||||
* from the {@link org.sleuthkit.datamodel.Content} passed into
|
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractorFactory}.
|
* {@link org.sleuthkit.autopsy.textextractors.TextExtractorFactory}.
|
||||||
*
|
*
|
||||||
* @return {@link java.io.Reader} that contains the text of the underlying
|
* @return true if content is supported, false otherwise
|
||||||
* {@link org.sleuthkit.datamodel.Content}
|
*/
|
||||||
|
boolean isSupported();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a Reader that will iterate over the text extracted from the Content
|
||||||
|
* passed into
|
||||||
|
* {@link org.sleuthkit.autopsy.textextractors.TextExtractorFactory}.
|
||||||
|
*
|
||||||
|
* @return Reader that contains the text of the underlying Content
|
||||||
*
|
*
|
||||||
* @throws
|
* @throws
|
||||||
* org.sleuthkit.autopsy.textextractors.TextExtractor.ExtractionException
|
* org.sleuthkit.autopsy.textextractors.TextExtractor.InitReaderException
|
||||||
*
|
*
|
||||||
* @see org.sleuthkit.autopsy.textextractors.TextExtractorFactory
|
* @see org.sleuthkit.autopsy.textextractors.TextExtractorFactory
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract Reader getReader() throws ExtractionException;
|
Reader getReader() throws InitReaderException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines how the extraction process will proceed given the settings
|
* Determines how the extraction process will proceed given the settings
|
||||||
@ -76,27 +58,24 @@ public abstract class TextExtractor {
|
|||||||
*
|
*
|
||||||
* @param context Instance containing file config classes
|
* @param context Instance containing file config classes
|
||||||
*/
|
*/
|
||||||
void setExtractionSettings(Lookup context) {
|
default void setExtractionSettings(Lookup context) {
|
||||||
//no-op by default
|
//no-op by default
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exception encountered during
|
* System level exception for reader initialization.
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractor#getReader()}.
|
|
||||||
* This indicates that there was an internal parsing error that occurred
|
|
||||||
* during the reading of Content text.
|
|
||||||
*/
|
*/
|
||||||
public class ExtractionException extends Exception {
|
public class InitReaderException extends Exception {
|
||||||
|
|
||||||
public ExtractionException(String msg, Throwable ex) {
|
public InitReaderException(String msg, Throwable ex) {
|
||||||
super(msg, ex);
|
super(msg, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExtractionException(Throwable ex) {
|
public InitReaderException(Throwable ex) {
|
||||||
super(ex);
|
super(ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExtractionException(String msg) {
|
public InitReaderException(String msg) {
|
||||||
super(msg);
|
super(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,52 +27,37 @@ import org.sleuthkit.datamodel.Content;
|
|||||||
import org.sleuthkit.datamodel.Report;
|
import org.sleuthkit.datamodel.Report;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory for creating
|
* Factory for creating TextExtractors given a Content instance
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractor}'s given a
|
|
||||||
* {@link org.sleuthkit.datamodel.Content} instance
|
|
||||||
*
|
*
|
||||||
* See {@link org.sleuthkit.autopsy.textextractors.extractionconfigs} for
|
* See {@link org.sleuthkit.autopsy.textextractors.textextractorconfigs} for
|
||||||
* available {@link org.sleuthkit.autopsy.textextractors.TextExtractor}
|
* available extractor configuration options.
|
||||||
* configuration options.
|
|
||||||
*
|
*
|
||||||
* @see org.openide.util.Lookup
|
* @see org.openide.util.Lookup
|
||||||
*/
|
*/
|
||||||
public class TextExtractorFactory {
|
public class TextExtractorFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Auto detects the correct
|
* Returns a TextExtractor containing the Content text. Configuration files
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractor} given the
|
* can be added to the Lookup.
|
||||||
* {@link org.sleuthkit.datamodel.Content}.
|
|
||||||
*
|
*
|
||||||
* See {@link org.sleuthkit.autopsy.textextractors.extractionconfigs} for
|
* See {@link org.sleuthkit.autopsy.textextractors.textextractorconfigs} for
|
||||||
* available {@link org.sleuthkit.autopsy.textextractors.TextExtractor}
|
* available extractor configuration options.
|
||||||
* configuration options.
|
|
||||||
*
|
*
|
||||||
* @param content Content source that will be read from
|
* @param content Content source that will be read from
|
||||||
* @param context Contains extraction configurations for certain file types
|
* @param context Contains extraction configurations for certain file types
|
||||||
*
|
*
|
||||||
* @return A TextExtractor that supports the given content. File text can be
|
* @return TextExtractor containing file text
|
||||||
* obtained from
|
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractor#getReader()}.
|
|
||||||
*
|
*
|
||||||
* @throws NoTextExtractorFound Encountered when there is no TextExtractor
|
* @throws NoTextExtractorFound Encountered when there is no Reader found
|
||||||
* was found for the given content type. Use {@link
|
* for the given content type or there was an
|
||||||
* TextExtractorFactory#getDefaultExtractor(org.sleuthkit.datamodel.Content,
|
* error while creating the reader.
|
||||||
* org.openide.util.Lookup)}
|
|
||||||
*
|
*
|
||||||
* @see org.openide.util.Lookup
|
* @see org.openide.util.Lookup
|
||||||
*/
|
*/
|
||||||
public static TextExtractor getExtractor(Content content,
|
public static TextExtractor getExtractor(Content content, Lookup context) throws NoTextExtractorFound {
|
||||||
Lookup context) throws NoTextExtractorFound {
|
|
||||||
if (content instanceof AbstractFile) {
|
if (content instanceof AbstractFile) {
|
||||||
String mimeType = ((AbstractFile) content).getMIMEType();
|
for (TextExtractor extractor : getFileExtractors((AbstractFile) content, context)) {
|
||||||
List<TextExtractor> extractors = Arrays.asList(
|
if (extractor.isSupported()) {
|
||||||
new HtmlTextExtractor(content),
|
|
||||||
new SqliteTextExtractor(content),
|
|
||||||
new TikaTextExtractor(content));
|
|
||||||
for (TextExtractor extractor : extractors) {
|
|
||||||
extractor.setExtractionSettings(context);
|
|
||||||
if (extractor.isEnabled() && extractor.isSupported(content, mimeType)) {
|
|
||||||
return extractor;
|
return extractor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,49 +72,69 @@ public class TextExtractorFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw new NoTextExtractorFound(
|
throw new NoTextExtractorFound(
|
||||||
String.format("Could not find a suitable extractor for "
|
String.format("Could not find a suitable reader for "
|
||||||
+ "content with name [%s] and id=[%d]. Try using the default, "
|
+ "content with name [%s] and id=[%d]. Try using "
|
||||||
+ "non content specific extractor as an alternative.",
|
+ "the strings extractor instead.",
|
||||||
content.getName(), content.getId())
|
content.getName(), content.getId())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Auto detects the correct
|
* Initializes, orders, and returns all file extractors that can read
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractor} given the
|
* AbstractFile instances.
|
||||||
* {@link org.sleuthkit.datamodel.Content}.
|
|
||||||
*
|
*
|
||||||
* @param content Content instance that will be read from
|
* @param content AbstractFile content
|
||||||
|
* @param context Lookup containing extractor configurations
|
||||||
*
|
*
|
||||||
* @return A TextExtractor that supports the given content. File text can be
|
* @return
|
||||||
* obtained from {@link TextExtractor#getReader()}.
|
|
||||||
*
|
|
||||||
* @throws NoTextExtractorFound Encountered when there is no TextExtractor
|
|
||||||
* was found for the given content type. Use {@link
|
|
||||||
* TextExtractorFactory#getDefaultExtractor(org.sleuthkit.datamodel.Content,
|
|
||||||
* org.openide.util.Lookup)}
|
|
||||||
*/
|
*/
|
||||||
public static TextExtractor getExtractor(Content content)
|
private static List<TextExtractor> getFileExtractors(AbstractFile content, Lookup context) {
|
||||||
throws NoTextExtractorFound {
|
List<TextExtractor> fileExtractors = Arrays.asList(
|
||||||
return getExtractor(content, null);
|
new HtmlTextExtractor(content),
|
||||||
|
new SqliteTextExtractor(content),
|
||||||
|
new TikaTextExtractor(content));
|
||||||
|
|
||||||
|
fileExtractors.forEach((fileExtractor) -> {
|
||||||
|
fileExtractor.setExtractionSettings(context);
|
||||||
|
});
|
||||||
|
|
||||||
|
return fileExtractors;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the default extractor that can be run on any content type. This
|
* Returns a TextExtractor containing the Content text.
|
||||||
* extractor should be used as a backup in the event that no extractor was
|
*
|
||||||
* found using or {@link TextExtractorFactory#getDefaultExtractor(org.sleuthkit.datamodel.Content, org.openide.util.Lookup)}
|
* @param content Content instance that will be read from
|
||||||
* {@link TextExtractorFactory#getExtractor(org.sleuthkit.datamodel.Content)}.
|
*
|
||||||
|
* @return TextExtractor containing file text
|
||||||
|
*
|
||||||
|
* @throws NoTextExtractorFound Encountered when there is no Reader was
|
||||||
|
* found for the given content type. Use
|
||||||
|
* getStringsExtractor(Content,Lookup) method
|
||||||
|
* instead.
|
||||||
|
*/
|
||||||
|
public static TextExtractor getExtractor(Content content) throws NoTextExtractorFound {
|
||||||
|
return TextExtractorFactory.getExtractor(content, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a TextExtractor containing the Content strings. This method
|
||||||
|
* supports all content types. This method should be used as a backup in the
|
||||||
|
* event that no reader was found using getExtractor(Content) or
|
||||||
|
* getExtractor(Content, Lookup).
|
||||||
|
*
|
||||||
|
* Configure this extractor with the StringsConfig in
|
||||||
|
* {@link org.sleuthkit.autopsy.textextractors.textextractorconfigs}
|
||||||
*
|
*
|
||||||
* @param content Content source to read from
|
* @param content Content source to read from
|
||||||
* @param context Contains extraction configurations for certain file types
|
* @param context Contains extraction configurations for certain file types
|
||||||
*
|
*
|
||||||
* @return A DefaultExtractor instance. File text can be obtained from
|
* @return TextExtractor containing file text
|
||||||
* {@link TextExtractor#getReader()}.
|
|
||||||
*
|
*
|
||||||
* @see org.openide.util.Lookup
|
* @see org.openide.util.Lookup
|
||||||
*/
|
*/
|
||||||
public static TextExtractor getDefaultExtractor(Content content, Lookup context) {
|
public static TextExtractor getStringsExtractor(Content content, Lookup context) {
|
||||||
TextExtractor stringsInstance = new StringsTextExtractor(content);
|
StringsTextExtractor stringsInstance = new StringsTextExtractor(content);
|
||||||
stringsInstance.setExtractionSettings(context);
|
stringsInstance.setExtractionSettings(context);
|
||||||
return stringsInstance;
|
return stringsInstance;
|
||||||
}
|
}
|
||||||
@ -137,12 +142,6 @@ public class TextExtractorFactory {
|
|||||||
/**
|
/**
|
||||||
* System level exception for handling content types that have no specific
|
* System level exception for handling content types that have no specific
|
||||||
* strategy defined for extracting their text.
|
* strategy defined for extracting their text.
|
||||||
*
|
|
||||||
* @see
|
|
||||||
* org.sleuthkit.autopsy.textextractors.TextExtractorFactory#getExtractor(org.sleuthkit.datamodel.Content)
|
|
||||||
* @see
|
|
||||||
* org.sleuthkit.autopsy.textextractors.TextExtractorFactory#getDefaultExtractor(org.sleuthkit.datamodel.Content,
|
|
||||||
* org.openide.util.Lookup)}
|
|
||||||
*/
|
*/
|
||||||
public static class NoTextExtractorFound extends Exception {
|
public static class NoTextExtractorFound extends Exception {
|
||||||
|
|
||||||
@ -153,5 +152,9 @@ public class TextExtractorFactory {
|
|||||||
public NoTextExtractorFound(Throwable ex) {
|
public NoTextExtractorFound(Throwable ex) {
|
||||||
super(ex);
|
super(ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private NoTextExtractorFound(String msg, Throwable ex) {
|
||||||
|
super(msg, ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,18 +20,23 @@ package org.sleuthkit.autopsy.textextractors;
|
|||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.io.CharSource;
|
import com.google.common.io.CharSource;
|
||||||
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.io.PushbackReader;
|
import java.io.PushbackReader;
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Arrays;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.concurrent.ThreadFactory;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@ -50,8 +55,15 @@ import org.apache.tika.parser.pdf.PDFParserConfig;
|
|||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.modules.InstalledFileLocator;
|
import org.openide.modules.InstalledFileLocator;
|
||||||
import org.openide.util.Lookup;
|
import org.openide.util.Lookup;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.ExecUtil;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.ExecUtil.ProcessTerminator;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.FileUtil;
|
||||||
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||||
import org.sleuthkit.autopsy.textextractors.extractionconfigs.ImageFileExtractionConfig;
|
import org.sleuthkit.autopsy.textextractors.configs.ImageConfig;
|
||||||
|
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
||||||
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.datamodel.ReadContentInputStream;
|
import org.sleuthkit.datamodel.ReadContentInputStream;
|
||||||
|
|
||||||
@ -59,7 +71,7 @@ import org.sleuthkit.datamodel.ReadContentInputStream;
|
|||||||
* Extracts text from Tika supported content. Protects against Tika parser hangs
|
* Extracts text from Tika supported content. Protects against Tika parser hangs
|
||||||
* (for unexpected/corrupt content) using a timeout mechanism.
|
* (for unexpected/corrupt content) using a timeout mechanism.
|
||||||
*/
|
*/
|
||||||
final class TikaTextExtractor extends TextExtractor {
|
final class TikaTextExtractor implements TextExtractor {
|
||||||
|
|
||||||
//Mimetype groups to aassist extractor implementations in ignoring binary and
|
//Mimetype groups to aassist extractor implementations in ignoring binary and
|
||||||
//archive files.
|
//archive files.
|
||||||
@ -110,7 +122,9 @@ final class TikaTextExtractor extends TextExtractor {
|
|||||||
|
|
||||||
private static final java.util.logging.Logger tikaLogger = java.util.logging.Logger.getLogger("Tika"); //NON-NLS
|
private static final java.util.logging.Logger tikaLogger = java.util.logging.Logger.getLogger("Tika"); //NON-NLS
|
||||||
|
|
||||||
private final ExecutorService tikaParseExecutor = Executors.newSingleThreadExecutor();
|
private final ThreadFactory tikaThreadFactory
|
||||||
|
= new ThreadFactoryBuilder().setNameFormat("tika-reader-%d").build();
|
||||||
|
private final ExecutorService executorService = Executors.newSingleThreadExecutor(tikaThreadFactory);
|
||||||
private static final String SQLITE_MIMETYPE = "application/x-sqlite3";
|
private static final String SQLITE_MIMETYPE = "application/x-sqlite3";
|
||||||
|
|
||||||
private final AutoDetectParser parser = new AutoDetectParser();
|
private final AutoDetectParser parser = new AutoDetectParser();
|
||||||
@ -121,6 +135,10 @@ final class TikaTextExtractor extends TextExtractor {
|
|||||||
private static final String TESSERACT_EXECUTABLE = "tesseract.exe"; //NON-NLS
|
private static final String TESSERACT_EXECUTABLE = "tesseract.exe"; //NON-NLS
|
||||||
private static final File TESSERACT_PATH = locateTesseractExecutable();
|
private static final File TESSERACT_PATH = locateTesseractExecutable();
|
||||||
private static final String LANGUAGE_PACKS = getLanguagePacks();
|
private static final String LANGUAGE_PACKS = getLanguagePacks();
|
||||||
|
private static final String TESSERACT_LANGUAGE_PACK_EXT = "traineddata"; //NON-NLS
|
||||||
|
private static final String TESSERACT_OUTPUT_FILE_NAME = "tess_output"; //NON-NLS
|
||||||
|
|
||||||
|
private ProcessTerminator processTerminator;
|
||||||
|
|
||||||
private static final List<String> TIKA_SUPPORTED_TYPES
|
private static final List<String> TIKA_SUPPORTED_TYPES
|
||||||
= new Tika().getParser().getSupportedTypes(new ParseContext())
|
= new Tika().getParser().getSupportedTypes(new ParseContext())
|
||||||
@ -132,6 +150,18 @@ final class TikaTextExtractor extends TextExtractor {
|
|||||||
this.content = content;
|
this.content = content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If Tesseract has been installed and is set to be used through
|
||||||
|
* configuration, then ocr is enabled. OCR can only currently be run on
|
||||||
|
* 64 bit Windows OS.
|
||||||
|
*
|
||||||
|
* @return Flag indicating if OCR is set to be used.
|
||||||
|
*/
|
||||||
|
private boolean ocrEnabled() {
|
||||||
|
return TESSERACT_PATH != null && tesseractOCREnabled
|
||||||
|
&& PlatformUtil.isWindowsOS() == true && PlatformUtil.is64BitOS();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a reader that will iterate over the text extracted from Apache
|
* Returns a reader that will iterate over the text extracted from Apache
|
||||||
* Tika.
|
* Tika.
|
||||||
@ -144,13 +174,46 @@ final class TikaTextExtractor extends TextExtractor {
|
|||||||
* org.sleuthkit.autopsy.textextractors.TextExtractor.TextExtractorException
|
* org.sleuthkit.autopsy.textextractors.TextExtractor.TextExtractorException
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Reader getReader() throws ExtractionException {
|
public Reader getReader() throws InitReaderException {
|
||||||
ReadContentInputStream stream = new ReadContentInputStream(content);
|
InputStream stream = null;
|
||||||
|
|
||||||
Metadata metadata = new Metadata();
|
|
||||||
ParseContext parseContext = new ParseContext();
|
ParseContext parseContext = new ParseContext();
|
||||||
parseContext.set(Parser.class, parser);
|
parseContext.set(Parser.class, parser);
|
||||||
|
|
||||||
|
if (ocrEnabled() && content instanceof AbstractFile) {
|
||||||
|
AbstractFile file = ((AbstractFile) content);
|
||||||
|
//Run OCR on images with Tesseract directly.
|
||||||
|
if (file.getMIMEType().toLowerCase().startsWith("image/")) {
|
||||||
|
stream = performOCR(file);
|
||||||
|
} else {
|
||||||
|
//Otherwise, go through Tika for PDFs so that it can
|
||||||
|
//extract images and run Tesseract on them.
|
||||||
|
PDFParserConfig pdfConfig = new PDFParserConfig();
|
||||||
|
|
||||||
|
// Extracting the inline images and letting Tesseract run on each inline image.
|
||||||
|
// https://wiki.apache.org/tika/PDFParser%20%28Apache%20PDFBox%29
|
||||||
|
// https://tika.apache.org/1.7/api/org/apache/tika/parser/pdf/PDFParserConfig.html
|
||||||
|
pdfConfig.setExtractInlineImages(true);
|
||||||
|
// Multiple pages within a PDF file might refer to the same underlying image.
|
||||||
|
pdfConfig.setExtractUniqueInlineImagesOnly(true);
|
||||||
|
parseContext.set(PDFParserConfig.class, pdfConfig);
|
||||||
|
|
||||||
|
// Configure Tesseract parser to perform OCR
|
||||||
|
TesseractOCRConfig ocrConfig = new TesseractOCRConfig();
|
||||||
|
String tesseractFolder = TESSERACT_PATH.getParent();
|
||||||
|
ocrConfig.setTesseractPath(tesseractFolder);
|
||||||
|
|
||||||
|
ocrConfig.setLanguage(LANGUAGE_PACKS);
|
||||||
|
ocrConfig.setTessdataPath(PlatformUtil.getOcrLanguagePacksPath());
|
||||||
|
parseContext.set(TesseractOCRConfig.class, ocrConfig);
|
||||||
|
|
||||||
|
stream = new ReadContentInputStream(content);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
stream = new ReadContentInputStream(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
Metadata metadata = new Metadata();
|
||||||
// Use the more memory efficient Tika SAX parsers for DOCX and
|
// Use the more memory efficient Tika SAX parsers for DOCX and
|
||||||
// PPTX files (it already uses SAX for XLSX).
|
// PPTX files (it already uses SAX for XLSX).
|
||||||
OfficeParserConfig officeParserConfig = new OfficeParserConfig();
|
OfficeParserConfig officeParserConfig = new OfficeParserConfig();
|
||||||
@ -158,60 +221,163 @@ final class TikaTextExtractor extends TextExtractor {
|
|||||||
officeParserConfig.setUseSAXDocxExtractor(true);
|
officeParserConfig.setUseSAXDocxExtractor(true);
|
||||||
parseContext.set(OfficeParserConfig.class, officeParserConfig);
|
parseContext.set(OfficeParserConfig.class, officeParserConfig);
|
||||||
|
|
||||||
// configure OCR if it is enabled in KWS settings and installed on the machine
|
//Make the creation of a TikaReader a cancellable future in case it takes too long
|
||||||
if (TESSERACT_PATH != null && tesseractOCREnabled && PlatformUtil.isWindowsOS() == true) {
|
Future<Reader> future = executorService.submit(
|
||||||
|
new GetTikaReader(parser, stream, metadata, parseContext));
|
||||||
// configure PDFParser.
|
|
||||||
PDFParserConfig pdfConfig = new PDFParserConfig();
|
|
||||||
|
|
||||||
// Extracting the inline images and letting Tesseract run on each inline image.
|
|
||||||
// https://wiki.apache.org/tika/PDFParser%20%28Apache%20PDFBox%29
|
|
||||||
// https://tika.apache.org/1.7/api/org/apache/tika/parser/pdf/PDFParserConfig.html
|
|
||||||
pdfConfig.setExtractInlineImages(true);
|
|
||||||
// Multiple pages within a PDF file might refer to the same underlying image.
|
|
||||||
pdfConfig.setExtractUniqueInlineImagesOnly(true);
|
|
||||||
parseContext.set(PDFParserConfig.class, pdfConfig);
|
|
||||||
|
|
||||||
// Configure Tesseract parser to perform OCR
|
|
||||||
TesseractOCRConfig ocrConfig = new TesseractOCRConfig();
|
|
||||||
String tesseractFolder = TESSERACT_PATH.getParent();
|
|
||||||
ocrConfig.setTesseractPath(tesseractFolder);
|
|
||||||
// Tesseract expects language data packs to be in a subdirectory of tesseractFolder, in a folder called "tessdata".
|
|
||||||
// If they are stored somewhere else, use ocrConfig.setTessdataPath(String tessdataPath) to point to them
|
|
||||||
ocrConfig.setLanguage(LANGUAGE_PACKS);
|
|
||||||
parseContext.set(TesseractOCRConfig.class, ocrConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Parse the file in a task, a convenient way to have a timeout...
|
|
||||||
final Future<Reader> future = tikaParseExecutor.submit(() -> new ParsingReader(parser, stream, metadata, parseContext));
|
|
||||||
try {
|
try {
|
||||||
final Reader tikaReader = future.get(getTimeout(content.getSize()), TimeUnit.SECONDS);
|
final Reader tikaReader = future.get(getTimeout(content.getSize()), TimeUnit.SECONDS);
|
||||||
|
|
||||||
//check if the reader is empty
|
//check if the reader is empty
|
||||||
PushbackReader pushbackReader = new PushbackReader(tikaReader);
|
PushbackReader pushbackReader = new PushbackReader(tikaReader);
|
||||||
int read = pushbackReader.read();
|
int read = pushbackReader.read();
|
||||||
if (read == -1) {
|
if (read == -1) {
|
||||||
throw new ExtractionException("Unable to extract text: Tika returned empty reader for " + content);
|
throw new InitReaderException("Unable to extract text: "
|
||||||
|
+ "Tika returned empty reader for " + content);
|
||||||
}
|
}
|
||||||
pushbackReader.unread(read);
|
pushbackReader.unread(read);
|
||||||
|
|
||||||
//concatenate parsed content and meta data into a single reader.
|
//concatenate parsed content and meta data into a single reader.
|
||||||
CharSource metaDataCharSource = getMetaDataCharSource(metadata);
|
CharSource metaDataCharSource = getMetaDataCharSource(metadata);
|
||||||
return CharSource.concat(new ReaderCharSource(pushbackReader), metaDataCharSource).openStream();
|
return CharSource.concat(new ReaderCharSource(pushbackReader), metaDataCharSource).openStream();
|
||||||
} catch (TimeoutException te) {
|
} catch (TimeoutException te) {
|
||||||
final String msg = NbBundle.getMessage(this.getClass(), "AbstractFileTikaTextExtract.index.tikaParseTimeout.text", content.getId(), content.getName());
|
final String msg = NbBundle.getMessage(this.getClass(),
|
||||||
throw new ExtractionException(msg, te);
|
"AbstractFileTikaTextExtract.index.tikaParseTimeout.text",
|
||||||
} catch (ExtractionException ex) {
|
content.getId(), content.getName());
|
||||||
|
throw new InitReaderException(msg, te);
|
||||||
|
} catch (InitReaderException ex) {
|
||||||
throw ex;
|
throw ex;
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
tikaLogger.log(Level.WARNING, "Exception: Unable to Tika parse the content" + content.getId() + ": " + content.getName(), ex.getCause()); //NON-NLS
|
tikaLogger.log(Level.WARNING, "Exception: Unable to Tika parse the "
|
||||||
final String msg = NbBundle.getMessage(this.getClass(), "AbstractFileTikaTextExtract.index.exception.tikaParse.msg", content.getId(), content.getName());
|
+ "content" + content.getId() + ": " + content.getName(),
|
||||||
throw new ExtractionException(msg, ex);
|
ex.getCause()); //NON-NLS
|
||||||
|
final String msg = NbBundle.getMessage(this.getClass(),
|
||||||
|
"AbstractFileTikaTextExtract.index.exception.tikaParse.msg",
|
||||||
|
content.getId(), content.getName());
|
||||||
|
throw new InitReaderException(msg, ex);
|
||||||
} finally {
|
} finally {
|
||||||
future.cancel(true);
|
future.cancel(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run OCR and return the file stream produced by Tesseract.
|
||||||
|
*
|
||||||
|
* @param file Image file to run OCR on
|
||||||
|
*
|
||||||
|
* @return InputStream connected to the output file that Tesseract produced.
|
||||||
|
*
|
||||||
|
* @throws
|
||||||
|
* org.sleuthkit.autopsy.textextractors.TextExtractor.InitReaderException
|
||||||
|
*/
|
||||||
|
private InputStream performOCR(AbstractFile file) throws InitReaderException {
|
||||||
|
File inputFile = null;
|
||||||
|
File outputFile = null;
|
||||||
|
try {
|
||||||
|
String tempDirectory = Case.getCurrentCaseThrows().getTempDirectory();
|
||||||
|
|
||||||
|
//Appending file id makes the name unique
|
||||||
|
String tempFileName = FileUtil.escapeFileName(file.getId() + file.getName());
|
||||||
|
inputFile = Paths.get(tempDirectory, tempFileName).toFile();
|
||||||
|
ContentUtils.writeToFile(content, inputFile);
|
||||||
|
|
||||||
|
String tempOutputName = FileUtil.escapeFileName(file.getId() + TESSERACT_OUTPUT_FILE_NAME);
|
||||||
|
String outputFilePath = Paths.get(tempDirectory, tempOutputName).toString();
|
||||||
|
String executeablePath = TESSERACT_PATH.toString();
|
||||||
|
|
||||||
|
//Build tesseract commands
|
||||||
|
ProcessBuilder process = new ProcessBuilder();
|
||||||
|
process.command(executeablePath,
|
||||||
|
String.format("\"%s\"", inputFile.getAbsolutePath()),
|
||||||
|
String.format("\"%s\"", outputFilePath),
|
||||||
|
"--tessdata-dir", PlatformUtil.getOcrLanguagePacksPath(),
|
||||||
|
//language pack command flag
|
||||||
|
"-l", LANGUAGE_PACKS);
|
||||||
|
|
||||||
|
//If the ProcessTerminator was supplied during
|
||||||
|
//configuration apply it here.
|
||||||
|
if (processTerminator != null) {
|
||||||
|
ExecUtil.execute(process, 1, TimeUnit.SECONDS, processTerminator);
|
||||||
|
} else {
|
||||||
|
ExecUtil.execute(process);
|
||||||
|
}
|
||||||
|
|
||||||
|
outputFile = new File(outputFilePath + ".txt");
|
||||||
|
//Open a stream of the Tesseract text file and send this to Tika
|
||||||
|
return new CleanUpStream(outputFile);
|
||||||
|
} catch (NoCurrentCaseException | IOException ex) {
|
||||||
|
if (outputFile != null) {
|
||||||
|
outputFile.delete();
|
||||||
|
}
|
||||||
|
throw new InitReaderException("Could not successfully run Tesseract", ex);
|
||||||
|
} finally {
|
||||||
|
if (inputFile != null) {
|
||||||
|
inputFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps the creation of a TikaReader into a Future so that it can be
|
||||||
|
* cancelled.
|
||||||
|
*/
|
||||||
|
private class GetTikaReader implements Callable<Reader> {
|
||||||
|
|
||||||
|
private final AutoDetectParser parser;
|
||||||
|
private final InputStream stream;
|
||||||
|
private final Metadata metadata;
|
||||||
|
private final ParseContext parseContext;
|
||||||
|
|
||||||
|
public GetTikaReader(AutoDetectParser parser, InputStream stream,
|
||||||
|
Metadata metadata, ParseContext parseContext) {
|
||||||
|
this.parser = parser;
|
||||||
|
this.stream = stream;
|
||||||
|
this.metadata = metadata;
|
||||||
|
this.parseContext = parseContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Reader call() throws Exception {
|
||||||
|
return new ParsingReader(parser, stream, metadata, parseContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Automatically deletes the underlying File when the close() method is
|
||||||
|
* called. This is used to delete the Output file produced from Tesseract
|
||||||
|
* once it has been read by Tika.
|
||||||
|
*/
|
||||||
|
private class CleanUpStream extends FileInputStream {
|
||||||
|
|
||||||
|
private File file;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a reference to file on construction
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
*
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
*/
|
||||||
|
public CleanUpStream(File file) throws FileNotFoundException {
|
||||||
|
super(file);
|
||||||
|
this.file = file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete this underlying file when close is called.
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
try {
|
||||||
|
super.close();
|
||||||
|
} finally {
|
||||||
|
if (file != null) {
|
||||||
|
file.delete();
|
||||||
|
file = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds and returns the path to the Tesseract executable, if able.
|
* Finds and returns the path to the Tesseract executable, if able.
|
||||||
*
|
*
|
||||||
@ -253,24 +419,27 @@ final class TikaTextExtractor extends TextExtractor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if Tika is supported for this content type and mimetype.
|
* Determines if Tika is enabled for this content
|
||||||
*
|
|
||||||
* @param content Source content to read
|
|
||||||
* @param detectedFormat Mimetype of content
|
|
||||||
*
|
*
|
||||||
* @return Flag indicating support for reading content type
|
* @return Flag indicating support for reading content type
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isSupported(Content content, String detectedFormat) {
|
public boolean isSupported() {
|
||||||
if (detectedFormat == null
|
if(!(content instanceof AbstractFile)) {
|
||||||
|| BINARY_MIME_TYPES.contains(detectedFormat) //any binary unstructured blobs (string extraction will be used)
|
return false;
|
||||||
|| ARCHIVE_MIME_TYPES.contains(detectedFormat)
|
}
|
||||||
|| (detectedFormat.startsWith("video/") && !detectedFormat.equals("video/x-flv")) //skip video other than flv (tika supports flv only) //NON-NLS
|
|
||||||
|| detectedFormat.equals(SQLITE_MIMETYPE) //Skip sqlite files, Tika cannot handle virtual tables and will fail with an exception. //NON-NLS
|
String detectedType = ((AbstractFile)content).getMIMEType();
|
||||||
|
if (detectedType == null
|
||||||
|
|| BINARY_MIME_TYPES.contains(detectedType) //any binary unstructured blobs (string extraction will be used)
|
||||||
|
|| ARCHIVE_MIME_TYPES.contains(detectedType)
|
||||||
|
|| (detectedType.startsWith("video/") && !detectedType.equals("video/x-flv")) //skip video other than flv (tika supports flv only) //NON-NLS
|
||||||
|
|| detectedType.equals(SQLITE_MIMETYPE) //Skip sqlite files, Tika cannot handle virtual tables and will fail with an exception. //NON-NLS
|
||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return TIKA_SUPPORTED_TYPES.contains(detectedFormat);
|
|
||||||
|
return TIKA_SUPPORTED_TYPES.contains(detectedType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -280,26 +449,17 @@ final class TikaTextExtractor extends TextExtractor {
|
|||||||
* @return String of all language packs available for Tesseract to use
|
* @return String of all language packs available for Tesseract to use
|
||||||
*/
|
*/
|
||||||
private static String getLanguagePacks() {
|
private static String getLanguagePacks() {
|
||||||
File languagePackRootDir = new File(TESSERACT_PATH.getParent(), "tessdata");
|
File languagePackRootDir = new File(PlatformUtil.getOcrLanguagePacksPath());
|
||||||
//Acceptable extensions for Tesseract-OCR version 3.05 language packs.
|
|
||||||
//All extensions other than traineddata are associated with cube files that
|
List<String> languagePacks = new ArrayList<>();
|
||||||
//have been made obsolete since version 4.0.
|
for (File languagePack : languagePackRootDir.listFiles()) {
|
||||||
List<String> acceptableExtensions = Arrays.asList("traineddata", "params",
|
String fileExt = FilenameUtils.getExtension(languagePack.getName());
|
||||||
"lm", "fold", "bigrams", "nn", "word-freq", "size",
|
if (!languagePack.isDirectory() && TESSERACT_LANGUAGE_PACK_EXT.equals(fileExt)) {
|
||||||
"user-patterns", "user-words");
|
String packageName = FilenameUtils.getBaseName(languagePack.getName());
|
||||||
//Pull out only unique languagePacks
|
languagePacks.add(packageName);
|
||||||
HashSet<String> languagePacks = new HashSet<>();
|
|
||||||
if (languagePackRootDir.exists()) {
|
|
||||||
for (File languagePack : languagePackRootDir.listFiles()) {
|
|
||||||
if (languagePack.isDirectory() || !acceptableExtensions.contains(
|
|
||||||
FilenameUtils.getExtension(languagePack.getName()))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String threeLetterPackageName = languagePack.getName().substring(0, 3);
|
|
||||||
//Ignore the eng language pack if accidentally added
|
|
||||||
languagePacks.add(threeLetterPackageName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return String.join("+", languagePacks);
|
return String.join("+", languagePacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,21 +490,23 @@ final class TikaTextExtractor extends TextExtractor {
|
|||||||
* Determines how the extraction process will proceed given the settings
|
* Determines how the extraction process will proceed given the settings
|
||||||
* stored in this context instance.
|
* stored in this context instance.
|
||||||
*
|
*
|
||||||
* See the ImageFileExtractionConfig class in the extractionconfigs package
|
* See the ImageConfig class in the extractionconfigs package for available
|
||||||
* for available settings.
|
* settings.
|
||||||
*
|
*
|
||||||
* @param context Instance containing config classes
|
* @param context Instance containing config classes
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setExtractionSettings(Lookup context) {
|
public void setExtractionSettings(Lookup context) {
|
||||||
if (context != null) {
|
if (context != null) {
|
||||||
ImageFileExtractionConfig configInstance = context.lookup(ImageFileExtractionConfig.class);
|
ImageConfig configInstance = context.lookup(ImageConfig.class);
|
||||||
if (configInstance == null) {
|
if (configInstance != null && Objects.nonNull(configInstance.getOCREnabled())) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Objects.nonNull(configInstance.getOCREnabled())) {
|
|
||||||
this.tesseractOCREnabled = configInstance.getOCREnabled();
|
this.tesseractOCREnabled = configInstance.getOCREnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProcessTerminator terminatorInstance = context.lookup(ProcessTerminator.class);
|
||||||
|
if (terminatorInstance != null) {
|
||||||
|
this.processTerminator = terminatorInstance;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,25 +16,20 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.textextractors.extractionconfigs;
|
package org.sleuthkit.autopsy.textextractors.configs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows for configuration of OCR on image files.
|
* Allows for configuration of OCR on image files. Extractors that use ImageConfig
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractor}'s that use
|
* can be obtained through TextExtractoryFactory.getExtractor().
|
||||||
* ImageFileExtractionConfig can be obtained through
|
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractorFactory#getExtractor(org.sleuthkit.datamodel.Content)}
|
|
||||||
* or
|
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractorFactory#getDefaultExtractor(org.sleuthkit.datamodel.Content, org.openide.util.Lookup)}.
|
|
||||||
*
|
*
|
||||||
* @see org.sleuthkit.autopsy.textextractors.TextExtractorFactory
|
|
||||||
* @see org.openide.util.Lookup
|
* @see org.openide.util.Lookup
|
||||||
*/
|
*/
|
||||||
public class ImageFileExtractionConfig {
|
public class ImageConfig {
|
||||||
|
|
||||||
private Boolean OCREnabled;
|
private Boolean OCREnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enables OCR to be run on the text extractor responsible for handling
|
* Enables OCR to be run on the text reader responsible for handling
|
||||||
* image files.
|
* image files.
|
||||||
*
|
*
|
||||||
* @param enabled Flag indicating if OCR is enabled.
|
* @param enabled Flag indicating if OCR is enabled.
|
@ -16,33 +16,32 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.textextractors.extractionconfigs;
|
package org.sleuthkit.autopsy.textextractors.configs;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT;
|
import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows for configuration of the
|
* Allows for configuration of the TextExtractor obtained from
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractor} obtained from
|
* TextExtractorFactory.getStringsExtractor().
|
||||||
* {@link org.sleuthkit.autopsy.textextractors.TextExtractorFactory#getDefaultExtractor(org.sleuthkit.datamodel.Content, org.openide.util.Lookup)}.
|
|
||||||
*
|
*
|
||||||
* The default extractor will read strings from the Content instance. This class
|
* The Strings extractor will extract strings from the Content instance. This
|
||||||
* allows for the configuration of the encoding language script to use during
|
* class allows for the configuration of the encoding and language scripts that
|
||||||
* extraction.
|
* will be used.
|
||||||
*
|
*
|
||||||
* @see org.sleuthkit.autopsy.textextractors.TextExtractorFactory
|
* @see org.sleuthkit.autopsy.textextractors.TextExtractorFactory
|
||||||
* @see
|
* @see
|
||||||
* org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT
|
* org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT
|
||||||
* @see org.openide.util.Lookup
|
* @see org.openide.util.Lookup
|
||||||
*/
|
*/
|
||||||
public class DefaultExtractionConfig {
|
public class StringsConfig {
|
||||||
|
|
||||||
private Boolean extractUTF8;
|
private Boolean extractUTF8;
|
||||||
private Boolean extractUTF16;
|
private Boolean extractUTF16;
|
||||||
private List<SCRIPT> extractScripts;
|
private List<SCRIPT> languageScripts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enables UTF-8 encoding to be used during extraction.
|
* Enables UTF-8 encoding to be used during reading.
|
||||||
*
|
*
|
||||||
* @param enabled Flag indicating if UTF-8 should be turned on
|
* @param enabled Flag indicating if UTF-8 should be turned on
|
||||||
*/
|
*/
|
||||||
@ -60,7 +59,7 @@ public class DefaultExtractionConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether extracting with UTF-8 encoding should be done.
|
* Returns whether extraction with UTF-8 encoding should be done.
|
||||||
*
|
*
|
||||||
* @return Flag indicating if UTF-8 has been turned on/off
|
* @return Flag indicating if UTF-8 has been turned on/off
|
||||||
*/
|
*/
|
||||||
@ -69,7 +68,7 @@ public class DefaultExtractionConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return whether extracting with UTF-16 encoding should be done.
|
* Return whether extraction with UTF-16 encoding should be done.
|
||||||
*
|
*
|
||||||
* @return Flag indicating if UTF-16 has been turned on/off
|
* @return Flag indicating if UTF-16 has been turned on/off
|
||||||
*/
|
*/
|
||||||
@ -78,23 +77,23 @@ public class DefaultExtractionConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the type of extraction scripts that will be used during this
|
* Sets the type of language scripts that will be used during extraction.
|
||||||
* extraction. See
|
* See
|
||||||
* {@link org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT}
|
* {@link org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT}
|
||||||
* for more information about available scripts.
|
* for more information about available scripts.
|
||||||
*
|
*
|
||||||
* @param scripts Desired set of scripts to be used during extraction
|
* @param scripts Desired set of scripts to be used during extraction
|
||||||
*/
|
*/
|
||||||
public void setExtractScripts(List<SCRIPT> scripts) {
|
public void setLanguageScripts(List<SCRIPT> scripts) {
|
||||||
this.extractScripts = scripts;
|
this.languageScripts = scripts;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the desired set of scripts to be used during extraction.
|
* Gets the desired set of scripts to be used during extraction.
|
||||||
*
|
*
|
||||||
* @return Set of extraction scripts to be used
|
* @return Set of language scripts to be used
|
||||||
*/
|
*/
|
||||||
public List<SCRIPT> getExtractScripts() {
|
public List<SCRIPT> getLanguageScripts() {
|
||||||
return this.extractScripts;
|
return this.languageScripts;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -96,6 +96,7 @@ import org.sleuthkit.autopsy.timeline.ui.detailview.DetailViewPane;
|
|||||||
import org.sleuthkit.autopsy.timeline.ui.detailview.tree.EventsTree;
|
import org.sleuthkit.autopsy.timeline.ui.detailview.tree.EventsTree;
|
||||||
import org.sleuthkit.autopsy.timeline.ui.listvew.ListViewPane;
|
import org.sleuthkit.autopsy.timeline.ui.listvew.ListViewPane;
|
||||||
import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
|
import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
|
||||||
|
import org.sleuthkit.datamodel.Content;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A container for an AbstractTimelineView. Has a Toolbar on top to hold
|
* A container for an AbstractTimelineView. Has a Toolbar on top to hold
|
||||||
@ -349,8 +350,8 @@ final public class ViewFrame extends BorderPane {
|
|||||||
viewModeToggleGroup.add(detailsToggle, ViewMode.DETAIL);
|
viewModeToggleGroup.add(detailsToggle, ViewMode.DETAIL);
|
||||||
viewModeToggleGroup.add(countsToggle, ViewMode.COUNTS);
|
viewModeToggleGroup.add(countsToggle, ViewMode.COUNTS);
|
||||||
modeSegButton.setToggleGroup(viewModeToggleGroup);
|
modeSegButton.setToggleGroup(viewModeToggleGroup);
|
||||||
viewModeToggleGroup.valueProperty().addListener((observable, oldViewMode, newViewVode) ->
|
viewModeToggleGroup.valueProperty().addListener((observable, oldViewMode, newViewVode)
|
||||||
controller.setViewMode(newViewVode != null ? newViewVode : (oldViewMode != null ? oldViewMode : ViewMode.COUNTS))
|
-> controller.setViewMode(newViewVode != null ? newViewVode : (oldViewMode != null ? oldViewMode : ViewMode.COUNTS))
|
||||||
);
|
);
|
||||||
|
|
||||||
controller.viewModeProperty().addListener(viewMode -> syncViewMode());
|
controller.viewModeProperty().addListener(viewMode -> syncViewMode());
|
||||||
@ -501,8 +502,11 @@ final public class ViewFrame extends BorderPane {
|
|||||||
"ViewFrame.notification.analysisComplete=Analysis has finished for {0}. The Timeline DB may be out of date."})
|
"ViewFrame.notification.analysisComplete=Analysis has finished for {0}. The Timeline DB may be out of date."})
|
||||||
public void handleAnalysisCompleted(DataSourceAnalysisCompletedEvent event) {
|
public void handleAnalysisCompleted(DataSourceAnalysisCompletedEvent event) {
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
notificationPane.getActions().setAll(new UpdateDB(controller));
|
Content dataSource = event.getDataSource();
|
||||||
notificationPane.show(Bundle.ViewFrame_notification_analysisComplete(event.getDataSource().getName()), new ImageView(WARNING));
|
if (dataSource != null) {
|
||||||
|
notificationPane.getActions().setAll(new UpdateDB(controller));
|
||||||
|
notificationPane.show(Bundle.ViewFrame_notification_analysisComplete(dataSource.getName()), new ImageView(WARNING));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ import org.sleuthkit.autopsy.commonfilesearch.CaseDBCommonAttributeInstanceNode;
|
|||||||
import org.sleuthkit.autopsy.commonfilesearch.CentralRepoCommonAttributeInstance;
|
import org.sleuthkit.autopsy.commonfilesearch.CentralRepoCommonAttributeInstance;
|
||||||
import org.sleuthkit.autopsy.commonfilesearch.CentralRepoCommonAttributeInstanceNode;
|
import org.sleuthkit.autopsy.commonfilesearch.CentralRepoCommonAttributeInstanceNode;
|
||||||
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeCountSearchResults;
|
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeCountSearchResults;
|
||||||
import org.sleuthkit.autopsy.guiutils.DataSourceLoader;
|
import org.sleuthkit.autopsy.datamodel.utils.DataSourceLoader;
|
||||||
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeValue;
|
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeValue;
|
||||||
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeValueList;
|
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeValueList;
|
||||||
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
|
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
|
||||||
|
@ -34,7 +34,7 @@ import org.sleuthkit.autopsy.casemodule.ImageDSProcessor;
|
|||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.commonfilesearch.AbstractCommonAttributeInstance;
|
import org.sleuthkit.autopsy.commonfilesearch.AbstractCommonAttributeInstance;
|
||||||
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeCountSearchResults;
|
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeCountSearchResults;
|
||||||
import org.sleuthkit.autopsy.guiutils.DataSourceLoader;
|
import org.sleuthkit.autopsy.datamodel.utils.DataSourceLoader;
|
||||||
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeValue;
|
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeValue;
|
||||||
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeValueList;
|
import org.sleuthkit.autopsy.commonfilesearch.CommonAttributeValueList;
|
||||||
import org.sleuthkit.autopsy.coreutils.TimeStampUtils;
|
import org.sleuthkit.autopsy.coreutils.TimeStampUtils;
|
||||||
|
@ -135,7 +135,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.13</specification-version>
|
<specification-version>10.14</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -39,6 +39,7 @@ import net.sf.sevenzipjbinding.simple.ISimpleInArchive;
|
|||||||
import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem;
|
import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.casemodule.GeneralFilter;
|
import org.sleuthkit.autopsy.casemodule.GeneralFilter;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.FileUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set of utilities that handles archive file extraction. Uses 7zip library.
|
* Set of utilities that handles archive file extraction. Uses 7zip library.
|
||||||
@ -235,7 +236,7 @@ final class ArchiveUtil {
|
|||||||
|
|
||||||
for (ISimpleInArchiveItem entry : simpleInArchive.getArchiveItems()) {
|
for (ISimpleInArchiveItem entry : simpleInArchive.getArchiveItems()) {
|
||||||
String entryPathInArchive = entry.getPath();
|
String entryPathInArchive = entry.getPath();
|
||||||
Path fullPath = Paths.get(destinationFolder, entryPathInArchive);
|
Path fullPath = Paths.get(destinationFolder, FileUtil.escapeFileName(entryPathInArchive)); // remove illegal characters from file name
|
||||||
File destFile = new File(fullPath.toString());
|
File destFile = new File(fullPath.toString());
|
||||||
File destinationParent = destFile.getParentFile();
|
File destinationParent = destFile.getParentFile();
|
||||||
destinationParent.mkdirs();
|
destinationParent.mkdirs();
|
||||||
|
@ -27,17 +27,18 @@ import java.awt.EventQueue;
|
|||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.SwingWorker;
|
import javax.swing.SwingWorker;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import org.openide.modules.Places;
|
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.sleuthkit.autopsy.core.ServicesMonitor;
|
import org.sleuthkit.autopsy.core.ServicesMonitor;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||||
import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestNodeRefreshEvents.RefreshChildrenEvent;
|
import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestNodeRefreshEvents.RefreshChildrenEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -46,8 +47,8 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestNodeRefreshEvents
|
|||||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||||
final class AutoIngestDashboard extends JPanel implements Observer {
|
final class AutoIngestDashboard extends JPanel implements Observer {
|
||||||
|
|
||||||
private final static String ADMIN_ACCESS_FILE_NAME = "adminAccess";
|
private final static String ADMIN_ACCESS_FILE_NAME = "_aiaa"; // NON-NLS
|
||||||
private final static String ADMIN_ACCESS_FILE_PATH = Places.getUserDirectory().getAbsolutePath() + File.separator + ADMIN_ACCESS_FILE_NAME;
|
private final static String ADMIN_ACCESS_FILE_PATH = Paths.get(PlatformUtil.getUserConfigDirectory(), ADMIN_ACCESS_FILE_NAME).toString();
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboard.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboard.class.getName());
|
||||||
private AutoIngestMonitor autoIngestMonitor;
|
private AutoIngestMonitor autoIngestMonitor;
|
||||||
|
@ -365,8 +365,9 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen
|
|||||||
LOGGER.log(Level.SEVERE, "Unknown AutoIngestJobData.ProcessingStatus");
|
LOGGER.log(Level.SEVERE, "Unknown AutoIngestJobData.ProcessingStatus");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} catch (InterruptedException ex) {
|
} catch (InterruptedException ignore) {
|
||||||
LOGGER.log(Level.SEVERE, String.format("Unexpected interrupt while retrieving coordination service node data for '%s'", node), ex);
|
LOGGER.log(Level.WARNING, "Interrupt while retrieving coordination service node data");
|
||||||
|
return newJobsSnapshot;
|
||||||
} catch (AutoIngestJobNodeData.InvalidDataException ex) {
|
} catch (AutoIngestJobNodeData.InvalidDataException ex) {
|
||||||
LOGGER.log(Level.SEVERE, String.format("Unable to use node data for '%s'", node), ex);
|
LOGGER.log(Level.SEVERE, String.format("Unable to use node data for '%s'", node), ex);
|
||||||
} catch (AutoIngestJob.AutoIngestJobException ex) {
|
} catch (AutoIngestJob.AutoIngestJobException ex) {
|
||||||
|
@ -127,7 +127,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.13</specification-version>
|
<specification-version>10.14</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -199,7 +199,7 @@ public class ImageGalleryModule {
|
|||||||
if (currentController.isListeningEnabled() == false) {
|
if (currentController.isListeningEnabled() == false) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String eventType = event.getPropertyName();
|
String eventType = event.getPropertyName();
|
||||||
switch (IngestManager.IngestModuleEvent.valueOf(eventType)) {
|
switch (IngestManager.IngestModuleEvent.valueOf(eventType)) {
|
||||||
case FILE_DONE:
|
case FILE_DONE:
|
||||||
@ -354,6 +354,11 @@ public class ImageGalleryModule {
|
|||||||
|
|
||||||
DataSourceAnalysisEvent dataSourceEvent = (DataSourceAnalysisEvent) event;
|
DataSourceAnalysisEvent dataSourceEvent = (DataSourceAnalysisEvent) event;
|
||||||
Content dataSource = dataSourceEvent.getDataSource();
|
Content dataSource = dataSourceEvent.getDataSource();
|
||||||
|
if (dataSource == null) {
|
||||||
|
logger.log(Level.SEVERE, String.format("Failed to handle %s event", event.getPropertyName())); //NON-NLS
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
long dataSourceObjId = dataSource.getId();
|
long dataSourceObjId = dataSource.getId();
|
||||||
String eventType = dataSourceEvent.getPropertyName();
|
String eventType = dataSourceEvent.getPropertyName();
|
||||||
try {
|
try {
|
||||||
|
@ -768,11 +768,11 @@ public final class DrawableDB {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
logger.log(Level.SEVERE, "Failed to get group seen", ex); //NON-NLS
|
completeExceptionally(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Callback to process result of seen query
|
// Callback to process result of seen query
|
||||||
GroupSeenQueryResultProcessor queryResultProcessor = new GroupSeenQueryResultProcessor();
|
GroupSeenQueryResultProcessor queryResultProcessor = new GroupSeenQueryResultProcessor();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -785,7 +785,7 @@ public final class DrawableDB {
|
|||||||
return queryResultProcessor.get();
|
return queryResultProcessor.get();
|
||||||
} catch (ExecutionException | InterruptedException | TskCoreException ex) {
|
} catch (ExecutionException | InterruptedException | TskCoreException ex) {
|
||||||
String msg = String.format("Failed to get is group seen for group key %s", groupKey.getValueDisplayName()); //NON-NLS
|
String msg = String.format("Failed to get is group seen for group key %s", groupKey.getValueDisplayName()); //NON-NLS
|
||||||
logger.log(Level.WARNING, msg, ex);
|
logger.log(Level.SEVERE, msg, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -119,7 +119,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.13</specification-version>
|
<specification-version>10.14</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
<EmptySpace min="-2" pref="22" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="22" max="-2" attributes="0"/>
|
||||||
<Component id="keywordListsLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="keywordListsLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jScrollPane1" max="32767" attributes="0"/>
|
<Component id="jScrollPane1" pref="354" max="32767" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="newListButton" linkSize="5" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="newListButton" linkSize="5" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
@ -318,7 +318,7 @@ class GlobalListsManagementPanel extends javax.swing.JPanel implements OptionsPa
|
|||||||
.addGap(22, 22, 22)
|
.addGap(22, 22, 22)
|
||||||
.addComponent(keywordListsLabel)
|
.addComponent(keywordListsLabel)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(jScrollPane1)
|
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 354, Short.MAX_VALUE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(newListButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(newListButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
@ -68,12 +68,14 @@ class KeywordSearchGlobalLanguageSettingsPanel extends javax.swing.JPanel implem
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!PlatformUtil.isWindowsOS()) {
|
|
||||||
enableOcrCheckbox.setVisible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
initScriptsCheckBoxes();
|
initScriptsCheckBoxes();
|
||||||
reloadScriptsCheckBoxes();
|
reloadScriptsCheckBoxes();
|
||||||
|
|
||||||
|
if (!PlatformUtil.isWindowsOS() || !PlatformUtil.is64BitOS()) {
|
||||||
|
enableOcrCheckbox.setText("Enable Optical Character Recognition (OCR) (Requires Windows 64-bit)");
|
||||||
|
enableOcrCheckbox.setSelected(false);
|
||||||
|
enableOcrCheckbox.setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
//allow panel to toggle its enabled status while it is open based on ingest events
|
//allow panel to toggle its enabled status while it is open based on ingest events
|
||||||
IngestManager.getInstance().addIngestJobEventListener(new PropertyChangeListener() {
|
IngestManager.getInstance().addIngestJobEventListener(new PropertyChangeListener() {
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Component id="tabbedPane" pref="824" max="32767" attributes="0"/>
|
<Component id="tabbedPane" pref="926" max="32767" attributes="0"/>
|
||||||
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
|
@ -106,7 +106,7 @@ final class KeywordSearchGlobalSettingsPanel extends IngestModuleGlobalSettingsP
|
|||||||
layout.setHorizontalGroup(
|
layout.setHorizontalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 824, Short.MAX_VALUE)
|
.addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 926, Short.MAX_VALUE)
|
||||||
.addGap(0, 0, 0))
|
.addGap(0, 0, 0))
|
||||||
);
|
);
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
|
@ -32,6 +32,7 @@ import org.openide.util.NbBundle.Messages;
|
|||||||
import org.openide.util.lookup.Lookups;
|
import org.openide.util.lookup.Lookups;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.ExecUtil.ProcessTerminator;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||||
import org.sleuthkit.autopsy.ingest.FileIngestModule;
|
import org.sleuthkit.autopsy.ingest.FileIngestModule;
|
||||||
@ -46,10 +47,9 @@ import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService;
|
|||||||
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
|
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
|
||||||
import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector;
|
import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector;
|
||||||
import org.sleuthkit.autopsy.textextractors.TextExtractor;
|
import org.sleuthkit.autopsy.textextractors.TextExtractor;
|
||||||
import org.sleuthkit.autopsy.textextractors.TextExtractor.ExtractionException;
|
|
||||||
import org.sleuthkit.autopsy.textextractors.TextExtractorFactory;
|
import org.sleuthkit.autopsy.textextractors.TextExtractorFactory;
|
||||||
import org.sleuthkit.autopsy.textextractors.extractionconfigs.ImageFileExtractionConfig;
|
import org.sleuthkit.autopsy.textextractors.configs.ImageConfig;
|
||||||
import org.sleuthkit.autopsy.textextractors.extractionconfigs.DefaultExtractionConfig;
|
import org.sleuthkit.autopsy.textextractors.configs.StringsConfig;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.TskData;
|
import org.sleuthkit.datamodel.TskData;
|
||||||
import org.sleuthkit.datamodel.TskData.FileKnown;
|
import org.sleuthkit.datamodel.TskData.FileKnown;
|
||||||
@ -74,7 +74,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule {
|
|||||||
|
|
||||||
/** generally text extractors should ignore archives and let unpacking
|
/** generally text extractors should ignore archives and let unpacking
|
||||||
* modules take care of them */
|
* modules take care of them */
|
||||||
public static final List<String> ARCHIVE_MIME_TYPES
|
private static final List<String> ARCHIVE_MIME_TYPES
|
||||||
= ImmutableList.of(
|
= ImmutableList.of(
|
||||||
//ignore unstructured binary and compressed data, for which string extraction or unzipper works better
|
//ignore unstructured binary and compressed data, for which string extraction or unzipper works better
|
||||||
"application/x-7z-compressed", //NON-NLS
|
"application/x-7z-compressed", //NON-NLS
|
||||||
@ -291,11 +291,11 @@ public final class KeywordSearchIngestModule implements FileIngestModule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DefaultExtractionConfig stringsConfig = new DefaultExtractionConfig();
|
StringsConfig stringsConfig = new StringsConfig();
|
||||||
Map<String, String> stringsOptions = KeywordSearchSettings.getStringExtractOptions();
|
Map<String, String> stringsOptions = KeywordSearchSettings.getStringExtractOptions();
|
||||||
stringsConfig.setExtractUTF8(Boolean.parseBoolean(stringsOptions.get(StringsExtractOptions.EXTRACT_UTF8.toString())));
|
stringsConfig.setExtractUTF8(Boolean.parseBoolean(stringsOptions.get(StringsExtractOptions.EXTRACT_UTF8.toString())));
|
||||||
stringsConfig.setExtractUTF16(Boolean.parseBoolean(stringsOptions.get(StringsExtractOptions.EXTRACT_UTF16.toString())));
|
stringsConfig.setExtractUTF16(Boolean.parseBoolean(stringsOptions.get(StringsExtractOptions.EXTRACT_UTF16.toString())));
|
||||||
stringsConfig.setExtractScripts(KeywordSearchSettings.getStringExtractScripts());
|
stringsConfig.setLanguageScripts(KeywordSearchSettings.getStringExtractScripts());
|
||||||
|
|
||||||
stringsExtractionContext = Lookups.fixed(stringsConfig);
|
stringsExtractionContext = Lookups.fixed(stringsConfig);
|
||||||
|
|
||||||
@ -478,15 +478,17 @@ public final class KeywordSearchIngestModule implements FileIngestModule {
|
|||||||
* @throws IngesterException exception thrown if indexing failed
|
* @throws IngesterException exception thrown if indexing failed
|
||||||
*/
|
*/
|
||||||
private boolean extractTextAndIndex(AbstractFile aFile, String detectedFormat) throws IngesterException {
|
private boolean extractTextAndIndex(AbstractFile aFile, String detectedFormat) throws IngesterException {
|
||||||
ImageFileExtractionConfig imageConfig = new ImageFileExtractionConfig();
|
ImageConfig imageConfig = new ImageConfig();
|
||||||
imageConfig.setOCREnabled(KeywordSearchSettings.getOcrOption());
|
imageConfig.setOCREnabled(KeywordSearchSettings.getOcrOption());
|
||||||
Lookup extractionContext = Lookups.fixed(imageConfig);
|
ProcessTerminator terminator = () -> context.fileIngestIsCancelled();
|
||||||
|
Lookup extractionContext = Lookups.fixed(imageConfig, terminator);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Reader specializedReader = TextExtractorFactory.getExtractor(aFile,extractionContext).getReader();
|
TextExtractor extractor = TextExtractorFactory.getExtractor(aFile,extractionContext);
|
||||||
|
Reader extractedTextReader = extractor.getReader();
|
||||||
//divide into chunks and index
|
//divide into chunks and index
|
||||||
return Ingester.getDefault().indexText(specializedReader,aFile.getId(),aFile.getName(), aFile, context);
|
return Ingester.getDefault().indexText(extractedTextReader,aFile.getId(),aFile.getName(), aFile, context);
|
||||||
} catch (TextExtractorFactory.NoTextExtractorFound | ExtractionException ex) {
|
} catch (TextExtractorFactory.NoTextExtractorFound | TextExtractor.InitReaderException ex) {
|
||||||
//No text extractor found... run the default instead
|
//No text extractor found... run the default instead
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -505,8 +507,9 @@ public final class KeywordSearchIngestModule implements FileIngestModule {
|
|||||||
if (context.fileIngestIsCancelled()) {
|
if (context.fileIngestIsCancelled()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Reader stringsReader = TextExtractorFactory.getDefaultExtractor(aFile, stringsExtractionContext).getReader();
|
TextExtractor stringsExtractor = TextExtractorFactory.getStringsExtractor(aFile, stringsExtractionContext);
|
||||||
if (Ingester.getDefault().indexText(stringsReader,aFile.getId(),aFile.getName(), aFile, KeywordSearchIngestModule.this.context)) {
|
Reader extractedTextReader = stringsExtractor.getReader();
|
||||||
|
if (Ingester.getDefault().indexText(extractedTextReader,aFile.getId(),aFile.getName(), aFile, KeywordSearchIngestModule.this.context)) {
|
||||||
putIngestStatus(jobId, aFile.getId(), IngestStatus.STRINGS_INGESTED);
|
putIngestStatus(jobId, aFile.getId(), IngestStatus.STRINGS_INGESTED);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
@ -514,7 +517,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule {
|
|||||||
putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_TEXTEXTRACT);
|
putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_TEXTEXTRACT);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} catch (IngesterException | ExtractionException ex) {
|
} catch (IngesterException | TextExtractor.InitReaderException ex) {
|
||||||
logger.log(Level.WARNING, "Failed to extract strings and ingest, file '" + aFile.getName() + "' (id: " + aFile.getId() + ").", ex); //NON-NLS
|
logger.log(Level.WARNING, "Failed to extract strings and ingest, file '" + aFile.getName() + "' (id: " + aFile.getId() + ").", ex); //NON-NLS
|
||||||
putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING);
|
putIngestStatus(jobId, aFile.getId(), IngestStatus.SKIPPED_ERROR_INDEXING);
|
||||||
return false;
|
return false;
|
||||||
|
@ -46,7 +46,6 @@ import org.sleuthkit.autopsy.appservices.AutopsyService;
|
|||||||
import org.sleuthkit.autopsy.progress.ProgressIndicator;
|
import org.sleuthkit.autopsy.progress.ProgressIndicator;
|
||||||
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService;
|
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService;
|
||||||
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
|
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
|
||||||
import org.sleuthkit.autopsy.textextractors.TextExtractor.ExtractionException;
|
|
||||||
import org.sleuthkit.autopsy.textextractors.TextExtractor;
|
import org.sleuthkit.autopsy.textextractors.TextExtractor;
|
||||||
import org.sleuthkit.autopsy.textextractors.TextExtractorFactory;
|
import org.sleuthkit.autopsy.textextractors.TextExtractorFactory;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
@ -116,24 +115,26 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Reader blackboardReader = TextExtractorFactory
|
TextExtractor blackboardExtractor = TextExtractorFactory.getExtractor(content, null);
|
||||||
.getExtractor(content, null).getReader();
|
Reader blackboardExtractedTextReader = blackboardExtractor.getReader();
|
||||||
String sourceName = artifact.getDisplayName() + "_" + artifact.getArtifactID();
|
String sourceName = artifact.getDisplayName() + "_" + artifact.getArtifactID();
|
||||||
ingester.indexMetaDataOnly(artifact, sourceName);
|
ingester.indexMetaDataOnly(artifact, sourceName);
|
||||||
ingester.indexText(blackboardReader, artifact.getArtifactID(), sourceName, content, null);
|
ingester.indexText(blackboardExtractedTextReader, artifact.getArtifactID(), sourceName, content, null);
|
||||||
} catch (Ingester.IngesterException | TextExtractorFactory.NoTextExtractorFound | ExtractionException ex) {
|
} catch (Ingester.IngesterException | TextExtractorFactory.NoTextExtractorFound | TextExtractor.InitReaderException ex) {
|
||||||
throw new TskCoreException(ex.getCause().getMessage(), ex);
|
throw new TskCoreException(ex.getCause().getMessage(), ex);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
Reader contentReader = TextExtractorFactory
|
TextExtractor contentExtractor = TextExtractorFactory.getExtractor(content, null);
|
||||||
.getExtractor(content, null).getReader();
|
Reader contentExtractedTextReader = contentExtractor.getReader();
|
||||||
ingester.indexText(contentReader, content.getId(), content.getName(), content, null);
|
ingester.indexText(contentExtractedTextReader, content.getId(), content.getName(), content, null);
|
||||||
} catch (TextExtractorFactory.NoTextExtractorFound | ExtractionException | Ingester.IngesterException ex) {
|
} catch (TextExtractorFactory.NoTextExtractorFound | Ingester.IngesterException | TextExtractor.InitReaderException ex) {
|
||||||
try {
|
try {
|
||||||
// Try the StringsTextExtractor if Tika extractions fails.
|
// Try the StringsTextExtractor if Tika extractions fails.
|
||||||
ingester.indexText(TextExtractorFactory.getDefaultExtractor(content, null).getReader(),content.getId(),content.getName(), content, null);
|
TextExtractor stringsExtractor = TextExtractorFactory.getStringsExtractor(content, null);
|
||||||
} catch (Ingester.IngesterException | ExtractionException ex1) {
|
Reader stringsExtractedTextReader = stringsExtractor.getReader();
|
||||||
|
ingester.indexText(stringsExtractedTextReader,content.getId(),content.getName(), content, null);
|
||||||
|
} catch (Ingester.IngesterException | TextExtractor.InitReaderException ex1) {
|
||||||
throw new TskCoreException(ex.getCause().getMessage(), ex1);
|
throw new TskCoreException(ex.getCause().getMessage(), ex1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -447,11 +448,11 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
String sourceName = artifact.getDisplayName() + "_" + artifact.getArtifactID();
|
String sourceName = artifact.getDisplayName() + "_" + artifact.getArtifactID();
|
||||||
Reader contentSpecificReader =
|
TextExtractor blackboardExtractor = TextExtractorFactory.getExtractor((Content) artifact, null);
|
||||||
TextExtractorFactory.getExtractor((Content) artifact, null).getReader();
|
Reader blackboardExtractedTextReader = blackboardExtractor.getReader();
|
||||||
ingester.indexMetaDataOnly(artifact, sourceName);
|
ingester.indexMetaDataOnly(artifact, sourceName);
|
||||||
ingester.indexText(contentSpecificReader, artifact.getId(), sourceName, artifact, null);
|
ingester.indexText(blackboardExtractedTextReader, artifact.getId(), sourceName, artifact, null);
|
||||||
} catch (Ingester.IngesterException | TextExtractorFactory.NoTextExtractorFound | ExtractionException ex) {
|
} catch (Ingester.IngesterException | TextExtractorFactory.NoTextExtractorFound | TextExtractor.InitReaderException ex) {
|
||||||
throw new TskCoreException(ex.getCause().getMessage(), ex);
|
throw new TskCoreException(ex.getCause().getMessage(), ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
39
NEWS.txt
@ -1,11 +1,46 @@
|
|||||||
|
---------------- VERSION 4.10.0 --------------
|
||||||
|
New Features:
|
||||||
|
- Users can now view information on all cases/data sources in the Central
|
||||||
|
Repository.
|
||||||
|
- SSID, MAC address, IMEI, IMSI, and ICCID properties can now be added to the
|
||||||
|
Central Repository by the Correlation Engine ingest module.
|
||||||
|
- The Correlation Engine ingest module can be configured to flag any occurrences
|
||||||
|
of SSID, MAC address, IMEI, IMSI, and ICCID properties that have been previously
|
||||||
|
added to the Central Repository.
|
||||||
|
- File type filtering for common properties search is now supported.
|
||||||
|
- Common properties search results can now be viewed by case and data source
|
||||||
|
within the case.
|
||||||
|
- Users can now search the Central Repository for property instances with a
|
||||||
|
given value.
|
||||||
|
- OCR text extraction for keyword search now supports languages other than
|
||||||
|
English, if language packs are installed.
|
||||||
|
- Added the ability for examiners to select the time zone for displaying dates.
|
||||||
|
- Custom headers and footers can now be added to HTML reports.
|
||||||
|
- Added ability to either enter or generate hashes of image data sources.
|
||||||
|
- Data sources that fail hash verification are now flagged with interesting
|
||||||
|
item artifacts by the Data Source Integrity ingest module (formerly known as the
|
||||||
|
E01 Verifier ingest module).
|
||||||
|
- Added a report module to export data in CASE/UCO format.
|
||||||
|
- Ingest filters and interesting file sets can now be defined with multiple
|
||||||
|
extensions included in a single condition/rule.
|
||||||
|
|
||||||
|
Bug Fixes:
|
||||||
|
- The Images/Videos Gallery now works for multi-user cases.
|
||||||
|
- Duplicate interesting item and EXIF metadata artifacts are no longer created
|
||||||
|
when you run the modules that generate them more than once.
|
||||||
|
- The Application content viewer now displays SQLite table column names even
|
||||||
|
when the table is empty.
|
||||||
|
- Assorted small bug fixes are included.
|
||||||
|
|
||||||
|
|
||||||
---------------- VERSION 4.9.1 --------------
|
---------------- VERSION 4.9.1 --------------
|
||||||
Bug Fixes:
|
Bug Fixes:
|
||||||
- Fixed possible ingest deadlock from Image Gallery database inserts.
|
- Fixed possible ingest deadlock from Image Gallery database inserts.
|
||||||
- Image Gallery does not need lock on Case DB during pre-population, which makes UI more responsive.
|
- Image Gallery does not need lock on Case DB during pre-population, which makes UI more responsive.
|
||||||
- Other misc Image Gallery fixes.
|
- Other misc Image Gallery fixes.
|
||||||
|
|
||||||
---------------- VERSION 4.9.0 --------------
|
|
||||||
|
|
||||||
|
---------------- VERSION 4.9.0 --------------
|
||||||
New Features:
|
New Features:
|
||||||
- Removed data from table that are time intensive and can be found in content viewers (such as hash set hits)
|
- Removed data from table that are time intensive and can be found in content viewers (such as hash set hits)
|
||||||
- Added ability to find common items (files, emails, etc.) between current case and past cases using the Central Repository.
|
- Added ability to find common items (files, emails, etc.) between current case and past cases using the Central Repository.
|
||||||
@ -56,12 +91,12 @@ New Features:
|
|||||||
-- An interesting file artifact is now created when a "zip bomb" is detected.
|
-- An interesting file artifact is now created when a "zip bomb" is detected.
|
||||||
-- An object detection ingest module was added to the Experimental module. It requires an OpenCV trained model.
|
-- An object detection ingest module was added to the Experimental module. It requires an OpenCV trained model.
|
||||||
|
|
||||||
|
|
||||||
Bug Fixes:
|
Bug Fixes:
|
||||||
- Expanding the case tree is more efficient.
|
- Expanding the case tree is more efficient.
|
||||||
- Improved "zip bomb" detection.
|
- Improved "zip bomb" detection.
|
||||||
- Assorted small bug fixes are included.
|
- Assorted small bug fixes are included.
|
||||||
|
|
||||||
|
|
||||||
---------------- VERSION 4.7.0 --------------
|
---------------- VERSION 4.7.0 --------------
|
||||||
New Features:
|
New Features:
|
||||||
- A graph visualization was added to the Communications tool to make it easier to find messages and relationships.
|
- A graph visualization was added to the Communications tool to make it easier to find messages and relationships.
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.13</specification-version>
|
<specification-version>10.14</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
</module-dependencies>
|
</module-dependencies>
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
<project name="TSK_VERSION">
|
<project name="TSK_VERSION">
|
||||||
<property name="TSK_VERSION" value="4.6.4"/>
|
<property name="TSK_VERSION" value="4.6.5"/>
|
||||||
</project>
|
</project>
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.10</specification-version>
|
<specification-version>10.14</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#Updated by build script
|
#Updated by build script
|
||||||
#Thu, 29 Nov 2018 12:23:03 -0500
|
#Tue, 11 Dec 2018 14:41:40 -0500
|
||||||
LBL_splash_window_title=Starting Autopsy
|
LBL_splash_window_title=Starting Autopsy
|
||||||
SPLASH_HEIGHT=314
|
SPLASH_HEIGHT=314
|
||||||
SPLASH_WIDTH=538
|
SPLASH_WIDTH=538
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#Updated by build script
|
#Updated by build script
|
||||||
#Thu, 29 Nov 2018 12:23:03 -0500
|
#Tue, 11 Dec 2018 14:41:40 -0500
|
||||||
CTL_MainWindow_Title=Autopsy 4.9.1
|
CTL_MainWindow_Title=Autopsy 4.9.1
|
||||||
CTL_MainWindow_Title_No_Project=Autopsy 4.9.1
|
CTL_MainWindow_Title_No_Project=Autopsy 4.9.1
|
||||||
|
4
docs/doxygen-user/Doxyfile
Executable file → Normal file
@ -38,7 +38,7 @@ PROJECT_NAME = "Autopsy User Documentation"
|
|||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
# control system is used.
|
# control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = 4.9.1
|
PROJECT_NUMBER = 4.10.0
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
@ -1025,7 +1025,7 @@ GENERATE_HTML = YES
|
|||||||
# The default directory is: html.
|
# The default directory is: html.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_OUTPUT = 4.9.0
|
HTML_OUTPUT = 4.10.0
|
||||||
|
|
||||||
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
|
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
|
||||||
# generated HTML page (for example: .htm, .php, .asp).
|
# generated HTML page (for example: .htm, .php, .asp).
|
||||||
|
@ -79,6 +79,16 @@ Descriptions of the property types:
|
|||||||
- Phone numbers are currently only extracted from call logs, contact lists and message, which come from the Android Analyzer module.
|
- Phone numbers are currently only extracted from call logs, contact lists and message, which come from the Android Analyzer module.
|
||||||
- <b>USB Devices</b>
|
- <b>USB Devices</b>
|
||||||
- USB device properties come from the registry parsing in the Recent Activity Module.
|
- USB device properties come from the registry parsing in the Recent Activity Module.
|
||||||
|
- <b>Wireless Networks</b>
|
||||||
|
- Wireless networks are correlated on SSIDs, and come from the registry parsing in the Recent Activity Module.
|
||||||
|
- <b>MAC Addresses</b>
|
||||||
|
- MAC address properties are currently only created by custom Autopsy modules
|
||||||
|
- <b>IMEI Number</b>
|
||||||
|
- IMEIs properties are currently only created by custom Autopsy modules
|
||||||
|
- <b>IMSI Number</b>
|
||||||
|
- IMSI properties are currently only created by custom Autopsy modules
|
||||||
|
- <b>ICCID Number</b>
|
||||||
|
- ICCID properties are currently only created by custom Autopsy modules
|
||||||
|
|
||||||
\subsection cr_manage_orgs Manage Organizations
|
\subsection cr_manage_orgs Manage Organizations
|
||||||
|
|
||||||
@ -90,9 +100,9 @@ One default org, "Not Specified" will always be present in the list. New organiz
|
|||||||
|
|
||||||
\image html central_repo_new_org.png
|
\image html central_repo_new_org.png
|
||||||
|
|
||||||
\subsection cr_show_cases Show Cases
|
\subsection cr_show_cases Manage Cases
|
||||||
|
|
||||||
Displays a list of all cases that are in the central repository database.
|
Displays a list of all cases that are in the central repository database and details about each case.
|
||||||
|
|
||||||
\image html central_repo_details.png
|
\image html central_repo_details.png
|
||||||
|
|
||||||
@ -107,6 +117,15 @@ database. If the Correlation Engine module is not run on a particular case but a
|
|||||||
there will still be some limited functionality. The Content Viewer will still display matching properties from
|
there will still be some limited functionality. The Content Viewer will still display matching properties from
|
||||||
other cases/data sources where the Correlation Engine was run.
|
other cases/data sources where the Correlation Engine was run.
|
||||||
|
|
||||||
|
\image html central_repo_ingest_settings.png
|
||||||
|
|
||||||
|
There are three settings for the Correlation Engine ingest module:
|
||||||
|
<ul>
|
||||||
|
<li><b>Save items to the Central Repository</b> - This should only be unselected in the rare case that you don't want to add any properties from the current data source to the central repository, but still want to flag past occurrences.
|
||||||
|
<li><b>Flag items previously tagged as notable</b> - Enabling this causes Interesting Item/File artifacts to be created when properties matching those previously flagged are found. See the next section \ref cr_tagging for details.
|
||||||
|
<li><b>Flag previously seen devices</b> - When this is enabled, an Interesting Item artifact will be created if any device-related property (USB, MAC Address, IMSI, IMEI, ICCID) is found that is already in the central repository, regardless of whether they have been flagged.
|
||||||
|
</li>
|
||||||
|
|
||||||
\subsection cr_tagging Tagging Files and Artifacts
|
\subsection cr_tagging Tagging Files and Artifacts
|
||||||
|
|
||||||
Tagging a file or artifact with a "notable" tag will change its associated property in the central repository to notable as well.
|
Tagging a file or artifact with a "notable" tag will change its associated property in the central repository to notable as well.
|
||||||
|
@ -4,13 +4,13 @@
|
|||||||
|
|
||||||
The Common Properties Search feature allows you to search for multiple copies of a property within the current case or within the \ref central_repo_page.
|
The Common Properties Search feature allows you to search for multiple copies of a property within the current case or within the \ref central_repo_page.
|
||||||
|
|
||||||
To start a search, go to Tools->Common Properties Search to bring up the main dialog. Searching requires at least one of the following to be true:
|
To start a search, go to Tools->Find Common Properties to bring up the main dialog. Searching requires at least one of the following to be true:
|
||||||
<ul>
|
<ul>
|
||||||
<li> The current case has more than one data source
|
<li> The current case has more than one data source
|
||||||
<li> The Central Repository contains at least two cases
|
<li> The Central Repository contains at least two cases
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
A message will be displayed if both of these conditions are false.
|
If both conditions are false, then the menu item will be disabled. If only one is false then part of the search dialog will be disabled.
|
||||||
|
|
||||||
\section common_properties_search_types Common Properties Search Scope
|
\section common_properties_search_types Common Properties Search Scope
|
||||||
|
|
||||||
@ -48,14 +48,22 @@ You can select the type of property to search for in the menu below:
|
|||||||
|
|
||||||
Restricting a file search to only return images or documents is currently disabled.
|
Restricting a file search to only return images or documents is currently disabled.
|
||||||
|
|
||||||
Finally, you can choose to hide matches that appear with a high frequency in the Central Repository.
|
You can choose to hide matches that appear with a high frequency in the Central Repository. Finally you can choose how to display the results, which will be described below.
|
||||||
|
|
||||||
\section common_properties_results Search Results
|
\section common_properties_results Search Results
|
||||||
|
|
||||||
Each search displays its results in a new tab. The title of the tab will include the search parameters.
|
Each search displays its results in a new tab. The title of the tab will include the search parameters.
|
||||||
|
|
||||||
|
\subsection common_properties_sort_by_count Sort by number of occurrences
|
||||||
|
|
||||||
\image html common_properties_result.png
|
\image html common_properties_result.png
|
||||||
|
|
||||||
The top tree level of the results shows the number of matching files. The results are grouped by how many matching files were found and then grouped by the property itself.
|
This is how all results from searches within the current case are displayed, and an option for displaying the results of a search between the current case and the Central Repository. The top tree level of the results shows the number of matching properties. The results are grouped by how many matching properties were found and then grouped by the property itself.
|
||||||
|
|
||||||
|
\subsection common_properties_sort_by_case Sort by case
|
||||||
|
|
||||||
|
This option is only available when searching between the current case and the Central Repository. The top level shows each case with matching properties, then you can select which data source to view. Every matching property will be displayed under the data source.
|
||||||
|
|
||||||
|
\image html common_properties_result_case_sort.png
|
||||||
|
|
||||||
*/
|
*/
|
51
docs/doxygen-user/data_source_integrity.dox
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*! \page data_source_integrity_page Data Source Integrity Module
|
||||||
|
|
||||||
|
\section data_source_integrity_overview Overview
|
||||||
|
|
||||||
|
The Data Source Integrity module has two purposes:
|
||||||
|
<ul>
|
||||||
|
<li>If the data source has any hashes associated with it (either user-entered or contained in an E01 file), it will verify these hashes
|
||||||
|
<li>If the data source has no associated hashes, it will calculate the hashes and store them in the database
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
\section data_source_integrity_running Running the module
|
||||||
|
|
||||||
|
If you wish to verify hashes, the first step is to enter hashes for your disk image (unless you have an E01 file - the hash is included in the data source).
|
||||||
|
You can do this in the Add Data Source wizard where you select your disk image.
|
||||||
|
|
||||||
|
\image html data_source_integrity_add_ds.png
|
||||||
|
|
||||||
|
You can enter any combination of hashes to be verified.
|
||||||
|
|
||||||
|
You'll next need to configure the ingest module.
|
||||||
|
|
||||||
|
\image html data_source_integrity_ingest_settings.png
|
||||||
|
|
||||||
|
Note that this is simply enabling one or both behaviors, not choosing which one to run (compute vs. verify). That is determined solely by whether the data source
|
||||||
|
has associated hashes. Unchecking both boxes but leaving the module enabled will lead to an ingest module startup error
|
||||||
|
|
||||||
|
\section data_source_integrity_results Viewing results
|
||||||
|
|
||||||
|
\subsection data_source_integrity_verification Hash verification
|
||||||
|
|
||||||
|
When verifying, if the check succeeds you'll see an inbox message confirming it. If you open the message you'll see the stored and computed hash values.
|
||||||
|
|
||||||
|
\image html data_source_integrity_pass1.png
|
||||||
|
<br>
|
||||||
|
\image html data_source_integrity_pass2.png
|
||||||
|
|
||||||
|
If the verification fails, you'll see an inbox message in yellow and the same message in a pop-up warning bubble.
|
||||||
|
|
||||||
|
\image html data_source_integrity_failed_inbox.png
|
||||||
|
|
||||||
|
The inbox messages will disappear after the case is closed, so the module also adds a "Verification Failed" artifact added to the case.
|
||||||
|
|
||||||
|
\image html data_source_integrity_failed_artifact.png
|
||||||
|
|
||||||
|
\subsection data_source_integrity_computation Hash computation
|
||||||
|
|
||||||
|
To view the calculated hashes, select "Data Sources" in the tree, select your data source in the result viewer, and then open the "File Metadata" tab. If you're in "Group by data source" mode (see \ref view_options_page), select "Data Source Files" under the data source you want to examine.
|
||||||
|
|
||||||
|
\image html data_source_integrity_metadata.png
|
||||||
|
|
||||||
|
*/
|
@ -1,31 +0,0 @@
|
|||||||
/*! \page e01_verifier_page E01 Verifier Module
|
|
||||||
|
|
||||||
What Does It Do
|
|
||||||
========
|
|
||||||
|
|
||||||
The E01 Verifier module computes a checksum on E01 files and compares with the E01 file's internal checksum to ensure they match.
|
|
||||||
This can detect if the E01 module is corrupted.
|
|
||||||
|
|
||||||
|
|
||||||
Configuration
|
|
||||||
=======
|
|
||||||
|
|
||||||
There is no configuration required.
|
|
||||||
|
|
||||||
|
|
||||||
Using the Module
|
|
||||||
======
|
|
||||||
Select the checkbox in the Ingest Modules list to use this module.
|
|
||||||
|
|
||||||
Ingest Settings
|
|
||||||
------
|
|
||||||
There are no runtime ingest settings required.
|
|
||||||
|
|
||||||
Seeing Results
|
|
||||||
------
|
|
||||||
|
|
||||||
You only see results from this module if the E01 is corrupted. A failure to load is shown below.
|
|
||||||
|
|
||||||
\image html e01-verifier.PNG
|
|
||||||
|
|
||||||
*/
|
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 28 KiB |
BIN
docs/doxygen-user/images/central_repo_ingest_settings.png
Normal file
After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 30 KiB |
BIN
docs/doxygen-user/images/common_properties_result_case_sort.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
docs/doxygen-user/images/data_source_integrity_add_ds.png
Normal file
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 39 KiB |
BIN
docs/doxygen-user/images/data_source_integrity_failed_inbox.png
Normal file
After Width: | Height: | Size: 34 KiB |