mirror of
https://github.com/elisspace/autopsy.git
synced 2026-10-01 14:59:50 +00:00
Merge branch 'develop' of https://github.com/sleuthkit/autopsy into 3802_group_tree_by_datasource
This commit is contained in:
+4
-5
@@ -21,11 +21,6 @@
|
||||
</target>
|
||||
|
||||
<target name="get-thirdparty-dependencies" description="get third-party dependencies">
|
||||
<!--Copy openCV dependencies to release-->
|
||||
<copy todir="${modules.dir}" >
|
||||
<fileset dir="${thirdparty.dir}/opencv" />
|
||||
</copy>
|
||||
|
||||
<!--Copy photorec to release-->
|
||||
<copy todir="${basedir}/release/photorec_exec" >
|
||||
<fileset dir="${thirdparty.dir}/photorec_exec"/>
|
||||
@@ -96,6 +91,10 @@
|
||||
<get src="https://drive.google.com/uc?id=1bghoSm7z7nhmGIxlllyY1MMlbLntxm7n" dest="${test-input}/local_files_test.zip" skipexisting="true"/>
|
||||
<get src="https://drive.google.com/uc?id=1BrSiUQ1fzxFS9vIaK4mYKX6qIVp9kRWT" dest="${test-input}/password_detection_test.img" skipexisting="true"/>
|
||||
<get src="https://drive.google.com/uc?id=1HD8s4rculgHV1qZT5g80Kg7j4m1qccrN" dest="${test-input}/veracrypt_detection_test.vhd" skipexisting="true"/>
|
||||
<get src="https://drive.google.com/uc?id=1O5D09fFCFpXZqw0uLEs8kVLtfYTxqXAd" dest="${test-input}/commonfiles_image1_v1.vhd" skipexisting="true"/>
|
||||
<get src="https://drive.google.com/uc?id=1rMP1QTI0LdppzdypbG-4BDwkKcR3tHXc" dest="${test-input}/commonfiles_image2_v1.vhd" skipexisting="true"/>
|
||||
<get src="https://drive.google.com/uc?id=1OdwyJ2lru55ZPdvwzj3pq6sXIys27i4x" dest="${test-input}/commonfiles_image3_v1.vhd" skipexisting="true"/>
|
||||
<get src="https://drive.google.com/uc?id=1GoF2x0km5AyFvE926ttN20lrMX1oLN7E" dest="${test-input}/commonfiles_image4_v1.vhd" skipexisting="true"/>
|
||||
</target>
|
||||
|
||||
<target name="get-deps" depends="init-ivy,getTSKJars,get-thirdparty-dependencies,get-InternalPythonModules, download-binlist,getTestDataFiles">
|
||||
|
||||
@@ -3,7 +3,7 @@ file.reference.c3p0-0.9.5.jar=release/modules/ext/c3p0-0.9.5.jar
|
||||
file.reference.commons-compress-1.14.jar=release/modules/ext/commons-compress-1.14.jar
|
||||
file.reference.commons-dbcp2-2.1.1.jar=release\\modules\\ext\\commons-dbcp2-2.1.1.jar
|
||||
file.reference.commons-pool2-2.4.2.jar=release\\modules\\ext\\commons-pool2-2.4.2.jar
|
||||
file.reference.dd-plist-1.20.jar=release\\modules\\ext\\dd-plist-1.20.jar
|
||||
file.reference.dd-plist-1.20.jar=release/modules/ext/dd-plist-1.20.jar
|
||||
file.reference.jdom-2.0.5-contrib.jar=release/modules/ext/jdom-2.0.5-contrib.jar
|
||||
file.reference.jdom-2.0.5.jar=release/modules/ext/jdom-2.0.5.jar
|
||||
file.reference.jgraphx-v3.8.0.jar=release/modules/ext/jgraphx-v3.8.0.jar
|
||||
@@ -12,7 +12,6 @@ file.reference.jython-standalone-2.7.0.jar=release/modules/ext/jython-standalone
|
||||
file.reference.mchange-commons-java-0.2.9.jar=release/modules/ext/mchange-commons-java-0.2.9.jar
|
||||
file.reference.metadata-extractor-2.10.1.jar=release/modules/ext/metadata-extractor-2.10.1.jar
|
||||
file.reference.postgresql-9.4.1211.jre7.jar=release/modules/ext/postgresql-9.4.1211.jre7.jar
|
||||
file.reference.opencv-248.jar=release/modules/ext/opencv-248.jar
|
||||
file.reference.Rejistry-1.0-SNAPSHOT.jar=release/modules/ext/Rejistry-1.0-SNAPSHOT.jar
|
||||
file.reference.sevenzipjbinding-AllPlatforms.jar=release/modules/ext/sevenzipjbinding-AllPlatforms.jar
|
||||
file.reference.sevenzipjbinding.jar=release/modules/ext/sevenzipjbinding.jar
|
||||
|
||||
+48
-56
@@ -339,6 +339,10 @@
|
||||
<package>org.sleuthkit.autopsy.report</package>
|
||||
<package>org.sleuthkit.datamodel</package>
|
||||
</public-packages>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jackcess-2.1.8.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jackcess-2.1.8.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/zookeeper-3.4.6.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/zookeeper-3.4.6.jar</binary-origin>
|
||||
@@ -348,33 +352,33 @@
|
||||
<binary-origin>release/modules/ext/jdom-2.0.5.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/sleuthkit-postgresql-4.6.1.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/sleuthkit-postgresql-4.6.1.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/opencv-248.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/opencv-248.jar</binary-origin>
|
||||
<runtime-relative-path>ext/cxf-rt-transports-http-3.0.16.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/cxf-rt-transports-http-3.0.16.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/curator-framework-2.8.0.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/curator-framework-2.8.0.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/commons-dbcp2-2.1.1.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/commons-dbcp2-2.1.1.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jgraphx-v3.8.0.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jgraphx-v3.8.0.jar</binary-origin>
|
||||
<runtime-relative-path>ext/bcprov-jdk15on-1.54.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/bcprov-jdk15on-1.54.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/commons-compress-1.14.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/commons-compress-1.14.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/fontbox-2.0.8.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/fontbox-2.0.8.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/commons-dbcp2-2.1.1.jar</runtime-relative-path>
|
||||
<binary-origin>release\modules\ext\commons-dbcp2-2.1.1.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jgraphx-v3.8.0.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jgraphx-v3.8.0.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jython-standalone-2.7.0.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jython-standalone-2.7.0.jar</binary-origin>
|
||||
@@ -387,6 +391,14 @@
|
||||
<runtime-relative-path>ext/mchange-commons-java-0.2.9.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/mchange-commons-java-0.2.9.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/cxf-core-3.0.16.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/cxf-core-3.0.16.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/javax.ws.rs-api-2.0.1.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/javax.ws.rs-api-2.0.1.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/postgresql-9.4.1211.jre7.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/postgresql-9.4.1211.jre7.jar</binary-origin>
|
||||
@@ -399,6 +411,10 @@
|
||||
<runtime-relative-path>ext/metadata-extractor-2.10.1.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/metadata-extractor-2.10.1.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/sleuthkit-postgresql-4.6.1.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/sleuthkit-postgresql-4.6.1.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/tika-core-1.17.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/tika-core-1.17.jar</binary-origin>
|
||||
@@ -411,58 +427,18 @@
|
||||
<runtime-relative-path>ext/curator-client-2.8.0.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/curator-client-2.8.0.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/bcprov-jdk15on-1.54.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/bcprov-jdk15on-1.54.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jackcess-2.1.8.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jackcess-2.1.8.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jackcess-encrypt-2.1.2.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jackcess-encrypt-2.1.2.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jempbox-1.8.13.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jempbox-1.8.13.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/javax.ws.rs-api-2.0.1.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/javax.ws.rs-api-2.0.1.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/cxf-rt-rs-client-3.0.16.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/cxf-rt-rs-client-3.0.16.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/cxf-rt-transports-http-3.0.16.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/cxf-rt-transports-http-3.0.16.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/cxf-core-3.0.16.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/cxf-core-3.0.16.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/cxf-rt-frontend-jaxrs-3.0.16.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/cxf-rt-frontend-jaxrs-3.0.16.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/tika-parsers-1.17.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/tika-parsers-1.17.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/fontbox-2.0.8.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/fontbox-2.0.8.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/pdfbox-2.0.8.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/pdfbox-2.0.8.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/pdfbox-tools-2.0.8.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/pdfbox-tools-2.0.8.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/tika-parsers-1.17.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/tika-parsers-1.17.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/sqlite-jdbc-3.8.11.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/sqlite-jdbc-3.8.11.jar</binary-origin>
|
||||
@@ -483,6 +459,14 @@
|
||||
<runtime-relative-path>ext/dd-plist-1.20.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/dd-plist-1.20.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jempbox-1.8.13.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jempbox-1.8.13.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/cxf-rt-rs-client-3.0.16.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/cxf-rt-rs-client-3.0.16.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/sevenzipjbinding-AllPlatforms.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/sevenzipjbinding-AllPlatforms.jar</binary-origin>
|
||||
@@ -491,6 +475,10 @@
|
||||
<runtime-relative-path>ext/commons-pool2-2.4.2.jar</runtime-relative-path>
|
||||
<binary-origin>release\modules\ext\commons-pool2-2.4.2.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jackcess-encrypt-2.1.2.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jackcess-encrypt-2.1.2.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/jsoup-1.10.3.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jsoup-1.10.3.jar</binary-origin>
|
||||
@@ -499,6 +487,10 @@
|
||||
<runtime-relative-path>ext/jdom-2.0.5-contrib.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/jdom-2.0.5-contrib.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/pdfbox-2.0.8.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/pdfbox-2.0.8.jar</binary-origin>
|
||||
</class-path-extension>
|
||||
<class-path-extension>
|
||||
<runtime-relative-path>ext/c3p0-0.9.5.jar</runtime-relative-path>
|
||||
<binary-origin>release/modules/ext/c3p0-0.9.5.jar</binary-origin>
|
||||
|
||||
@@ -83,7 +83,7 @@ abstract class AddTagAction extends AbstractAction implements Presenter.Popup {
|
||||
*/
|
||||
// @@@ This user interface has some significant usability issues and needs
|
||||
// to be reworked.
|
||||
private class TagMenu extends JMenu {
|
||||
private final class TagMenu extends JMenu {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -99,13 +99,8 @@ abstract class AddTagAction extends AbstractAction implements Presenter.Popup {
|
||||
Logger.getLogger(TagsManager.class.getName()).log(Level.SEVERE, "Failed to get tag names", ex); //NON-NLS
|
||||
}
|
||||
|
||||
// Create a "Quick Tag" sub-menu.
|
||||
JMenu quickTagMenu = new JMenu(NbBundle.getMessage(this.getClass(), "AddTagAction.quickTag"));
|
||||
add(quickTagMenu);
|
||||
|
||||
// Each tag name in the current set of tags gets its own menu item in
|
||||
// the "Quick Tags" sub-menu. Selecting one of these menu items adds
|
||||
// a tag with the associated tag name.
|
||||
// Create a menu item for each of the existing and visible tags.
|
||||
// Selecting one of these menu items adds a tag with the associated tag name.
|
||||
if (null != tagNamesMap && !tagNamesMap.isEmpty()) {
|
||||
for (Map.Entry<String, TagName> entry : tagNamesMap.entrySet()) {
|
||||
String tagDisplayName = entry.getKey();
|
||||
@@ -119,28 +114,15 @@ abstract class AddTagAction extends AbstractAction implements Presenter.Popup {
|
||||
tagNameItem.addActionListener((ActionEvent e) -> {
|
||||
getAndAddTag(entry.getKey(), entry.getValue(), NO_COMMENT);
|
||||
});
|
||||
quickTagMenu.add(tagNameItem);
|
||||
|
||||
add(tagNameItem);
|
||||
}
|
||||
} else {
|
||||
JMenuItem empty = new JMenuItem(NbBundle.getMessage(this.getClass(), "AddTagAction.noTags"));
|
||||
empty.setEnabled(false);
|
||||
quickTagMenu.add(empty);
|
||||
}
|
||||
|
||||
if (getItemCount() > 0) {
|
||||
addSeparator();
|
||||
}
|
||||
|
||||
quickTagMenu.addSeparator();
|
||||
|
||||
// The "Quick Tag" menu also gets an "Choose Tag..." menu item.
|
||||
// Selecting this item initiates a dialog that can be used to create
|
||||
// or select a tag name and adds a tag with the resulting name.
|
||||
JMenuItem newTagMenuItem = new JMenuItem(NbBundle.getMessage(this.getClass(), "AddTagAction.newTag"));
|
||||
newTagMenuItem.addActionListener((ActionEvent e) -> {
|
||||
TagName tagName = GetTagNameDialog.doDialog();
|
||||
if (null != tagName) {
|
||||
addTag(tagName, NO_COMMENT);
|
||||
}
|
||||
});
|
||||
quickTagMenu.add(newTagMenuItem);
|
||||
|
||||
// Create a "Choose Tag and Comment..." menu item. Selecting this item initiates
|
||||
// a dialog that can be used to create or select a tag name with an
|
||||
// optional comment and adds a tag with the resulting name.
|
||||
@@ -153,6 +135,19 @@ abstract class AddTagAction extends AbstractAction implements Presenter.Popup {
|
||||
}
|
||||
});
|
||||
add(tagAndCommentItem);
|
||||
|
||||
// Create a "New Tag..." menu item.
|
||||
// Selecting this item initiates a dialog that can be used to create
|
||||
// or select a tag name and adds a tag with the resulting name.
|
||||
JMenuItem newTagMenuItem = new JMenuItem(NbBundle.getMessage(this.getClass(), "AddTagAction.newTag"));
|
||||
newTagMenuItem.addActionListener((ActionEvent e) -> {
|
||||
TagName tagName = GetTagNameDialog.doDialog();
|
||||
if (null != tagName) {
|
||||
addTag(tagName, NO_COMMENT);
|
||||
}
|
||||
});
|
||||
add(newTagMenuItem);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -43,6 +43,10 @@ import org.sleuthkit.datamodel.TagName;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.sleuthkit.datamodel.TskData;
|
||||
|
||||
/**
|
||||
* This dialog allows tag assignment with a comment attached.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class GetTagNameAndCommentDialog extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -46,8 +46,12 @@ import org.sleuthkit.datamodel.TagName;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.sleuthkit.datamodel.TskData;
|
||||
|
||||
/**
|
||||
* Displays existing tag names, and allows the creation of new tags.
|
||||
*/
|
||||
@Messages({"GetTagNameDialog.descriptionLabel.text=Description:",
|
||||
"GetTagNameDialog.notableCheckbox.text=Tag indicates item is notable."})
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class GetTagNameDialog extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -18,15 +18,22 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.casemodule;
|
||||
|
||||
import java.awt.Frame;
|
||||
import javax.swing.JDialog;
|
||||
|
||||
/**
|
||||
* Dialog to show add image error messages
|
||||
*/
|
||||
public class AddImageErrorsDialog extends javax.swing.JDialog {
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class AddImageErrorsDialog extends JDialog {
|
||||
|
||||
/**
|
||||
* Creates new form AddImageErrorsDialog
|
||||
*
|
||||
* @param parent The parent frame.
|
||||
* @param modal Does this dialog act as a modal?
|
||||
*/
|
||||
public AddImageErrorsDialog(java.awt.Frame parent, boolean modal) {
|
||||
public AddImageErrorsDialog(Frame parent, boolean modal) {
|
||||
super(parent, modal);
|
||||
initComponents();
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
* {@link AddImageWizardIngestConfigPanel} (which is a bit weird if you ask m
|
||||
* -jm)
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class AddImageWizardAddingProgressPanel extends ShortcutWizardDescriptorPanel {
|
||||
|
||||
private boolean readyToIngest = false;
|
||||
@@ -79,7 +80,7 @@ class AddImageWizardAddingProgressPanel extends ShortcutWizardDescriptorPanel {
|
||||
*/
|
||||
private AddImageWizardAddingProgressVisual component;
|
||||
private final Set<ChangeListener> listeners = new HashSet<>(1); // or can use ChangeSupport in NB 6.0
|
||||
private final List<Content> newContents = Collections.synchronizedList(new ArrayList<Content>());
|
||||
private final List<Content> newContents = Collections.synchronizedList(new ArrayList<>());
|
||||
private final DSPProgressMonitorImpl dspProgressMonitorImpl = new DSPProgressMonitorImpl();
|
||||
private IngestJobSettings ingestJobSettings;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2012 Basis Technology Corp.
|
||||
* Copyright 2012-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -19,16 +19,14 @@
|
||||
package org.sleuthkit.autopsy.casemodule;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import javax.swing.JProgressBar;
|
||||
import org.openide.WizardDescriptor;
|
||||
import org.openide.util.NbBundle;
|
||||
|
||||
/**
|
||||
* visual component to display progress bar and status updates while adding an
|
||||
* image in the wizard
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class AddImageWizardAddingProgressVisual extends javax.swing.JPanel {
|
||||
|
||||
private static final String ADDING_DATA_SOURCE_COMPLETE = NbBundle
|
||||
|
||||
@@ -39,6 +39,7 @@ import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.ShortcutWizardDescript
|
||||
* The "Add Image" wizard panel1 handling the logic of selecting image file(s)
|
||||
* to add to Case, and pick the time zone.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class AddImageWizardDataSourceSettingsPanel extends ShortcutWizardDescriptorPanel implements PropertyChangeListener {
|
||||
|
||||
/**
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -37,8 +37,8 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
/**
|
||||
* visual component for the first panel of add image wizard. Allows the user to
|
||||
* choose the data source type and then select the data source
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class AddImageWizardDataSourceSettingsVisual extends JPanel {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AddImageWizardDataSourceSettingsVisual.class.getName());
|
||||
|
||||
@@ -40,10 +40,11 @@ import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.ShortcutWizardDescript
|
||||
* TODO: review this for dead code. think about moving logic of adding image to
|
||||
* 3rd panel( {@link AddImageWizardAddingProgressPanel}) separate class -jm
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class AddImageWizardIngestConfigPanel extends ShortcutWizardDescriptorPanel {
|
||||
|
||||
@Messages("AddImageWizardIngestConfigPanel.name.text=Configure Ingest Modules")
|
||||
private IngestJobSettingsPanel ingestJobSettingsPanel;
|
||||
private final IngestJobSettingsPanel ingestJobSettingsPanel;
|
||||
/**
|
||||
* The visual component that displays this panel. If you need to access the
|
||||
* component from this class, just use getComponent().
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2014 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -25,8 +25,8 @@ import javax.swing.JPanel;
|
||||
/**
|
||||
* UI panel for the ingest job configuration wizard panel of the add data source
|
||||
* wizard.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class AddImageWizardIngestConfigVisual extends JPanel {
|
||||
|
||||
private final JPanel ingestPanel;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -36,6 +36,7 @@ import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.ShortcutWizardDescript
|
||||
* Create a wizard panel which contains a panel allowing the selection of the
|
||||
* DataSourceProcessor
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class AddImageWizardSelectDspPanel extends ShortcutWizardDescriptorPanel implements PropertyChangeListener {
|
||||
|
||||
@NbBundle.Messages("SelectDataSourceProcessorPanel.name.text=Select Type of Data Source To Add")
|
||||
|
||||
@@ -46,6 +46,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
* Panel which displays the available DataSourceProcessors and allows selection
|
||||
* of one
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class AddImageWizardSelectDspVisual extends JPanel {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AddImageWizardSelectDspVisual.class.getName());
|
||||
|
||||
@@ -49,8 +49,8 @@ import org.sleuthkit.autopsy.datamodel.EmptyNode;
|
||||
*
|
||||
* Used to display a list of multi user cases and allow the user to open one of
|
||||
* them.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -32,6 +32,7 @@ import org.openide.windows.WindowManager;
|
||||
* Panel for displaying the case information, including both case details and
|
||||
* ingest job history.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class CaseInformationPanel extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -31,10 +31,11 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
* A panel that allows the user to view various properties of a case and change
|
||||
* the display name of the case.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class CasePropertiesPanel extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger LOGGER = Logger.getLogger(CasePropertiesPanel.class.getName());
|
||||
private static final Logger logger = Logger.getLogger(CasePropertiesPanel.class.getName());
|
||||
private Case theCase;
|
||||
|
||||
/**
|
||||
@@ -52,7 +53,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel {
|
||||
try {
|
||||
theCase = Case.getCurrentCaseThrows();
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex);
|
||||
logger.log(Level.SEVERE, "Exception while getting open case.", ex);
|
||||
return;
|
||||
}
|
||||
lbCaseNameText.setText(theCase.getDisplayName());
|
||||
@@ -90,7 +91,7 @@ final class CasePropertiesPanel extends javax.swing.JPanel {
|
||||
currentOrg = correlationCase.getOrg();
|
||||
}
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Unable to access Correlation Case when Central Repo is enabled", ex);
|
||||
logger.log(Level.SEVERE, "Unable to access Correlation Case when Central Repo is enabled", ex);
|
||||
}
|
||||
}
|
||||
if (currentOrg != null) {
|
||||
|
||||
@@ -35,6 +35,7 @@ import org.openide.windows.WindowManager;
|
||||
/*
|
||||
* The panel in the default Autopsy startup window.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class CueBannerPanel extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -22,9 +22,9 @@ import java.awt.event.ActionListener;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author wschaefer
|
||||
* Panel to allow examiner to edit option case properties.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class EditOptionalCasePropertiesPanel extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -31,7 +31,6 @@ import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import javax.swing.filechooser.FileFilter;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.NbBundle;
|
||||
import static org.sleuthkit.autopsy.casemodule.Bundle.*;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor;
|
||||
@@ -46,6 +45,7 @@ import org.sleuthkit.autopsy.coreutils.PathValidator;
|
||||
* to select a file as well as choose the timezone and whether to ignore orphan
|
||||
* files in FAT32.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class ImageFilePanel extends JPanel implements DocumentListener {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(ImageFilePanel.class.getName());
|
||||
|
||||
@@ -39,6 +39,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
/**
|
||||
* Panel for displaying ingest job history.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class IngestJobInfoPanel extends javax.swing.JPanel {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(IngestJobInfoPanel.class.getName());
|
||||
@@ -91,7 +92,7 @@ public final class IngestJobInfoPanel extends javax.swing.JPanel {
|
||||
"IngestJobInfoPanel.IngestJobTableModel.IngestStatus.header=Ingest Status"})
|
||||
private class IngestJobTableModel extends AbstractTableModel {
|
||||
|
||||
private List<String> columnHeaders = new ArrayList<>();
|
||||
private final List<String> columnHeaders = new ArrayList<>();
|
||||
|
||||
IngestJobTableModel() {
|
||||
columnHeaders.add(Bundle.IngestJobInfoPanel_IngestJobTableModel_DataSource_header());
|
||||
@@ -146,8 +147,8 @@ public final class IngestJobInfoPanel extends javax.swing.JPanel {
|
||||
"IngestJobInfoPanel.IngestModuleTableModel.ModuleVersion.header=Module Version"})
|
||||
private class IngestModuleTableModel extends AbstractTableModel {
|
||||
|
||||
private List<String> columnHeaders = new ArrayList<>();
|
||||
private IngestJobInfo currJob;
|
||||
private final List<String> columnHeaders = new ArrayList<>();
|
||||
private final IngestJobInfo currJob;
|
||||
|
||||
IngestModuleTableModel(IngestJobInfo currJob) {
|
||||
columnHeaders.add(Bundle.IngestJobInfoPanel_IngestModuleTableModel_ModuleName_header());
|
||||
|
||||
@@ -34,6 +34,10 @@ import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||
import org.sleuthkit.autopsy.imagewriter.ImageWriterSettings;
|
||||
|
||||
/**
|
||||
* ImageTypePanel for adding a local disk or partition such as PhysicalDrive0 or
|
||||
* C:.
|
||||
*/
|
||||
@NbBundle.Messages({
|
||||
"LocalDiskPanel.errorMessage.noOpenCaseTitle=No open case available",
|
||||
"LocalDiskPanel.errorMessage.noOpenCaseBody=LocalDiskPanel listener couldn't get the open case.",
|
||||
@@ -45,10 +49,7 @@ import org.sleuthkit.autopsy.imagewriter.ImageWriterSettings;
|
||||
"LocalDiskPanel.moduleErrorMessage.body=A module caused an error listening to LocalDiskPanel updates. See log to determine which module. Some data could be incomplete.",
|
||||
"LocalDiskPanel.localDiskMessage.unspecified=Unspecified"
|
||||
})
|
||||
/**
|
||||
* ImageTypePanel for adding a local disk or partition such as PhysicalDrive0 or
|
||||
* C:.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class LocalDiskPanel extends JPanel {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(LocalDiskPanel.class.getName());
|
||||
|
||||
@@ -35,6 +35,7 @@ import org.sleuthkit.autopsy.coreutils.PathValidator;
|
||||
/**
|
||||
* A panel which allows the user to select local files and/or directories.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class LocalFilesPanel extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -32,7 +32,6 @@ import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.PathValidator;
|
||||
@@ -40,6 +39,7 @@ import org.sleuthkit.autopsy.coreutils.PathValidator;
|
||||
/**
|
||||
* A panel which allows the user to select a Logical Evidence File (L01)
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class LogicalEvidenceFilePanel extends javax.swing.JPanel implements DocumentListener {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -28,13 +28,14 @@ import org.openide.util.NbBundle;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor;
|
||||
|
||||
/**
|
||||
* Add input wizard subpanel for adding local files / dirs to the case
|
||||
*/
|
||||
@Messages({
|
||||
"LogicalFilesDspPanel.subTypeComboBox.localFilesOption.text=Local files and folders",
|
||||
"LogicalFilesDspPanel.subTypeComboBox.l01FileOption.text=Logical evidence file (L01)"
|
||||
})
|
||||
/**
|
||||
* Add input wizard subpanel for adding local files / dirs to the case
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class LogicalFilesDspPanel extends JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -35,6 +35,10 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
* Dialog to allow the examiner to locate an image when it cannot be found.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class MissingImageDialog extends javax.swing.JDialog {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MissingImageDialog.class.getName());
|
||||
@@ -50,7 +54,7 @@ class MissingImageDialog extends javax.swing.JDialog {
|
||||
}
|
||||
static final String allDesc = NbBundle.getMessage(MissingImageDialog.class, "MissingImageDialog.allDesc.text");
|
||||
static final GeneralFilter allFilter = new GeneralFilter(allExt, allDesc);
|
||||
private JFileChooser fc = new JFileChooser();
|
||||
private final JFileChooser fc = new JFileChooser();
|
||||
|
||||
/**
|
||||
* Instantiate a MissingImageDialog.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -28,6 +28,7 @@ import org.openide.windows.WindowManager;
|
||||
/**
|
||||
* This class extends a JDialog and maintains the MultiUserCasesPanel.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class MultiUserCasesDialog extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -36,9 +36,10 @@ import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
/**
|
||||
* A panel that allows a user to open cases created by auto ingest.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class MultiUserCasesPanel extends JPanel{
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(MultiUserCasesPanel.class.getName());
|
||||
private static final Logger logger = Logger.getLogger(MultiUserCasesPanel.class.getName());
|
||||
private static final long serialVersionUID = 1L;
|
||||
private final JDialog parentDialog;
|
||||
private final CaseBrowser caseBrowserPanel;
|
||||
@@ -98,7 +99,7 @@ final class MultiUserCasesPanel extends JPanel{
|
||||
Case.openAsCurrentCase(caseMetadataFilePath);
|
||||
} catch (CaseActionException ex) {
|
||||
if (null != ex.getCause() && !(ex.getCause() instanceof CaseActionCancelledException)) {
|
||||
LOGGER.log(Level.SEVERE, String.format("Error opening case with metadata file path %s", caseMetadataFilePath), ex); //NON-NLS
|
||||
logger.log(Level.SEVERE, String.format("Error opening case with metadata file path %s", caseMetadataFilePath), ex); //NON-NLS
|
||||
MessageNotifyUtil.Message.error(ex.getCause().getLocalizedMessage());
|
||||
}
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2015 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -18,9 +18,9 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.casemodule;
|
||||
|
||||
import java.awt.Component;
|
||||
import org.openide.util.NbBundle;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JPanel;
|
||||
@@ -33,6 +33,7 @@ import org.sleuthkit.autopsy.coreutils.PathValidator;
|
||||
/**
|
||||
* The JPanel for the first page of the new case wizard.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class NewCaseVisualPanel1 extends JPanel implements DocumentListener {
|
||||
|
||||
private final JFileChooser fileChooser = new JFileChooser();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -16,20 +16,14 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* NewCaseVisualPanel2.java
|
||||
*
|
||||
* Created on Mar 7, 2012, 11:01:48 AM
|
||||
*/
|
||||
package org.sleuthkit.autopsy.casemodule;
|
||||
|
||||
import org.openide.util.NbBundle;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author dfickling
|
||||
* The JPanel for the second page of the new case wizard.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class NewCaseVisualPanel2 extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -35,6 +35,7 @@ import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
||||
/**
|
||||
* Panel used by the the open recent case option of the start window.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class OpenRecentCasePanel extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -36,9 +36,10 @@ import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
* Panel which allows for editing and setting of the case details which are
|
||||
* optional or otherwise able to be edited.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class OptionalCasePropertiesPanel extends javax.swing.JPanel {
|
||||
|
||||
private final static Logger LOGGER = Logger.getLogger(OptionalCasePropertiesPanel.class.getName());
|
||||
private final static Logger logger = Logger.getLogger(OptionalCasePropertiesPanel.class.getName());
|
||||
private static final long serialVersionUID = 1L;
|
||||
private EamOrganization selectedOrg = null;
|
||||
private java.util.List<EamOrganization> orgs = null;
|
||||
@@ -66,7 +67,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel {
|
||||
try {
|
||||
openCase = Case.getCurrentCaseThrows();
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex);
|
||||
logger.log(Level.SEVERE, "Exception while getting open case.", ex);
|
||||
return;
|
||||
}
|
||||
caseDisplayNameTextField.setText(openCase.getDisplayName());
|
||||
@@ -100,9 +101,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel {
|
||||
selectedOrg = dbManager.getCase(currentCase).getOrg();
|
||||
}
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Unable to get Organization associated with the case from Central Repo", ex);
|
||||
logger.log(Level.SEVERE, "Unable to get Organization associated with the case from Central Repo", ex);
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex);
|
||||
logger.log(Level.SEVERE, "Exception while getting open case.", ex);
|
||||
}
|
||||
|
||||
if (selectedOrg != null) {
|
||||
@@ -145,7 +146,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel {
|
||||
});
|
||||
comboBoxOrgName.setSelectedItem(selectedBeforeLoad);
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.WARNING, "Unable to populate list of Organizations from Central Repo", ex);
|
||||
logger.log(Level.WARNING, "Unable to populate list of Organizations from Central Repo", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -598,9 +599,9 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel {
|
||||
correlationCase.setNotes(taNotesText.getText());
|
||||
dbManager.updateCase(correlationCase);
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error connecting to central repository database", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Error connecting to central repository database", ex); // NON-NLS
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
|
||||
} finally {
|
||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
}
|
||||
|
||||
@@ -19,8 +19,6 @@
|
||||
package org.sleuthkit.autopsy.casemodule.services;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import javax.swing.JFrame;
|
||||
@@ -34,6 +32,7 @@ import org.sleuthkit.datamodel.TskData;
|
||||
|
||||
@Messages({"TagNameDialog.descriptionLabel.text=Description:",
|
||||
"TagNameDialog.notableCheckbox.text=Tag indicates item is notable."})
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class TagNameDialog extends javax.swing.JDialog {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -27,7 +27,6 @@ import java.util.TreeSet;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.DefaultListModel;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import org.netbeans.spi.options.OptionsPanelController;
|
||||
import org.openide.util.NbBundle;
|
||||
@@ -43,6 +42,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
/**
|
||||
* A panel to allow the user to create and delete custom tag types.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
+142
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.AbstractAction;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamArtifactUtil;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
* An AbstractAction to manage adding and modifying a Central Repository file
|
||||
* instance comment.
|
||||
*/
|
||||
public final class AddEditCentralRepoCommentAction extends AbstractAction {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AddEditCentralRepoCommentAction.class.getName());
|
||||
|
||||
private boolean addToDatabase;
|
||||
private CorrelationAttribute correlationAttribute;
|
||||
String title;
|
||||
|
||||
/**
|
||||
* Private constructor to create an instance given a CorrelationAttribute.
|
||||
*
|
||||
* @param correlationAttribute The correlation attribute to modify.
|
||||
* @param title The text for the menu item.
|
||||
*/
|
||||
private AddEditCentralRepoCommentAction(CorrelationAttribute correlationAttribute, String title) {
|
||||
super(title);
|
||||
this.title = title;
|
||||
this.correlationAttribute = correlationAttribute;
|
||||
}
|
||||
|
||||
/**
|
||||
* Private constructor to create an instance given an AbstractFile.
|
||||
*
|
||||
* @param file The file from which a correlation attribute to modify is
|
||||
* derived.
|
||||
* @param title The text for the menu item.
|
||||
*/
|
||||
private AddEditCentralRepoCommentAction(AbstractFile file, String title) {
|
||||
|
||||
super(title);
|
||||
this.title = title;
|
||||
correlationAttribute = EamArtifactUtil.getCorrelationAttributeFromContent(file);
|
||||
if (correlationAttribute == null) {
|
||||
addToDatabase = true;
|
||||
correlationAttribute = EamArtifactUtil.makeCorrelationAttributeFromContent(file);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
addEditCentralRepoComment();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Add/Edit dialog for the correlation attribute file instance
|
||||
* comment. The comment will be updated in the database if the file instance
|
||||
* exists there, or a new file instance will be added to the database with
|
||||
* the comment attached otherwise.
|
||||
*/
|
||||
public void addEditCentralRepoComment() {
|
||||
CentralRepoCommentDialog centralRepoCommentDialog = new CentralRepoCommentDialog(correlationAttribute, title);
|
||||
centralRepoCommentDialog.display();
|
||||
|
||||
if (centralRepoCommentDialog.isCommentUpdated()) {
|
||||
EamDb dbManager;
|
||||
|
||||
try {
|
||||
dbManager = EamDb.getInstance();
|
||||
|
||||
if (addToDatabase) {
|
||||
dbManager.addArtifact(correlationAttribute);
|
||||
} else {
|
||||
dbManager.updateAttributeInstanceComment(correlationAttribute);
|
||||
}
|
||||
} catch (EamDbException ex) {
|
||||
logger.log(Level.SEVERE, "Error connecting to Central Repository database.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance labeled "Add/Edit Central Repository Comment" given an
|
||||
* AbstractFile. This is intended for the result view.
|
||||
*
|
||||
* @param file The file from which a correlation attribute to modify is
|
||||
* derived.
|
||||
*
|
||||
* @return The instance.
|
||||
*
|
||||
* @throws EamDbException
|
||||
* @throws NoCurrentCaseException
|
||||
* @throws TskCoreException
|
||||
*/
|
||||
@Messages({"AddEditCentralRepoCommentAction.menuItemText.addEditCentralRepoComment=Add/Edit Central Repository Comment"})
|
||||
public static AddEditCentralRepoCommentAction createAddEditCentralRepoCommentAction(AbstractFile file) {
|
||||
|
||||
return new AddEditCentralRepoCommentAction(file,
|
||||
Bundle.AddEditCentralRepoCommentAction_menuItemText_addEditCentralRepoComment());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance labeled "Add/Edit Comment" given a
|
||||
* CorrelationAttribute. This is intended for the content view.
|
||||
*
|
||||
* @param correlationAttribute The correlation attribute to modify.
|
||||
*
|
||||
* @return The instance.
|
||||
*/
|
||||
@Messages({"AddEditCentralRepoCommentAction.menuItemText.addEditComment=Add/Edit Comment"})
|
||||
public static AddEditCentralRepoCommentAction createAddEditCommentAction(CorrelationAttribute correlationAttribute) {
|
||||
|
||||
return new AddEditCentralRepoCommentAction(correlationAttribute,
|
||||
Bundle.AddEditCentralRepoCommentAction_menuItemText_addEditComment());
|
||||
}
|
||||
}
|
||||
@@ -5,3 +5,8 @@ OpenIDE-Module-Long-Description=\
|
||||
Correlation Engine ingest module and central database. \n\n\
|
||||
The Correlation Engine ingest module stores attributes of artifacts matching selected correlation types into a central database.\n\
|
||||
Stored attributes are used in future cases to correlate and analyzes files and artifacts during ingest.
|
||||
CentralRepoCommentDialog.fileLabel.text=File:
|
||||
CentralRepoCommentDialog.commentLabel.text=Comment:
|
||||
CentralRepoCommentDialog.pathLabel.text=
|
||||
CentralRepoCommentDialog.okButton.text=&OK
|
||||
CentralRepoCommentDialog.cancelButton.text=C&ancel
|
||||
|
||||
+138
@@ -0,0 +1,138 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||
<Properties>
|
||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||
<Property name="size" type="java.awt.Dimension" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection component="Form" name="preferredSize" type="property"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<SyntheticProperties>
|
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||
</SyntheticProperties>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="jScrollPane1" pref="500" max="32767" attributes="0"/>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="fileLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="pathLabel" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="commentLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="451" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
<Component id="okButton" min="-2" pref="75" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="cancelButton" min="-2" pref="75" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="fileLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="pathLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="-2" pref="19" max="-2" attributes="0"/>
|
||||
<Component id="commentLabel" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane1" max="32767" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="okButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="cancelButton" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTextArea" name="commentTextArea">
|
||||
<Properties>
|
||||
<Property name="columns" type="int" value="20"/>
|
||||
<Property name="lineWrap" type="boolean" value="true"/>
|
||||
<Property name="rows" type="int" value="5"/>
|
||||
<Property name="tabSize" type="int" value="4"/>
|
||||
<Property name="wrapStyleWord" type="boolean" value="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JButton" name="okButton">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/Bundle.properties" key="CentralRepoCommentDialog.okButton.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="okButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="cancelButton">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/Bundle.properties" key="CentralRepoCommentDialog.cancelButton.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="cancelButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="fileLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/Bundle.properties" key="CentralRepoCommentDialog.fileLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="pathLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/Bundle.properties" key="CentralRepoCommentDialog.pathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="commentLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/Bundle.properties" key="CentralRepoCommentDialog.commentLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
||||
+187
@@ -0,0 +1,187 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository;
|
||||
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||
|
||||
/**
|
||||
* Dialog to allow Central Repository file instance comments to be added and
|
||||
* modified.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class CentralRepoCommentDialog extends javax.swing.JDialog {
|
||||
|
||||
private final CorrelationAttribute correlationAttribute;
|
||||
private boolean commentUpdated = false;
|
||||
|
||||
/**
|
||||
* Create an instance.
|
||||
*
|
||||
* @param correlationAttribute The correlation attribute to be modified.
|
||||
* @param title The title to assign the dialog.
|
||||
*/
|
||||
CentralRepoCommentDialog(CorrelationAttribute correlationAttribute, String title) {
|
||||
super(WindowManager.getDefault().getMainWindow(), title);
|
||||
|
||||
initComponents();
|
||||
|
||||
CorrelationAttributeInstance instance = correlationAttribute.getInstances().get(0);
|
||||
|
||||
pathLabel.setText(instance.getFilePath());
|
||||
commentTextArea.setText(instance.getComment());
|
||||
|
||||
this.correlationAttribute = correlationAttribute;
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the dialog.
|
||||
*/
|
||||
void display() {
|
||||
setModal(true);
|
||||
setSize(getPreferredSize());
|
||||
setLocationRelativeTo(this.getParent());
|
||||
setAlwaysOnTop(false);
|
||||
pack();
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Has the comment been updated?
|
||||
*
|
||||
* @return True if the comment has been updated; otherwise false.
|
||||
*/
|
||||
boolean isCommentUpdated() {
|
||||
return commentUpdated;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called from within the constructor to initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is always
|
||||
* regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
jScrollPane1 = new javax.swing.JScrollPane();
|
||||
commentTextArea = new javax.swing.JTextArea();
|
||||
okButton = new javax.swing.JButton();
|
||||
cancelButton = new javax.swing.JButton();
|
||||
fileLabel = new javax.swing.JLabel();
|
||||
pathLabel = new javax.swing.JLabel();
|
||||
commentLabel = new javax.swing.JLabel();
|
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||
setSize(getPreferredSize());
|
||||
|
||||
commentTextArea.setColumns(20);
|
||||
commentTextArea.setLineWrap(true);
|
||||
commentTextArea.setRows(5);
|
||||
commentTextArea.setTabSize(4);
|
||||
commentTextArea.setWrapStyleWord(true);
|
||||
jScrollPane1.setViewportView(commentTextArea);
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(okButton, org.openide.util.NbBundle.getMessage(CentralRepoCommentDialog.class, "CentralRepoCommentDialog.okButton.text")); // NOI18N
|
||||
okButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
okButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(CentralRepoCommentDialog.class, "CentralRepoCommentDialog.cancelButton.text")); // NOI18N
|
||||
cancelButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
cancelButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(fileLabel, org.openide.util.NbBundle.getMessage(CentralRepoCommentDialog.class, "CentralRepoCommentDialog.fileLabel.text")); // NOI18N
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(CentralRepoCommentDialog.class, "CentralRepoCommentDialog.pathLabel.text")); // NOI18N
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(commentLabel, org.openide.util.NbBundle.getMessage(CentralRepoCommentDialog.class, "CentralRepoCommentDialog.commentLabel.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(fileLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(pathLabel))
|
||||
.addComponent(commentLabel))
|
||||
.addGap(0, 451, Short.MAX_VALUE))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(0, 0, Short.MAX_VALUE)
|
||||
.addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(cancelButton, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(fileLabel)
|
||||
.addComponent(pathLabel))
|
||||
.addGap(19, 19, 19)
|
||||
.addComponent(commentLabel)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jScrollPane1)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(okButton)
|
||||
.addComponent(cancelButton))
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
|
||||
dispose();
|
||||
}//GEN-LAST:event_cancelButtonActionPerformed
|
||||
|
||||
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
|
||||
String comment = commentTextArea.getText();
|
||||
correlationAttribute.getInstances().get(0).setComment(comment);
|
||||
commentUpdated = true;
|
||||
|
||||
dispose();
|
||||
}//GEN-LAST:event_okButtonActionPerformed
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton cancelButton;
|
||||
private javax.swing.JLabel commentLabel;
|
||||
private javax.swing.JTextArea commentTextArea;
|
||||
private javax.swing.JLabel fileLabel;
|
||||
private javax.swing.JScrollPane jScrollPane1;
|
||||
private javax.swing.JButton okButton;
|
||||
private javax.swing.JLabel pathLabel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
/*
|
||||
* Central Repository
|
||||
*
|
||||
* Copyright 2015-2017 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Used as a key to ensure we eliminate duplicates from the result set by not overwriting CR correlation instances.
|
||||
*/
|
||||
final class ArtifactKey {
|
||||
|
||||
private final String dataSourceID;
|
||||
private final String filePath;
|
||||
|
||||
ArtifactKey(String theDataSource, String theFilePath) {
|
||||
dataSourceID = theDataSource;
|
||||
filePath = theFilePath.toLowerCase();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @return the dataSourceID device ID
|
||||
*/
|
||||
String getDataSourceID() {
|
||||
return dataSourceID;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return the filPath including the filename and extension.
|
||||
*/
|
||||
String getFilePath() {
|
||||
return filePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object other) {
|
||||
if (other instanceof ArtifactKey) {
|
||||
return ((ArtifactKey) other).getDataSourceID().equals(dataSourceID) && ((ArtifactKey) other).getFilePath().equals(filePath);
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
//int hash = 7;
|
||||
//hash = 67 * hash + this.dataSourceID.hashCode();
|
||||
//hash = 67 * hash + this.filePath.hashCode();
|
||||
|
||||
return Objects.hash(dataSourceID, filePath);
|
||||
}
|
||||
}
|
||||
@@ -3,3 +3,4 @@ DataContentViewerOtherCases.showCaseDetailsMenuItem.text=Show Case Details
|
||||
DataContentViewerOtherCases.table.toolTip.text=Click column name to sort. Right-click on the table for more options.
|
||||
DataContentViewerOtherCases.exportToCSVMenuItem.text=Export Selected Rows to CSV
|
||||
DataContentViewerOtherCases.showCommonalityMenuItem.text=Show Frequency
|
||||
DataContentViewerOtherCases.addCommentMenuItem.text=Add/Edit Comment
|
||||
|
||||
+10
@@ -3,6 +3,9 @@
|
||||
<Form version="1.6" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<NonVisualComponents>
|
||||
<Container class="javax.swing.JPopupMenu" name="rightClickPopupMenu">
|
||||
<Events>
|
||||
<EventHandler event="popupMenuWillBecomeVisible" listener="javax.swing.event.PopupMenuListener" parameters="javax.swing.event.PopupMenuEvent" handler="rightClickPopupMenuPopupMenuWillBecomeVisible"/>
|
||||
</Events>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||
@@ -36,6 +39,13 @@
|
||||
</Property>
|
||||
</Properties>
|
||||
</MenuItem>
|
||||
<MenuItem class="javax.swing.JMenuItem" name="addCommentMenuItem">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/contentviewer/Bundle.properties" key="DataContentViewerOtherCases.addCommentMenuItem.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</MenuItem>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JFileChooser" name="CSVFileChooser">
|
||||
|
||||
+179
-51
@@ -31,6 +31,7 @@ import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -40,6 +41,7 @@ import javax.swing.JOptionPane;
|
||||
import static javax.swing.JOptionPane.DEFAULT_OPTION;
|
||||
import static javax.swing.JOptionPane.PLAIN_MESSAGE;
|
||||
import static javax.swing.JOptionPane.ERROR_MESSAGE;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
import javax.swing.table.TableCellRenderer;
|
||||
import javax.swing.table.TableColumn;
|
||||
@@ -48,6 +50,7 @@ import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.util.lookup.ServiceProvider;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.centralrepository.AddEditCentralRepoCommentAction;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttribute;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||
@@ -63,18 +66,21 @@ import org.sleuthkit.datamodel.ContentTag;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.sleuthkit.datamodel.TskException;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbUtil;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskData;
|
||||
import org.sleuthkit.datamodel.TskDataException;
|
||||
|
||||
/**
|
||||
* View correlation results from other cases
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
@ServiceProvider(service = DataContentViewer.class, position = 8)
|
||||
@Messages({"DataContentViewerOtherCases.title=Other Occurrences",
|
||||
"DataContentViewerOtherCases.toolTip=Displays instances of the selected file/artifact from other occurrences.",})
|
||||
public class DataContentViewerOtherCases extends javax.swing.JPanel implements DataContentViewer {
|
||||
public class DataContentViewerOtherCases extends JPanel implements DataContentViewer {
|
||||
|
||||
private final static Logger LOGGER = Logger.getLogger(DataContentViewerOtherCases.class.getName());
|
||||
private final static Logger logger = Logger.getLogger(DataContentViewerOtherCases.class.getName());
|
||||
|
||||
private final DataContentViewerOtherCasesTableModel tableModel;
|
||||
private final Collection<CorrelationAttribute> correlationAttributes;
|
||||
@@ -108,10 +114,15 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
try {
|
||||
saveToCSV();
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
|
||||
}
|
||||
} else if (jmi.equals(showCommonalityMenuItem)) {
|
||||
showCommonalityDetails();
|
||||
} else if (jmi.equals(addCommentMenuItem)) {
|
||||
CorrelationAttribute selectedAttribute = (CorrelationAttribute) tableModel.getRow(otherCasesTable.getSelectedRow());
|
||||
AddEditCentralRepoCommentAction action = AddEditCentralRepoCommentAction.createAddEditCommentAction(selectedAttribute);
|
||||
action.addEditCentralRepoComment();
|
||||
otherCasesTable.repaint();
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -120,6 +131,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
selectAllMenuItem.addActionListener(actList);
|
||||
showCaseDetailsMenuItem.addActionListener(actList);
|
||||
showCommonalityMenuItem.addActionListener(actList);
|
||||
addCommentMenuItem.addActionListener(actList);
|
||||
|
||||
// Set background of every nth row as light grey.
|
||||
TableCellRenderer renderer = new DataContentViewerOtherCasesTableCellRenderer();
|
||||
@@ -135,7 +147,8 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
"DataContentViewerOtherCases.correlatedArtifacts.title=Attribute Frequency",
|
||||
"DataContentViewerOtherCases.correlatedArtifacts.failed=Failed to get frequency details."})
|
||||
/**
|
||||
* Show how common the selected correlationAttributes are with details dialog.
|
||||
* Show how common the selected correlationAttributes are with details
|
||||
* dialog.
|
||||
*/
|
||||
private void showCommonalityDetails() {
|
||||
if (correlationAttributes.isEmpty()) {
|
||||
@@ -159,7 +172,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
Bundle.DataContentViewerOtherCases_correlatedArtifacts_title(),
|
||||
DEFAULT_OPTION, PLAIN_MESSAGE);
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error getting commonality details.", ex);
|
||||
logger.log(Level.SEVERE, "Error getting commonality details.", ex);
|
||||
JOptionPane.showConfirmDialog(showCommonalityMenuItem,
|
||||
Bundle.DataContentViewerOtherCases_correlatedArtifacts_failed(),
|
||||
Bundle.DataContentViewerOtherCases_correlatedArtifacts_title(),
|
||||
@@ -283,7 +296,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
}
|
||||
|
||||
} catch (IOException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error writing selected rows to CSV.", ex);
|
||||
logger.log(Level.SEVERE, "Error writing selected rows to CSV.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -374,7 +387,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
try {
|
||||
content = nodeBbArtifact.getSleuthkitCase().getContentById(nodeBbArtifact.getObjectID());
|
||||
} catch (TskCoreException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error retrieving blackboard artifact", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Error retrieving blackboard artifact", ex); // NON-NLS
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -401,7 +414,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
|
||||
// correlate on blackboard artifact attributes if they exist and supported
|
||||
BlackboardArtifact bbArtifact = getBlackboardArtifactFromNode(node);
|
||||
if (bbArtifact != null) {
|
||||
if (bbArtifact != null && EamDb.isEnabled()) {
|
||||
ret.addAll(EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(bbArtifact, false, false));
|
||||
}
|
||||
|
||||
@@ -420,20 +433,20 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
}
|
||||
}
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error connecting to DB", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Error connecting to DB", ex); // NON-NLS
|
||||
}
|
||||
|
||||
} else {
|
||||
try {
|
||||
// If EamDb not enabled, get the Files default correlation type to allow Other Occurances to be enabled.
|
||||
if(this.file != null) {
|
||||
if (this.file != null) {
|
||||
String md5 = this.file.getMd5Hash();
|
||||
if(md5 != null && !md5.isEmpty()) {
|
||||
ret.add(new CorrelationAttribute(CorrelationAttribute.getDefaultCorrelationTypes().get(0),md5));
|
||||
if (md5 != null && !md5.isEmpty()) {
|
||||
ret.add(new CorrelationAttribute(CorrelationAttribute.getDefaultCorrelationTypes().get(0), md5));
|
||||
}
|
||||
}
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error connecting to DB", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Error connecting to DB", ex); // NON-NLS
|
||||
}
|
||||
}
|
||||
|
||||
@@ -441,35 +454,36 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
}
|
||||
|
||||
/**
|
||||
* Query the db for artifact instances from other cases correlated to the
|
||||
* given central repository artifact. Will not show instances from the same
|
||||
* datasource / device
|
||||
* Query the database for artifact instances from other cases correlated to
|
||||
* the given central repository artifact. Instances from the same datasource
|
||||
* / device will also be included.
|
||||
*
|
||||
* @param corAttr CorrelationAttribute to query for
|
||||
* @param corAttr CorrelationAttribute to query for
|
||||
* @param dataSourceName Data source to filter results
|
||||
* @param deviceId Device Id to filter results
|
||||
* @param deviceId Device Id to filter results
|
||||
*
|
||||
* @return A collection of correlated artifact instances from other cases
|
||||
* @return A collection of correlated artifact instances
|
||||
*/
|
||||
private Map<ArtifactKey, CorrelationAttributeInstance> getCorrelatedInstances(CorrelationAttribute corAttr, String dataSourceName, String deviceId) {
|
||||
private Map<UniquePathKey, CorrelationAttributeInstance> getCorrelatedInstances(CorrelationAttribute corAttr, String dataSourceName, String deviceId) {
|
||||
// @@@ Check exception
|
||||
try {
|
||||
final Case openCase = Case.getCurrentCase();
|
||||
String caseUUID = openCase.getName();
|
||||
HashMap<ArtifactKey, CorrelationAttributeInstance> artifactInstances = new HashMap<>();
|
||||
String filePath = (file.getParentPath() + file.getName()).toLowerCase();
|
||||
HashMap<UniquePathKey, CorrelationAttributeInstance> artifactInstances = new HashMap<>();
|
||||
|
||||
if (EamDb.isEnabled()) {
|
||||
EamDb dbManager = EamDb.getInstance();
|
||||
artifactInstances.putAll(dbManager.getArtifactInstancesByTypeValue(corAttr.getCorrelationType(), corAttr.getCorrelationValue()).stream()
|
||||
.filter(artifactInstance -> !artifactInstance.getCorrelationCase().getCaseUUID().equals(caseUUID)
|
||||
.filter(artifactInstance -> !artifactInstance.getFilePath().equals(filePath)
|
||||
|| !artifactInstance.getCorrelationCase().getCaseUUID().equals(caseUUID)
|
||||
|| !artifactInstance.getCorrelationDataSource().getName().equals(dataSourceName)
|
||||
|| !artifactInstance.getCorrelationDataSource().getDeviceID().equals(deviceId))
|
||||
.collect(Collectors.toMap(
|
||||
correlationAttr -> new ArtifactKey(correlationAttr.getCorrelationDataSource().getDeviceID(), correlationAttr.getFilePath()),
|
||||
.collect(Collectors.toMap(correlationAttr -> new UniquePathKey(correlationAttr.getCorrelationDataSource().getDeviceID(), correlationAttr.getFilePath()),
|
||||
correlationAttr -> correlationAttr)));
|
||||
}
|
||||
|
||||
if (corAttr.getCorrelationType().getDisplayName().equals("Files")) {
|
||||
if (corAttr.getCorrelationType().getDisplayName().equals("Files")) {
|
||||
List<AbstractFile> caseDbFiles = addCaseDbMatches(corAttr, openCase);
|
||||
for (AbstractFile caseDbFile : caseDbFiles) {
|
||||
addOrUpdateAttributeInstance(openCase, artifactInstances, caseDbFile);
|
||||
@@ -478,13 +492,13 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
|
||||
return artifactInstances;
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error getting artifact instances from database.", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Error getting artifact instances from database.", ex); // NON-NLS
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
|
||||
} catch (TskCoreException ex) {
|
||||
// do nothing.
|
||||
// @@@ Review this behavior
|
||||
LOGGER.log(Level.SEVERE, "Exception while querying open case.", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Exception while querying open case.", ex); // NON-NLS
|
||||
}
|
||||
|
||||
return new HashMap<>(0);
|
||||
@@ -507,29 +521,59 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
|
||||
}
|
||||
|
||||
private void addOrUpdateAttributeInstance(final Case openCase, Map<ArtifactKey, CorrelationAttributeInstance> artifactInstances, AbstractFile caseDbFile) throws TskCoreException, EamDbException {
|
||||
CorrelationCase caze = new CorrelationCase(openCase.getNumber(), openCase.getDisplayName());
|
||||
CorrelationDataSource dataSource = CorrelationDataSource.fromTSKDataSource(caze, caseDbFile.getDataSource());
|
||||
String filePath = caseDbFile.getParentPath() + caseDbFile.getName();
|
||||
ArtifactKey instKey = new ArtifactKey(dataSource.getDeviceID(), filePath);
|
||||
CorrelationAttributeInstance caseDbInstance = new CorrelationAttributeInstance(caze, dataSource, filePath, "", caseDbFile.getKnown());
|
||||
TskData.FileKnown knownStatus = caseDbInstance.getKnownStatus();
|
||||
// If not known, check Tags for known and set
|
||||
TskData.FileKnown knownBad = TskData.FileKnown.BAD;
|
||||
if (!knownStatus.equals(knownBad)) {
|
||||
List<ContentTag> fileMatchTags = openCase.getServices().getTagsManager().getContentTagsByContent(caseDbFile);
|
||||
/**
|
||||
* Adds the file to the artifactInstances map if it does not already exist
|
||||
*
|
||||
* @param autopsyCase
|
||||
* @param artifactInstances
|
||||
* @param newFile
|
||||
*
|
||||
* @throws TskCoreException
|
||||
* @throws EamDbException
|
||||
*/
|
||||
private void addOrUpdateAttributeInstance(final Case autopsyCase, Map<UniquePathKey, CorrelationAttributeInstance> artifactInstances, AbstractFile newFile) throws TskCoreException, EamDbException {
|
||||
|
||||
// figure out if the casedb file is known via either hash or tags
|
||||
TskData.FileKnown localKnown = newFile.getKnown();
|
||||
|
||||
if (localKnown != TskData.FileKnown.BAD) {
|
||||
List<ContentTag> fileMatchTags = autopsyCase.getServices().getTagsManager().getContentTagsByContent(newFile);
|
||||
for (ContentTag tag : fileMatchTags) {
|
||||
TskData.FileKnown tagKnownStatus = tag.getName().getKnownStatus();
|
||||
if (tagKnownStatus.equals(knownBad)) {
|
||||
caseDbInstance.setKnownStatus(knownBad);
|
||||
if (tagKnownStatus.equals(TskData.FileKnown.BAD)) {
|
||||
localKnown = TskData.FileKnown.BAD;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If known, or not in CR, add
|
||||
if (caseDbInstance.getKnownStatus().equals(knownBad) || !artifactInstances.containsKey(instKey)) {
|
||||
artifactInstances.put(instKey, caseDbInstance);
|
||||
// make a key to see if the file is already in the map
|
||||
String filePath = newFile.getParentPath() + newFile.getName();
|
||||
String deviceId;
|
||||
try {
|
||||
deviceId = autopsyCase.getSleuthkitCase().getDataSource(newFile.getDataSource().getId()).getDeviceId();
|
||||
} catch (TskDataException | TskCoreException ex) {
|
||||
logger.log(Level.WARNING, "Error getting data source info: {0}", ex);
|
||||
return;
|
||||
}
|
||||
UniquePathKey uniquePathKey = new UniquePathKey(deviceId, filePath);
|
||||
|
||||
// double check that the CR version is BAD if the caseDB version is BAD.
|
||||
if (artifactInstances.containsKey(uniquePathKey)) {
|
||||
if (localKnown == TskData.FileKnown.BAD) {
|
||||
CorrelationAttributeInstance prevInstance = artifactInstances.get(uniquePathKey);
|
||||
prevInstance.setKnownStatus(localKnown);
|
||||
}
|
||||
} // add the data from the case DB by pushing data into CorrelationAttributeInstance class
|
||||
else {
|
||||
// NOTE: If we are in here, it is likely because CR is not enabled. So, we cannot rely
|
||||
// on any of the methods that query the DB.
|
||||
CorrelationCase correlationCase = new CorrelationCase(autopsyCase.getName(), autopsyCase.getDisplayName());
|
||||
|
||||
CorrelationDataSource correlationDataSource = CorrelationDataSource.fromTSKDataSource(correlationCase, newFile.getDataSource());
|
||||
|
||||
CorrelationAttributeInstance caseDbInstance = new CorrelationAttributeInstance(correlationCase, correlationDataSource, filePath, "", localKnown);
|
||||
artifactInstances.put(uniquePathKey, caseDbInstance);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -539,9 +583,15 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
// Is supported if this node
|
||||
// has correlatable content (File, BlackboardArtifact) OR
|
||||
// other common files across datasources.
|
||||
return this.file != null
|
||||
&& this.file.getSize() > 0
|
||||
&& !getCorrelationAttributesFromNode(node).isEmpty();
|
||||
|
||||
if (EamDb.isEnabled()) {
|
||||
return this.file != null
|
||||
&& this.file.getSize() > 0
|
||||
&& !getCorrelationAttributesFromNode(node).isEmpty();
|
||||
} else {
|
||||
return this.file != null
|
||||
&& this.file.getSize() > 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -582,7 +632,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
// get the attributes we can correlate on
|
||||
correlationAttributes.addAll(getCorrelationAttributesFromNode(node));
|
||||
for (CorrelationAttribute corAttr : correlationAttributes) {
|
||||
Map<ArtifactKey, CorrelationAttributeInstance> corAttrInstances = new HashMap<>(0);
|
||||
Map<UniquePathKey, CorrelationAttributeInstance> corAttrInstances = new HashMap<>(0);
|
||||
|
||||
// get correlation and reference set instances from DB
|
||||
corAttrInstances.putAll(getCorrelatedInstances(corAttr, dataSourceName, deviceId));
|
||||
@@ -596,12 +646,13 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
newCeArtifact.addInstance(corAttrInstance);
|
||||
tableModel.addEamArtifact(newCeArtifact);
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error creating correlation attribute", ex);
|
||||
logger.log(Level.SEVERE, "Error creating correlation attribute", ex);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (correlationAttributes.isEmpty()) {
|
||||
// @@@ BC: We should have a more descriptive message than this. Mention that the file didn't have a MD5, etc.
|
||||
displayMessageOnTableStatusPanel(Bundle.DataContentViewerOtherCases_table_noArtifacts());
|
||||
} else if (0 == tableModel.getRowCount()) {
|
||||
displayMessageOnTableStatusPanel(Bundle.DataContentViewerOtherCases_table_isempty());
|
||||
@@ -644,6 +695,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
exportToCSVMenuItem = new javax.swing.JMenuItem();
|
||||
showCaseDetailsMenuItem = new javax.swing.JMenuItem();
|
||||
showCommonalityMenuItem = new javax.swing.JMenuItem();
|
||||
addCommentMenuItem = new javax.swing.JMenuItem();
|
||||
CSVFileChooser = new javax.swing.JFileChooser();
|
||||
otherCasesPanel = new javax.swing.JPanel();
|
||||
tableContainerPanel = new javax.swing.JPanel();
|
||||
@@ -652,6 +704,16 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
tableStatusPanel = new javax.swing.JPanel();
|
||||
tableStatusPanelLabel = new javax.swing.JLabel();
|
||||
|
||||
rightClickPopupMenu.addPopupMenuListener(new javax.swing.event.PopupMenuListener() {
|
||||
public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) {
|
||||
}
|
||||
public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
|
||||
}
|
||||
public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {
|
||||
rightClickPopupMenuPopupMenuWillBecomeVisible(evt);
|
||||
}
|
||||
});
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(selectAllMenuItem, org.openide.util.NbBundle.getMessage(DataContentViewerOtherCases.class, "DataContentViewerOtherCases.selectAllMenuItem.text")); // NOI18N
|
||||
rightClickPopupMenu.add(selectAllMenuItem);
|
||||
|
||||
@@ -664,6 +726,9 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
org.openide.awt.Mnemonics.setLocalizedText(showCommonalityMenuItem, org.openide.util.NbBundle.getMessage(DataContentViewerOtherCases.class, "DataContentViewerOtherCases.showCommonalityMenuItem.text")); // NOI18N
|
||||
rightClickPopupMenu.add(showCommonalityMenuItem);
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(addCommentMenuItem, org.openide.util.NbBundle.getMessage(DataContentViewerOtherCases.class, "DataContentViewerOtherCases.addCommentMenuItem.text")); // NOI18N
|
||||
rightClickPopupMenu.add(addCommentMenuItem);
|
||||
|
||||
setMinimumSize(new java.awt.Dimension(1500, 10));
|
||||
setOpaque(false);
|
||||
setPreferredSize(new java.awt.Dimension(1500, 44));
|
||||
@@ -734,7 +799,7 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
.addGap(0, 60, Short.MAX_VALUE)
|
||||
.addGroup(otherCasesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(otherCasesPanelLayout.createSequentialGroup()
|
||||
.addComponent(tableContainerPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE)
|
||||
.addComponent(tableContainerPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 52, Short.MAX_VALUE)
|
||||
.addGap(0, 0, 0)))
|
||||
);
|
||||
|
||||
@@ -746,13 +811,28 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(otherCasesPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE)
|
||||
.addComponent(otherCasesPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 52, Short.MAX_VALUE)
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void rightClickPopupMenuPopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {//GEN-FIRST:event_rightClickPopupMenuPopupMenuWillBecomeVisible
|
||||
boolean addCommentMenuItemVisible = false;
|
||||
|
||||
if (EamDbUtil.useCentralRepo() && otherCasesTable.getSelectedRowCount() == 1) {
|
||||
int rowIndex = otherCasesTable.getSelectedRow();
|
||||
CorrelationAttribute selectedAttribute = (CorrelationAttribute) tableModel.getRow(rowIndex);
|
||||
if (selectedAttribute.getInstances().get(0).isDatabaseInstance()
|
||||
&& selectedAttribute.getCorrelationType().getId() == CorrelationAttribute.FILES_TYPE_ID) {
|
||||
addCommentMenuItemVisible = true;
|
||||
}
|
||||
}
|
||||
|
||||
addCommentMenuItem.setVisible(addCommentMenuItemVisible);
|
||||
}//GEN-LAST:event_rightClickPopupMenuPopupMenuWillBecomeVisible
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JFileChooser CSVFileChooser;
|
||||
private javax.swing.JMenuItem addCommentMenuItem;
|
||||
private javax.swing.JMenuItem exportToCSVMenuItem;
|
||||
private javax.swing.JPanel otherCasesPanel;
|
||||
private javax.swing.JTable otherCasesTable;
|
||||
@@ -766,4 +846,52 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
||||
private javax.swing.JLabel tableStatusPanelLabel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
/**
|
||||
* Used as a key to ensure we eliminate duplicates from the result set by
|
||||
* not overwriting CR correlation instances.
|
||||
*/
|
||||
static final class UniquePathKey {
|
||||
|
||||
private final String dataSourceID;
|
||||
private final String filePath;
|
||||
|
||||
UniquePathKey(String theDataSource, String theFilePath) {
|
||||
super();
|
||||
dataSourceID = theDataSource;
|
||||
filePath = theFilePath.toLowerCase();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return the dataSourceID device ID
|
||||
*/
|
||||
String getDataSourceID() {
|
||||
return dataSourceID;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return the filPath including the filename and extension.
|
||||
*/
|
||||
String getFilePath() {
|
||||
return filePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object other) {
|
||||
if (other instanceof UniquePathKey) {
|
||||
return ((UniquePathKey) other).getDataSourceID().equals(dataSourceID) && ((UniquePathKey) other).getFilePath().equals(filePath);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
//int hash = 7;
|
||||
//hash = 67 * hash + this.dataSourceID.hashCode();
|
||||
//hash = 67 * hash + this.filePath.hashCode();
|
||||
return Objects.hash(dataSourceID, filePath);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+562
-309
File diff suppressed because it is too large
Load Diff
+23
-27
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Central Repository
|
||||
*
|
||||
* Copyright 2015-2017 Basis Technology Corp.
|
||||
* Copyright 2015-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -24,8 +24,8 @@ import org.sleuthkit.datamodel.TskData;
|
||||
|
||||
/**
|
||||
*
|
||||
* Used to store details about a specific instance of a
|
||||
* CorrelationAttribute. Includes its data source, path, etc.
|
||||
* Used to store details about a specific instance of a CorrelationAttribute.
|
||||
* Includes its data source, path, etc.
|
||||
*
|
||||
*/
|
||||
@Messages({
|
||||
@@ -43,13 +43,6 @@ public class CorrelationAttributeInstance implements Serializable {
|
||||
private String comment;
|
||||
private TskData.FileKnown knownStatus;
|
||||
|
||||
public CorrelationAttributeInstance(
|
||||
CorrelationCase eamCase,
|
||||
CorrelationDataSource eamDataSource
|
||||
) throws EamDbException {
|
||||
this(-1, eamCase, eamDataSource, "", null, TskData.FileKnown.UNKNOWN);
|
||||
}
|
||||
|
||||
public CorrelationAttributeInstance(
|
||||
CorrelationCase eamCase,
|
||||
CorrelationDataSource eamDataSource,
|
||||
@@ -58,14 +51,6 @@ public class CorrelationAttributeInstance implements Serializable {
|
||||
this(-1, eamCase, eamDataSource, filePath, null, TskData.FileKnown.UNKNOWN);
|
||||
}
|
||||
|
||||
public CorrelationAttributeInstance(
|
||||
CorrelationCase eamCase,
|
||||
CorrelationDataSource eamDataSource,
|
||||
String filePath,
|
||||
String comment
|
||||
) throws EamDbException {
|
||||
this(-1, eamCase, eamDataSource, filePath, comment, TskData.FileKnown.UNKNOWN);
|
||||
}
|
||||
|
||||
public CorrelationAttributeInstance(
|
||||
CorrelationCase eamCase,
|
||||
@@ -85,10 +70,10 @@ public class CorrelationAttributeInstance implements Serializable {
|
||||
String comment,
|
||||
TskData.FileKnown knownStatus
|
||||
) throws EamDbException {
|
||||
if(filePath == null) {
|
||||
if (filePath == null) {
|
||||
throw new EamDbException("file path is null");
|
||||
}
|
||||
|
||||
|
||||
this.ID = ID;
|
||||
this.correlationCase = eamCase;
|
||||
this.correlationDataSource = eamDataSource;
|
||||
@@ -117,6 +102,16 @@ public class CorrelationAttributeInstance implements Serializable {
|
||||
+ this.getComment();
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this a database instance?
|
||||
*
|
||||
* @return True if the instance ID is greater or equal to zero; otherwise
|
||||
* false.
|
||||
*/
|
||||
public boolean isDatabaseInstance() {
|
||||
return (ID >= 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the database ID
|
||||
*/
|
||||
@@ -160,9 +155,9 @@ public class CorrelationAttributeInstance implements Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get this knownStatus. This only indicates whether an item has been
|
||||
* tagged as notable and should never return KNOWN.
|
||||
*
|
||||
* Get this knownStatus. This only indicates whether an item has been tagged
|
||||
* as notable and should never return KNOWN.
|
||||
*
|
||||
* @return BAD if the item has been tagged as notable, UNKNOWN otherwise
|
||||
*/
|
||||
public TskData.FileKnown getKnownStatus() {
|
||||
@@ -170,10 +165,11 @@ public class CorrelationAttributeInstance implements Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the knownStatus. This only indicates whether an item has been
|
||||
* tagged as notable and should never be set to KNOWN.
|
||||
*
|
||||
* @param knownStatus Should be BAD if the item is tagged as notable, UNKNOWN otherwise
|
||||
* Set the knownStatus. This only indicates whether an item has been tagged
|
||||
* as notable and should never be set to KNOWN.
|
||||
*
|
||||
* @param knownStatus Should be BAD if the item is tagged as notable,
|
||||
* UNKNOWN otherwise
|
||||
*/
|
||||
public void setKnownStatus(TskData.FileKnown knownStatus) {
|
||||
this.knownStatus = knownStatus;
|
||||
|
||||
+25
-8
@@ -40,15 +40,21 @@ public class CorrelationDataSource implements Serializable {
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param caseId
|
||||
* @param deviceId
|
||||
* @param name
|
||||
* @param correlationCase CorrelationCase object data source is associated with. Must have been created by EamDB and have a valid ID.
|
||||
* @param deviceId User specified case-specific ID
|
||||
* @param name Display name of data source
|
||||
*/
|
||||
public CorrelationDataSource(int caseId, String deviceId, String name) {
|
||||
this(caseId, -1, deviceId, name);
|
||||
public CorrelationDataSource(CorrelationCase correlationCase, String deviceId, String name) {
|
||||
this(correlationCase.getID(), -1, deviceId, name);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param caseId Row ID for Case in DB
|
||||
* @param dataSourceId Row ID for this data source in DB (or -1)
|
||||
* @param deviceId User specified ID for device (unique per case)
|
||||
* @param name User specified name
|
||||
*/
|
||||
CorrelationDataSource(int caseId,
|
||||
int dataSourceId,
|
||||
String deviceId,
|
||||
@@ -84,7 +90,18 @@ public class CorrelationDataSource implements Serializable {
|
||||
} catch (TskDataException | TskCoreException ex) {
|
||||
throw new EamDbException("Error getting data source info: " + ex.getMessage());
|
||||
}
|
||||
return new CorrelationDataSource(correlationCase.getID(), -1, deviceId, dataSource.getName());
|
||||
|
||||
CorrelationDataSource correlationDataSource = null;
|
||||
if (EamDbUtil.useCentralRepo()) {
|
||||
correlationDataSource = EamDb.getInstance().getDataSource(correlationCase, deviceId);
|
||||
}
|
||||
if (correlationDataSource == null) {
|
||||
correlationDataSource = new CorrelationDataSource(correlationCase, deviceId, dataSource.getName());
|
||||
if (EamDbUtil.useCentralRepo()) {
|
||||
EamDb.getInstance().newDataSource(correlationDataSource);
|
||||
}
|
||||
}
|
||||
return correlationDataSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -102,7 +119,7 @@ public class CorrelationDataSource implements Serializable {
|
||||
/**
|
||||
* Get the database row ID
|
||||
*
|
||||
* @return the ID
|
||||
* @return the ID or -1 if unknown
|
||||
*/
|
||||
int getID() {
|
||||
return dataSourceID;
|
||||
|
||||
@@ -39,7 +39,7 @@ import org.sleuthkit.datamodel.TskData;
|
||||
public class EamArtifactUtil {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Logger LOGGER = Logger.getLogger(EamArtifactUtil.class.getName());
|
||||
private static final Logger logger = Logger.getLogger(EamArtifactUtil.class.getName());
|
||||
|
||||
public EamArtifactUtil() {
|
||||
}
|
||||
@@ -76,14 +76,14 @@ public class EamArtifactUtil {
|
||||
// have switch based on artifact type
|
||||
for (CorrelationAttribute.Type aType : EamDb.getInstance().getDefinedCorrelationTypes()) {
|
||||
if ((checkEnabled && aType.isEnabled()) || !checkEnabled) {
|
||||
CorrelationAttribute eamArtifact = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(aType, bbArtifact);
|
||||
if (eamArtifact != null) {
|
||||
eamArtifacts.add(eamArtifact);
|
||||
CorrelationAttribute correlationAttribute = EamArtifactUtil.getCorrelationAttributeFromBlackboardArtifact(aType, bbArtifact);
|
||||
if (correlationAttribute != null) {
|
||||
eamArtifacts.add(correlationAttribute);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error getting defined correlation types.", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Error getting defined correlation types.", ex); // NON-NLS
|
||||
return eamArtifacts;
|
||||
}
|
||||
|
||||
@@ -115,10 +115,10 @@ public class EamArtifactUtil {
|
||||
eamArtifact.addInstance(eamInstance);
|
||||
}
|
||||
} catch (TskCoreException | EamDbException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error creating artifact instance.", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Error creating artifact instance.", ex); // NON-NLS
|
||||
return eamArtifacts;
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Case is closed.", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Case is closed.", ex); // NON-NLS
|
||||
return eamArtifacts;
|
||||
}
|
||||
}
|
||||
@@ -136,7 +136,7 @@ public class EamArtifactUtil {
|
||||
* @return the new EamArtifact, or null if one was not created because
|
||||
* bbArtifact did not contain the needed data
|
||||
*/
|
||||
private static CorrelationAttribute getCorrelationAttributeFromBlackboardArtifact(CorrelationAttribute.Type correlationType,
|
||||
private static CorrelationAttribute getCorrelationAttributeFromBlackboardArtifact(CorrelationAttribute.Type correlationType,
|
||||
BlackboardArtifact bbArtifact) throws EamDbException {
|
||||
String value = null;
|
||||
int artifactTypeID = bbArtifact.getArtifactTypeID();
|
||||
@@ -202,10 +202,10 @@ public class EamArtifactUtil {
|
||||
}
|
||||
|
||||
} catch (TskCoreException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error getting attribute while getting type from BlackboardArtifact.", ex); // NON-NLS
|
||||
logger.log(Level.SEVERE, "Error getting attribute while getting type from BlackboardArtifact.", ex); // NON-NLS
|
||||
return null;
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
logger.log(Level.SEVERE, "Exception while getting open case.", ex); // NON-NLS
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -216,6 +216,45 @@ public class EamArtifactUtil {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve CorrelationAttribute from the given Content.
|
||||
*
|
||||
* @param content The content object
|
||||
*
|
||||
* @return The new CorrelationAttribute, or null if retrieval failed.
|
||||
*/
|
||||
public static CorrelationAttribute getCorrelationAttributeFromContent(Content content) {
|
||||
|
||||
if (!(content instanceof AbstractFile)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final AbstractFile file = (AbstractFile) content;
|
||||
|
||||
if (!isSupportedAbstractFileType(file)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
CorrelationAttribute correlationAttribute = null;
|
||||
|
||||
try {
|
||||
CorrelationAttribute.Type type = EamDb.getInstance().getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID);
|
||||
CorrelationCase correlationCase = EamDb.getInstance().getCase(Case.getCurrentCaseThrows());
|
||||
if (null == correlationCase) {
|
||||
correlationCase = EamDb.getInstance().newCase(Case.getCurrentCaseThrows());
|
||||
}
|
||||
CorrelationDataSource correlationDataSource = CorrelationDataSource.fromTSKDataSource(correlationCase, file.getDataSource());
|
||||
String value = file.getMd5Hash();
|
||||
String filePath = (file.getParentPath() + file.getName()).toLowerCase();
|
||||
|
||||
correlationAttribute = EamDb.getInstance().getCorrelationAttribute(type, correlationCase, correlationDataSource, value, filePath);
|
||||
} catch (TskCoreException | EamDbException | NoCurrentCaseException ex) {
|
||||
logger.log(Level.SEVERE, "Error retrieving correlation attribute.", ex);
|
||||
}
|
||||
|
||||
return correlationAttribute;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an EamArtifact from the given Content. Will return null if an
|
||||
* artifact can not be created - this is not necessarily an error case, it
|
||||
@@ -225,7 +264,7 @@ public class EamArtifactUtil {
|
||||
*
|
||||
* Does not add the artifact to the database.
|
||||
*
|
||||
* @param content The content object
|
||||
* @param content The content object
|
||||
*
|
||||
* @return The new EamArtifact or null if creation failed
|
||||
*/
|
||||
@@ -237,7 +276,7 @@ public class EamArtifactUtil {
|
||||
|
||||
final AbstractFile af = (AbstractFile) content;
|
||||
|
||||
if (!isValidCentralRepoFile(af)) {
|
||||
if (!isSupportedAbstractFileType(af)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -262,7 +301,7 @@ public class EamArtifactUtil {
|
||||
eamArtifact.addInstance(cei);
|
||||
return eamArtifact;
|
||||
} catch (TskCoreException | EamDbException | NoCurrentCaseException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error making correlation attribute.", ex);
|
||||
logger.log(Level.SEVERE, "Error making correlation attribute.", ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -271,21 +310,17 @@ public class EamArtifactUtil {
|
||||
* Check whether the given abstract file should be processed for the central
|
||||
* repository.
|
||||
*
|
||||
* @param af The file to test
|
||||
* @param file The file to test
|
||||
*
|
||||
* @return true if the file should be added to the central repo, false
|
||||
* otherwise
|
||||
*/
|
||||
public static boolean isValidCentralRepoFile(AbstractFile af) {
|
||||
if (af == null) {
|
||||
public static boolean isSupportedAbstractFileType(AbstractFile file) {
|
||||
if (file == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (af.getKnown() == TskData.FileKnown.KNOWN) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (af.getType()) {
|
||||
switch (file.getType()) {
|
||||
case UNALLOC_BLOCKS:
|
||||
case UNUSED_BLOCKS:
|
||||
case SLACK:
|
||||
@@ -297,9 +332,9 @@ public class EamArtifactUtil {
|
||||
case LOCAL:
|
||||
return true;
|
||||
case FS:
|
||||
return af.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.ALLOC);
|
||||
return file.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.ALLOC);
|
||||
default:
|
||||
LOGGER.log(Level.WARNING, "Unexpected file type {0}", af.getType().getName());
|
||||
logger.log(Level.WARNING, "Unexpected file type {0}", file.getType().getName());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Central Repository
|
||||
*
|
||||
* Copyright 2015-2017 Basis Technology Corp.
|
||||
* Copyright 2015-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -34,7 +34,8 @@ public interface EamDb {
|
||||
public static final int SCHEMA_VERSION = 1;
|
||||
public static final CaseDbSchemaVersionNumber CURRENT_DB_SCHEMA_VERSION
|
||||
= new CaseDbSchemaVersionNumber(1, 1);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the instance
|
||||
*
|
||||
@@ -103,7 +104,7 @@ public interface EamDb {
|
||||
/**
|
||||
* Add a new name/value pair in the db_info table.
|
||||
*
|
||||
* @param name Key to set
|
||||
* @param name Key to set
|
||||
* @param value Value to set
|
||||
*
|
||||
* @throws EamDbException
|
||||
@@ -124,7 +125,7 @@ public interface EamDb {
|
||||
/**
|
||||
* Update the value for a name in the name/value db_info table.
|
||||
*
|
||||
* @param name Name to find
|
||||
* @param name Name to find
|
||||
* @param value Value to assign to name.
|
||||
*
|
||||
* @throws EamDbException
|
||||
@@ -158,7 +159,9 @@ public interface EamDb {
|
||||
* Retrieves Central Repo case based on an Autopsy Case
|
||||
*
|
||||
* @param autopsyCase Autopsy case to find corresponding CR case for
|
||||
*
|
||||
* @return CR Case
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
CorrelationCase getCase(Case autopsyCase) throws EamDbException;
|
||||
@@ -189,8 +192,8 @@ public interface EamDb {
|
||||
/**
|
||||
* Retrieves Data Source details based on data source device ID
|
||||
*
|
||||
* @param correlationCase the current CorrelationCase used for ensuring
|
||||
* uniqueness of DataSource
|
||||
* @param correlationCase the current CorrelationCase used for ensuring
|
||||
* uniqueness of DataSource
|
||||
* @param dataSourceDeviceId the data source device ID number
|
||||
*
|
||||
* @return The data source
|
||||
@@ -227,7 +230,7 @@ public interface EamDb {
|
||||
* Retrieves eamArtifact instances from the database that are associated
|
||||
* with the aType and filePath
|
||||
*
|
||||
* @param aType EamArtifact.Type to search for
|
||||
* @param aType EamArtifact.Type to search for
|
||||
* @param filePath File path to search for
|
||||
*
|
||||
* @return List of 0 or more EamArtifactInstances
|
||||
@@ -244,7 +247,7 @@ public interface EamDb {
|
||||
* @param value Value to search for
|
||||
*
|
||||
* @return Number of artifact instances having ArtifactType and
|
||||
* ArtifactValue.
|
||||
* ArtifactValue.
|
||||
*/
|
||||
Long getCountArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException;
|
||||
|
||||
@@ -281,11 +284,11 @@ public interface EamDb {
|
||||
* associated with the caseDisplayName and dataSource of the given
|
||||
* eamArtifact instance.
|
||||
*
|
||||
* @param caseUUID Case ID to search for
|
||||
* @param caseUUID Case ID to search for
|
||||
* @param dataSourceID Data source ID to search for
|
||||
*
|
||||
* @return Number of artifact instances having caseDisplayName and
|
||||
* dataSource
|
||||
* dataSource
|
||||
*/
|
||||
Long getCountArtifactInstancesByCaseDataSource(String caseUUID, String dataSourceID) throws EamDbException;
|
||||
|
||||
@@ -309,6 +312,34 @@ public interface EamDb {
|
||||
*/
|
||||
void bulkInsertCases(List<CorrelationCase> cases) throws EamDbException;
|
||||
|
||||
/**
|
||||
* Update a correlation attribute instance comment in the database with that
|
||||
* in the associated CorrelationAttribute object.
|
||||
*
|
||||
* @param eamArtifact The correlation attribute whose database instance will
|
||||
* be updated.
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
void updateAttributeInstanceComment(CorrelationAttribute eamArtifact) throws EamDbException;
|
||||
|
||||
/**
|
||||
* Find a correlation attribute in the Central Repository database given the
|
||||
* instance type, case, data source, value, and file path.
|
||||
*
|
||||
* @param type The type of instance.
|
||||
* @param correlationCase The case tied to the instance.
|
||||
* @param correlationDataSource The data source tied to the instance.
|
||||
* @param value The value tied to the instance.
|
||||
* @param filePath The file path tied to the instance.
|
||||
*
|
||||
* @return The correlation attribute if it exists; otherwise null.
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
CorrelationAttribute getCorrelationAttribute(CorrelationAttribute.Type type, CorrelationCase correlationCase,
|
||||
CorrelationDataSource correlationDataSource, String value, String filePath) throws EamDbException;
|
||||
|
||||
/**
|
||||
* Sets an eamArtifact instance to the given known status. If eamArtifact
|
||||
* exists, it is updated. If eamArtifact does not exist nothing happens
|
||||
@@ -329,6 +360,15 @@ public interface EamDb {
|
||||
*/
|
||||
List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException;
|
||||
|
||||
/**
|
||||
* Gets list of matching eamArtifact instances that have knownStatus =
|
||||
* "Bad".
|
||||
*
|
||||
* @param aType EamArtifact.Type to search for
|
||||
* @return List with 0 or more matching eamArtifact instances.
|
||||
* @throws EamDbException
|
||||
*/
|
||||
List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttribute.Type aType) throws EamDbException;
|
||||
/**
|
||||
* Count matching eamArtifacts instances that have knownStatus = "Bad".
|
||||
*
|
||||
@@ -347,7 +387,7 @@ public interface EamDb {
|
||||
* @param value Value to search for
|
||||
*
|
||||
* @return List of cases containing this artifact with instances marked as
|
||||
* bad
|
||||
* bad
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@@ -357,6 +397,7 @@ public interface EamDb {
|
||||
* Remove a reference set and all values contained in it.
|
||||
*
|
||||
* @param referenceSetID
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
public void deleteReferenceSet(int referenceSetID) throws EamDbException;
|
||||
@@ -369,7 +410,9 @@ public interface EamDb {
|
||||
* @param referenceSetID
|
||||
* @param referenceSetName
|
||||
* @param version
|
||||
*
|
||||
* @return true if a matching entry exists in the central repository
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
public boolean referenceSetIsValid(int referenceSetID, String referenceSetName, String version) throws EamDbException;
|
||||
@@ -381,7 +424,9 @@ public interface EamDb {
|
||||
*
|
||||
* @param referenceSetName
|
||||
* @param version
|
||||
*
|
||||
* @return true if a matching set is found
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
public boolean referenceSetExists(String referenceSetName, String version) throws EamDbException;
|
||||
@@ -392,7 +437,9 @@ public interface EamDb {
|
||||
*
|
||||
* @param hash
|
||||
* @param referenceSetID
|
||||
*
|
||||
* @return true if the hash is found in the reference set
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
public boolean isFileHashInReferenceSet(String hash, int referenceSetID) throws EamDbException;
|
||||
@@ -403,6 +450,7 @@ public interface EamDb {
|
||||
* @param value
|
||||
* @param referenceSetID
|
||||
* @param correlationTypeID
|
||||
*
|
||||
* @return true if the hash is found in the reference set
|
||||
*/
|
||||
public boolean isValueInReferenceSet(String value, int referenceSetID, int correlationTypeID) throws EamDbException;
|
||||
@@ -422,11 +470,11 @@ public interface EamDb {
|
||||
*
|
||||
* @param eamOrg The organization to add
|
||||
*
|
||||
* @return the Organization ID of the newly created organization.
|
||||
* @return The organization with the org ID set.
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
long newOrganization(EamOrganization eamOrg) throws EamDbException;
|
||||
EamOrganization newOrganization(EamOrganization eamOrg) throws EamDbException;
|
||||
|
||||
/**
|
||||
* Get all organizations
|
||||
@@ -452,7 +500,9 @@ public interface EamDb {
|
||||
* Get the organization associated with the given reference set.
|
||||
*
|
||||
* @param referenceSetID ID of the reference set
|
||||
*
|
||||
* @return The organization object
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
EamOrganization getReferenceSetOrganization(int referenceSetID) throws EamDbException;
|
||||
@@ -461,7 +511,7 @@ public interface EamDb {
|
||||
* Update an existing organization.
|
||||
*
|
||||
* @param updatedOrganization the values the Organization with the same ID
|
||||
* will be updated to in the database.
|
||||
* will be updated to in the database.
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@@ -502,7 +552,7 @@ public interface EamDb {
|
||||
* Get all reference sets
|
||||
*
|
||||
* @param correlationType Type of sets to return
|
||||
*
|
||||
*
|
||||
* @return List of all reference sets in the central repository
|
||||
*
|
||||
* @throws EamDbException
|
||||
@@ -513,7 +563,8 @@ public interface EamDb {
|
||||
* Add a new reference instance
|
||||
*
|
||||
* @param eamGlobalFileInstance The reference instance to add
|
||||
* @param correlationType Correlation Type that this Reference Instance is
|
||||
* @param correlationType Correlation Type that this Reference
|
||||
* Instance is
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@@ -523,8 +574,8 @@ public interface EamDb {
|
||||
* Insert the bulk collection of Global File Instances
|
||||
*
|
||||
* @param globalInstances a Set of EamGlobalFileInstances to insert into the
|
||||
* db.
|
||||
* @param contentType the Type of the global instances
|
||||
* db.
|
||||
* @param contentType the Type of the global instances
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@@ -533,7 +584,7 @@ public interface EamDb {
|
||||
/**
|
||||
* Get all reference entries having a given correlation type and value
|
||||
*
|
||||
* @param aType Type to use for matching
|
||||
* @param aType Type to use for matching
|
||||
* @param aValue Value to use for matching
|
||||
*
|
||||
* @return List of all global file instances with a type and value
|
||||
@@ -558,7 +609,7 @@ public interface EamDb {
|
||||
* used to correlate artifacts.
|
||||
*
|
||||
* @return List of EamArtifact.Type's. If none are defined in the database,
|
||||
* the default list will be returned.
|
||||
* the default list will be returned.
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@@ -569,7 +620,7 @@ public interface EamDb {
|
||||
* artifacts.
|
||||
*
|
||||
* @return List of enabled EamArtifact.Type's. If none are defined in the
|
||||
* database, the default list will be returned.
|
||||
* database, the default list will be returned.
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@@ -580,7 +631,7 @@ public interface EamDb {
|
||||
* correlate artifacts.
|
||||
*
|
||||
* @return List of supported EamArtifact.Type's. If none are defined in the
|
||||
* database, the default list will be returned.
|
||||
* database, the default list will be returned.
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@@ -620,8 +671,18 @@ public interface EamDb {
|
||||
* (meaning the database is in use).
|
||||
*
|
||||
* @return the lock, or null if locking is not supported
|
||||
*
|
||||
* @throws EamDbException if the coordination service is running but we fail
|
||||
* to get the lock
|
||||
* to get the lock
|
||||
*/
|
||||
public CoordinationService.Lock getExclusiveMultiUserDbLock() throws EamDbException;
|
||||
|
||||
/**
|
||||
* Process the Artifact instance in the EamDb
|
||||
*
|
||||
* @param type EamArtifact.Type to search for
|
||||
* @param instanceTableCallback callback to process the instance
|
||||
* @throws EamDbException
|
||||
*/
|
||||
void processInstanceTable(CorrelationAttribute.Type type, InstanceTableCallback instanceTableCallback) throws EamDbException;
|
||||
}
|
||||
|
||||
@@ -42,18 +42,18 @@ public class EamDbUtil {
|
||||
private static final String DEFAULT_ORG_NAME = "Not Specified";
|
||||
|
||||
/**
|
||||
* Close the prepared statement.
|
||||
* Close the statement.
|
||||
*
|
||||
* @param preparedStatement
|
||||
* @param statement The statement to be closed.
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
public static void closePreparedStatement(PreparedStatement preparedStatement) {
|
||||
if (null != preparedStatement) {
|
||||
public static void closeStatement(Statement statement) {
|
||||
if (null != statement) {
|
||||
try {
|
||||
preparedStatement.close();
|
||||
statement.close();
|
||||
} catch (SQLException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error closing PreparedStatement.", ex);
|
||||
LOGGER.log(Level.SEVERE, "Error closing Statement.", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -361,4 +361,18 @@ public class EamDbUtil {
|
||||
return "reference_" + type.getDbTableName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the prepared statement.
|
||||
*
|
||||
* @param preparedStatement The prepared statement to be closed.
|
||||
*
|
||||
* @deprecated Use closeStatement() instead.
|
||||
*
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@Deprecated
|
||||
public static void closePreparedStatement(PreparedStatement preparedStatement) {
|
||||
closeStatement(preparedStatement);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ public class EamOrganization {
|
||||
private String pocEmail;
|
||||
private String pocPhone;
|
||||
|
||||
public EamOrganization(
|
||||
EamOrganization(
|
||||
int orgID,
|
||||
String name,
|
||||
String pocName,
|
||||
@@ -84,7 +84,7 @@ public class EamOrganization {
|
||||
/**
|
||||
* @param orgID the orgID to set
|
||||
*/
|
||||
public void setOrgID(int orgID) {
|
||||
void setOrgID(int orgID) {
|
||||
this.orgID = orgID;
|
||||
}
|
||||
|
||||
|
||||
+109
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Central Repository
|
||||
*
|
||||
* Copyright 2015-2017 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.datamodel;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* CallBack Interface to process attribute instance Table. Used in EamDb.processInstanceTable
|
||||
* is called only once. The implementation of this method needs to call resultset.next to
|
||||
* loop through each row of attribute instance table.
|
||||
*/
|
||||
public interface InstanceTableCallback {
|
||||
|
||||
/**
|
||||
* Process the attribute instance
|
||||
*
|
||||
* @param resultSet attribute instance table.
|
||||
*/
|
||||
void process(ResultSet resultSet);
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @param resultSet attribute instance table
|
||||
* @return ID of the instance
|
||||
* @throws SQLException
|
||||
*/
|
||||
static int getId(ResultSet resultSet) throws SQLException{
|
||||
return resultSet.getInt("id");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param resultSet attribute instance table
|
||||
* @return Case ID of a given instance
|
||||
* @throws SQLException
|
||||
*/
|
||||
static int getCaseId(ResultSet resultSet) throws SQLException {
|
||||
return resultSet.getInt("case_id");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param resultSet attribute instance table
|
||||
* @return Data source id of a particular instance
|
||||
* @throws SQLException
|
||||
*/
|
||||
static int getDataSourceId(ResultSet resultSet) throws SQLException {
|
||||
return resultSet.getInt("data_source_id");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param resultSet attribute instance table
|
||||
* @return md5 hash value of the instance
|
||||
* @throws SQLException
|
||||
*/
|
||||
static String getValue(ResultSet resultSet) throws SQLException {
|
||||
return resultSet.getString("value");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param resultSet attribute instance table
|
||||
* @return file path of the instance
|
||||
* @throws SQLException
|
||||
*/
|
||||
static String getFilePath(ResultSet resultSet) throws SQLException {
|
||||
return resultSet.getString("file_path");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param resultSet attribute instance table
|
||||
* @return status integer based on whether instance is marked notable or not
|
||||
* @throws SQLException
|
||||
*/
|
||||
static int getKnownStatus(ResultSet resultSet) throws SQLException {
|
||||
return resultSet.getInt("known_status");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param resultSet attribute instance table
|
||||
* @return previous comment made for the instance
|
||||
* @throws SQLException
|
||||
*/
|
||||
static String getComment(ResultSet resultSet) throws SQLException {
|
||||
return resultSet.getString("comment");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -24,8 +24,6 @@ import java.sql.Statement;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.logging.Level;
|
||||
import org.apache.commons.dbcp2.BasicDataSource;
|
||||
import org.sleuthkit.autopsy.casemodule.CaseActionCancelledException;
|
||||
import org.sleuthkit.autopsy.casemodule.CaseActionException;
|
||||
import org.sleuthkit.autopsy.coordinationservice.CoordinationService;
|
||||
import org.sleuthkit.autopsy.core.UserPreferences;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
@@ -34,7 +32,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
* Central Repository database implementation using Postgres as a
|
||||
* backend
|
||||
*/
|
||||
public class PostgresEamDb extends AbstractSqlEamDb {
|
||||
final class PostgresEamDb extends AbstractSqlEamDb {
|
||||
|
||||
private final static Logger LOGGER = Logger.getLogger(PostgresEamDb.class.getName());
|
||||
|
||||
@@ -116,7 +114,7 @@ public class PostgresEamDb extends AbstractSqlEamDb {
|
||||
|
||||
String instancesTemplate = "TRUNCATE TABLE %s_instances RESTART IDENTITY CASCADE";
|
||||
String referencesTemplate = "TRUNCATE TABLE reference_%s RESTART IDENTITY CASCADE";
|
||||
for (CorrelationAttribute.Type type : DEFAULT_CORRELATION_TYPES) {
|
||||
for (CorrelationAttribute.Type type : defaultCorrelationTypes) {
|
||||
dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName()));
|
||||
// FUTURE: support other reference types
|
||||
if (type.getId() == CorrelationAttribute.FILES_TYPE_ID) {
|
||||
|
||||
+12
-11
@@ -35,6 +35,8 @@ import org.sleuthkit.autopsy.coreutils.TextConverterException;
|
||||
|
||||
/**
|
||||
* Settings for the Postgres implementation of the Central Repository database
|
||||
*
|
||||
* NOTE: This is public scope because the options panel calls it directly to set/get
|
||||
*/
|
||||
public final class PostgresEamDbSettings {
|
||||
|
||||
@@ -42,7 +44,6 @@ public final class PostgresEamDbSettings {
|
||||
private final String DEFAULT_HOST = ""; // NON-NLS
|
||||
private final int DEFAULT_PORT = 5432;
|
||||
private final String DEFAULT_DBNAME = "central_repository"; // NON-NLS
|
||||
private final int DEFAULT_BULK_THRESHHOLD = 1000;
|
||||
private final String DEFAULT_USERNAME = "";
|
||||
private final String DEFAULT_PASSWORD = "";
|
||||
private final String VALIDATION_QUERY = "SELECT version()"; // NON-NLS
|
||||
@@ -89,15 +90,15 @@ public final class PostgresEamDbSettings {
|
||||
try {
|
||||
String bulkThresholdString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.bulkThreshold"); // NON-NLS
|
||||
if (bulkThresholdString == null || bulkThresholdString.isEmpty()) {
|
||||
this.bulkThreshold = DEFAULT_BULK_THRESHHOLD;
|
||||
this.bulkThreshold = AbstractSqlEamDb.DEFAULT_BULK_THRESHHOLD;
|
||||
} else {
|
||||
this.bulkThreshold = Integer.parseInt(bulkThresholdString);
|
||||
if (getBulkThreshold() <= 0) {
|
||||
this.bulkThreshold = DEFAULT_BULK_THRESHHOLD;
|
||||
this.bulkThreshold = AbstractSqlEamDb.DEFAULT_BULK_THRESHHOLD;
|
||||
}
|
||||
}
|
||||
} catch (NumberFormatException ex) {
|
||||
this.bulkThreshold = DEFAULT_BULK_THRESHHOLD;
|
||||
this.bulkThreshold = AbstractSqlEamDb.DEFAULT_BULK_THRESHHOLD;
|
||||
}
|
||||
|
||||
userName = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.user"); // NON-NLS
|
||||
@@ -139,7 +140,7 @@ public final class PostgresEamDbSettings {
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getConnectionURL(boolean usePostgresDb) {
|
||||
String getConnectionURL(boolean usePostgresDb) {
|
||||
StringBuilder url = new StringBuilder();
|
||||
url.append(getJDBCBaseURI());
|
||||
url.append(getHost());
|
||||
@@ -231,7 +232,7 @@ public final class PostgresEamDbSettings {
|
||||
* Use the current settings and the schema version query to test the
|
||||
* database schema.
|
||||
*
|
||||
* @return true if successfull connection, else false.
|
||||
* @return true if successful connection, else false.
|
||||
*/
|
||||
public boolean verifyDatabaseSchema() {
|
||||
Connection conn = getEphemeralConnection(false);
|
||||
@@ -493,7 +494,7 @@ public final class PostgresEamDbSettings {
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean isChanged() {
|
||||
boolean isChanged() {
|
||||
String hostString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.host"); // NON-NLS
|
||||
String portString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.port"); // NON-NLS
|
||||
String dbNameString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.dbName"); // NON-NLS
|
||||
@@ -568,7 +569,7 @@ public final class PostgresEamDbSettings {
|
||||
/**
|
||||
* @return the bulkThreshold
|
||||
*/
|
||||
public int getBulkThreshold() {
|
||||
int getBulkThreshold() {
|
||||
return bulkThreshold;
|
||||
}
|
||||
|
||||
@@ -622,21 +623,21 @@ public final class PostgresEamDbSettings {
|
||||
/**
|
||||
* @return the VALIDATION_QUERY
|
||||
*/
|
||||
public String getValidationQuery() {
|
||||
String getValidationQuery() {
|
||||
return VALIDATION_QUERY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the POSTGRES_DRIVER
|
||||
*/
|
||||
public String getDriver() {
|
||||
String getDriver() {
|
||||
return JDBC_DRIVER;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the JDBC_BASE_URI
|
||||
*/
|
||||
public String getJDBCBaseURI() {
|
||||
String getJDBCBaseURI() {
|
||||
return JDBC_BASE_URI;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.datamodel;
|
||||
|
||||
import java.io.File;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
@@ -38,7 +37,7 @@ import org.sleuthkit.autopsy.coordinationservice.CoordinationService;
|
||||
* All methods in AbstractSqlEamDb that read or write to the database should
|
||||
* be overriden here and use appropriate locking.
|
||||
*/
|
||||
public class SqliteEamDb extends AbstractSqlEamDb {
|
||||
final class SqliteEamDb extends AbstractSqlEamDb {
|
||||
|
||||
private final static Logger LOGGER = Logger.getLogger(SqliteEamDb.class.getName());
|
||||
|
||||
@@ -125,7 +124,7 @@ public class SqliteEamDb extends AbstractSqlEamDb {
|
||||
|
||||
String instancesTemplate = "DELETE FROM %s_instances";
|
||||
String referencesTemplate = "DELETE FROM global_files";
|
||||
for (CorrelationAttribute.Type type : DEFAULT_CORRELATION_TYPES) {
|
||||
for (CorrelationAttribute.Type type : defaultCorrelationTypes) {
|
||||
dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName()));
|
||||
// FUTURE: support other reference types
|
||||
if (type.getId() == CorrelationAttribute.FILES_TYPE_ID) {
|
||||
@@ -417,8 +416,8 @@ public class SqliteEamDb extends AbstractSqlEamDb {
|
||||
} finally {
|
||||
releaseSharedLock();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves eamArtifact instances from the database that are associated
|
||||
* with the aType and filePath
|
||||
@@ -590,6 +589,24 @@ public class SqliteEamDb extends AbstractSqlEamDb {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Gets list of matching eamArtifact instances that have knownStatus =
|
||||
* "Bad".
|
||||
* @param aType EamArtifact.Type to search for
|
||||
* @return List with 0 or more matching eamArtifact instances.
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@Override
|
||||
public List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttribute.Type aType) throws EamDbException {
|
||||
try{
|
||||
acquireSharedLock();
|
||||
return super.getArtifactInstancesKnownBad(aType);
|
||||
} finally {
|
||||
releaseSharedLock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Count matching eamArtifacts instances that have knownStatus = "Bad".
|
||||
*
|
||||
@@ -662,6 +679,22 @@ public class SqliteEamDb extends AbstractSqlEamDb {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process the Artifact instance in the EamDb
|
||||
*
|
||||
* @param type EamArtifact.Type to search for
|
||||
* @param instanceTableCallback callback to process the instance
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@Override
|
||||
public void processInstanceTable(CorrelationAttribute.Type type, InstanceTableCallback instanceTableCallback) throws EamDbException {
|
||||
try {
|
||||
acquireSharedLock();
|
||||
super.processInstanceTable(type, instanceTableCallback);
|
||||
} finally {
|
||||
releaseSharedLock();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Check whether a reference set with the given name/version is in the central repo.
|
||||
* Used to check for name collisions when creating reference sets.
|
||||
@@ -708,7 +741,7 @@ public class SqliteEamDb extends AbstractSqlEamDb {
|
||||
* @throws EamDbException
|
||||
*/
|
||||
@Override
|
||||
public long newOrganization(EamOrganization eamOrg) throws EamDbException {
|
||||
public EamOrganization newOrganization(EamOrganization eamOrg) throws EamDbException {
|
||||
try{
|
||||
acquireExclusiveLock();
|
||||
return super.newOrganization(eamOrg);
|
||||
|
||||
+12
-11
@@ -35,13 +35,14 @@ import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||
|
||||
/**
|
||||
* Settings for the sqlite implementation of the Central Repository database
|
||||
*
|
||||
* NOTE: This is public scope because the options panel calls it directly to set/get
|
||||
*/
|
||||
public final class SqliteEamDbSettings {
|
||||
|
||||
private final static Logger LOGGER = Logger.getLogger(SqliteEamDbSettings.class.getName());
|
||||
private final String DEFAULT_DBNAME = "central_repository.db"; // NON-NLS
|
||||
private final String DEFAULT_DBDIRECTORY = PlatformUtil.getUserDirectory() + File.separator + "central_repository"; // NON-NLS
|
||||
private final int DEFAULT_BULK_THRESHHOLD = 1000;
|
||||
private final String JDBC_DRIVER = "org.sqlite.JDBC"; // NON-NLS
|
||||
private final String JDBC_BASE_URI = "jdbc:sqlite:"; // NON-NLS
|
||||
private final String VALIDATION_QUERY = "SELECT count(*) from sqlite_master"; // NON-NLS
|
||||
@@ -75,15 +76,15 @@ public final class SqliteEamDbSettings {
|
||||
try {
|
||||
String bulkThresholdString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.bulkThreshold"); // NON-NLS
|
||||
if (bulkThresholdString == null || bulkThresholdString.isEmpty()) {
|
||||
this.bulkThreshold = DEFAULT_BULK_THRESHHOLD;
|
||||
this.bulkThreshold = AbstractSqlEamDb.DEFAULT_BULK_THRESHHOLD;
|
||||
} else {
|
||||
this.bulkThreshold = Integer.parseInt(bulkThresholdString);
|
||||
if (getBulkThreshold() <= 0) {
|
||||
this.bulkThreshold = DEFAULT_BULK_THRESHHOLD;
|
||||
this.bulkThreshold = AbstractSqlEamDb.DEFAULT_BULK_THRESHHOLD;
|
||||
}
|
||||
}
|
||||
} catch (NumberFormatException ex) {
|
||||
this.bulkThreshold = DEFAULT_BULK_THRESHHOLD;
|
||||
this.bulkThreshold = AbstractSqlEamDb.DEFAULT_BULK_THRESHHOLD;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +163,7 @@ public final class SqliteEamDbSettings {
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getConnectionURL() {
|
||||
String getConnectionURL() {
|
||||
StringBuilder url = new StringBuilder();
|
||||
url.append(getJDBCBaseURI());
|
||||
url.append(getFileNameWithPath());
|
||||
@@ -439,7 +440,7 @@ public final class SqliteEamDbSettings {
|
||||
return result;
|
||||
}
|
||||
|
||||
public boolean isChanged() {
|
||||
boolean isChanged() {
|
||||
String dbNameString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.dbName"); // NON-NLS
|
||||
String dbDirectoryString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.dbDirectory"); // NON-NLS
|
||||
String bulkThresholdString = ModuleSettings.getConfigSetting("CentralRepository", "db.sqlite.bulkThreshold"); // NON-NLS
|
||||
@@ -474,14 +475,14 @@ public final class SqliteEamDbSettings {
|
||||
/**
|
||||
* @return the bulkThreshold
|
||||
*/
|
||||
public int getBulkThreshold() {
|
||||
int getBulkThreshold() {
|
||||
return bulkThreshold;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bulkThreshold the bulkThreshold to set
|
||||
*/
|
||||
public void setBulkThreshold(int bulkThreshold) throws EamDbException {
|
||||
void setBulkThreshold(int bulkThreshold) throws EamDbException {
|
||||
if (bulkThreshold > 0) {
|
||||
this.bulkThreshold = bulkThreshold;
|
||||
} else {
|
||||
@@ -525,21 +526,21 @@ public final class SqliteEamDbSettings {
|
||||
/**
|
||||
* @return the DRIVER
|
||||
*/
|
||||
public String getDriver() {
|
||||
String getDriver() {
|
||||
return JDBC_DRIVER;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the VALIDATION_QUERY
|
||||
*/
|
||||
public String getValidationQuery() {
|
||||
String getValidationQuery() {
|
||||
return VALIDATION_QUERY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the JDBC_BASE_URI
|
||||
*/
|
||||
public String getJDBCBaseURI() {
|
||||
String getJDBCBaseURI() {
|
||||
return JDBC_BASE_URI;
|
||||
}
|
||||
|
||||
|
||||
@@ -102,10 +102,14 @@ final class IngestModule implements FileIngestModule {
|
||||
return ProcessResult.ERROR;
|
||||
}
|
||||
|
||||
if (!EamArtifactUtil.isValidCentralRepoFile(abstractFile)) {
|
||||
if (!EamArtifactUtil.isSupportedAbstractFileType(abstractFile)) {
|
||||
return ProcessResult.OK;
|
||||
}
|
||||
|
||||
if (abstractFile.getKnown() == TskData.FileKnown.KNOWN) {
|
||||
return ProcessResult.OK;
|
||||
}
|
||||
|
||||
EamDb dbManager;
|
||||
try {
|
||||
dbManager = EamDb.getInstance();
|
||||
|
||||
@@ -24,6 +24,7 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel;
|
||||
/**
|
||||
* Ingest job settings panel for the Correlation Engine module.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class IngestSettingsPanel extends IngestModuleIngestJobSettingsPanel {
|
||||
|
||||
/**
|
||||
|
||||
+23
-11
@@ -36,9 +36,10 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||
/**
|
||||
* Dialog to add a new organization to the Central Repository database
|
||||
*/
|
||||
public class AddNewOrganizationDialog extends javax.swing.JDialog {
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class AddNewOrganizationDialog extends javax.swing.JDialog {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(AddNewOrganizationDialog.class.getName());
|
||||
private static final Logger logger = Logger.getLogger(AddNewOrganizationDialog.class.getName());
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final Collection<JTextField> textBoxes;
|
||||
@@ -51,7 +52,7 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog {
|
||||
* Creates new form AddNewOrganizationDialog
|
||||
*/
|
||||
@Messages({"AddNewOrganizationDialog.addNewOrg.msg=Add New Organization"})
|
||||
public AddNewOrganizationDialog() {
|
||||
AddNewOrganizationDialog() {
|
||||
super((JFrame) WindowManager.getDefault().getMainWindow(),
|
||||
Bundle.AddNewOrganizationDialog_addNewOrg_msg(),
|
||||
true); // NON-NLS
|
||||
@@ -65,6 +66,7 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog {
|
||||
display();
|
||||
}
|
||||
|
||||
// populates the dialog with existing case information to edit
|
||||
public AddNewOrganizationDialog(EamOrganization orgToEdit) {
|
||||
super((JFrame) WindowManager.getDefault().getMainWindow(),
|
||||
Bundle.AddNewOrganizationDialog_addNewOrg_msg(),
|
||||
@@ -193,10 +195,19 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return True if new org was added or existing org changed
|
||||
*/
|
||||
public boolean isChanged() {
|
||||
return hasChanged;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only valid if isChanged() is true.
|
||||
*
|
||||
* @return Org that was added or changed. null if nothing changed
|
||||
*/
|
||||
public EamOrganization getNewOrg() {
|
||||
return newOrg;
|
||||
}
|
||||
@@ -332,12 +343,12 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog {
|
||||
try {
|
||||
EamDb dbManager = EamDb.getInstance();
|
||||
if (organizationToEdit != null) {
|
||||
//check if new name exists with ID other than the one in use here
|
||||
newOrg = new EamOrganization(organizationToEdit.getOrgID(),
|
||||
tfOrganizationName.getText(),
|
||||
tfPocName.getText(),
|
||||
tfPocEmail.getText(),
|
||||
tfPocPhone.getText());
|
||||
// make a copy in case the update fails
|
||||
newOrg = dbManager.getOrganizationByID(organizationToEdit.getOrgID());
|
||||
newOrg.setName(tfOrganizationName.getText());
|
||||
newOrg.setPocName(tfPocName.getText());
|
||||
newOrg.setPocEmail(tfPocEmail.getText());
|
||||
newOrg.setPocPhone(tfPocPhone.getText());
|
||||
dbManager.updateOrganization(newOrg);
|
||||
} else {
|
||||
newOrg = new EamOrganization(
|
||||
@@ -345,13 +356,14 @@ public class AddNewOrganizationDialog extends javax.swing.JDialog {
|
||||
tfPocName.getText(),
|
||||
tfPocEmail.getText(),
|
||||
tfPocPhone.getText());
|
||||
newOrg.setOrgID((int)dbManager.newOrganization(newOrg));
|
||||
newOrg = dbManager.newOrganization(newOrg);
|
||||
}
|
||||
hasChanged = true;
|
||||
dispose();
|
||||
} catch (EamDbException ex) {
|
||||
lbWarningMsg.setText(Bundle.AddNewOrganizationDialog_bnOk_addFailed_text());
|
||||
LOGGER.log(Level.SEVERE, "Failed adding new organization.", ex);
|
||||
logger.log(Level.SEVERE, "Failed adding new organization.", ex);
|
||||
newOrg = null;
|
||||
}
|
||||
}//GEN-LAST:event_bnOKActionPerformed
|
||||
|
||||
|
||||
+3
-6
@@ -47,9 +47,9 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.PostgresEamDbSettings;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.SqliteEamDbSettings;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author nick
|
||||
* Configuration dialog for Central Repository database settings.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class EamDbSettingsDialog extends JDialog {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(EamDbSettingsDialog.class.getName());
|
||||
@@ -96,11 +96,8 @@ public class EamDbSettingsDialog extends JDialog {
|
||||
public boolean accept(File pathname) {
|
||||
if (pathname.isDirectory()) {
|
||||
return true;
|
||||
} else if (pathname.getName().toLowerCase().equals((CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT).toLowerCase())) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return pathname.getName().toLowerCase().equals((CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT).toLowerCase());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -41,6 +41,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.SqliteEamDbSettings;
|
||||
/**
|
||||
* Main settings panel for the Central Repository
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class GlobalSettingsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
+3
-4
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Central Repository
|
||||
*
|
||||
* Copyright 2015-2017 Basis Technology Corp.
|
||||
* Copyright 2015-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -18,8 +18,6 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.centralrepository.optionspanel;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Toolkit;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
@@ -38,8 +36,9 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||
|
||||
/**
|
||||
* Dialog to handle management of artifact types handled by the Central
|
||||
* Repository
|
||||
* Repository
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class ManageCorrelationPropertiesDialog extends javax.swing.JDialog {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(ManageCorrelationPropertiesDialog.class.getName());
|
||||
|
||||
+4
@@ -37,6 +37,10 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbUtil;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamOrganization;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
|
||||
/**
|
||||
* Configuration dialog to manage organizations for the Central Repository.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class ManageOrganizationsDialog extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
+2
-2
@@ -24,7 +24,7 @@ import java.util.Map;
|
||||
/**
|
||||
* Provides logic for selecting common files from all data sources.
|
||||
*/
|
||||
final class AllDataSourcesCommonFilesAlgorithm extends CommonFilesMetadataBuilder {
|
||||
final public class AllDataSourcesCommonFilesAlgorithm extends CommonFilesMetadataBuilder {
|
||||
|
||||
private static final String WHERE_CLAUSE = "%s md5 in (select md5 from tsk_files where (known != 1 OR known IS NULL)%s GROUP BY md5 HAVING COUNT(*) > 1) order by md5"; //NON-NLS
|
||||
|
||||
@@ -36,7 +36,7 @@ final class AllDataSourcesCommonFilesAlgorithm extends CommonFilesMetadataBuilde
|
||||
* @param filterByMediaMimeType match only on files whose mime types can be broadly categorized as media types
|
||||
* @param filterByDocMimeType match only on files whose mime types can be broadly categorized as document types
|
||||
*/
|
||||
AllDataSourcesCommonFilesAlgorithm(Map<Long, String> dataSourceIdMap, boolean filterByMediaMimeType, boolean filterByDocMimeType) {
|
||||
public AllDataSourcesCommonFilesAlgorithm(Map<Long, String> dataSourceIdMap, boolean filterByMediaMimeType, boolean filterByDocMimeType) {
|
||||
super(dataSourceIdMap, filterByMediaMimeType, filterByDocMimeType);
|
||||
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ import java.util.Map;
|
||||
* Utility and wrapper model around data required for Common Files Search results.
|
||||
* Subclass this to implement different selections of files from the case.
|
||||
*/
|
||||
final class CommonFilesMetadata {
|
||||
final public class CommonFilesMetadata {
|
||||
|
||||
private final Map<String, Md5Metadata> metadata;
|
||||
|
||||
@@ -52,7 +52,7 @@ final class CommonFilesMetadata {
|
||||
return this.metadata.get(md5);
|
||||
}
|
||||
|
||||
Map<String, Md5Metadata> getMetadata() {
|
||||
public Map<String, Md5Metadata> getMetadata() {
|
||||
return Collections.unmodifiableMap(this.metadata);
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ final class CommonFilesMetadata {
|
||||
* How many distinct file instances exist for this metadata?
|
||||
* @return number of file instances
|
||||
*/
|
||||
int size() {
|
||||
public int size() {
|
||||
int count = 0;
|
||||
for (Md5Metadata data : this.metadata.values()) {
|
||||
count += data.size();
|
||||
|
||||
@@ -46,7 +46,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* This entire thing runs on a background thread where exceptions are handled.
|
||||
*/
|
||||
@SuppressWarnings("PMD.AbstractNaming")
|
||||
abstract class CommonFilesMetadataBuilder {
|
||||
public abstract class CommonFilesMetadataBuilder {
|
||||
|
||||
private final Map<Long, String> dataSourceIdToNameMap;
|
||||
private final boolean filterByMedia;
|
||||
|
||||
@@ -18,12 +18,9 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.commonfilesearch;
|
||||
|
||||
import java.io.File;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
@@ -33,7 +30,6 @@ import javax.swing.SwingUtilities;
|
||||
import javax.swing.SwingWorker;
|
||||
import org.openide.explorer.ExplorerManager;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataResultViewer;
|
||||
import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent;
|
||||
@@ -42,9 +38,6 @@ import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
import org.sleuthkit.autopsy.directorytree.DataResultFilterNode;
|
||||
import org.sleuthkit.autopsy.directorytree.DirectoryTreeTopComponent;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase.CaseDbQuery;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
@@ -77,7 +70,7 @@ public final class CommonFilesPanel extends javax.swing.JPanel {
|
||||
initComponents();
|
||||
|
||||
this.setupDataSources();
|
||||
|
||||
|
||||
this.errorText.setVisible(false);
|
||||
}
|
||||
|
||||
@@ -98,10 +91,6 @@ public final class CommonFilesPanel extends javax.swing.JPanel {
|
||||
|
||||
new SwingWorker<Map<Long, String>, Void>() {
|
||||
|
||||
private static final String SELECT_DATA_SOURCES_LOGICAL = "select obj_id, name from tsk_files where obj_id in (SELECT obj_id FROM tsk_objects WHERE obj_id in (select obj_id from data_source_info))";
|
||||
|
||||
private static final String SELECT_DATA_SOURCES_IMAGE = "select obj_id, name from tsk_image_names where obj_id in (SELECT obj_id FROM tsk_objects WHERE obj_id in (select obj_id from data_source_info))";
|
||||
|
||||
private void updateUi() {
|
||||
|
||||
String[] dataSourcesNames = new String[CommonFilesPanel.this.dataSourceMap.size()];
|
||||
@@ -132,48 +121,10 @@ public final class CommonFilesPanel extends javax.swing.JPanel {
|
||||
return CommonFilesPanel.this.dataSourceMap.size() >= 2;
|
||||
}
|
||||
|
||||
private void loadLogicalSources(SleuthkitCase tskDb, Map<Long, String> dataSouceMap) throws TskCoreException, SQLException {
|
||||
//try block releases resources - exceptions are handled in done()
|
||||
try (
|
||||
CaseDbQuery query = tskDb.executeQuery(SELECT_DATA_SOURCES_LOGICAL);
|
||||
ResultSet resultSet = query.getResultSet()) {
|
||||
while (resultSet.next()) {
|
||||
Long objectId = resultSet.getLong(1);
|
||||
String dataSourceName = resultSet.getString(2);
|
||||
dataSouceMap.put(objectId, dataSourceName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void loadImageSources(SleuthkitCase tskDb, Map<Long, String> dataSouceMap) throws SQLException, TskCoreException {
|
||||
//try block releases resources - exceptions are handled in done()
|
||||
try (
|
||||
CaseDbQuery query = tskDb.executeQuery(SELECT_DATA_SOURCES_IMAGE);
|
||||
ResultSet resultSet = query.getResultSet()) {
|
||||
|
||||
while (resultSet.next()) {
|
||||
Long objectId = resultSet.getLong(1);
|
||||
String dataSourceName = resultSet.getString(2);
|
||||
File image = new File(dataSourceName);
|
||||
String dataSourceNameTrimmed = image.getName();
|
||||
dataSouceMap.put(objectId, dataSourceNameTrimmed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Map<Long, String> doInBackground() throws NoCurrentCaseException, TskCoreException, SQLException {
|
||||
|
||||
Map<Long, String> dataSouceMap = new HashMap<>();
|
||||
|
||||
Case currentCase = Case.getCurrentCaseThrows();
|
||||
SleuthkitCase tskDb = currentCase.getSleuthkitCase();
|
||||
|
||||
loadLogicalSources(tskDb, dataSouceMap);
|
||||
|
||||
loadImageSources(tskDb, dataSouceMap);
|
||||
|
||||
return dataSouceMap;
|
||||
DataSourceLoader loader = new DataSourceLoader();
|
||||
return loader.getDataSourceMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -296,10 +247,10 @@ public final class CommonFilesPanel extends javax.swing.JPanel {
|
||||
TableFilterNode tableFilterWithDescendantsNode = new TableFilterNode(dataResultFilterNode);
|
||||
|
||||
DataResultViewerTable table = new DataResultViewerTable();
|
||||
|
||||
|
||||
Collection<DataResultViewer> viewers = new ArrayList<>(1);
|
||||
viewers.add(table);
|
||||
|
||||
|
||||
DataResultTopComponent.createInstance(tabTitle, pathText, tableFilterWithDescendantsNode, metadata.size(), viewers);
|
||||
|
||||
} catch (InterruptedException ex) {
|
||||
@@ -591,7 +542,7 @@ public final class CommonFilesPanel extends javax.swing.JPanel {
|
||||
|
||||
this.pictureVideoCheckbox.setEnabled(true);
|
||||
this.documentsCheckbox.setEnabled(true);
|
||||
|
||||
|
||||
this.toggleErrorTextAndSearchBox();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.commonfilesearch;
|
||||
|
||||
import java.io.File;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
* Encapsulates logic required to create a mapping of data sources in the
|
||||
* current case to their data source IDs.
|
||||
*
|
||||
* Intended to be used within the context of a SwingWorker or other background
|
||||
* thread.
|
||||
*/
|
||||
public class DataSourceLoader {
|
||||
|
||||
private static final String SELECT_DATA_SOURCES_LOGICAL = "select obj_id, name from tsk_files where obj_id in (SELECT obj_id FROM tsk_objects WHERE obj_id in (select obj_id from data_source_info))";
|
||||
|
||||
private static final String SELECT_DATA_SOURCES_IMAGE = "select obj_id, name from tsk_image_names where obj_id in (SELECT obj_id FROM tsk_objects WHERE obj_id in (select obj_id from data_source_info))";
|
||||
|
||||
private void loadLogicalSources(SleuthkitCase tskDb, Map<Long, String> dataSouceMap) throws TskCoreException, SQLException {
|
||||
//try block releases resources - exceptions are handled in done()
|
||||
try (
|
||||
SleuthkitCase.CaseDbQuery query = tskDb.executeQuery(SELECT_DATA_SOURCES_LOGICAL);
|
||||
ResultSet resultSet = query.getResultSet()
|
||||
) {
|
||||
while (resultSet.next()) {
|
||||
Long objectId = resultSet.getLong(1);
|
||||
String dataSourceName = resultSet.getString(2);
|
||||
dataSouceMap.put(objectId, dataSourceName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void loadImageSources(SleuthkitCase tskDb, Map<Long, String> dataSouceMap) throws SQLException, TskCoreException {
|
||||
//try block releases resources - exceptions are handled in done()
|
||||
try (
|
||||
SleuthkitCase.CaseDbQuery query = tskDb.executeQuery(SELECT_DATA_SOURCES_IMAGE);
|
||||
ResultSet resultSet = query.getResultSet()) {
|
||||
|
||||
while (resultSet.next()) {
|
||||
Long objectId = resultSet.getLong(1);
|
||||
String dataSourceName = resultSet.getString(2);
|
||||
File image = new File(dataSourceName);
|
||||
String dataSourceNameTrimmed = image.getName();
|
||||
dataSouceMap.put(objectId, dataSourceNameTrimmed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a map of data source Ids to their string names for the current case.
|
||||
*
|
||||
* @return Map of Long (id) to String (name)
|
||||
* @throws NoCurrentCaseException
|
||||
* @throws TskCoreException
|
||||
* @throws SQLException
|
||||
*/
|
||||
public Map<Long, String> getDataSourceMap() throws NoCurrentCaseException, TskCoreException, SQLException {
|
||||
Map<Long, String> dataSouceMap = new HashMap<>();
|
||||
|
||||
Case currentCase = Case.getCurrentCaseThrows();
|
||||
SleuthkitCase tskDb = currentCase.getSleuthkitCase();
|
||||
|
||||
loadLogicalSources(tskDb, dataSouceMap);
|
||||
|
||||
loadImageSources(tskDb, dataSouceMap);
|
||||
|
||||
return dataSouceMap;
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,7 @@ import java.util.Map;
|
||||
/**
|
||||
* Provides logic for selecting common files from a single data source.
|
||||
*/
|
||||
final class SingleDataSource extends CommonFilesMetadataBuilder {
|
||||
final public class SingleDataSource extends CommonFilesMetadataBuilder {
|
||||
|
||||
private static final String WHERE_CLAUSE = "%s md5 in (select md5 from tsk_files where md5 in (select md5 from tsk_files where (known != 1 OR known IS NULL) and data_source_obj_id=%s%s) GROUP BY md5 HAVING COUNT(*) > 1) order by md5"; //NON-NLS
|
||||
private final Long selectedDataSourceId;
|
||||
@@ -35,10 +35,12 @@ final class SingleDataSource extends CommonFilesMetadataBuilder {
|
||||
* once in the given data source
|
||||
* @param dataSourceId data source id for which common files must appear at least once
|
||||
* @param dataSourceIdMap a map of obj_id to datasource name
|
||||
* @param filterByMediaMimeType match only on files whose mime types can be broadly categorized as media types
|
||||
* @param filterByDocMimeType match only on files whose mime types can be broadly categorized as document types
|
||||
* @param filterByMediaMimeType match only on files whose mime types can be
|
||||
* broadly categorized as media types
|
||||
* @param filterByDocMimeType match only on files whose mime types can be
|
||||
* broadly categorized as document types
|
||||
*/
|
||||
SingleDataSource(Long dataSourceId, Map<Long, String> dataSourceIdMap, boolean filterByMediaMimeType, boolean filterByDocMimeType) {
|
||||
public SingleDataSource(Long dataSourceId, Map<Long, String> dataSourceIdMap, boolean filterByMediaMimeType, boolean filterByDocMimeType) {
|
||||
super(dataSourceIdMap, filterByMediaMimeType, filterByDocMimeType);
|
||||
this.selectedDataSourceId = dataSourceId;
|
||||
this.dataSourceName = dataSourceIdMap.get(this.selectedDataSourceId);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2017-18 Basis Technology Corp.
|
||||
* Copyright 2017-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -48,6 +48,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* CVTTopComponent when this tab is active allowing for context sensitive
|
||||
* actions to work correctly.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class AccountsBrowser extends JPanel implements ExplorerManager.Provider, Lookup.Provider {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2017-18 Basis Technology Corp.
|
||||
* Copyright 2017-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -42,6 +42,7 @@ import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
||||
@TopComponent.Registration(mode = "cvt", openAtStartup = false)
|
||||
@RetainLocation("cvt")
|
||||
@NbBundle.Messages("CVTTopComponent.name= Communications Visualization")
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class CVTTopComponent extends TopComponent {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2017-18 Basis Technology Corp.
|
||||
* Copyright 2017-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -57,6 +57,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* Panel that holds the Filter control widgets and triggers queries against the
|
||||
* CommunicationsManager on user filtering changes.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final public class FiltersPanel extends JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2017-18 Basis Technology Corp.
|
||||
* Copyright 2017-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -41,6 +41,7 @@ import org.sleuthkit.autopsy.directorytree.DataResultFilterNode;
|
||||
* messages and other account details, and a ContentViewer to show individual
|
||||
* messages.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class MessageBrowser extends JPanel implements ExplorerManager.Provider, Lookup.Provider {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -112,6 +112,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* CVTTopComponent when this tab is active allowing for context sensitive
|
||||
* actions to work correctly.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final public class VisualizationPanel extends JPanel implements Lookup.Provider {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -75,3 +75,4 @@ SQLiteViewer.jLabel2.text=Page
|
||||
SQLiteViewer.numEntriesField.text=num Entries
|
||||
SQLiteViewer.jLabel1.text=Table
|
||||
PListViewer.exportButton.text=Export
|
||||
SQLiteViewer.exportCsvButton.text=Export to CSV
|
||||
|
||||
@@ -76,6 +76,7 @@ import org.sleuthkit.datamodel.TskData;
|
||||
@ServiceProviders(value = {
|
||||
@ServiceProvider(service = FrameCapture.class)
|
||||
})
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class FXVideoPanel extends MediaViewVideoPanel {
|
||||
|
||||
// Refer to https://docs.oracle.com/javafx/2/api/javafx/scene/media/package-summary.html
|
||||
|
||||
@@ -36,6 +36,7 @@ import org.sleuthkit.datamodel.AbstractFile;
|
||||
* Generic Application content viewer
|
||||
*/
|
||||
@ServiceProvider(service = DataContentViewer.class, position = 3)
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class FileViewer extends javax.swing.JPanel implements DataContentViewer {
|
||||
|
||||
private static final int CONFIDENCE_LEVEL = 5;
|
||||
|
||||
@@ -69,6 +69,7 @@ import org.sleuthkit.datamodel.TskData;
|
||||
@ServiceProviders(value = {
|
||||
@ServiceProvider(service = FrameCapture.class)
|
||||
})
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class GstVideoPanel extends MediaViewVideoPanel {
|
||||
|
||||
private static final String[] EXTENSIONS = new String[]{".mov", ".m4v", ".flv", ".mp4", ".3gp", ".avi", ".mpg", ".mpeg", ".wmv"}; //NON-NLS
|
||||
@@ -365,7 +366,7 @@ public class GstVideoPanel extends MediaViewVideoPanel {
|
||||
playbin.getState();
|
||||
|
||||
if (!playbin.seek(timeStamp, unit)) {
|
||||
logger.log(Level.INFO, "There was a problem seeking to " + timeStamp + " " + unit.name().toLowerCase()); //NON-NLS
|
||||
logger.log(Level.INFO, "There was a problem seeking to {0} {1}", new Object[]{timeStamp, unit.name().toLowerCase()}); //NON-NLS
|
||||
}
|
||||
|
||||
ret = playbin.play();
|
||||
@@ -395,7 +396,7 @@ public class GstVideoPanel extends MediaViewVideoPanel {
|
||||
}
|
||||
|
||||
if (image == null) {
|
||||
logger.log(Level.WARNING, "There was a problem while trying to capture a frame from file " + file.getName()); //NON-NLS
|
||||
logger.log(Level.WARNING, "There was a problem while trying to capture a frame from file {0}", file.getName()); //NON-NLS
|
||||
badVideoFiles.add(file.getName());
|
||||
break;
|
||||
}
|
||||
@@ -672,7 +673,7 @@ public class GstVideoPanel extends MediaViewVideoPanel {
|
||||
try {
|
||||
get();
|
||||
} catch (InterruptedException | ExecutionException ex) {
|
||||
logger.log(Level.WARNING, "Error updating video progress: " + ex.getMessage()); //NON-NLS
|
||||
logger.log(Level.WARNING, "Error updating video progress: {0}", ex.getMessage()); //NON-NLS
|
||||
infoLabel.setText(NbBundle.getMessage(this.getClass(), "GstVideoPanel.progress.infoLabel.updateErr",
|
||||
ex.getMessage()));
|
||||
} // catch and ignore if we were cancelled
|
||||
|
||||
@@ -30,6 +30,7 @@ import org.sleuthkit.datamodel.AbstractFile;
|
||||
/**
|
||||
* Media content viewer for videos, sounds and images.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class MediaFileViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(MediaFileViewer.class.getName());
|
||||
|
||||
@@ -48,7 +48,6 @@ import org.openide.util.NbBundle;
|
||||
import org.python.google.common.collect.Lists;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.datamodel.FileNode;
|
||||
import org.sleuthkit.autopsy.directorytree.ExternalViewerAction;
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
@@ -60,12 +59,11 @@ import org.sleuthkit.datamodel.AbstractFile;
|
||||
@NbBundle.Messages({"MediaViewImagePanel.externalViewerButton.text=Open in External Viewer",
|
||||
"MediaViewImagePanel.errorLabel.text=Could not load file into Media View.",
|
||||
"MediaViewImagePanel.errorLabel.OOMText=Could not load file into Media View: insufficent memory."})
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPanel {
|
||||
|
||||
private static final Image EXTERNAL = new Image(MediaViewImagePanel.class.getResource("/org/sleuthkit/autopsy/images/external.png").toExternalForm());
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(MediaViewImagePanel.class.getName());
|
||||
|
||||
private final boolean fxInited;
|
||||
|
||||
private JFXPanel fxPanel;
|
||||
|
||||
@@ -71,6 +71,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* Shows SMS/MMS/EMail messages
|
||||
*/
|
||||
@ServiceProvider(service = DataContentViewer.class, position = 5)
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class MessageContentViewer extends javax.swing.JPanel implements DataContentViewer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2013-2014 Basis Technology Corp.
|
||||
* Copyright 2013-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -36,6 +36,7 @@ import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM;
|
||||
* different order and allows the full path to be visible in the bottom area.
|
||||
*/
|
||||
@ServiceProvider(service = DataContentViewer.class, position = 6)
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class Metadata extends javax.swing.JPanel implements DataContentViewer {
|
||||
|
||||
/**
|
||||
@@ -222,7 +223,6 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer {
|
||||
@Override
|
||||
public void resetComponent() {
|
||||
setText("");
|
||||
return;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -63,11 +63,12 @@ import org.xml.sax.SAXException;
|
||||
* PListViewer - a file viewer for binary plist files.
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class PListViewer extends javax.swing.JPanel implements FileTypeViewer, ExplorerManager.Provider {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String[] MIMETYPES = new String[]{"application/x-bplist"};
|
||||
private static final Logger LOGGER = Logger.getLogger(PListViewer.class.getName());
|
||||
private static final Logger logger = Logger.getLogger(PListViewer.class.getName());
|
||||
|
||||
private final org.openide.explorer.view.OutlineView outlineView;
|
||||
private final Outline outline;
|
||||
@@ -198,7 +199,7 @@ class PListViewer extends javax.swing.JPanel implements FileTypeViewer, Explorer
|
||||
Bundle.PListViewer_ExportFailed_message(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
|
||||
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex);
|
||||
logger.log(Level.SEVERE, "Exception while getting open case.", ex);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -227,7 +228,7 @@ class PListViewer extends javax.swing.JPanel implements FileTypeViewer, Explorer
|
||||
Bundle.PListViewer_ExportFailed_message(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
|
||||
LOGGER.log(Level.SEVERE, "Error exporting plist to XML file " + selectedFile.getName(), ex);
|
||||
logger.log(Level.SEVERE, "Error exporting plist to XML file " + selectedFile.getName(), ex);
|
||||
}
|
||||
}
|
||||
}//GEN-LAST:event_exportButtonActionPerformed
|
||||
@@ -305,7 +306,7 @@ class PListViewer extends javax.swing.JPanel implements FileTypeViewer, Explorer
|
||||
setColumnWidths();
|
||||
});
|
||||
} catch (InterruptedException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Interruption while parsing/dislaying plist file " + plistFile.getName(), ex);
|
||||
logger.log(Level.SEVERE, "Interruption while parsing/dislaying plist file " + plistFile.getName(), ex);
|
||||
|
||||
JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
|
||||
ex.getMessage(),
|
||||
@@ -313,7 +314,7 @@ class PListViewer extends javax.swing.JPanel implements FileTypeViewer, Explorer
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
|
||||
} catch (ExecutionException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Exception while parsing/dislaying plist file " + plistFile.getName(), ex);
|
||||
logger.log(Level.SEVERE, "Exception while parsing/dislaying plist file " + plistFile.getName(), ex);
|
||||
JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(),
|
||||
ex.getCause().getMessage(),
|
||||
Bundle.PListViewer_processPlist_errorMessage(),
|
||||
@@ -407,7 +408,7 @@ class PListViewer extends javax.swing.JPanel implements FileTypeViewer, Explorer
|
||||
pkv.setChildren(children.toArray(new PropKeyValue[children.size()]));
|
||||
return pkv;
|
||||
} else {
|
||||
LOGGER.log(Level.SEVERE, "Can''t parse Plist for key = {0} value of type {1}", new Object[]{key, value.getClass()});
|
||||
logger.log(Level.SEVERE, "Can''t parse Plist for key = {0} value of type {1}", new Object[]{key, value.getClass()});
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
@@ -49,6 +49,7 @@ import org.openide.util.actions.Presenter;
|
||||
/**
|
||||
* Panel to display a SQLite table
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class SQLiteTableView extends JPanel implements ExplorerManager.Provider {
|
||||
|
||||
private final org.openide.explorer.view.OutlineView outlineView;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="jHdrPanel" max="32767" attributes="0"/>
|
||||
<Component id="jHdrPanel" pref="569" max="32767" attributes="0"/>
|
||||
<Component id="jTableDataPanel" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@@ -60,7 +60,9 @@
|
||||
<Component id="prevPageButton" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
|
||||
<Component id="nextPageButton" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="133" max="32767" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="29" max="-2" attributes="0"/>
|
||||
<Component id="exportCsvButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@@ -69,6 +71,7 @@
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="exportCsvButton" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="nextPageButton" alignment="0" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<Component id="prevPageButton" alignment="0" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
@@ -199,6 +202,16 @@
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="nextPageButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="exportCsvButton">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="SQLiteViewer.exportCsvButton.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="exportCsvButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="jTableDataPanel">
|
||||
|
||||
@@ -22,6 +22,7 @@ import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.Cursor;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
@@ -39,6 +40,10 @@ import java.util.Objects;
|
||||
import java.util.TreeMap;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
@@ -51,10 +56,12 @@ import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
import org.sleuthkit.autopsy.coreutils.TimeStampUtils;
|
||||
|
||||
/**
|
||||
* A file content viewer for SQLite database files.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@@ -95,6 +102,7 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||
numPagesLabel = new javax.swing.JLabel();
|
||||
prevPageButton = new javax.swing.JButton();
|
||||
nextPageButton = new javax.swing.JButton();
|
||||
exportCsvButton = new javax.swing.JButton();
|
||||
jTableDataPanel = new javax.swing.JPanel();
|
||||
|
||||
jHdrPanel.setPreferredSize(new java.awt.Dimension(536, 40));
|
||||
@@ -146,6 +154,13 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||
}
|
||||
});
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(exportCsvButton, org.openide.util.NbBundle.getMessage(SQLiteViewer.class, "SQLiteViewer.exportCsvButton.text")); // NOI18N
|
||||
exportCsvButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
exportCsvButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout jHdrPanelLayout = new javax.swing.GroupLayout(jHdrPanel);
|
||||
jHdrPanel.setLayout(jHdrPanelLayout);
|
||||
jHdrPanelLayout.setHorizontalGroup(
|
||||
@@ -169,13 +184,16 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||
.addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGap(0, 0, 0)
|
||||
.addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap(133, Short.MAX_VALUE))
|
||||
.addGap(29, 29, 29)
|
||||
.addComponent(exportCsvButton)
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
);
|
||||
jHdrPanelLayout.setVerticalGroup(
|
||||
jHdrPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jHdrPanelLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(jHdrPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(exportCsvButton)
|
||||
.addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGroup(jHdrPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
@@ -195,7 +213,7 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jHdrPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(jHdrPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 569, Short.MAX_VALUE)
|
||||
.addComponent(jTableDataPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
@@ -249,9 +267,56 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||
WindowManager.getDefault().getMainWindow().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||
}//GEN-LAST:event_tablesDropdownListActionPerformed
|
||||
|
||||
/**
|
||||
* The action when the Export Csv button is pressed. The file chooser window will pop
|
||||
* up to choose where the user wants to save the csv file. The default location is case export directory.
|
||||
*
|
||||
* @param evt the action event
|
||||
*/
|
||||
|
||||
@NbBundle.Messages({"SQLiteViewer.csvExport.fileName.empty=Please input a file name for exporting.",
|
||||
"SQLiteViewer.csvExport.title=Export to csv file",
|
||||
"SQLiteViewer.csvExport.confirm.msg=Do you want to overwrite the existing file?"})
|
||||
private void exportCsvButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportCsvButtonActionPerformed
|
||||
Case openCase = Case.getCurrentCase();
|
||||
File caseDirectory = new File(openCase.getExportDirectory());
|
||||
JFileChooser fileChooser = new JFileChooser();
|
||||
fileChooser.setDragEnabled(false);
|
||||
fileChooser.setCurrentDirectory(caseDirectory);
|
||||
//Set a filter to let the filechooser only work for csv files
|
||||
FileNameExtensionFilter csvFilter = new FileNameExtensionFilter("*.csv", "csv");
|
||||
fileChooser.addChoosableFileFilter(csvFilter);
|
||||
fileChooser.setAcceptAllFileFilterUsed(true);
|
||||
fileChooser.setFileFilter(csvFilter);
|
||||
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
|
||||
int choice = fileChooser.showSaveDialog((Component) evt.getSource()); //TODO
|
||||
if (JFileChooser.APPROVE_OPTION == choice) {
|
||||
boolean overwrite = false;
|
||||
File file = fileChooser.getSelectedFile();
|
||||
if (file == null) {
|
||||
JOptionPane.showMessageDialog(this,
|
||||
Bundle.SQLiteViewer_csvExport_fileName_empty(),
|
||||
Bundle.SQLiteViewer_csvExport_title(),
|
||||
JOptionPane.WARNING_MESSAGE);
|
||||
return;
|
||||
} else if (file.exists() && FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("csv")) {
|
||||
if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this,
|
||||
Bundle.SQLiteViewer_csvExport_confirm_msg(),
|
||||
Bundle.SQLiteViewer_csvExport_title(),
|
||||
JOptionPane.YES_NO_OPTION)) {
|
||||
overwrite = true;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
exportTableToCsv(file, overwrite);
|
||||
}
|
||||
}//GEN-LAST:event_exportCsvButtonActionPerformed
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JLabel currPageLabel;
|
||||
private javax.swing.JButton exportCsvButton;
|
||||
private javax.swing.JPanel jHdrPanel;
|
||||
private javax.swing.JLabel jLabel1;
|
||||
private javax.swing.JLabel jLabel2;
|
||||
@@ -436,9 +501,11 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||
prevPageButton.setEnabled(false);
|
||||
|
||||
if (numRows > 0) {
|
||||
exportCsvButton.setEnabled(true);
|
||||
nextPageButton.setEnabled(((numRows > ROWS_PER_PAGE)));
|
||||
readTable(tableName, (currPage - 1) * ROWS_PER_PAGE + 1, ROWS_PER_PAGE);
|
||||
} else {
|
||||
exportCsvButton.setEnabled(false);
|
||||
nextPageButton.setEnabled(false);
|
||||
selectedTableView.setupTable(Collections.emptyList());
|
||||
}
|
||||
@@ -495,4 +562,68 @@ class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||
|
||||
return rowlist;
|
||||
}
|
||||
|
||||
@NbBundle.Messages({"SQLiteViewer.exportTableToCsv.write.errText=Failed to export table content to csv file.",
|
||||
"SQLiteViewer.exportTableToCsv.FileName=File name: ",
|
||||
"SQLiteViewer.exportTableToCsv.TableName=Table name: "
|
||||
})
|
||||
private void exportTableToCsv(File file, boolean overwrite) {
|
||||
String tableName = (String) this.tablesDropdownList.getSelectedItem();
|
||||
String csvFileSuffix = "_" + tableName + "_" + TimeStampUtils.createTimeStamp() + ".csv";
|
||||
try (
|
||||
Statement statement = connection.createStatement();
|
||||
ResultSet resultSet = statement.executeQuery("SELECT * FROM " + tableName)) {
|
||||
List<Map<String, Object>> currentTableRows = resultSetToArrayList(resultSet);
|
||||
|
||||
if (Objects.isNull(currentTableRows) || currentTableRows.isEmpty()) {
|
||||
logger.log(Level.INFO, String.format("The table %s is empty. (objId=%d)", tableName, sqliteDbFile.getId())); //NON-NLS
|
||||
} else {
|
||||
String fileName = file.getName();
|
||||
File csvFile;
|
||||
if (overwrite) {
|
||||
csvFile = file;
|
||||
} else if (FilenameUtils.getExtension(fileName).equalsIgnoreCase("csv")) {
|
||||
csvFile = new File(file.getParentFile(), FilenameUtils.removeExtension(fileName) + csvFileSuffix);
|
||||
} else {
|
||||
csvFile = new File(file.toString() + csvFileSuffix);
|
||||
}
|
||||
FileOutputStream out = new FileOutputStream(csvFile, false);
|
||||
|
||||
out.write((Bundle.SQLiteViewer_exportTableToCsv_FileName() + csvFile.getName() + "\n").getBytes());
|
||||
out.write((Bundle.SQLiteViewer_exportTableToCsv_TableName() + tableName + "\n").getBytes());
|
||||
// Set up the column names
|
||||
Map<String, Object> row = currentTableRows.get(0);
|
||||
StringBuffer header = new StringBuffer();
|
||||
for (Map.Entry<String, Object> col : row.entrySet()) {
|
||||
String colName = col.getKey();
|
||||
if (header.length() > 0) {
|
||||
header.append(',').append(colName);
|
||||
} else {
|
||||
header.append(colName);
|
||||
}
|
||||
}
|
||||
out.write(header.append('\n').toString().getBytes());
|
||||
|
||||
for (Map<String, Object> maps : currentTableRows) {
|
||||
StringBuffer valueLine = new StringBuffer();
|
||||
maps.values().forEach((value) -> {
|
||||
if (valueLine.length() > 0) {
|
||||
valueLine.append(',').append(value.toString());
|
||||
} else {
|
||||
valueLine.append(value.toString());
|
||||
}
|
||||
});
|
||||
out.write(valueLine.append('\n').toString().getBytes());
|
||||
}
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
logger.log(Level.SEVERE, String.format("Failed to read table %s from DB file '%s' (objId=%d)", tableName, sqliteDbFile.getName(), sqliteDbFile.getId()), ex); //NON-NLS
|
||||
MessageNotifyUtil.Message.error(Bundle.SQLiteViewer_readTable_errorText(tableName));
|
||||
} catch (IOException ex) {
|
||||
logger.log(Level.SEVERE, String.format("Failed to export table %s to file '%s'", tableName, file.getName()), ex); //NON-NLS
|
||||
MessageNotifyUtil.Message.error(Bundle.SQLiteViewer_exportTableToCsv_write_errText());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -206,7 +206,7 @@ public class Installer extends ModuleInstall {
|
||||
// Prevent the Autopsy UI from shrinking on high DPI displays
|
||||
System.setProperty("sun.java2d.dpiaware", "false");
|
||||
System.setProperty("prism.allowhidpi", "false");
|
||||
|
||||
|
||||
// Update existing configuration in case of unsupported settings
|
||||
updateConfig();
|
||||
|
||||
@@ -218,16 +218,16 @@ public class Installer extends ModuleInstall {
|
||||
packageInstallers.add(org.sleuthkit.autopsy.centralrepository.eventlisteners.Installer.getDefault());
|
||||
packageInstallers.add(org.sleuthkit.autopsy.healthmonitor.Installer.getDefault());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* If the mode in the configuration file is 'REVIEW' (2, now invalid), this
|
||||
* method will set it to 'STANDALONE' (0) and disable auto ingest.
|
||||
*/
|
||||
private void updateConfig() {
|
||||
String mode = ModuleSettings.getConfigSetting(SETTINGS_PROPERTIES, "AutopsyMode");
|
||||
if(mode != null) {
|
||||
if (mode != null) {
|
||||
int ordinal = Integer.parseInt(mode);
|
||||
if(ordinal > 1) {
|
||||
if (ordinal > 1) {
|
||||
UserPreferences.setMode(UserPreferences.SelectedMode.STANDALONE);
|
||||
ModuleSettings.setConfigSetting(UserPreferences.SETTINGS_PROPERTIES, "JoinAutoModeCluster", Boolean.toString(false));
|
||||
}
|
||||
@@ -268,6 +268,19 @@ public class Installer extends ModuleInstall {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a folder in the config directory for object detection classifiers if one does not
|
||||
* exist.
|
||||
*/
|
||||
private static void ensureClassifierFolderExists() {
|
||||
File objectDetectionClassifierDir = new File(PlatformUtil.getObjectDetectionClassifierPath());
|
||||
objectDetectionClassifierDir.mkdir();
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a folder in the config directory for Python Modules if one does not
|
||||
* exist.
|
||||
*/
|
||||
private static void ensurePythonModulesFolderExists() {
|
||||
File pythonModulesDir = new File(PlatformUtil.getUserPythonModulesPath());
|
||||
pythonModulesDir.mkdir();
|
||||
@@ -277,6 +290,7 @@ public class Installer extends ModuleInstall {
|
||||
public void restored() {
|
||||
super.restored();
|
||||
ensurePythonModulesFolderExists();
|
||||
ensureClassifierFolderExists();
|
||||
initJavaFx();
|
||||
for (ModuleInstall mi : packageInstallers) {
|
||||
try {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2016 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -19,14 +19,12 @@
|
||||
package org.sleuthkit.autopsy.corecomponents;
|
||||
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Image;
|
||||
import java.awt.Window;
|
||||
import java.io.File;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Locale;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JPanel;
|
||||
@@ -45,6 +43,7 @@ import org.sleuthkit.datamodel.SleuthkitJNI;
|
||||
/**
|
||||
* Custom "About" window panel.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class AboutWindowPanel extends JPanel implements HyperlinkListener {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@@ -212,7 +211,7 @@ private void logoLabelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:e
|
||||
private void showUrl() {
|
||||
if (url != null) {
|
||||
org.openide.awt.StatusDisplayer.getDefault().setStatusText(
|
||||
NbBundle.getBundle(HTMLViewAction.class).getString("CTL_OpeningBrowser")); //NON-NLS
|
||||
NbBundle.getMessage(HTMLViewAction.class, "CTL_OpeningBrowser")); //NON-NLS
|
||||
HtmlBrowser.URLDisplayer.getDefault().showURL(url);
|
||||
}
|
||||
}
|
||||
|
||||
+19
-4
@@ -1,12 +1,24 @@
|
||||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.sleuthkit.autopsy.corecomponents;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Toolkit;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import org.openide.windows.WindowManager;
|
||||
@@ -16,6 +28,7 @@ import org.openide.windows.WindowManager;
|
||||
* the panel given to it. No additional buttons or features, except the default
|
||||
* close operation, which is set to dispose.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class AdvancedConfigurationCleanDialog extends javax.swing.JDialog {
|
||||
|
||||
/**
|
||||
@@ -27,6 +40,8 @@ public class AdvancedConfigurationCleanDialog extends javax.swing.JDialog {
|
||||
|
||||
/**
|
||||
* Creates new form AdvancedConfigurationDialog
|
||||
*
|
||||
* @param resizable Is the dialog resizable?
|
||||
*/
|
||||
public AdvancedConfigurationCleanDialog(boolean resizable) {
|
||||
super((JFrame) WindowManager.getDefault().getMainWindow(), true);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -16,26 +16,18 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* AdvancedConfigurationDialog.java
|
||||
*
|
||||
* Created on Feb 28, 2012, 4:47:31 PM
|
||||
*/
|
||||
package org.sleuthkit.autopsy.corecomponents;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.ActionListener;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import org.openide.windows.WindowManager;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author dfickling
|
||||
* Advanced configuration dialog.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class AdvancedConfigurationDialog extends javax.swing.JDialog {
|
||||
|
||||
/**
|
||||
@@ -47,6 +39,8 @@ public class AdvancedConfigurationDialog extends javax.swing.JDialog {
|
||||
|
||||
/**
|
||||
* Creates new form AdvancedConfigurationDialog
|
||||
*
|
||||
* @param resizable Is the dialog resizable?
|
||||
*/
|
||||
public AdvancedConfigurationDialog(boolean resizable) {
|
||||
super((JFrame) WindowManager.getDefault().getMainWindow(), true);
|
||||
|
||||
@@ -66,7 +66,7 @@ import org.sleuthkit.autopsy.report.ReportBranding;
|
||||
"AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.pathNotSet.text=Agency logo path must be set.",
|
||||
"AutopsyOptionsPanel.logNumAlert.invalidInput.text=A positive integer is required here."
|
||||
})
|
||||
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-17 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -32,6 +32,7 @@ import org.sleuthkit.autopsy.corecomponents.ResultViewerPersistence.SortCriterio
|
||||
/**
|
||||
* A Gui for choosing a SortCriterion from a list of available properties.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
final class CriterionChooser extends javax.swing.JPanel {
|
||||
|
||||
private DefaultListCellRenderer defaultListCellRenderer = new DefaultListCellRenderer();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2014 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -38,8 +38,9 @@ import org.sleuthkit.datamodel.Content;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
*
|
||||
* Data content panel.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class DataContentPanel extends javax.swing.JPanel implements DataContent, ChangeListener {
|
||||
|
||||
private static Logger logger = Logger.getLogger(DataContentPanel.class.getName());
|
||||
@@ -241,7 +242,7 @@ public class DataContentPanel extends javax.swing.JPanel implements DataContent,
|
||||
|
||||
private static class UpdateWrapper {
|
||||
|
||||
private DataContentViewer wrapped;
|
||||
private final DataContentViewer wrapped;
|
||||
private boolean outdated;
|
||||
|
||||
UpdateWrapper(DataContentViewer wrapped) {
|
||||
|
||||
@@ -43,6 +43,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
//@TopComponent.Description(preferredID = "DataContentTopComponent")
|
||||
//@TopComponent.Registration(mode = "output", openAtStartup = true)
|
||||
//@TopComponent.OpenActionRegistration(displayName = "#CTL_DataContentAction", preferredID = "DataContentTopComponent")
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class DataContentTopComponent extends TopComponent implements DataContent, ExplorerManager.Provider {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(DataContentTopComponent.class.getName());
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2013 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -63,6 +63,7 @@ import org.netbeans.swing.etable.ETable;
|
||||
* in a JTable representation of its BlackboardAttributes.
|
||||
*/
|
||||
@ServiceProvider(service = DataContentViewer.class, position = 7)
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class DataContentViewerArtifact extends javax.swing.JPanel implements DataContentViewer {
|
||||
|
||||
@NbBundle.Messages({
|
||||
@@ -484,7 +485,8 @@ public class DataContentViewerArtifact extends javax.swing.JPanel implements Dat
|
||||
if ((artifact == null)
|
||||
|| (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID())
|
||||
|| (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID())
|
||||
|| (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID())) {
|
||||
|| (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID())
|
||||
|| (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_OBJECT_DETECTED.getTypeID())) {
|
||||
return 3;
|
||||
} else {
|
||||
return 6;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2016 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -27,7 +27,6 @@ import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import javax.swing.JMenuItem;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JTextPane;
|
||||
import javax.swing.text.BadLocationException;
|
||||
import javax.swing.text.Utilities;
|
||||
import org.openide.nodes.Node;
|
||||
@@ -40,6 +39,7 @@ import org.sleuthkit.datamodel.TskException;
|
||||
/**
|
||||
* Hex view of file contents.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
@ServiceProvider(service = DataContentViewer.class, position = 1)
|
||||
public class DataContentViewerHex extends javax.swing.JPanel implements DataContentViewer {
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011 Basis Technology Corp.
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -28,9 +28,7 @@ import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import javax.swing.JMenuItem;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JTextPane;
|
||||
import org.openide.nodes.Node;
|
||||
import org.openide.util.Lookup;
|
||||
import org.openide.util.lookup.ServiceProvider;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
|
||||
import org.sleuthkit.autopsy.coreutils.StringExtract;
|
||||
@@ -44,11 +42,12 @@ import org.sleuthkit.datamodel.TskException;
|
||||
* Viewer displays strings extracted from contents.
|
||||
*/
|
||||
@ServiceProvider(service = DataContentViewer.class, position = 2)
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class DataContentViewerString extends javax.swing.JPanel implements DataContentViewer {
|
||||
|
||||
private static long currentOffset = 0;
|
||||
private static final long pageLength = 16384;
|
||||
private final byte[] data = new byte[(int) pageLength];
|
||||
private static final long PAGE_LENGTH = 16384;
|
||||
private final byte[] data = new byte[(int) PAGE_LENGTH];
|
||||
private static int currentPage = 1;
|
||||
private Content dataSource;
|
||||
//string extract utility
|
||||
@@ -62,7 +61,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
||||
initComponents();
|
||||
customizeComponents();
|
||||
this.resetComponent();
|
||||
logger.log(Level.INFO, "Created StringView instance: " + this); //NON-NLS
|
||||
logger.log(Level.INFO, "Created StringView instance: {0}", this); //NON-NLS
|
||||
}
|
||||
|
||||
private void customizeComponents() {
|
||||
@@ -264,7 +263,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
||||
|
||||
private void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prevPageButtonActionPerformed
|
||||
//@@@ this is part of the code dealing with the data viewer. could be copied/removed to implement the scrollbar
|
||||
currentOffset -= pageLength;
|
||||
currentOffset -= PAGE_LENGTH;
|
||||
currentPage = currentPage - 1;
|
||||
currentPageLabel.setText(Integer.toString(currentPage));
|
||||
setDataView(dataSource, currentOffset);
|
||||
@@ -272,7 +271,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
||||
|
||||
private void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextPageButtonActionPerformed
|
||||
//@@@ this is part of the code dealing with the data viewer. could be copied/removed to implement the scrollbar
|
||||
currentOffset += pageLength;
|
||||
currentOffset += PAGE_LENGTH;
|
||||
currentPage = currentPage + 1;
|
||||
currentPageLabel.setText(Integer.toString(currentPage));
|
||||
setDataView(dataSource, currentOffset);
|
||||
@@ -281,7 +280,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
||||
private void goToPageTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goToPageTextFieldActionPerformed
|
||||
String pageNumberStr = goToPageTextField.getText();
|
||||
int pageNumber;
|
||||
int maxPage = Math.round((dataSource.getSize() - 1) / pageLength) + 1;
|
||||
int maxPage = Math.round((dataSource.getSize() - 1) / PAGE_LENGTH) + 1;
|
||||
try {
|
||||
pageNumber = Integer.parseInt(pageNumberStr);
|
||||
} catch (NumberFormatException ex) {
|
||||
@@ -297,7 +296,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
||||
JOptionPane.WARNING_MESSAGE);
|
||||
return;
|
||||
}
|
||||
currentOffset = (pageNumber - 1) * pageLength;
|
||||
currentOffset = (pageNumber - 1) * PAGE_LENGTH;
|
||||
currentPage = pageNumber;
|
||||
currentPageLabel.setText(Integer.toString(currentPage));
|
||||
setDataView(dataSource, currentOffset);
|
||||
@@ -352,11 +351,11 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
||||
String text = "";
|
||||
if (dataSource.getSize() > 0) {
|
||||
try {
|
||||
bytesRead = dataSource.read(data, offset, pageLength); // read the data
|
||||
bytesRead = dataSource.read(data, offset, PAGE_LENGTH); // read the data
|
||||
} catch (TskException ex) {
|
||||
text = NbBundle.getMessage(this.getClass(),
|
||||
"DataContentViewerString.setDataView.errorText", currentOffset,
|
||||
currentOffset + pageLength);
|
||||
currentOffset + PAGE_LENGTH);
|
||||
logger.log(Level.WARNING, "Error while trying to show the String content.", ex); //NON-NLS
|
||||
}
|
||||
}
|
||||
@@ -370,15 +369,15 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
||||
if (text.trim().isEmpty()) {
|
||||
text = NbBundle.getMessage(this.getClass(),
|
||||
"DataContentViewerString.setDataView.errorNoText", currentOffset,
|
||||
currentOffset + pageLength);
|
||||
currentOffset + PAGE_LENGTH);
|
||||
}
|
||||
} else {
|
||||
text = NbBundle.getMessage(this.getClass(), "DataContentViewerString.setDataView.errorText", currentOffset,
|
||||
currentOffset + pageLength);
|
||||
currentOffset + PAGE_LENGTH);
|
||||
}
|
||||
|
||||
// disable or enable the next button
|
||||
if (offset + pageLength < dataSource.getSize()) {
|
||||
if (offset + PAGE_LENGTH < dataSource.getSize()) {
|
||||
nextPageButton.setEnabled(true);
|
||||
} else {
|
||||
nextPageButton.setEnabled(false);
|
||||
@@ -391,7 +390,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
||||
prevPageButton.setEnabled(true);
|
||||
}
|
||||
|
||||
int totalPage = Math.round((dataSource.getSize() - 1) / pageLength) + 1;
|
||||
int totalPage = Math.round((dataSource.getSize() - 1) / PAGE_LENGTH) + 1;
|
||||
totalPageLabel.setText(Integer.toString(totalPage));
|
||||
currentPageLabel.setText(Integer.toString(currentPage));
|
||||
outputViewPane.setText(text); // set the output view
|
||||
@@ -500,11 +499,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
||||
return false;
|
||||
}
|
||||
Content content = node.getLookup().lookup(Content.class);
|
||||
if (content != null && content.getSize() > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return (content != null && content.getSize() > 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -72,6 +72,7 @@ import org.sleuthkit.autopsy.datamodel.NodeSelectionInfo;
|
||||
* (DataContentTopComponent) that is normally docked into the lower right hand
|
||||
* side of the main application window, or it could be a custom content view.
|
||||
*/
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public class DataResultPanel extends javax.swing.JPanel implements DataResult, ChangeListener, ExplorerManager.Provider {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@@ -451,7 +452,7 @@ public class DataResultPanel extends javax.swing.JPanel implements DataResult, C
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
if (tabToSelect == NO_TAB_SELECTED) {
|
||||
tabToSelect = resultViewerTabs.getSelectedIndex();
|
||||
if ((tabToSelect == NO_TAB_SELECTED) || (!resultViewerTabs.isEnabledAt(tabToSelect))) {
|
||||
|
||||
@@ -68,6 +68,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
* viewers to the actions global context.
|
||||
*/
|
||||
@RetainLocation("editor")
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class DataResultTopComponent extends TopComponent implements DataResult, ExplorerManager.Provider {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(DataResultTopComponent.class.getName());
|
||||
|
||||
@@ -77,6 +77,7 @@ import org.sleuthkit.autopsy.datamodel.NodeSelectionInfo;
|
||||
* ancestor top component's explorer manager at runtime.
|
||||
*/
|
||||
@ServiceProvider(service = DataResultViewer.class)
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class DataResultViewerTable extends AbstractDataResultViewer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -71,6 +71,7 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* ancestor top component's explorer manager at runtime.
|
||||
*/
|
||||
@ServiceProvider(service = DataResultViewer.class)
|
||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||
public final class DataResultViewerThumbnail extends AbstractDataResultViewer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@@ -372,10 +373,7 @@ public final class DataResultViewerThumbnail extends AbstractDataResultViewer {
|
||||
|
||||
@Override
|
||||
public boolean isSupported(Node selectedNode) {
|
||||
if (selectedNode == null) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
return (selectedNode != null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user