mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 16:06:15 +00:00
fixed merge conflict
This commit is contained in:
commit
95ea5adb0a
@ -22,12 +22,12 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.services.FileManager;
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.autopsy.casemodule.services.FileManager;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
|
||||||
import org.sleuthkit.datamodel.LocalFilesDataSource;
|
import org.sleuthkit.datamodel.LocalFilesDataSource;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskDataException;
|
import org.sleuthkit.datamodel.TskDataException;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2018 Basis Technology Corp.
|
* Copyright 2011-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -21,7 +21,6 @@ package org.sleuthkit.autopsy.casemodule;
|
|||||||
import java.awt.Cursor;
|
import java.awt.Cursor;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.JComboBox;
|
import javax.swing.JComboBox;
|
||||||
import org.openide.util.Exceptions;
|
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||||
@ -573,7 +572,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel {
|
|||||||
examinerTextField.getText(), tfExaminerPhoneText.getText(),
|
examinerTextField.getText(), tfExaminerPhoneText.getText(),
|
||||||
tfExaminerEmailText.getText(), taNotesText.getText()));
|
tfExaminerEmailText.getText(), taNotesText.getText()));
|
||||||
} catch (CaseActionException ex) {
|
} catch (CaseActionException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
logger.log(Level.WARNING, "Error updating case details", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013 Basis Technology Corp.
|
* Copyright 2013-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -62,7 +62,6 @@ public class StartupWindowProvider implements StartupWindowInterface {
|
|||||||
if (isRunningFromCommandLine()) {
|
if (isRunningFromCommandLine()) {
|
||||||
// Autopsy is running from command line
|
// Autopsy is running from command line
|
||||||
logger.log(Level.INFO, "Running from command line"); //NON-NLS
|
logger.log(Level.INFO, "Running from command line"); //NON-NLS
|
||||||
System.out.println("Running from command line");
|
|
||||||
startupWindowToUse = new CommandLineStartupWindow();
|
startupWindowToUse = new CommandLineStartupWindow();
|
||||||
// kick off command line processing
|
// kick off command line processing
|
||||||
new CommandLineIngestManager().start();
|
new CommandLineIngestManager().start();
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Central Repository
|
* Central Repository
|
||||||
*
|
*
|
||||||
* Copyright 2015-2018 Basis Technology Corp.
|
* Copyright 2015-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -26,7 +26,6 @@ import javax.swing.event.TableModelEvent;
|
|||||||
import javax.swing.event.TableModelListener;
|
import javax.swing.event.TableModelListener;
|
||||||
import javax.swing.table.DefaultTableModel;
|
import javax.swing.table.DefaultTableModel;
|
||||||
import javax.swing.table.TableModel;
|
import javax.swing.table.TableModel;
|
||||||
import org.openide.util.Exceptions;
|
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.openide.windows.WindowManager;
|
import org.openide.windows.WindowManager;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
@ -74,7 +73,7 @@ final class ManageCorrelationPropertiesDialog extends javax.swing.JDialog {
|
|||||||
correlationTypes.clear();
|
correlationTypes.clear();
|
||||||
correlationTypes.addAll(dbManager.getDefinedCorrelationTypes());
|
correlationTypes.addAll(dbManager.getDefinedCorrelationTypes());
|
||||||
} catch (EamDbException ex) {
|
} catch (EamDbException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
LOGGER.log(Level.WARNING, "Error loading data", ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
correlationTypes.forEach((aType) -> {
|
correlationTypes.forEach((aType) -> {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Central Repository
|
* Central Repository
|
||||||
*
|
*
|
||||||
* Copyright 2015-2018 Basis Technology Corp.
|
* Copyright 2015-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -28,7 +28,6 @@ import javax.swing.JFrame;
|
|||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.event.ListSelectionEvent;
|
import javax.swing.event.ListSelectionEvent;
|
||||||
import javax.swing.event.ListSelectionListener;
|
import javax.swing.event.ListSelectionListener;
|
||||||
import org.openide.util.Exceptions;
|
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.openide.windows.WindowManager;
|
import org.openide.windows.WindowManager;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||||
@ -78,7 +77,7 @@ public final class ManageOrganizationsDialog extends JDialog {
|
|||||||
setButtonsEnabled(organizationList.getSelectedValue());
|
setButtonsEnabled(organizationList.getSelectedValue());
|
||||||
newOrg = null;
|
newOrg = null;
|
||||||
} catch (EamDbException ex) {
|
} catch (EamDbException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
logger.log(Level.WARNING, "Error getting Central Repo for Organizations dialog", ex);
|
||||||
}
|
}
|
||||||
display();
|
display();
|
||||||
}
|
}
|
||||||
|
@ -27,10 +27,11 @@ import java.util.Map;
|
|||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.Observable;
|
import java.util.Observable;
|
||||||
import java.util.Observer;
|
import java.util.Observer;
|
||||||
|
import java.util.logging.Level;
|
||||||
import javax.swing.ComboBoxModel;
|
import javax.swing.ComboBoxModel;
|
||||||
import org.openide.util.Exceptions;
|
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UI controls for Common Files Search scenario where the user intends to find
|
* UI controls for Common Files Search scenario where the user intends to find
|
||||||
@ -38,6 +39,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
|||||||
*/
|
*/
|
||||||
public final class InterCasePanel extends javax.swing.JPanel {
|
public final class InterCasePanel extends javax.swing.JPanel {
|
||||||
|
|
||||||
|
private final static Logger logger = Logger.getLogger(InterCasePanel.class.getName());
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
private final Observable fileTypeFilterObservable;
|
private final Observable fileTypeFilterObservable;
|
||||||
static final int NO_CASE_SELECTED = -1;
|
static final int NO_CASE_SELECTED = -1;
|
||||||
@ -121,7 +123,7 @@ public final class InterCasePanel extends javax.swing.JPanel {
|
|||||||
this.correlationTypeComboBox.addItem(type.getDisplayName());
|
this.correlationTypeComboBox.addItem(type.getDisplayName());
|
||||||
}
|
}
|
||||||
} catch (EamDbException ex) {
|
} catch (EamDbException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
logger.log(Level.WARNING, "Error getting correlation types", ex);
|
||||||
}
|
}
|
||||||
this.correlationTypeComboBox.setSelectedIndex(0);
|
this.correlationTypeComboBox.setSelectedIndex(0);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,10 @@
|
|||||||
ContactDetailsPane.nameLabel.text=Placeholder
|
ContactDetailsPane.nameLabel.text=Placeholder
|
||||||
SummaryViewer.countsPanel.border.title=Counts
|
SummaryViewer.countsPanel.border.title=Counts
|
||||||
SummaryViewer.contactsLabel.text=Contacts:
|
SummaryViewer.contactsLabel.text=Contacts:
|
||||||
SummaryViewer.attachmentsLabel.text=Media Attachments:
|
|
||||||
OutlineViewPanel.messageLabel.text=<Control Disabled>
|
OutlineViewPanel.messageLabel.text=<Control Disabled>
|
||||||
SummaryViewer.messagesDataLabel.text=messages
|
SummaryViewer.messagesDataLabel.text=messages
|
||||||
SummaryViewer.callLogsDataLabel.text=callLogs
|
SummaryViewer.callLogsDataLabel.text=callLogs
|
||||||
SummaryViewer.contactsDataLabel.text=contacts
|
SummaryViewer.contactsDataLabel.text=contacts
|
||||||
SummaryViewer.attachmentsDataLabel.text=attachments
|
|
||||||
SummaryViewer.messagesLabel.text=Messages:
|
SummaryViewer.messagesLabel.text=Messages:
|
||||||
SummaryViewer.callLogsLabel.text=Call Logs:
|
SummaryViewer.callLogsLabel.text=Call Logs:
|
||||||
ThreadRootMessagePanel.showAllCheckBox.text=Show All Messages
|
ThreadRootMessagePanel.showAllCheckBox.text=Show All Messages
|
||||||
@ -19,3 +17,7 @@ MessageViewer.showingMessagesLabel.text=Showing Messages for Thread:
|
|||||||
MessageViewer.backButton.AccessibleContext.accessibleDescription=
|
MessageViewer.backButton.AccessibleContext.accessibleDescription=
|
||||||
MessageViewer.backButton.text=Threads
|
MessageViewer.backButton.text=Threads
|
||||||
MessageViewer.showAllButton.text=All Messages
|
MessageViewer.showAllButton.text=All Messages
|
||||||
|
SummaryViewer.thumbnailCntLabel.text=Media Attachments:
|
||||||
|
SummaryViewer.attachmentsLable.text=Total Attachments:
|
||||||
|
SummaryViewer.thumbnailsDataLabel.text=attachments
|
||||||
|
SummaryViewer.attachmentDataLabel.text=count
|
||||||
|
@ -37,12 +37,10 @@ MessageViewer_viewMessage_selected=Selected
|
|||||||
MessageViewer_viewMessage_unthreaded=Unthreaded
|
MessageViewer_viewMessage_unthreaded=Unthreaded
|
||||||
SummaryViewer.countsPanel.border.title=Counts
|
SummaryViewer.countsPanel.border.title=Counts
|
||||||
SummaryViewer.contactsLabel.text=Contacts:
|
SummaryViewer.contactsLabel.text=Contacts:
|
||||||
SummaryViewer.attachmentsLabel.text=Media Attachments:
|
|
||||||
OutlineViewPanel.messageLabel.text=<Control Disabled>
|
OutlineViewPanel.messageLabel.text=<Control Disabled>
|
||||||
SummaryViewer.messagesDataLabel.text=messages
|
SummaryViewer.messagesDataLabel.text=messages
|
||||||
SummaryViewer.callLogsDataLabel.text=callLogs
|
SummaryViewer.callLogsDataLabel.text=callLogs
|
||||||
SummaryViewer.contactsDataLabel.text=contacts
|
SummaryViewer.contactsDataLabel.text=contacts
|
||||||
SummaryViewer.attachmentsDataLabel.text=attachments
|
|
||||||
SummaryViewer.messagesLabel.text=Messages:
|
SummaryViewer.messagesLabel.text=Messages:
|
||||||
SummaryViewer.callLogsLabel.text=Call Logs:
|
SummaryViewer.callLogsLabel.text=Call Logs:
|
||||||
SummaryViewer_CaseRefNameColumn_Title=Case Name
|
SummaryViewer_CaseRefNameColumn_Title=Case Name
|
||||||
@ -61,3 +59,7 @@ MessageViewer.showingMessagesLabel.text=Showing Messages for Thread:
|
|||||||
MessageViewer.backButton.AccessibleContext.accessibleDescription=
|
MessageViewer.backButton.AccessibleContext.accessibleDescription=
|
||||||
MessageViewer.backButton.text=Threads
|
MessageViewer.backButton.text=Threads
|
||||||
MessageViewer.showAllButton.text=All Messages
|
MessageViewer.showAllButton.text=All Messages
|
||||||
|
SummaryViewer.thumbnailCntLabel.text=Media Attachments:
|
||||||
|
SummaryViewer.attachmentsLable.text=Total Attachments:
|
||||||
|
SummaryViewer.thumbnailsDataLabel.text=attachments
|
||||||
|
SummaryViewer.attachmentDataLabel.text=count
|
||||||
|
@ -47,7 +47,6 @@ import org.openide.nodes.Children;
|
|||||||
import org.openide.nodes.Node;
|
import org.openide.nodes.Node;
|
||||||
import org.openide.nodes.Node.Property;
|
import org.openide.nodes.Node.Property;
|
||||||
import org.openide.nodes.Node.PropertySet;
|
import org.openide.nodes.Node.PropertySet;
|
||||||
import org.openide.util.Exceptions;
|
|
||||||
import org.openide.util.Lookup;
|
import org.openide.util.Lookup;
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.sleuthkit.autopsy.communications.ModifiableProxyLookup;
|
import org.sleuthkit.autopsy.communications.ModifiableProxyLookup;
|
||||||
@ -397,7 +396,7 @@ public class MessageViewer extends JPanel implements RelationshipsViewer {
|
|||||||
try {
|
try {
|
||||||
rootTablePane.getExplorerManager().setSelectedNodes(new Node[0]);
|
rootTablePane.getExplorerManager().setSelectedNodes(new Node[0]);
|
||||||
} catch (PropertyVetoException ex) {
|
} catch (PropertyVetoException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
logger.log(Level.WARNING, "Error setting selected nodes", ex);
|
||||||
}
|
}
|
||||||
showThreadsPane();
|
showThreadsPane();
|
||||||
}//GEN-LAST:event_backButtonActionPerformed
|
}//GEN-LAST:event_backButtonActionPerformed
|
||||||
|
@ -24,6 +24,7 @@ import java.util.logging.Level;
|
|||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
||||||
import org.sleuthkit.datamodel.Account;
|
import org.sleuthkit.datamodel.Account;
|
||||||
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
@ -51,9 +52,9 @@ public final class SelectionInfo {
|
|||||||
/**
|
/**
|
||||||
* Wraps the details of the currently selected accounts.
|
* Wraps the details of the currently selected accounts.
|
||||||
*
|
*
|
||||||
* @param selectedNodes Selected AccountDeviceInstances
|
* @param selectedNodes Selected AccountDeviceInstances
|
||||||
* @param selectedEdges Selected pairs of AccountDeviceInstances
|
* @param selectedEdges Selected pairs of AccountDeviceInstances
|
||||||
* @param communicationFilter Currently selected communications filters
|
* @param communicationFilter Currently selected communications filters
|
||||||
*/
|
*/
|
||||||
public SelectionInfo(Set<AccountDeviceInstance> selectedNodes, Set<GraphEdge> selectedEdges,
|
public SelectionInfo(Set<AccountDeviceInstance> selectedNodes, Set<GraphEdge> selectedEdges,
|
||||||
CommunicationsFilter communicationFilter) {
|
CommunicationsFilter communicationFilter) {
|
||||||
@ -102,6 +103,7 @@ public final class SelectionInfo {
|
|||||||
* Get the set of relationship sources from the case database
|
* Get the set of relationship sources from the case database
|
||||||
*
|
*
|
||||||
* @return the relationship sources (may be empty)
|
* @return the relationship sources (may be empty)
|
||||||
|
*
|
||||||
* @throws TskCoreException
|
* @throws TskCoreException
|
||||||
*/
|
*/
|
||||||
Set<Content> getRelationshipSources() throws TskCoreException {
|
Set<Content> getRelationshipSources() throws TskCoreException {
|
||||||
@ -131,7 +133,7 @@ public final class SelectionInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Set<BlackboardArtifact> getArtifacts() {
|
public Set<BlackboardArtifact> getArtifacts() {
|
||||||
if(accountArtifacts == null) {
|
if (accountArtifacts == null) {
|
||||||
accountArtifacts = new HashSet<>();
|
accountArtifacts = new HashSet<>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -149,45 +151,54 @@ public final class SelectionInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public SelectionSummary getSummary() {
|
public SelectionSummary getSummary() {
|
||||||
if(summary == null) {
|
if (summary == null) {
|
||||||
summary = new SelectionSummary();
|
summary = new SelectionSummary();
|
||||||
}
|
}
|
||||||
|
|
||||||
return summary;
|
return summary;
|
||||||
}
|
}
|
||||||
|
|
||||||
final class SelectionSummary{
|
final class SelectionSummary {
|
||||||
|
|
||||||
int attachmentCnt;
|
int attachmentCnt;
|
||||||
int messagesCnt;
|
int messagesCnt;
|
||||||
int emailCnt;
|
int emailCnt;
|
||||||
int callLogCnt;
|
int callLogCnt;
|
||||||
int contactsCnt;
|
int contactsCnt;
|
||||||
|
int mediaCnt;
|
||||||
|
|
||||||
SelectionSummary() {
|
SelectionSummary() {
|
||||||
getCounts();
|
getCounts();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getCounts(){
|
private void getCounts() {
|
||||||
for(BlackboardArtifact artifact: getArtifacts()) {
|
for (BlackboardArtifact artifact : getArtifacts()) {
|
||||||
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
|
||||||
if(null != fromID) switch (fromID) {
|
if (null != fromID) {
|
||||||
case TSK_EMAIL_MSG:
|
switch (fromID) {
|
||||||
emailCnt++;
|
case TSK_EMAIL_MSG:
|
||||||
break;
|
emailCnt++;
|
||||||
case TSK_CALLLOG:
|
break;
|
||||||
callLogCnt++;
|
case TSK_CALLLOG:
|
||||||
break;
|
callLogCnt++;
|
||||||
case TSK_MESSAGE:
|
break;
|
||||||
messagesCnt++;
|
case TSK_MESSAGE:
|
||||||
break;
|
messagesCnt++;
|
||||||
case TSK_CONTACT:
|
break;
|
||||||
contactsCnt++;
|
case TSK_CONTACT:
|
||||||
break;
|
contactsCnt++;
|
||||||
default:
|
break;
|
||||||
break;
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
try{
|
try {
|
||||||
attachmentCnt+= artifact.getChildrenCount();
|
attachmentCnt += artifact.getChildrenCount();
|
||||||
|
for (Content childContent : artifact.getChildren()) {
|
||||||
|
if (ImageUtils.thumbnailSupported(childContent)) {
|
||||||
|
mediaCnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
logger.log(Level.WARNING, String.format("Exception thrown "
|
logger.log(Level.WARNING, String.format("Exception thrown "
|
||||||
+ "from getChildrenCount artifactID: %d",
|
+ "from getChildrenCount artifactID: %d",
|
||||||
@ -215,12 +226,17 @@ public final class SelectionInfo {
|
|||||||
public int getContactsCnt() {
|
public int getContactsCnt() {
|
||||||
return contactsCnt;
|
return contactsCnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getThumbnailCnt() {
|
||||||
|
return mediaCnt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class to represent an edge from the graph visualization.
|
* Utility class to represent an edge from the graph visualization.
|
||||||
*/
|
*/
|
||||||
public static class GraphEdge {
|
public static class GraphEdge {
|
||||||
|
|
||||||
AccountDeviceInstance startNode;
|
AccountDeviceInstance startNode;
|
||||||
AccountDeviceInstance endNode;
|
AccountDeviceInstance endNode;
|
||||||
|
|
||||||
|
@ -41,16 +41,18 @@
|
|||||||
<Component id="messagesLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="messagesLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="callLogsLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="callLogsLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="contactsLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="contactsLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="attachmentsLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="thumbnailCntLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="attachmentsLable" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="attachmentsDataLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="attachmentDataLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="thumbnailsDataLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="contactsDataLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="contactsDataLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="callLogsDataLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="callLogsDataLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="messagesDataLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="messagesDataLabel" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace pref="959" max="32767" attributes="0"/>
|
<EmptySpace pref="845" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -74,10 +76,14 @@
|
|||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="attachmentsLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="thumbnailCntLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="attachmentsDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="thumbnailsDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="attachmentsLable" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="attachmentDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -104,17 +110,17 @@
|
|||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="attachmentsLabel">
|
<Component class="javax.swing.JLabel" name="thumbnailCntLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentsLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.thumbnailCntLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="attachmentsDataLabel">
|
<Component class="javax.swing.JLabel" name="thumbnailsDataLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentsDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.thumbnailsDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -139,6 +145,20 @@
|
|||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="attachmentsLable">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentsLable.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="attachmentDataLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Component class="org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel" name="fileReferencesPanel">
|
<Component class="org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel" name="fileReferencesPanel">
|
||||||
|
@ -104,10 +104,11 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
} else {
|
} else {
|
||||||
SelectionSummary summaryDetails = info.getSummary();
|
SelectionSummary summaryDetails = info.getSummary();
|
||||||
|
|
||||||
attachmentsDataLabel.setText(Integer.toString(summaryDetails.getAttachmentCnt()));
|
thumbnailsDataLabel.setText(Integer.toString(summaryDetails.getThumbnailCnt()));
|
||||||
callLogsDataLabel.setText(Integer.toString(summaryDetails.getCallLogCnt()));
|
callLogsDataLabel.setText(Integer.toString(summaryDetails.getCallLogCnt()));
|
||||||
contactsDataLabel.setText(Integer.toString(summaryDetails.getContactsCnt()));
|
contactsDataLabel.setText(Integer.toString(summaryDetails.getContactsCnt()));
|
||||||
messagesDataLabel.setText(Integer.toString(summaryDetails.getMessagesCnt() + summaryDetails.getEmailCnt()));
|
messagesDataLabel.setText(Integer.toString(summaryDetails.getMessagesCnt() + summaryDetails.getEmailCnt()));
|
||||||
|
attachmentDataLabel.setText(Integer.toString(summaryDetails.getAttachmentCnt()));
|
||||||
|
|
||||||
fileReferencesPanel.showOutlineView();
|
fileReferencesPanel.showOutlineView();
|
||||||
|
|
||||||
@ -131,7 +132,7 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
@Override
|
@Override
|
||||||
public void setEnabled(boolean enabled) {
|
public void setEnabled(boolean enabled) {
|
||||||
super.setEnabled(enabled);
|
super.setEnabled(enabled);
|
||||||
attachmentsLabel.setEnabled(enabled);
|
thumbnailCntLabel.setEnabled(enabled);
|
||||||
callLogsLabel.setEnabled(enabled);
|
callLogsLabel.setEnabled(enabled);
|
||||||
contactsLabel.setEnabled(enabled);
|
contactsLabel.setEnabled(enabled);
|
||||||
messagesLabel.setEnabled(enabled);
|
messagesLabel.setEnabled(enabled);
|
||||||
@ -144,10 +145,11 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
* Clears the text fields and OutlookViews.
|
* Clears the text fields and OutlookViews.
|
||||||
*/
|
*/
|
||||||
private void clearControls() {
|
private void clearControls() {
|
||||||
attachmentsDataLabel.setText("");
|
thumbnailsDataLabel.setText("");
|
||||||
callLogsDataLabel.setText("");
|
callLogsDataLabel.setText("");
|
||||||
contactsDataLabel.setText("");
|
contactsDataLabel.setText("");
|
||||||
messagesDataLabel.setText("");
|
messagesDataLabel.setText("");
|
||||||
|
attachmentDataLabel.setText("");
|
||||||
|
|
||||||
fileReferencesPanel.setNode(new AbstractNode(Children.LEAF));
|
fileReferencesPanel.setNode(new AbstractNode(Children.LEAF));
|
||||||
caseReferencesPanel.setNode(new AbstractNode(Children.LEAF));
|
caseReferencesPanel.setNode(new AbstractNode(Children.LEAF));
|
||||||
@ -187,11 +189,13 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
contactsLabel = new javax.swing.JLabel();
|
contactsLabel = new javax.swing.JLabel();
|
||||||
messagesLabel = new javax.swing.JLabel();
|
messagesLabel = new javax.swing.JLabel();
|
||||||
callLogsLabel = new javax.swing.JLabel();
|
callLogsLabel = new javax.swing.JLabel();
|
||||||
attachmentsLabel = new javax.swing.JLabel();
|
thumbnailCntLabel = new javax.swing.JLabel();
|
||||||
attachmentsDataLabel = new javax.swing.JLabel();
|
thumbnailsDataLabel = new javax.swing.JLabel();
|
||||||
messagesDataLabel = new javax.swing.JLabel();
|
messagesDataLabel = new javax.swing.JLabel();
|
||||||
callLogsDataLabel = new javax.swing.JLabel();
|
callLogsDataLabel = new javax.swing.JLabel();
|
||||||
contactsDataLabel = new javax.swing.JLabel();
|
contactsDataLabel = new javax.swing.JLabel();
|
||||||
|
attachmentsLable = new javax.swing.JLabel();
|
||||||
|
attachmentDataLabel = new javax.swing.JLabel();
|
||||||
fileReferencesPanel = new org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel();
|
fileReferencesPanel = new org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel();
|
||||||
caseReferencesPanel = new org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel();
|
caseReferencesPanel = new org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel();
|
||||||
|
|
||||||
@ -205,9 +209,9 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(callLogsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.callLogsLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(callLogsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.callLogsLabel.text")); // NOI18N
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(attachmentsLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentsLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(thumbnailCntLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.thumbnailCntLabel.text")); // NOI18N
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(attachmentsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentsDataLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(thumbnailsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.thumbnailsDataLabel.text")); // NOI18N
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(messagesDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.messagesDataLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(messagesDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.messagesDataLabel.text")); // NOI18N
|
||||||
|
|
||||||
@ -215,6 +219,10 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(contactsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.contactsDataLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(contactsDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.contactsDataLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(attachmentsLable, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentsLable.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(attachmentDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentDataLabel.text")); // NOI18N
|
||||||
|
|
||||||
javax.swing.GroupLayout countsPanelLayout = new javax.swing.GroupLayout(countsPanel);
|
javax.swing.GroupLayout countsPanelLayout = new javax.swing.GroupLayout(countsPanel);
|
||||||
countsPanel.setLayout(countsPanelLayout);
|
countsPanel.setLayout(countsPanelLayout);
|
||||||
countsPanelLayout.setHorizontalGroup(
|
countsPanelLayout.setHorizontalGroup(
|
||||||
@ -225,14 +233,16 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
.addComponent(messagesLabel)
|
.addComponent(messagesLabel)
|
||||||
.addComponent(callLogsLabel)
|
.addComponent(callLogsLabel)
|
||||||
.addComponent(contactsLabel)
|
.addComponent(contactsLabel)
|
||||||
.addComponent(attachmentsLabel))
|
.addComponent(thumbnailCntLabel)
|
||||||
|
.addComponent(attachmentsLable))
|
||||||
.addGap(18, 18, 18)
|
.addGap(18, 18, 18)
|
||||||
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(attachmentsDataLabel)
|
.addComponent(attachmentDataLabel)
|
||||||
|
.addComponent(thumbnailsDataLabel)
|
||||||
.addComponent(contactsDataLabel)
|
.addComponent(contactsDataLabel)
|
||||||
.addComponent(callLogsDataLabel)
|
.addComponent(callLogsDataLabel)
|
||||||
.addComponent(messagesDataLabel))
|
.addComponent(messagesDataLabel))
|
||||||
.addContainerGap(959, Short.MAX_VALUE))
|
.addContainerGap(845, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
countsPanelLayout.setVerticalGroup(
|
countsPanelLayout.setVerticalGroup(
|
||||||
countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
@ -251,9 +261,12 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
.addComponent(contactsDataLabel))
|
.addComponent(contactsDataLabel))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(attachmentsLabel)
|
.addComponent(thumbnailCntLabel)
|
||||||
.addComponent(attachmentsDataLabel))
|
.addComponent(thumbnailsDataLabel))
|
||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(attachmentsLable)
|
||||||
|
.addComponent(attachmentDataLabel)))
|
||||||
);
|
);
|
||||||
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
@ -287,8 +300,8 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private javax.swing.JLabel attachmentsDataLabel;
|
private javax.swing.JLabel attachmentDataLabel;
|
||||||
private javax.swing.JLabel attachmentsLabel;
|
private javax.swing.JLabel attachmentsLable;
|
||||||
private javax.swing.JLabel callLogsDataLabel;
|
private javax.swing.JLabel callLogsDataLabel;
|
||||||
private javax.swing.JLabel callLogsLabel;
|
private javax.swing.JLabel callLogsLabel;
|
||||||
private org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel caseReferencesPanel;
|
private org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel caseReferencesPanel;
|
||||||
@ -298,6 +311,8 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
|||||||
private org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel fileReferencesPanel;
|
private org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel fileReferencesPanel;
|
||||||
private javax.swing.JLabel messagesDataLabel;
|
private javax.swing.JLabel messagesDataLabel;
|
||||||
private javax.swing.JLabel messagesLabel;
|
private javax.swing.JLabel messagesLabel;
|
||||||
|
private javax.swing.JLabel thumbnailCntLabel;
|
||||||
|
private javax.swing.JLabel thumbnailsDataLabel;
|
||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2018 Basis Technology Corp.
|
* Copyright 2011-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-18 Basis Technology Corp.
|
* Copyright 2011-19 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -47,7 +47,6 @@ import org.openide.nodes.AbstractNode;
|
|||||||
import org.openide.nodes.Children;
|
import org.openide.nodes.Children;
|
||||||
import org.openide.nodes.FilterNode;
|
import org.openide.nodes.FilterNode;
|
||||||
import org.openide.nodes.Node;
|
import org.openide.nodes.Node;
|
||||||
import org.openide.util.Exceptions;
|
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.util.lookup.Lookups;
|
import org.openide.util.lookup.Lookups;
|
||||||
import org.sleuthkit.autopsy.corecomponents.ResultViewerPersistence.SortCriterion;
|
import org.sleuthkit.autopsy.corecomponents.ResultViewerPersistence.SortCriterion;
|
||||||
@ -197,7 +196,7 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} catch (IllegalAccessException | InvocationTargetException ex) {
|
} catch (IllegalAccessException | InvocationTargetException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
logger.log(Level.WARNING, "Error getting value for thumbnail children", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2012-2018 Basis Technology Corp.
|
* Copyright 2012-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@ -336,7 +336,6 @@ public abstract class AbstractAbstractFileNode<T extends AbstractFile> extends A
|
|||||||
backgroundTasksPool.submit(new GetSCOTask(
|
backgroundTasksPool.submit(new GetSCOTask(
|
||||||
new WeakReference<>(this), weakPcl));
|
new WeakReference<>(this), weakPcl));
|
||||||
|
|
||||||
properties.add(new NodeProperty<>(LOCATION.toString(), LOCATION.toString(), NO_DESCR, getContentPath(content)));
|
|
||||||
properties.add(new NodeProperty<>(MOD_TIME.toString(), MOD_TIME.toString(), NO_DESCR, ContentUtils.getStringTime(content.getMtime(), content)));
|
properties.add(new NodeProperty<>(MOD_TIME.toString(), MOD_TIME.toString(), NO_DESCR, ContentUtils.getStringTime(content.getMtime(), content)));
|
||||||
properties.add(new NodeProperty<>(CHANGED_TIME.toString(), CHANGED_TIME.toString(), NO_DESCR, ContentUtils.getStringTime(content.getCtime(), content)));
|
properties.add(new NodeProperty<>(CHANGED_TIME.toString(), CHANGED_TIME.toString(), NO_DESCR, ContentUtils.getStringTime(content.getCtime(), content)));
|
||||||
properties.add(new NodeProperty<>(ACCESS_TIME.toString(), ACCESS_TIME.toString(), NO_DESCR, ContentUtils.getStringTime(content.getAtime(), content)));
|
properties.add(new NodeProperty<>(ACCESS_TIME.toString(), ACCESS_TIME.toString(), NO_DESCR, ContentUtils.getStringTime(content.getAtime(), content)));
|
||||||
@ -345,6 +344,7 @@ public abstract class AbstractAbstractFileNode<T extends AbstractFile> extends A
|
|||||||
properties.add(new NodeProperty<>(FLAGS_DIR.toString(), FLAGS_DIR.toString(), NO_DESCR, content.getDirFlagAsString()));
|
properties.add(new NodeProperty<>(FLAGS_DIR.toString(), FLAGS_DIR.toString(), NO_DESCR, content.getDirFlagAsString()));
|
||||||
properties.add(new NodeProperty<>(FLAGS_META.toString(), FLAGS_META.toString(), NO_DESCR, content.getMetaFlagsAsString()));
|
properties.add(new NodeProperty<>(FLAGS_META.toString(), FLAGS_META.toString(), NO_DESCR, content.getMetaFlagsAsString()));
|
||||||
properties.add(new NodeProperty<>(KNOWN.toString(), KNOWN.toString(), NO_DESCR, content.getKnown().getName()));
|
properties.add(new NodeProperty<>(KNOWN.toString(), KNOWN.toString(), NO_DESCR, content.getKnown().getName()));
|
||||||
|
properties.add(new NodeProperty<>(LOCATION.toString(), LOCATION.toString(), NO_DESCR, getContentPath(content)));
|
||||||
properties.add(new NodeProperty<>(MD5HASH.toString(), MD5HASH.toString(), NO_DESCR, StringUtils.defaultString(content.getMd5Hash())));
|
properties.add(new NodeProperty<>(MD5HASH.toString(), MD5HASH.toString(), NO_DESCR, StringUtils.defaultString(content.getMd5Hash())));
|
||||||
properties.add(new NodeProperty<>(MIMETYPE.toString(), MIMETYPE.toString(), NO_DESCR, StringUtils.defaultString(content.getMIMEType())));
|
properties.add(new NodeProperty<>(MIMETYPE.toString(), MIMETYPE.toString(), NO_DESCR, StringUtils.defaultString(content.getMIMEType())));
|
||||||
properties.add(new NodeProperty<>(EXTENSION.toString(), EXTENSION.toString(), NO_DESCR, content.getNameExtension()));
|
properties.add(new NodeProperty<>(EXTENSION.toString(), EXTENSION.toString(), NO_DESCR, content.getNameExtension()));
|
||||||
|
@ -0,0 +1,209 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2019 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.datamodel.utils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
import org.sleuthkit.datamodel.Content;
|
||||||
|
import org.sleuthkit.datamodel.DataSource;
|
||||||
|
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||||
|
import org.sleuthkit.datamodel.SpecialDirectory;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
import org.sleuthkit.datamodel.TskData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class for adding local files with specified paths in the data source.
|
||||||
|
* It is currently assumed that the data source is empty to start or that at
|
||||||
|
* least the paths to the files being added do not exist; no checks will be done
|
||||||
|
* to see if folders exist prior to creating them through addLocalFile().
|
||||||
|
*/
|
||||||
|
public class LocalFileImporter {
|
||||||
|
private static final Logger logger = Logger.getLogger(LocalFileImporter.class.getName());
|
||||||
|
|
||||||
|
SleuthkitCase.CaseDbTransaction globalTrans = null;
|
||||||
|
boolean useSingleTransaction = true;
|
||||||
|
SleuthkitCase sleuthkitCase;
|
||||||
|
private final Map<String, SpecialDirectory> localFileDirMap = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a LocalFileImporter.
|
||||||
|
*
|
||||||
|
* @param sleuthkitCase The current SleuthkitCase
|
||||||
|
*/
|
||||||
|
public LocalFileImporter(SleuthkitCase sleuthkitCase) {
|
||||||
|
this.sleuthkitCase = sleuthkitCase;
|
||||||
|
this.useSingleTransaction = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a LocalFileImporter. The caller is responsible for committing
|
||||||
|
* or rolling back the transaction.
|
||||||
|
*
|
||||||
|
* @param sleuthkitCase The current SleuthkitCase
|
||||||
|
* @param trans The open CaseDbTransaction
|
||||||
|
*/
|
||||||
|
public LocalFileImporter(SleuthkitCase sleuthkitCase, SleuthkitCase.CaseDbTransaction trans) {
|
||||||
|
this.sleuthkitCase = sleuthkitCase;
|
||||||
|
this.globalTrans = trans;
|
||||||
|
this.useSingleTransaction = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a local file to the database with the specified parameters. Will create
|
||||||
|
* any necessary parent folders.
|
||||||
|
*
|
||||||
|
* Will not fail if the fileOnDisk does not exist.
|
||||||
|
*
|
||||||
|
* @param fileOnDisk The local file on disk
|
||||||
|
* @param name The name to use in the data source
|
||||||
|
* @param parentPath The path to use in the data source
|
||||||
|
* @param ctime Change time
|
||||||
|
* @param crtime Created time
|
||||||
|
* @param atime Access time
|
||||||
|
* @param mtime Modified time
|
||||||
|
* @param dataSource The data source to add the file to
|
||||||
|
*
|
||||||
|
* @return The AbstractFile that was just created
|
||||||
|
*
|
||||||
|
* @throws TskCoreException
|
||||||
|
*/
|
||||||
|
public AbstractFile addLocalFile(File fileOnDisk, String name, String parentPath,
|
||||||
|
Long ctime, Long crtime, Long atime, Long mtime,
|
||||||
|
DataSource dataSource) throws TskCoreException {
|
||||||
|
|
||||||
|
// Get the parent folder, creating it and any of its parent folders if necessary
|
||||||
|
SpecialDirectory parentDir = getOrMakeDirInDataSource(new File(parentPath), dataSource);
|
||||||
|
|
||||||
|
SleuthkitCase.CaseDbTransaction trans = null;
|
||||||
|
try {
|
||||||
|
if (useSingleTransaction) {
|
||||||
|
trans = globalTrans;
|
||||||
|
} else {
|
||||||
|
trans = sleuthkitCase.beginTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to get the file size
|
||||||
|
long size = 0;
|
||||||
|
if (fileOnDisk.exists()) {
|
||||||
|
size = fileOnDisk.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the new file
|
||||||
|
AbstractFile file = sleuthkitCase.addLocalFile(name, fileOnDisk.getAbsolutePath(), size,
|
||||||
|
ctime, crtime, atime, mtime,
|
||||||
|
true, TskData.EncodingType.NONE, parentDir, trans);
|
||||||
|
|
||||||
|
if (! useSingleTransaction) {
|
||||||
|
trans.commit();
|
||||||
|
}
|
||||||
|
return file;
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
if ((!useSingleTransaction) && (null != trans)) {
|
||||||
|
try {
|
||||||
|
trans.rollback();
|
||||||
|
} catch (TskCoreException ex2) {
|
||||||
|
logger.log(Level.SEVERE, String.format("Failed to rollback transaction after exception: %s", ex.getMessage()), ex2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the SpecialDirectory object corresponding to the given directory, creating
|
||||||
|
* it and its parents as needed.
|
||||||
|
*
|
||||||
|
* @param directory The file to get the SpecialDirectory for
|
||||||
|
* @param dataSource The data source
|
||||||
|
*
|
||||||
|
* @return The SpecialDirectory object corresponding to the given file
|
||||||
|
*
|
||||||
|
* @throws TskCoreException
|
||||||
|
*/
|
||||||
|
private SpecialDirectory getOrMakeDirInDataSource(File directory, Content dataSource) throws TskCoreException {
|
||||||
|
if ((directory == null) || directory.getPath().isEmpty()) {
|
||||||
|
throw new TskCoreException("Can not create directory from null path");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we've already created it
|
||||||
|
if (localFileDirMap.containsKey(directory.toString())) {
|
||||||
|
return localFileDirMap.get(directory.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
File parent = directory.getParentFile();
|
||||||
|
if (parent == null) {
|
||||||
|
// This is the root of the path and it isn't in the map, so create it
|
||||||
|
SpecialDirectory dir = createLocalFilesDir(dataSource.getId(), directory.getName());
|
||||||
|
localFileDirMap.put(directory.getName(), dir);
|
||||||
|
return dir;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Create everything above this in the tree, and then add the parent folder
|
||||||
|
SpecialDirectory parentDir = getOrMakeDirInDataSource(parent, dataSource);
|
||||||
|
SpecialDirectory dir = createLocalFilesDir(parentDir.getId(), directory.getName());
|
||||||
|
localFileDirMap.put(directory.getPath(), dir);
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new LocalDirectory
|
||||||
|
*
|
||||||
|
* @param parentId The object ID for parent
|
||||||
|
* @param name The name of the new local directory
|
||||||
|
*
|
||||||
|
* @return The new LocalDirectory
|
||||||
|
*
|
||||||
|
* @throws TskCoreException
|
||||||
|
*/
|
||||||
|
private SpecialDirectory createLocalFilesDir(long parentId, String name) throws TskCoreException {
|
||||||
|
SleuthkitCase.CaseDbTransaction trans = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (useSingleTransaction) {
|
||||||
|
trans = globalTrans;
|
||||||
|
} else {
|
||||||
|
trans = sleuthkitCase.beginTransaction();
|
||||||
|
}
|
||||||
|
SpecialDirectory dir;
|
||||||
|
|
||||||
|
dir = sleuthkitCase.addLocalDirectory(parentId, name, trans);
|
||||||
|
|
||||||
|
if (! useSingleTransaction) {
|
||||||
|
trans.commit();
|
||||||
|
}
|
||||||
|
return dir;
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
if (( !useSingleTransaction) && (null != trans)) {
|
||||||
|
try {
|
||||||
|
trans.rollback();
|
||||||
|
} catch (TskCoreException ex2) {
|
||||||
|
logger.log(Level.SEVERE, String.format("Failed to rollback transaction after exception: %s", ex.getMessage()), ex2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -179,9 +179,7 @@ public class DataResultFilterNode extends FilterNode {
|
|||||||
newPs.setShortDescription(ps.getShortDescription());
|
newPs.setShortDescription(ps.getShortDescription());
|
||||||
|
|
||||||
newPs.put(ps.getProperties());
|
newPs.put(ps.getProperties());
|
||||||
if (newPs.remove(AbstractFsContentNode.HIDE_PARENT) != null) {
|
newPs.remove(AbstractFsContentNode.HIDE_PARENT);
|
||||||
newPs.remove(AbstractFilePropertyType.LOCATION.toString());
|
|
||||||
}
|
|
||||||
propertySets[i] = newPs;
|
propertySets[i] = newPs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2017 Basis Technology Corp.
|
* Copyright 2011-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -24,9 +24,10 @@ import java.nio.file.Files;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
import org.openide.util.Exceptions;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
|
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
|
||||||
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||||
|
|
||||||
@ -40,7 +41,7 @@ public final class IngestProfiles {
|
|||||||
private static final String PROFILE_DESC_KEY = "Profile_Description";
|
private static final String PROFILE_DESC_KEY = "Profile_Description";
|
||||||
private static final String PROFILE_FILTER_KEY = "Profile_Filter";
|
private static final String PROFILE_FILTER_KEY = "Profile_Filter";
|
||||||
private static final String PROFILE_FILE_EXT = ".properties";
|
private static final String PROFILE_FILE_EXT = ".properties";
|
||||||
|
private static final Logger logger = Logger.getLogger(IngestProfiles.class.getName());
|
||||||
/**
|
/**
|
||||||
* Gets the collection of profiles which currently exist.
|
* Gets the collection of profiles which currently exist.
|
||||||
*
|
*
|
||||||
@ -143,7 +144,7 @@ public final class IngestProfiles {
|
|||||||
Files.deleteIfExists(Paths.get(PlatformUtil.getUserConfigDirectory(), selectedProfile.getName() + PROFILE_FILE_EXT));
|
Files.deleteIfExists(Paths.get(PlatformUtil.getUserConfigDirectory(), selectedProfile.getName() + PROFILE_FILE_EXT));
|
||||||
FileUtils.deleteDirectory(IngestJobSettings.getSavedModuleSettingsFolder(selectedProfile.getName() + File.separator).toFile());
|
FileUtils.deleteDirectory(IngestJobSettings.getSavedModuleSettingsFolder(selectedProfile.getName() + File.separator).toFile());
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
logger.log(Level.WARNING, "Error deleting directory for profile " + selectedProfile.getName(), ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2018 Basis Technology Corp.
|
* Copyright 2011-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -22,12 +22,14 @@ import org.sleuthkit.autopsy.ingest.runIngestModuleWizard.RunIngestModulesAction
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JMenuItem;
|
import javax.swing.JMenuItem;
|
||||||
import org.openide.awt.DynamicMenuContent;
|
import org.openide.awt.DynamicMenuContent;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
@ -37,6 +39,8 @@ import org.sleuthkit.datamodel.TskCoreException;
|
|||||||
*/
|
*/
|
||||||
final class RunIngestSubMenu extends JMenuItem implements DynamicMenuContent {
|
final class RunIngestSubMenu extends JMenuItem implements DynamicMenuContent {
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(RunIngestSubMenu.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates main menu/popup menu items. It's called each time a popup menu is
|
* Creates main menu/popup menu items. It's called each time a popup menu is
|
||||||
* constructed and just once for the main menu. Main menu updates happen
|
* constructed and just once for the main menu. Main menu updates happen
|
||||||
@ -54,7 +58,7 @@ final class RunIngestSubMenu extends JMenuItem implements DynamicMenuContent {
|
|||||||
// No open Cases, create a disabled empty menu
|
// No open Cases, create a disabled empty menu
|
||||||
return getEmpty();
|
return getEmpty();
|
||||||
} catch (TskCoreException | NoCurrentCaseException e) {
|
} catch (TskCoreException | NoCurrentCaseException e) {
|
||||||
System.out.println("Exception getting images: " + e.getMessage()); //NON-NLS
|
logger.log(Level.INFO, "Exception getting images: " + e.getMessage());
|
||||||
}
|
}
|
||||||
JComponent[] comps = new JComponent[dataSources.size()];
|
JComponent[] comps = new JComponent[dataSources.size()];
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ EditNonFullPathsRulePanel.minSizeCheckbox.text=Minimum size:
|
|||||||
NewRulePanel.chooseLabel.text=Choose the type of rule
|
NewRulePanel.chooseLabel.text=Choose the type of rule
|
||||||
ConfigVisualPanel1.configureDriveRadioButton.text_1=Configure selected external drive:
|
ConfigVisualPanel1.configureDriveRadioButton.text_1=Configure selected external drive:
|
||||||
ConfigVisualPanel1.configureFolderRadioButton.text_1=Configure in a folder:
|
ConfigVisualPanel1.configureFolderRadioButton.text_1=Configure in a folder:
|
||||||
ConfigVisualPanel1.descriptionTextArea.text=Select a location for the Logical Imager. This location will contain the imaging program and a configuration file. If that location already contains a configuration file, it will be loaded to edit. Imaging results will be saved to this location, so ensure it has enough free space.
|
ConfigVisualPanel1.descriptionTextArea.text=Select a location for the Logical Imager. This location will contain the imaging program and a configuration file. If that location already contains a configuration file, it will be loaded to edit. Imaging results will be saved to this location, so ensure it has enough free space. Drives with FAT format are not supported.
|
||||||
ConfigVisualPanel1.refreshButton.text=Refresh
|
ConfigVisualPanel1.refreshButton.text=Refresh
|
||||||
ConfigVisualPanel3.saveButton.text=Save
|
ConfigVisualPanel3.saveButton.text=Save
|
||||||
ConfigVisualPanel3.configLabel.text=Logical Imager config file save status:
|
ConfigVisualPanel3.configLabel.text=Logical Imager config file save status:
|
||||||
@ -122,3 +122,4 @@ EditNonFullPathsRulePanel.fileNamesInfoLabel.text=File names are case insensitiv
|
|||||||
EditNonFullPathsRulePanel.extensionsInfoLabel.text=Extensions are case insensitive.
|
EditNonFullPathsRulePanel.extensionsInfoLabel.text=Extensions are case insensitive.
|
||||||
ConfigVisualPanel2.promptBeforeExit.text=Prompt before exiting imager
|
ConfigVisualPanel2.promptBeforeExit.text=Prompt before exiting imager
|
||||||
ConfigVisualPanel2.promptBeforeExit.actionCommand=
|
ConfigVisualPanel2.promptBeforeExit.actionCommand=
|
||||||
|
ConfigVisualPanel2.createVHDCheckBox.text=Create VHD
|
||||||
|
@ -26,10 +26,16 @@ ConfigVisualPanel1.chooseFileTitle=Select a Logical Imager configuration
|
|||||||
# {0} - filename
|
# {0} - filename
|
||||||
ConfigVisualPanel1.configFileIsEmpty=Configuration file {0} is empty
|
ConfigVisualPanel1.configFileIsEmpty=Configuration file {0} is empty
|
||||||
ConfigVisualPanel1.configurationError=Configuration error
|
ConfigVisualPanel1.configurationError=Configuration error
|
||||||
|
# {0} - root
|
||||||
|
# {1} - description
|
||||||
|
# {2} - size with unit
|
||||||
|
# {3} - file system
|
||||||
|
ConfigVisualPanel1.driveListItem={0} ({1}) ({2}) - File system: {3}
|
||||||
ConfigVisualPanel1.fileNameExtensionFilter=Configuration JSON File
|
ConfigVisualPanel1.fileNameExtensionFilter=Configuration JSON File
|
||||||
ConfigVisualPanel1.invalidConfigJson=Invalid config JSON:
|
ConfigVisualPanel1.invalidConfigJson=Invalid config JSON:
|
||||||
ConfigVisualPanel1.messageLabel.noExternalDriveFound=No drive found
|
ConfigVisualPanel1.messageLabel.noExternalDriveFound=No drive found
|
||||||
ConfigVisualPanel1.selectConfigurationFile=Select location
|
ConfigVisualPanel1.selectConfigurationFile=Select location
|
||||||
|
ConfigVisualPanel1.unknown=Unknown
|
||||||
ConfigVisualPanel2.cancel=Cancel
|
ConfigVisualPanel2.cancel=Cancel
|
||||||
ConfigVisualPanel2.deleteRuleSet=Delete rule
|
ConfigVisualPanel2.deleteRuleSet=Delete rule
|
||||||
ConfigVisualPanel2.deleteRuleSetConfirmation=Delete rule confirmation
|
ConfigVisualPanel2.deleteRuleSetConfirmation=Delete rule confirmation
|
||||||
@ -174,7 +180,7 @@ LogicalImagerConfigDeserializer.unsupportedKeyException=Unsupported key: {0}
|
|||||||
NewRulePanel.chooseLabel.text=Choose the type of rule
|
NewRulePanel.chooseLabel.text=Choose the type of rule
|
||||||
ConfigVisualPanel1.configureDriveRadioButton.text_1=Configure selected external drive:
|
ConfigVisualPanel1.configureDriveRadioButton.text_1=Configure selected external drive:
|
||||||
ConfigVisualPanel1.configureFolderRadioButton.text_1=Configure in a folder:
|
ConfigVisualPanel1.configureFolderRadioButton.text_1=Configure in a folder:
|
||||||
ConfigVisualPanel1.descriptionTextArea.text=Select a location for the Logical Imager. This location will contain the imaging program and a configuration file. If that location already contains a configuration file, it will be loaded to edit. Imaging results will be saved to this location, so ensure it has enough free space.
|
ConfigVisualPanel1.descriptionTextArea.text=Select a location for the Logical Imager. This location will contain the imaging program and a configuration file. If that location already contains a configuration file, it will be loaded to edit. Imaging results will be saved to this location, so ensure it has enough free space. Drives with FAT format are not supported.
|
||||||
ConfigVisualPanel1.refreshButton.text=Refresh
|
ConfigVisualPanel1.refreshButton.text=Refresh
|
||||||
ConfigVisualPanel3.saveButton.text=Save
|
ConfigVisualPanel3.saveButton.text=Save
|
||||||
ConfigVisualPanel3.configLabel.text=Logical Imager config file save status:
|
ConfigVisualPanel3.configLabel.text=Logical Imager config file save status:
|
||||||
@ -191,6 +197,7 @@ EditNonFullPathsRulePanel.fileNamesInfoLabel.text=File names are case insensitiv
|
|||||||
EditNonFullPathsRulePanel.extensionsInfoLabel.text=Extensions are case insensitive.
|
EditNonFullPathsRulePanel.extensionsInfoLabel.text=Extensions are case insensitive.
|
||||||
ConfigVisualPanel2.promptBeforeExit.text=Prompt before exiting imager
|
ConfigVisualPanel2.promptBeforeExit.text=Prompt before exiting imager
|
||||||
ConfigVisualPanel2.promptBeforeExit.actionCommand=
|
ConfigVisualPanel2.promptBeforeExit.actionCommand=
|
||||||
|
ConfigVisualPanel2.createVHDCheckBox.text=Create VHD
|
||||||
NewRuleSetPanel.attributeRule.description=Search for files based on one or more attributes or metadata fields.
|
NewRuleSetPanel.attributeRule.description=Search for files based on one or more attributes or metadata fields.
|
||||||
NewRuleSetPanel.attributeRule.name=Attribute
|
NewRuleSetPanel.attributeRule.name=Attribute
|
||||||
NewRuleSetPanel.fullPathRule.description=Search for files based on full exact match path.
|
NewRuleSetPanel.fullPathRule.description=Search for files based on full exact match path.
|
||||||
|
@ -29,7 +29,11 @@ import java.io.IOException;
|
|||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.FileStore;
|
import java.nio.file.FileStore;
|
||||||
|
import java.nio.file.FileSystem;
|
||||||
|
import java.nio.file.FileSystems;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.spi.FileSystemProvider;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@ -241,10 +245,31 @@ final class ConfigVisualPanel1 extends JPanel {
|
|||||||
firePropertyChange(UPDATE_UI_EVENT_NAME, false, true); // NON-NLS
|
firePropertyChange(UPDATE_UI_EVENT_NAME, false, true); // NON-NLS
|
||||||
}//GEN-LAST:event_driveListMouseReleasedSelection
|
}//GEN-LAST:event_driveListMouseReleasedSelection
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the Windows file system name of the drive
|
||||||
|
* @param drive File system drive, should be of the form "C:\"
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Messages({"ConfigVisualPanel1.unknown=Unknown"})
|
||||||
|
private String getFileSystemName(String drive) {
|
||||||
|
FileSystem fileSystem = FileSystems.getDefault();
|
||||||
|
FileSystemProvider provider = fileSystem.provider();
|
||||||
|
try {
|
||||||
|
FileStore fileStore = provider.getFileStore(Paths.get(drive));
|
||||||
|
return fileStore.type();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
return Bundle.ConfigVisualPanel1_unknown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Refresh the list of local drives on the current machine
|
* Refresh the list of local drives on the current machine
|
||||||
*/
|
*/
|
||||||
@Messages({"ConfigVisualPanel1.messageLabel.noExternalDriveFound=No drive found"})
|
@NbBundle.Messages({
|
||||||
|
"ConfigVisualPanel1.messageLabel.noExternalDriveFound=No drive found",
|
||||||
|
"# {0} - root", "# {1} - description", "# {2} - size with unit", "# {3} - file system",
|
||||||
|
"ConfigVisualPanel1.driveListItem={0} ({1}) ({2}) - File system: {3}"
|
||||||
|
})
|
||||||
private void refreshDriveList() {
|
private void refreshDriveList() {
|
||||||
List<String> listData = new ArrayList<>();
|
List<String> listData = new ArrayList<>();
|
||||||
File[] roots = File.listRoots();
|
File[] roots = File.listRoots();
|
||||||
@ -257,7 +282,8 @@ final class ConfigVisualPanel1 extends JPanel {
|
|||||||
String description = FileSystemView.getFileSystemView().getSystemTypeDescription(root);
|
String description = FileSystemView.getFileSystemView().getSystemTypeDescription(root);
|
||||||
long spaceInBytes = root.getTotalSpace();
|
long spaceInBytes = root.getTotalSpace();
|
||||||
String sizeWithUnit = DriveListUtils.humanReadableByteCount(spaceInBytes, false);
|
String sizeWithUnit = DriveListUtils.humanReadableByteCount(spaceInBytes, false);
|
||||||
listData.add(root + " (" + description + ") (" + sizeWithUnit + ")");
|
String fileSystem = getFileSystemName(root.toString());
|
||||||
|
listData.add(Bundle.ConfigVisualPanel1_driveListItem(root, description, sizeWithUnit, fileSystem));
|
||||||
if (firstRemovableDrive == -1) {
|
if (firstRemovableDrive == -1) {
|
||||||
try {
|
try {
|
||||||
FileStore fileStore = Files.getFileStore(root.toPath());
|
FileStore fileStore = Files.getFileStore(root.toPath());
|
||||||
@ -266,7 +292,7 @@ final class ConfigVisualPanel1 extends JPanel {
|
|||||||
}
|
}
|
||||||
} catch (IOException ignored) {
|
} catch (IOException ignored) {
|
||||||
//unable to get this removable drive for default selection will try and select next removable drive by default
|
//unable to get this removable drive for default selection will try and select next removable drive by default
|
||||||
logger.log(Level.INFO, "Unable to select first removable drive found", ignored);
|
logger.log(Level.INFO, String.format("Unable to select first removable drive found %s", root.toString())); // NON-NLS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
@ -431,8 +457,7 @@ final class ConfigVisualPanel1 extends JPanel {
|
|||||||
return UPDATE_UI_EVENT_NAME;
|
return UPDATE_UI_EVENT_NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setConfigFilename(String filename
|
void setConfigFilename(String filename) {
|
||||||
) {
|
|
||||||
configFileTextField.setText(filename);
|
configFileTextField.setText(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,9 +467,11 @@ final class ConfigVisualPanel1 extends JPanel {
|
|||||||
* @return true if panel has valid settings selected, false otherwise
|
* @return true if panel has valid settings selected, false otherwise
|
||||||
*/
|
*/
|
||||||
boolean isPanelValid() {
|
boolean isPanelValid() {
|
||||||
return !StringUtils.isBlank(getConfigPath()) && ((configureDriveRadioButton.isSelected() && !StringUtils.isBlank(driveList.getSelectedValue()))
|
return !StringUtils.isBlank(getConfigPath())
|
||||||
|| (configureFolderRadioButton.isSelected() && (!configFileTextField.getText().isEmpty())));
|
&& !(getFileSystemName(getConfigPath().substring(0, 3)).equals("FAT") // NON-NLS
|
||||||
|
|| getFileSystemName(getConfigPath().substring(0, 3)).equals("FAT32")) // NON-NLS
|
||||||
|
&& ((configureDriveRadioButton.isSelected() && !StringUtils.isBlank(driveList.getSelectedValue()))
|
||||||
|
|| (configureFolderRadioButton.isSelected() && (!configFileTextField.getText().isEmpty())));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -103,6 +103,7 @@
|
|||||||
<Component id="flagEncryptionProgramsCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="flagEncryptionProgramsCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="finalizeImageWriter" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="finalizeImageWriter" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="promptBeforeExit" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="promptBeforeExit" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="createVHDCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
@ -193,7 +194,8 @@
|
|||||||
<Component id="finalizeImageWriter" min="-2" max="-2" attributes="0"/>
|
<Component id="finalizeImageWriter" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="promptBeforeExit" min="-2" max="-2" attributes="0"/>
|
<Component id="promptBeforeExit" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" pref="21" max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="createVHDCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
@ -582,5 +584,15 @@
|
|||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="promptBeforeExitActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="promptBeforeExitActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="createVHDCheckBox">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/configuration/Bundle.properties" key="ConfigVisualPanel2.createVHDCheckBox.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="createVHDCheckBoxActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Form>
|
</Form>
|
||||||
|
@ -111,6 +111,7 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
maxSizeLabel = new javax.swing.JLabel();
|
maxSizeLabel = new javax.swing.JLabel();
|
||||||
maxSizeTextField = new javax.swing.JFormattedTextField();
|
maxSizeTextField = new javax.swing.JFormattedTextField();
|
||||||
promptBeforeExit = new javax.swing.JCheckBox();
|
promptBeforeExit = new javax.swing.JCheckBox();
|
||||||
|
createVHDCheckBox = new javax.swing.JCheckBox();
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(modifiedDateLabel, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.modifiedDateLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(modifiedDateLabel, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.modifiedDateLabel.text")); // NOI18N
|
||||||
|
|
||||||
@ -264,6 +265,13 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(createVHDCheckBox, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.createVHDCheckBox.text")); // NOI18N
|
||||||
|
createVHDCheckBox.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
createVHDCheckBoxActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
this.setLayout(layout);
|
this.setLayout(layout);
|
||||||
layout.setHorizontalGroup(
|
layout.setHorizontalGroup(
|
||||||
@ -338,7 +346,8 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(flagEncryptionProgramsCheckBox)
|
.addComponent(flagEncryptionProgramsCheckBox)
|
||||||
.addComponent(finalizeImageWriter)
|
.addComponent(finalizeImageWriter)
|
||||||
.addComponent(promptBeforeExit))
|
.addComponent(promptBeforeExit)
|
||||||
|
.addComponent(createVHDCheckBox))
|
||||||
.addGap(0, 0, Short.MAX_VALUE))
|
.addGap(0, 0, Short.MAX_VALUE))
|
||||||
.addComponent(jSeparator1)))))
|
.addComponent(jSeparator1)))))
|
||||||
);
|
);
|
||||||
@ -412,7 +421,8 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
.addComponent(finalizeImageWriter)
|
.addComponent(finalizeImageWriter)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(promptBeforeExit)
|
.addComponent(promptBeforeExit)
|
||||||
.addGap(21, 21, 21))))
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(createVHDCheckBox))))
|
||||||
);
|
);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
@ -546,6 +556,10 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
config.setPromptBeforeExit(promptBeforeExit.isSelected());
|
config.setPromptBeforeExit(promptBeforeExit.isSelected());
|
||||||
}//GEN-LAST:event_promptBeforeExitActionPerformed
|
}//GEN-LAST:event_promptBeforeExitActionPerformed
|
||||||
|
|
||||||
|
private void createVHDCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createVHDCheckBoxActionPerformed
|
||||||
|
config.setCreateVHD(createVHDCheckBox.isSelected());
|
||||||
|
}//GEN-LAST:event_createVHDCheckBoxActionPerformed
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the whether the a rule for detecting encryption programs will be
|
* Set the whether the a rule for detecting encryption programs will be
|
||||||
* added to the rules in this config
|
* added to the rules in this config
|
||||||
@ -588,6 +602,7 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private javax.swing.JTextField configFileTextField;
|
private javax.swing.JTextField configFileTextField;
|
||||||
|
private javax.swing.JCheckBox createVHDCheckBox;
|
||||||
private javax.swing.JLabel daysIncludedLabel;
|
private javax.swing.JLabel daysIncludedLabel;
|
||||||
private javax.swing.JButton deleteRuleButton;
|
private javax.swing.JButton deleteRuleButton;
|
||||||
private javax.swing.JTextField descriptionEditTextField;
|
private javax.swing.JTextField descriptionEditTextField;
|
||||||
@ -638,13 +653,14 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
* Update the panel to reflect the rules in the current config
|
* Update the panel to reflect the rules in the current config
|
||||||
*
|
*
|
||||||
* @param configFilePath path of the config file being modified
|
* @param configFilePath path of the config file being modified
|
||||||
* @param config contents of the config file being modifed
|
* @param config contents of the config file being modified
|
||||||
* @param rowSelectionkey the name of the rule to select by default
|
* @param rowSelectionkey the name of the rule to select by default
|
||||||
*/
|
*/
|
||||||
private void updatePanel(String configFilePath, LogicalImagerConfig config, String rowSelectionkey) {
|
private void updatePanel(String configFilePath, LogicalImagerConfig config, String rowSelectionkey) {
|
||||||
configFileTextField.setText(configFilePath);
|
configFileTextField.setText(configFilePath);
|
||||||
finalizeImageWriter.setSelected(config.isFinalizeImageWriter());
|
finalizeImageWriter.setSelected(config.isFinalizeImageWriter());
|
||||||
promptBeforeExit.setSelected(config.isPromptBeforeExit());
|
promptBeforeExit.setSelected(config.isPromptBeforeExit());
|
||||||
|
createVHDCheckBox.setSelected(config.isCreateVHD());
|
||||||
LogicalImagerRuleSet ruleSet = getRuleSetFromCurrentConfig();
|
LogicalImagerRuleSet ruleSet = getRuleSetFromCurrentConfig();
|
||||||
flagEncryptionProgramsCheckBox.setSelected(ruleSet.find(EncryptionProgramsRule.getName()) != null);
|
flagEncryptionProgramsCheckBox.setSelected(ruleSet.find(EncryptionProgramsRule.getName()) != null);
|
||||||
RulesTableModel rulesTableModel = new RulesTableModel();
|
RulesTableModel rulesTableModel = new RulesTableModel();
|
||||||
|
@ -42,6 +42,10 @@ class LogicalImagerConfig {
|
|||||||
@Expose(serialize = true)
|
@Expose(serialize = true)
|
||||||
private boolean promptBeforeExit;
|
private boolean promptBeforeExit;
|
||||||
|
|
||||||
|
@SerializedName("create-VHD")
|
||||||
|
@Expose(serialize = true)
|
||||||
|
private boolean createVHD;
|
||||||
|
|
||||||
@SerializedName("rule-sets")
|
@SerializedName("rule-sets")
|
||||||
@Expose(serialize = true)
|
@Expose(serialize = true)
|
||||||
private List<LogicalImagerRuleSet> ruleSets;
|
private List<LogicalImagerRuleSet> ruleSets;
|
||||||
@ -50,6 +54,7 @@ class LogicalImagerConfig {
|
|||||||
this.version = CURRENT_VERSION;
|
this.version = CURRENT_VERSION;
|
||||||
this.finalizeImageWriter = false;
|
this.finalizeImageWriter = false;
|
||||||
this.promptBeforeExit = true;
|
this.promptBeforeExit = true;
|
||||||
|
this.createVHD = false;
|
||||||
this.ruleSets = new ArrayList<>();
|
this.ruleSets = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,6 +65,7 @@ class LogicalImagerConfig {
|
|||||||
this.version = CURRENT_VERSION;
|
this.version = CURRENT_VERSION;
|
||||||
this.finalizeImageWriter = finalizeImageWriter;
|
this.finalizeImageWriter = finalizeImageWriter;
|
||||||
this.promptBeforeExit = true;
|
this.promptBeforeExit = true;
|
||||||
|
this.createVHD = false;
|
||||||
this.ruleSets = ruleSets;
|
this.ruleSets = ruleSets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,6 +77,7 @@ class LogicalImagerConfig {
|
|||||||
this.version = version;
|
this.version = version;
|
||||||
this.finalizeImageWriter = finalizeImageWriter;
|
this.finalizeImageWriter = finalizeImageWriter;
|
||||||
this.promptBeforeExit = true;
|
this.promptBeforeExit = true;
|
||||||
|
this.createVHD = false;
|
||||||
this.ruleSets = ruleSets;
|
this.ruleSets = ruleSets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,11 +85,13 @@ class LogicalImagerConfig {
|
|||||||
String version,
|
String version,
|
||||||
boolean finalizeImageWriter,
|
boolean finalizeImageWriter,
|
||||||
boolean promptBeforeExit,
|
boolean promptBeforeExit,
|
||||||
|
boolean createVHD,
|
||||||
List<LogicalImagerRuleSet> ruleSets
|
List<LogicalImagerRuleSet> ruleSets
|
||||||
) {
|
) {
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.finalizeImageWriter = finalizeImageWriter;
|
this.finalizeImageWriter = finalizeImageWriter;
|
||||||
this.promptBeforeExit = promptBeforeExit;
|
this.promptBeforeExit = promptBeforeExit;
|
||||||
|
this.createVHD = createVHD;
|
||||||
this.ruleSets = ruleSets;
|
this.ruleSets = ruleSets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,6 +123,14 @@ class LogicalImagerConfig {
|
|||||||
this.promptBeforeExit = promptBeforeExit;
|
this.promptBeforeExit = promptBeforeExit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isCreateVHD() {
|
||||||
|
return createVHD;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCreateVHD(boolean createVHD) {
|
||||||
|
this.createVHD = createVHD;
|
||||||
|
}
|
||||||
|
|
||||||
List<LogicalImagerRuleSet> getRuleSets() {
|
List<LogicalImagerRuleSet> getRuleSets() {
|
||||||
return ruleSets;
|
return ruleSets;
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,7 @@ class LogicalImagerConfigDeserializer implements JsonDeserializer<LogicalImagerC
|
|||||||
String version = LogicalImagerConfig.getCurrentVersion();
|
String version = LogicalImagerConfig.getCurrentVersion();
|
||||||
boolean finalizeImageWriter = false;
|
boolean finalizeImageWriter = false;
|
||||||
boolean promptBeforeExit = true;
|
boolean promptBeforeExit = true;
|
||||||
|
boolean createVHD = false;
|
||||||
|
|
||||||
final JsonObject jsonObject = je.getAsJsonObject();
|
final JsonObject jsonObject = je.getAsJsonObject();
|
||||||
final JsonElement jsonVersion = jsonObject.get("version"); // NON-NLS
|
final JsonElement jsonVersion = jsonObject.get("version"); // NON-NLS
|
||||||
@ -63,6 +64,11 @@ class LogicalImagerConfigDeserializer implements JsonDeserializer<LogicalImagerC
|
|||||||
promptBeforeExit = jsonPromptBeforeExit.getAsBoolean();
|
promptBeforeExit = jsonPromptBeforeExit.getAsBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final JsonElement jsonCreateVHD = jsonObject.get("create-VHD"); // NON-NLS
|
||||||
|
if (jsonCreateVHD != null) {
|
||||||
|
createVHD = jsonCreateVHD.getAsBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
JsonArray asJsonArray = jsonObject.get("rule-sets").getAsJsonArray(); // NON-NLS
|
JsonArray asJsonArray = jsonObject.get("rule-sets").getAsJsonArray(); // NON-NLS
|
||||||
if (asJsonArray == null) {
|
if (asJsonArray == null) {
|
||||||
throw new JsonParseException(Bundle.LogicalImagerConfigDeserializer_missingRuleSetException());
|
throw new JsonParseException(Bundle.LogicalImagerConfigDeserializer_missingRuleSetException());
|
||||||
@ -80,7 +86,7 @@ class LogicalImagerConfigDeserializer implements JsonDeserializer<LogicalImagerC
|
|||||||
LogicalImagerRuleSet ruleSet = new LogicalImagerRuleSet(setName, rules);
|
LogicalImagerRuleSet ruleSet = new LogicalImagerRuleSet(setName, rules);
|
||||||
ruleSets.add(ruleSet);
|
ruleSets.add(ruleSet);
|
||||||
}
|
}
|
||||||
return new LogicalImagerConfig(version, finalizeImageWriter, promptBeforeExit, ruleSets);
|
return new LogicalImagerConfig(version, finalizeImageWriter, promptBeforeExit, createVHD, ruleSets);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<LogicalImagerRule> parseRules(JsonArray asJsonArray) {
|
private List<LogicalImagerRule> parseRules(JsonArray asJsonArray) {
|
||||||
|
@ -31,19 +31,21 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.casemodule.services.Blackboard;
|
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.ingest.IngestServices;
|
import org.sleuthkit.autopsy.datamodel.utils.LocalFileImporter;
|
||||||
import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
|
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
import org.sleuthkit.datamodel.Blackboard;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
|
import org.sleuthkit.datamodel.LocalFilesDataSource;
|
||||||
|
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,12 +53,16 @@ import org.sleuthkit.datamodel.TskCoreException;
|
|||||||
* SearchResults.txt and users.txt files to report - add an image data source to the
|
* SearchResults.txt and users.txt files to report - add an image data source to the
|
||||||
* case database.
|
* case database.
|
||||||
*/
|
*/
|
||||||
final class AddLogicalImageTask extends AddMultipleImageTask {
|
final class AddLogicalImageTask implements Runnable {
|
||||||
|
|
||||||
private final static Logger LOGGER = Logger.getLogger(AddLogicalImageTask.class.getName());
|
private final static Logger LOGGER = Logger.getLogger(AddLogicalImageTask.class.getName());
|
||||||
private final static String SEARCH_RESULTS_TXT = "SearchResults.txt"; //NON-NLS
|
private final static String SEARCH_RESULTS_TXT = "SearchResults.txt"; //NON-NLS
|
||||||
private final static String USERS_TXT = "users.txt"; //NON-NLS
|
private final static String USERS_TXT = "users.txt"; //NON-NLS
|
||||||
private final static String MODULE_NAME = "Logical Imager"; //NON-NLS
|
private final static String MODULE_NAME = "Logical Imager"; //NON-NLS
|
||||||
|
private final static String ROOT_STR = "root"; // NON-NLS
|
||||||
|
private final static String VHD_EXTENSION = ".vhd"; // NON-NLS
|
||||||
|
private final String deviceId;
|
||||||
|
private final String timeZone;
|
||||||
private final File src;
|
private final File src;
|
||||||
private final File dest;
|
private final File dest;
|
||||||
private final DataSourceProcessorCallback callback;
|
private final DataSourceProcessorCallback callback;
|
||||||
@ -64,20 +70,22 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
|||||||
private final Blackboard blackboard;
|
private final Blackboard blackboard;
|
||||||
private final Case currentCase;
|
private final Case currentCase;
|
||||||
|
|
||||||
|
private volatile boolean cancelled;
|
||||||
|
|
||||||
AddLogicalImageTask(String deviceId,
|
AddLogicalImageTask(String deviceId,
|
||||||
List<String> imagePaths,
|
|
||||||
String timeZone,
|
String timeZone,
|
||||||
File src, File dest,
|
File src, File dest,
|
||||||
DataSourceProcessorProgressMonitor progressMonitor,
|
DataSourceProcessorProgressMonitor progressMonitor,
|
||||||
DataSourceProcessorCallback callback
|
DataSourceProcessorCallback callback
|
||||||
) throws NoCurrentCaseException {
|
) throws NoCurrentCaseException {
|
||||||
super(deviceId, imagePaths, timeZone, progressMonitor, callback);
|
this.deviceId = deviceId;
|
||||||
|
this.timeZone = timeZone;
|
||||||
this.src = src;
|
this.src = src;
|
||||||
this.dest = dest;
|
this.dest = dest;
|
||||||
this.progressMonitor = progressMonitor;
|
this.progressMonitor = progressMonitor;
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
this.currentCase = Case.getCurrentCase();
|
this.currentCase = Case.getCurrentCase();
|
||||||
this.blackboard = this.currentCase.getServices().getBlackboard();
|
this.blackboard = this.currentCase.getServices().getArtifactsBlackboard();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -90,16 +98,32 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
|||||||
"# {0} - src", "# {1} - dest", "AddLogicalImageTask.failedToCopyDirectory=Failed to copy directory {0} to {1}",
|
"# {0} - src", "# {1} - dest", "AddLogicalImageTask.failedToCopyDirectory=Failed to copy directory {0} to {1}",
|
||||||
"# {0} - file", "AddLogicalImageTask.addingToReport=Adding {0} to report",
|
"# {0} - file", "AddLogicalImageTask.addingToReport=Adding {0} to report",
|
||||||
"# {0} - file", "AddLogicalImageTask.doneAddingToReport=Done adding {0} to report",
|
"# {0} - file", "AddLogicalImageTask.doneAddingToReport=Done adding {0} to report",
|
||||||
|
"AddLogicalImageTask.ingestionCancelled=Ingestion cancelled",
|
||||||
|
"# {0} - file", "AddLogicalImageTask.failToGetCanonicalPath=Fail to get canonical path for {0}",
|
||||||
|
"# {0} - sparseImageDirectory", "AddLogicalImageTask.directoryDoesNotContainSparseImage=Directory {0} does not contain any images",
|
||||||
|
"AddLogicalImageTask.noCurrentCase=No current case",
|
||||||
"AddLogicalImageTask.addingInterestingFiles=Adding search results as interesting files",
|
"AddLogicalImageTask.addingInterestingFiles=Adding search results as interesting files",
|
||||||
"AddLogicalImageTask.doneAddingInterestingFiles=Done adding search results as interesting files",
|
"AddLogicalImageTask.doneAddingInterestingFiles=Done adding search results as interesting files",
|
||||||
"# {0} - SearchResults.txt", "# {1} - directory", "AddLogicalImageTask.cannotFindFiles=Cannot find {0} in {1}",
|
"# {0} - SearchResults.txt", "# {1} - directory", "AddLogicalImageTask.cannotFindFiles=Cannot find {0} in {1}",
|
||||||
"# {0} - reason", "AddLogicalImageTask.failedToAddInterestingFiles=Failed to add interesting files: {0}"
|
"# {0} - reason", "AddLogicalImageTask.failedToAddInterestingFiles=Failed to add interesting files: {0}",
|
||||||
|
"AddLogicalImageTask.addingExtractedFiles=Adding extracted files",
|
||||||
|
"AddLogicalImageTask.doneAddingExtractedFiles=Done adding extracted files",
|
||||||
})
|
})
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
List<String> errorList = new ArrayList<>();
|
List<String> errorList = new ArrayList<>();
|
||||||
List<Content> emptyDataSources = new ArrayList<>();
|
List<Content> emptyDataSources = new ArrayList<>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_copyingImageFromTo(src.toString(), dest.toString()));
|
||||||
|
FileUtils.copyDirectory(src, dest);
|
||||||
|
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneCopying());
|
||||||
|
} catch (IOException ex) {
|
||||||
|
// Copy directory failed
|
||||||
|
String msg = Bundle.AddLogicalImageTask_failedToCopyDirectory(src.toString(), dest.toString());
|
||||||
|
errorList.add(msg);
|
||||||
|
}
|
||||||
|
|
||||||
// Add the SearchResults.txt and users.txt to the case report
|
// Add the SearchResults.txt and users.txt to the case report
|
||||||
String resultsFilename;
|
String resultsFilename;
|
||||||
if (Paths.get(dest.toString(), SEARCH_RESULTS_TXT).toFile().exists()) {
|
if (Paths.get(dest.toString(), SEARCH_RESULTS_TXT).toFile().exists()) {
|
||||||
@ -109,6 +133,11 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
|||||||
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cancelled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingToReport(resultsFilename));
|
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingToReport(resultsFilename));
|
||||||
String status = addReport(Paths.get(dest.toString(), resultsFilename), resultsFilename + " " + src.getName());
|
String status = addReport(Paths.get(dest.toString(), resultsFilename), resultsFilename + " " + src.getName());
|
||||||
if (status != null) {
|
if (status != null) {
|
||||||
@ -127,17 +156,75 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
|||||||
}
|
}
|
||||||
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingToReport(USERS_TXT));
|
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingToReport(USERS_TXT));
|
||||||
|
|
||||||
super.run();
|
// Get all VHD files in the dest directory
|
||||||
if (super.getResult() == DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS) {
|
List<String> imagePaths = new ArrayList<>();
|
||||||
callback.done(super.getResult(), super.getErrorMessages(), super.getNewDataSources());
|
for (File f : dest.listFiles()) {
|
||||||
return;
|
if (f.getName().endsWith(VHD_EXTENSION)) {
|
||||||
|
try {
|
||||||
|
imagePaths.add(f.getCanonicalPath());
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
String msg = Bundle.AddLogicalImageTask_failToGetCanonicalPath(f.getName());
|
||||||
|
errorList.add(msg);
|
||||||
|
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AddMultipleImageTask addMultipleImageTask = null;
|
||||||
|
List<Content> newDataSources = new ArrayList<>();
|
||||||
|
boolean createVHD;
|
||||||
|
|
||||||
|
if (imagePaths.isEmpty()) {
|
||||||
|
createVHD = false;
|
||||||
|
// No VHD in src directory, try ingest the root directory using Logical File Set
|
||||||
|
File root = Paths.get(dest.toString(), ROOT_STR).toFile();
|
||||||
|
if (root.exists() && root.isDirectory()) {
|
||||||
|
imagePaths.add(root.getAbsolutePath());
|
||||||
|
} else {
|
||||||
|
String msg = Bundle.AddLogicalImageTask_directoryDoesNotContainSparseImage(dest);
|
||||||
|
errorList.add(msg);
|
||||||
|
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingExtractedFiles());
|
||||||
|
addExtractedFiles(dest, Paths.get(dest.toString(), resultsFilename), newDataSources);
|
||||||
|
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingExtractedFiles());
|
||||||
|
} catch (IOException | TskCoreException ex) {
|
||||||
|
errorList.add(ex.getMessage());
|
||||||
|
LOGGER.log(Level.SEVERE, String.format("Failed to add datasource: %s", ex.getMessage()), ex); // NON-NLS
|
||||||
|
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
createVHD = true;
|
||||||
|
// ingest the VHDs
|
||||||
|
try {
|
||||||
|
addMultipleImageTask = new AddMultipleImageTask(deviceId, imagePaths, timeZone , progressMonitor, callback);
|
||||||
|
addMultipleImageTask.run();
|
||||||
|
if (addMultipleImageTask.getResult() == DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS) {
|
||||||
|
callback.done(addMultipleImageTask.getResult(), addMultipleImageTask.getErrorMessages(), addMultipleImageTask.getNewDataSources());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (NoCurrentCaseException ex) {
|
||||||
|
String msg = Bundle.AddLogicalImageTask_noCurrentCase();
|
||||||
|
errorList.add(msg);
|
||||||
|
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingInterestingFiles());
|
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingInterestingFiles());
|
||||||
addInterestingFiles(dest, Paths.get(dest.toString(), resultsFilename));
|
addInterestingFiles(dest, Paths.get(dest.toString(), resultsFilename), createVHD);
|
||||||
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingInterestingFiles());
|
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingInterestingFiles());
|
||||||
callback.done(super.getResult(), super.getErrorMessages(), super.getNewDataSources());
|
if (addMultipleImageTask != null) {
|
||||||
|
callback.done(addMultipleImageTask.getResult(), addMultipleImageTask.getErrorMessages(), addMultipleImageTask.getNewDataSources());
|
||||||
|
} else {
|
||||||
|
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.NO_ERRORS, errorList, newDataSources);
|
||||||
|
}
|
||||||
} catch (IOException | TskCoreException ex) {
|
} catch (IOException | TskCoreException ex) {
|
||||||
errorList.add(Bundle.AddLogicalImageTask_failedToAddInterestingFiles(ex.getMessage()));
|
errorList.add(Bundle.AddLogicalImageTask_failedToAddInterestingFiles(ex.getMessage()));
|
||||||
LOGGER.log(Level.SEVERE, "Failed to add interesting files", ex); // NON-NLS
|
LOGGER.log(Level.SEVERE, "Failed to add interesting files", ex); // NON-NLS
|
||||||
@ -171,6 +258,15 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to cancel the processing of the input image files. May result in
|
||||||
|
* partial processing of the input.
|
||||||
|
*/
|
||||||
|
void cancelTask() {
|
||||||
|
LOGGER.log(Level.WARNING, "AddLogicalImageTask cancelled, processing may be incomplete"); // NON-NLS
|
||||||
|
cancelled = true;
|
||||||
|
}
|
||||||
|
|
||||||
private Map<String, Long> imagePathsToDataSourceObjId(Map<Long, List<String>> imagePaths) {
|
private Map<String, Long> imagePathsToDataSourceObjId(Map<Long, List<String>> imagePaths) {
|
||||||
Map<String, Long> imagePathToObjIdMap = new HashMap<>();
|
Map<String, Long> imagePathToObjIdMap = new HashMap<>();
|
||||||
for (Map.Entry<Long, List<String>> entry : imagePaths.entrySet()) {
|
for (Map.Entry<Long, List<String>> entry : imagePaths.entrySet()) {
|
||||||
@ -187,28 +283,23 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
|||||||
"# {0} - line number", "# {1} - fields length", "# {2} - expected length", "AddLogicalImageTask.notEnoughFields=File does not contain enough fields at line {0}, got {1}, expecting {2}",
|
"# {0} - line number", "# {1} - fields length", "# {2} - expected length", "AddLogicalImageTask.notEnoughFields=File does not contain enough fields at line {0}, got {1}, expecting {2}",
|
||||||
"# {0} - target image path", "AddLogicalImageTask.cannotFindDataSourceObjId=Cannot find obj_id in tsk_image_names for {0}"
|
"# {0} - target image path", "AddLogicalImageTask.cannotFindDataSourceObjId=Cannot find obj_id in tsk_image_names for {0}"
|
||||||
})
|
})
|
||||||
private void addInterestingFiles(File src, Path resultsPath) throws IOException, TskCoreException {
|
private void addInterestingFiles(File src, Path resultsPath, boolean createVHD) throws IOException, TskCoreException {
|
||||||
Map<Long, List<String>> imagePaths = currentCase.getSleuthkitCase().getImagePaths();
|
|
||||||
Map<String, Long> imagePathToObjIdMap = imagePathsToDataSourceObjId(imagePaths);
|
|
||||||
|
|
||||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(
|
try (BufferedReader br = new BufferedReader(new InputStreamReader(
|
||||||
new FileInputStream(resultsPath.toFile()), "UTF8"))) { // NON-NLS
|
new FileInputStream(resultsPath.toFile()), "UTF8"))) { // NON-NLS
|
||||||
|
List<BlackboardArtifact> artifacts = new ArrayList<>();
|
||||||
String line;
|
String line;
|
||||||
br.readLine(); // skip the header line
|
br.readLine(); // skip the header line
|
||||||
int lineNumber = 2;
|
int lineNumber = 2;
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
|
if (cancelled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
String[] fields = line.split("\t", -1); // NON-NLS
|
String[] fields = line.split("\t", -1); // NON-NLS
|
||||||
if (fields.length != 9) {
|
if (fields.length != 14) {
|
||||||
throw new IOException(Bundle.AddLogicalImageTask_notEnoughFields(lineNumber, fields.length, 9));
|
throw new IOException(Bundle.AddLogicalImageTask_notEnoughFields(lineNumber, fields.length, 9));
|
||||||
}
|
}
|
||||||
String vhdFilename = fields[0];
|
String vhdFilename = fields[0];
|
||||||
|
|
||||||
String targetImagePath = Paths.get(src.toString(), vhdFilename).toString();
|
|
||||||
Long dataSourceObjId = imagePathToObjIdMap.get(targetImagePath);
|
|
||||||
if (dataSourceObjId == null) {
|
|
||||||
throw new TskCoreException(Bundle.AddLogicalImageTask_cannotFindDataSourceObjId(targetImagePath));
|
|
||||||
}
|
|
||||||
|
|
||||||
// String fileSystemOffsetStr = fields[1];
|
// String fileSystemOffsetStr = fields[1];
|
||||||
String fileMetaAddressStr = fields[2];
|
String fileMetaAddressStr = fields[2];
|
||||||
// String extractStatusStr = fields[3];
|
// String extractStatusStr = fields[3];
|
||||||
@ -216,37 +307,131 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
|||||||
String ruleName = fields[5];
|
String ruleName = fields[5];
|
||||||
// String description = fields[6];
|
// String description = fields[6];
|
||||||
String filename = fields[7];
|
String filename = fields[7];
|
||||||
// String parentPath = fields[8];
|
String parentPath = fields[8];
|
||||||
|
|
||||||
String query = String.format("data_source_obj_id = '%s' AND meta_addr = '%s' AND name = '%s'", // NON-NLS
|
String query = makeQuery(createVHD, vhdFilename, fileMetaAddressStr, parentPath, filename);
|
||||||
dataSourceObjId.toString(), fileMetaAddressStr, filename);
|
|
||||||
|
// TODO - findAllFilesWhere should SQL-escape the query
|
||||||
List<AbstractFile> matchedFiles = Case.getCurrentCase().getSleuthkitCase().findAllFilesWhere(query);
|
List<AbstractFile> matchedFiles = Case.getCurrentCase().getSleuthkitCase().findAllFilesWhere(query);
|
||||||
for (AbstractFile file : matchedFiles) {
|
for (AbstractFile file : matchedFiles) {
|
||||||
addInterestingFile(file, ruleSetName, ruleName);
|
addInterestingFileToArtifacts(file, ruleSetName, ruleName, artifacts);
|
||||||
}
|
}
|
||||||
lineNumber++;
|
lineNumber++;
|
||||||
|
} // end reading file
|
||||||
|
|
||||||
|
try {
|
||||||
|
// index the artifact for keyword search
|
||||||
|
blackboard.postArtifacts(artifacts, MODULE_NAME);
|
||||||
|
} catch (Blackboard.BlackboardException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Unable to post artifacts to blackboard", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
IngestServices.getInstance().fireModuleDataEvent(new ModuleDataEvent(MODULE_NAME,
|
|
||||||
BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addInterestingFile(AbstractFile file, String ruleSetName, String ruleName) throws TskCoreException {
|
private void addInterestingFileToArtifacts(AbstractFile file, String ruleSetName, String ruleName, List<BlackboardArtifact> artifacts) throws TskCoreException {
|
||||||
Collection<BlackboardAttribute> attributes = new ArrayList<>();
|
Collection<BlackboardAttribute> attributes = new ArrayList<>();
|
||||||
BlackboardAttribute setNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, MODULE_NAME, ruleSetName);
|
BlackboardAttribute setNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, MODULE_NAME, ruleSetName);
|
||||||
attributes.add(setNameAttribute);
|
attributes.add(setNameAttribute);
|
||||||
BlackboardAttribute ruleNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY, MODULE_NAME, ruleName);
|
BlackboardAttribute ruleNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY, MODULE_NAME, ruleName);
|
||||||
attributes.add(ruleNameAttribute);
|
attributes.add(ruleNameAttribute);
|
||||||
org.sleuthkit.datamodel.Blackboard tskBlackboard = Case.getCurrentCase().getSleuthkitCase().getBlackboard();
|
if (!blackboard.artifactExists(file, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, attributes)) {
|
||||||
if (!tskBlackboard.artifactExists(file, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, attributes)) {
|
BlackboardArtifact artifact = this.currentCase.getSleuthkitCase().newBlackboardArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, file.getId());
|
||||||
BlackboardArtifact artifact = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
|
|
||||||
artifact.addAttributes(attributes);
|
artifact.addAttributes(attributes);
|
||||||
|
artifacts.add(artifact);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addExtractedFiles(File src, Path resultsPath, List<Content> newDataSources) throws TskCoreException, IOException {
|
||||||
|
SleuthkitCase skCase = Case.getCurrentCase().getSleuthkitCase();
|
||||||
|
SleuthkitCase.CaseDbTransaction trans = null;
|
||||||
|
try {
|
||||||
|
trans = skCase.beginTransaction();
|
||||||
|
LocalFilesDataSource localFilesDataSource = skCase.addLocalFilesDataSource(deviceId, this.src.getName(), timeZone, trans);
|
||||||
|
LocalFileImporter fileImporter = new LocalFileImporter(skCase, trans);
|
||||||
|
|
||||||
|
try (BufferedReader br = new BufferedReader(new InputStreamReader(
|
||||||
|
new FileInputStream(resultsPath.toFile()), "UTF8"))) { // NON-NLS
|
||||||
|
String line;
|
||||||
|
br.readLine(); // skip the header line
|
||||||
|
int lineNumber = 2;
|
||||||
|
while ((line = br.readLine()) != null) {
|
||||||
|
if (cancelled) {
|
||||||
|
rollbackTransaction(trans);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String[] fields = line.split("\t", -1); // NON-NLS
|
||||||
|
if (fields.length != 14) {
|
||||||
|
rollbackTransaction(trans);
|
||||||
|
throw new IOException(Bundle.AddLogicalImageTask_notEnoughFields(lineNumber, fields.length, 14));
|
||||||
|
}
|
||||||
|
String vhdFilename = fields[0];
|
||||||
|
// String fileSystemOffsetStr = fields[1];
|
||||||
|
// String fileMetaAddressStr = fields[2];
|
||||||
|
// String extractStatusStr = fields[3];
|
||||||
|
// String ruleSetName = fields[4];
|
||||||
|
// String ruleName = fields[5];
|
||||||
|
// String description = fields[6];
|
||||||
|
String filename = fields[7];
|
||||||
|
String parentPath = fields[8];
|
||||||
|
String extractedFilePath = fields[9];
|
||||||
|
String crtime = fields[10];
|
||||||
|
String mtime = fields[11];
|
||||||
|
String atime = fields[12];
|
||||||
|
String ctime = fields[13];
|
||||||
|
parentPath = ROOT_STR + "/" + vhdFilename + "/" + parentPath;
|
||||||
|
|
||||||
|
//addLocalFile here
|
||||||
|
fileImporter.addLocalFile(
|
||||||
|
Paths.get(src.toString(), extractedFilePath).toFile(),
|
||||||
|
filename,
|
||||||
|
parentPath,
|
||||||
|
Long.parseLong(ctime),
|
||||||
|
Long.parseLong(crtime),
|
||||||
|
Long.parseLong(atime),
|
||||||
|
Long.parseLong(mtime),
|
||||||
|
localFilesDataSource);
|
||||||
|
|
||||||
|
lineNumber++;
|
||||||
|
} // end reading file
|
||||||
|
}
|
||||||
|
trans.commit();
|
||||||
|
newDataSources.add(localFilesDataSource);
|
||||||
|
|
||||||
|
} catch (NumberFormatException | TskCoreException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Error adding extracted files", ex); // NON-NLS
|
||||||
|
rollbackTransaction(trans);
|
||||||
|
throw new TskCoreException("Error adding extracted files", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void rollbackTransaction(SleuthkitCase.CaseDbTransaction trans) throws TskCoreException {
|
||||||
|
if (null != trans) {
|
||||||
try {
|
try {
|
||||||
// index the artifact for keyword search
|
trans.rollback();
|
||||||
blackboard.indexArtifact(artifact);
|
} catch (TskCoreException ex) {
|
||||||
} catch (Blackboard.BlackboardException ex) {
|
LOGGER.log(Level.SEVERE, String.format("Failed to rollback transaction: %s", ex.getMessage()), ex); // NON-NLS
|
||||||
LOGGER.log(Level.SEVERE, "Unable to index blackboard artifact " + artifact.getArtifactID(), ex); //NON-NLS
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String makeQuery(boolean createVHD, String vhdFilename, String fileMetaAddressStr, String parentPath, String filename) throws TskCoreException {
|
||||||
|
String query;
|
||||||
|
if (createVHD) {
|
||||||
|
Map<Long, List<String>> imagePaths = currentCase.getSleuthkitCase().getImagePaths();
|
||||||
|
Map<String, Long> imagePathToObjIdMap = imagePathsToDataSourceObjId(imagePaths);
|
||||||
|
String targetImagePath = Paths.get(src.toString(), vhdFilename).toString();
|
||||||
|
Long dataSourceObjId = imagePathToObjIdMap.get(targetImagePath);
|
||||||
|
if (dataSourceObjId == null) {
|
||||||
|
throw new TskCoreException(Bundle.AddLogicalImageTask_cannotFindDataSourceObjId(targetImagePath));
|
||||||
|
}
|
||||||
|
query = String.format("data_source_obj_id = '%s' AND meta_addr = '%s' AND name = '%s'", // NON-NLS
|
||||||
|
dataSourceObjId.toString(), fileMetaAddressStr, filename.replace("'", "''"));
|
||||||
|
} else {
|
||||||
|
String newParentPath = "/" + ROOT_STR + "/" + vhdFilename + "/" + parentPath;
|
||||||
|
query = String.format("name = '%s' AND parent_path = '%s'", // NON-NLS
|
||||||
|
filename.replace("'", "''"), newParentPath.replace("'", "''"));
|
||||||
|
}
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,21 @@
|
|||||||
# To change this template file, choose Tools | Templates
|
# To change this template file, choose Tools | Templates
|
||||||
# and open the template in the editor.
|
# and open the template in the editor.
|
||||||
|
|
||||||
|
AddLogicalImageTask.addingExtractedFiles=Adding extracted files
|
||||||
AddLogicalImageTask.addingInterestingFiles=Adding search results as interesting files
|
AddLogicalImageTask.addingInterestingFiles=Adding search results as interesting files
|
||||||
# {0} - file
|
# {0} - file
|
||||||
AddLogicalImageTask.addingToReport=Adding {0} to report
|
AddLogicalImageTask.addingToReport=Adding {0} to report
|
||||||
|
# {0} - target image path
|
||||||
|
AddLogicalImageTask.cannotFindDataSourceObjId=Cannot find obj_id in tsk_image_names for {0}
|
||||||
# {0} - SearchResults.txt
|
# {0} - SearchResults.txt
|
||||||
# {1} - directory
|
# {1} - directory
|
||||||
AddLogicalImageTask.cannotFindFiles=Cannot find {0} in {1}
|
AddLogicalImageTask.cannotFindFiles=Cannot find {0} in {1}
|
||||||
# {0} - src
|
# {0} - src
|
||||||
# {1} - dest
|
# {1} - dest
|
||||||
AddLogicalImageTask.copyingImageFromTo=Copying image from {0} to {1}
|
AddLogicalImageTask.copyingImageFromTo=Copying image from {0} to {1}
|
||||||
|
# {0} - sparseImageDirectory
|
||||||
|
AddLogicalImageTask.directoryDoesNotContainSparseImage=Directory {0} does not contain any images
|
||||||
|
AddLogicalImageTask.doneAddingExtractedFiles=Done adding extracted files
|
||||||
AddLogicalImageTask.doneAddingInterestingFiles=Done adding search results as interesting files
|
AddLogicalImageTask.doneAddingInterestingFiles=Done adding search results as interesting files
|
||||||
# {0} - file
|
# {0} - file
|
||||||
AddLogicalImageTask.doneAddingToReport=Done adding {0} to report
|
AddLogicalImageTask.doneAddingToReport=Done adding {0} to report
|
||||||
@ -23,6 +29,10 @@ AddLogicalImageTask.failedToAddReport=Failed to add report {0}. Reason= {1}
|
|||||||
# {0} - src
|
# {0} - src
|
||||||
# {1} - dest
|
# {1} - dest
|
||||||
AddLogicalImageTask.failedToCopyDirectory=Failed to copy directory {0} to {1}
|
AddLogicalImageTask.failedToCopyDirectory=Failed to copy directory {0} to {1}
|
||||||
|
# {0} - file
|
||||||
|
AddLogicalImageTask.failToGetCanonicalPath=Fail to get canonical path for {0}
|
||||||
|
AddLogicalImageTask.ingestionCancelled=Ingestion cancelled
|
||||||
|
AddLogicalImageTask.noCurrentCase=No current case
|
||||||
# {0} - line number
|
# {0} - line number
|
||||||
# {1} - fields length
|
# {1} - fields length
|
||||||
# {2} - expected length
|
# {2} - expected length
|
||||||
@ -52,8 +62,6 @@ LogicalImagerDSProcessor.dataSourceType=Autopsy Logical Imager Results
|
|||||||
LogicalImagerDSProcessor.directoryAlreadyExists=Directory {0} already exists
|
LogicalImagerDSProcessor.directoryAlreadyExists=Directory {0} already exists
|
||||||
# {0} - directory
|
# {0} - directory
|
||||||
LogicalImagerDSProcessor.failToCreateDirectory=Failed to create directory {0}
|
LogicalImagerDSProcessor.failToCreateDirectory=Failed to create directory {0}
|
||||||
# {0} - file
|
|
||||||
LogicalImagerDSProcessor.failToGetCanonicalPath=Fail to get canonical path for {0}
|
|
||||||
# {0} - imageDirPath
|
# {0} - imageDirPath
|
||||||
LogicalImagerDSProcessor.imageDirPathNotFound={0} not found.\nUSB drive has been ejected.
|
LogicalImagerDSProcessor.imageDirPathNotFound={0} not found.\nUSB drive has been ejected.
|
||||||
LogicalImagerDSProcessor.noCurrentCase=No current case
|
LogicalImagerDSProcessor.noCurrentCase=No current case
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
package org.sleuthkit.autopsy.logicalimager.dsp;
|
package org.sleuthkit.autopsy.logicalimager.dsp;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -131,8 +130,8 @@ public final class LogicalImagerDSProcessor implements DataSourceProcessor {
|
|||||||
"# {0} - imageDirPath", "LogicalImagerDSProcessor.imageDirPathNotFound={0} not found.\nUSB drive has been ejected.",
|
"# {0} - imageDirPath", "LogicalImagerDSProcessor.imageDirPathNotFound={0} not found.\nUSB drive has been ejected.",
|
||||||
"# {0} - directory", "LogicalImagerDSProcessor.failToCreateDirectory=Failed to create directory {0}",
|
"# {0} - directory", "LogicalImagerDSProcessor.failToCreateDirectory=Failed to create directory {0}",
|
||||||
"# {0} - directory", "LogicalImagerDSProcessor.directoryAlreadyExists=Directory {0} already exists",
|
"# {0} - directory", "LogicalImagerDSProcessor.directoryAlreadyExists=Directory {0} already exists",
|
||||||
"# {0} - file", "LogicalImagerDSProcessor.failToGetCanonicalPath=Fail to get canonical path for {0}",
|
"LogicalImagerDSProcessor.noCurrentCase=No current case",
|
||||||
"LogicalImagerDSProcessor.noCurrentCase=No current case",})
|
})
|
||||||
@Override
|
@Override
|
||||||
public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) {
|
public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) {
|
||||||
configPanel.storeSettings();
|
configPanel.storeSettings();
|
||||||
@ -171,37 +170,10 @@ public final class LogicalImagerDSProcessor implements DataSourceProcessor {
|
|||||||
}
|
}
|
||||||
File src = imageDirPath.toFile();
|
File src = imageDirPath.toFile();
|
||||||
|
|
||||||
try {
|
|
||||||
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_copyingImageFromTo(src.toString(), dest.toString()));
|
|
||||||
FileUtils.copyDirectory(src, dest);
|
|
||||||
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneCopying());
|
|
||||||
} catch (IOException ex) {
|
|
||||||
// Copy directory failed
|
|
||||||
String msg = Bundle.AddLogicalImageTask_failedToCopyDirectory(src.toString(), dest.toString());
|
|
||||||
errorList.add(msg);
|
|
||||||
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get all VHD files in the src directory
|
|
||||||
List<String> imagePaths = new ArrayList<>();
|
|
||||||
for (File f : dest.listFiles()) {
|
|
||||||
if (f.getName().endsWith(".vhd")) {
|
|
||||||
try {
|
|
||||||
imagePaths.add(f.getCanonicalPath());
|
|
||||||
} catch (IOException ex) {
|
|
||||||
String msg = Bundle.LogicalImagerDSProcessor_failToGetCanonicalPath(f.getName());
|
|
||||||
errorList.add(msg);
|
|
||||||
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
String deviceId = UUID.randomUUID().toString();
|
String deviceId = UUID.randomUUID().toString();
|
||||||
String timeZone = Calendar.getInstance().getTimeZone().getID();
|
String timeZone = Calendar.getInstance().getTimeZone().getID();
|
||||||
run(deviceId, imagePaths,
|
run(deviceId, timeZone, src, dest,
|
||||||
timeZone, src, dest,
|
|
||||||
progressMonitor, callback);
|
progressMonitor, callback);
|
||||||
} catch (NoCurrentCaseException ex) {
|
} catch (NoCurrentCaseException ex) {
|
||||||
String msg = Bundle.LogicalImagerDSProcessor_noCurrentCase();
|
String msg = Bundle.LogicalImagerDSProcessor_noCurrentCase();
|
||||||
@ -220,7 +192,6 @@ public final class LogicalImagerDSProcessor implements DataSourceProcessor {
|
|||||||
* @param deviceId An ASCII-printable identifier for the device
|
* @param deviceId An ASCII-printable identifier for the device
|
||||||
* associated with the data source that is intended
|
* associated with the data source that is intended
|
||||||
* to be unique across multiple cases (e.g., a UUID).
|
* to be unique across multiple cases (e.g., a UUID).
|
||||||
* @param imagePaths Paths to the image files.
|
|
||||||
* @param timeZone The time zone to use when processing dates and
|
* @param timeZone The time zone to use when processing dates and
|
||||||
* times for the image, obtained from
|
* times for the image, obtained from
|
||||||
* java.util.TimeZone.getID.
|
* java.util.TimeZone.getID.
|
||||||
@ -230,11 +201,11 @@ public final class LogicalImagerDSProcessor implements DataSourceProcessor {
|
|||||||
* processing.
|
* processing.
|
||||||
* @param callback Callback to call when processing is done.
|
* @param callback Callback to call when processing is done.
|
||||||
*/
|
*/
|
||||||
private void run(String deviceId, List<String> imagePaths, String timeZone,
|
private void run(String deviceId, String timeZone,
|
||||||
File src, File dest,
|
File src, File dest,
|
||||||
DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback
|
DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback
|
||||||
) throws NoCurrentCaseException {
|
) throws NoCurrentCaseException {
|
||||||
addLogicalImageTask = new AddLogicalImageTask(deviceId, imagePaths, timeZone, src, dest,
|
addLogicalImageTask = new AddLogicalImageTask(deviceId, timeZone, src, dest,
|
||||||
progressMonitor, callback);
|
progressMonitor, callback);
|
||||||
new Thread(addLogicalImageTask).start();
|
new Thread(addLogicalImageTask).start();
|
||||||
}
|
}
|
||||||
|
@ -333,9 +333,19 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (vhdFiles.length == 0) {
|
if (vhdFiles.length == 0) {
|
||||||
setErrorMessage(Bundle.LogicalImagerPanel_messageLabel_directoryDoesNotContainSparseImage(path));
|
// No VHD files, try directories for individual files
|
||||||
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), true, false);
|
String[] directories = dir.list(new FilenameFilter() {
|
||||||
return;
|
@Override
|
||||||
|
public boolean accept(File dir, String name) {
|
||||||
|
return Paths.get(dir.toString(), name).toFile().isDirectory();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (directories.length == 0) {
|
||||||
|
// No directories, bail
|
||||||
|
setErrorMessage(Bundle.LogicalImagerPanel_messageLabel_directoryDoesNotContainSparseImage(path));
|
||||||
|
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), true, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
manualImageDirPath = Paths.get(path);
|
manualImageDirPath = Paths.get(path);
|
||||||
setNormalMessage(path);
|
setNormalMessage(path);
|
||||||
@ -360,11 +370,11 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean dirHasVhdFiles(File dir) {
|
private boolean dirHasImagerResult(File dir) {
|
||||||
File[] fList = dir.listFiles(new FilenameFilter() {
|
String[] fList = dir.list(new FilenameFilter() {
|
||||||
@Override
|
@Override
|
||||||
public boolean accept(File dir, String name) {
|
public boolean accept(File dir, String name) {
|
||||||
return name.endsWith(".vhd");
|
return name.endsWith(".vhd") || Paths.get(dir.toString(), name).toFile().isDirectory();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return (fList != null && fList.length != 0);
|
return (fList != null && fList.length != 0);
|
||||||
@ -382,9 +392,9 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
if (fList != null) {
|
if (fList != null) {
|
||||||
imageTableModel = new ImageTableModel();
|
imageTableModel = new ImageTableModel();
|
||||||
// Find all directories with name like Logical_Imager_HOSTNAME_yyyymmdd_HH_MM_SS
|
// Find all directories with name like Logical_Imager_HOSTNAME_yyyymmdd_HH_MM_SS
|
||||||
// and has vhd files in it
|
// and has Logical Imager result in it
|
||||||
for (File file : fList) {
|
for (File file : fList) {
|
||||||
if (file.isDirectory() && dirHasVhdFiles(file)) {
|
if (file.isDirectory() && dirHasImagerResult(file)) {
|
||||||
String dir = file.getName();
|
String dir = file.getName();
|
||||||
Matcher m = regex.matcher(dir);
|
Matcher m = regex.matcher(dir);
|
||||||
if (m.find()) {
|
if (m.find()) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2014-2018 Basis Technology Corp.
|
* Copyright 2014-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -216,7 +216,6 @@ final class ContactAnalyzer {
|
|||||||
try {
|
try {
|
||||||
while ((length = is.read(buffer)) != -1) {
|
while ((length = is.read(buffer)) != -1) {
|
||||||
os.write(buffer, 0, length);
|
os.write(buffer, 0, length);
|
||||||
System.out.println(length);
|
|
||||||
os.flush();
|
os.flush();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -239,13 +238,13 @@ final class ContactAnalyzer {
|
|||||||
ostream.write(c);
|
ostream.write(c);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
System.out.println("Error: " + e.getMessage()); //NON-NLS
|
logger.log(Level.WARNING, "Error copying file", e);
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
istream.close();
|
istream.close();
|
||||||
ostream.close();
|
ostream.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
System.out.println("File did not close"); //NON-NLS
|
logger.log(Level.WARNING, "File did not close", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013-2018 Basis Technology Corp.
|
* Copyright 2013-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -70,7 +70,7 @@ class StixArtifactData {
|
|||||||
|
|
||||||
@Messages({"StixArtifactData.indexError.message=Failed to index STIX interesting file hit artifact for keyword search.",
|
@Messages({"StixArtifactData.indexError.message=Failed to index STIX interesting file hit artifact for keyword search.",
|
||||||
"StixArtifactData.noOpenCase.errMsg=No open case available."})
|
"StixArtifactData.noOpenCase.errMsg=No open case available."})
|
||||||
public void createArtifact(String a_title) throws TskCoreException {
|
void createArtifact(String a_title) throws TskCoreException {
|
||||||
Blackboard blackboard;
|
Blackboard blackboard;
|
||||||
try {
|
try {
|
||||||
blackboard = Case.getCurrentCaseThrows().getSleuthkitCase().getBlackboard();
|
blackboard = Case.getCurrentCaseThrows().getSleuthkitCase().getBlackboard();
|
||||||
@ -104,8 +104,4 @@ class StixArtifactData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void print() {
|
|
||||||
System.out.println(" " + observableId + " " + file.getName());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2018 Basis Technology Corp.
|
* Copyright 2011-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -21,8 +21,6 @@ package org.sleuthkit.autopsy.test;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import org.openide.util.Exceptions;
|
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
@ -128,7 +126,7 @@ final class InterestingArtifactCreatorIngestModule extends FileIngestModuleAdapt
|
|||||||
logger.log(Level.SEVERE, String.format("Failed to process file (obj_id = %d)", file.getId()), ex);
|
logger.log(Level.SEVERE, String.format("Failed to process file (obj_id = %d)", file.getId()), ex);
|
||||||
return ProcessResult.ERROR;
|
return ProcessResult.ERROR;
|
||||||
} catch (Blackboard.BlackboardException ex) {
|
} catch (Blackboard.BlackboardException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
logger.log(Level.WARNING, "Blackboard Exception processing file with obj_id = " + file.getId(), ex);
|
||||||
}
|
}
|
||||||
return ProcessResult.OK;
|
return ProcessResult.OK;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2018 Basis Technology Corp.
|
* Copyright 2011-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -454,7 +454,6 @@ final class StringsTextExtractor implements TextExtractor {
|
|||||||
convertBuffRemain = bytesInConvertBuff - convertBuffOffset;
|
convertBuffRemain = bytesInConvertBuff - convertBuffOffset;
|
||||||
}
|
}
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
//Exceptions.printStackTrace(ex);
|
|
||||||
fileEOF = true;
|
fileEOF = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
*
|
*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2018 Basis Technology Corp.
|
* Copyright 2018-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -46,19 +46,11 @@ import org.sleuthkit.autopsy.testutils.CaseUtils;
|
|||||||
import org.sleuthkit.autopsy.testutils.IngestUtils;
|
import org.sleuthkit.autopsy.testutils.IngestUtils;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import junit.framework.Assert;
|
import junit.framework.Assert;
|
||||||
import org.sleuthkit.autopsy.casemodule.CaseActionException;
|
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||||
import org.sleuthkit.autopsy.commonpropertiessearch.AbstractCommonAttributeInstance;
|
|
||||||
import org.sleuthkit.autopsy.commonpropertiessearch.CaseDBCommonAttributeInstanceNode;
|
|
||||||
import org.sleuthkit.autopsy.commonpropertiessearch.CentralRepoCommonAttributeInstance;
|
|
||||||
import org.sleuthkit.autopsy.commonpropertiessearch.CentralRepoCommonAttributeInstanceNode;
|
|
||||||
import org.sleuthkit.autopsy.commonpropertiessearch.CommonAttributeCountSearchResults;
|
|
||||||
import org.sleuthkit.autopsy.datamodel.utils.DataSourceLoader;
|
import org.sleuthkit.autopsy.datamodel.utils.DataSourceLoader;
|
||||||
import org.sleuthkit.autopsy.commonpropertiessearch.CommonAttributeValue;
|
|
||||||
import org.sleuthkit.autopsy.commonpropertiessearch.CommonAttributeValueList;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.TimeStampUtils;
|
import org.sleuthkit.autopsy.coreutils.TimeStampUtils;
|
||||||
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
|
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
|
||||||
import org.sleuthkit.autopsy.modules.dataSourceIntegrity.DataSourceIntegrityModuleFactory;
|
import org.sleuthkit.autopsy.modules.dataSourceIntegrity.DataSourceIntegrityModuleFactory;
|
||||||
@ -279,10 +271,8 @@ class InterCaseTestUtils {
|
|||||||
for (CorrelationCase correlationCase : EamDb.getInstance().getCases()) {
|
for (CorrelationCase correlationCase : EamDb.getInstance().getCases()) {
|
||||||
mapOfCaseIdsToCase.put(correlationCase.getDisplayName(), correlationCase.getID());
|
mapOfCaseIdsToCase.put(correlationCase.getDisplayName(), correlationCase.getID());
|
||||||
}
|
}
|
||||||
System.out.println("EAM IS ENABLED");
|
|
||||||
return mapOfCaseIdsToCase;
|
return mapOfCaseIdsToCase;
|
||||||
} else {
|
} else {
|
||||||
System.out.println("EAMDB NOT ENABLED");
|
|
||||||
//it is reasonable that this might happen...
|
//it is reasonable that this might happen...
|
||||||
// for example when we test the feature in the absence of an enabled eamdb
|
// for example when we test the feature in the absence of an enabled eamdb
|
||||||
return new HashMap<>(0);
|
return new HashMap<>(0);
|
||||||
|
@ -85,8 +85,7 @@ public class BingTranslatorTest {
|
|||||||
// /*
|
// /*
|
||||||
// //It's unrealistic to expect the same answer every time, but sometimes
|
// //It's unrealistic to expect the same answer every time, but sometimes
|
||||||
// //it's helpful to have this in your debug process.
|
// //it's helpful to have this in your debug process.
|
||||||
// System.out.println(translation);
|
// assertEquals("Result did not match expected result", expectedTranslation, translation);
|
||||||
// assertEquals(expectedTranslation, translation);
|
|
||||||
// */
|
// */
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
@ -37,8 +37,8 @@ public class GoogleTranslatorTest {
|
|||||||
// //It's unrealistic to expect the same answer every time, but sometimes
|
// //It's unrealistic to expect the same answer every time, but sometimes
|
||||||
// //it's helpful to have this in your debug process.
|
// //it's helpful to have this in your debug process.
|
||||||
//
|
//
|
||||||
// String expResult = "translate"; assertEquals(expResult, result);
|
// String expResult = "translate"; assertEquals(expResult, result);
|
||||||
// System.out.println(result);
|
// assertEquals("Result did not match expected result" expResult, result);
|
||||||
|
|
||||||
}
|
}
|
||||||
//Commented out because using TranslateOption with the current version of Guava is not supported JIRA-5063
|
//Commented out because using TranslateOption with the current version of Guava is not supported JIRA-5063
|
||||||
@ -63,7 +63,6 @@ public class GoogleTranslatorTest {
|
|||||||
// //It's unrealistic to expect the same answer every time, but sometimes
|
// //It's unrealistic to expect the same answer every time, but sometimes
|
||||||
// //it's helpful to have this in your debug process.
|
// //it's helpful to have this in your debug process.
|
||||||
// String expResult = "¡Hola Mundo!";
|
// String expResult = "¡Hola Mundo!";
|
||||||
// assertEquals(expResult, result);
|
// assertEquals("Result did not match expected result", expResult, result);
|
||||||
// System.out.println(result);
|
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,6 @@ import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
|
|||||||
import static org.apache.commons.lang3.ObjectUtils.notEqual;
|
import static org.apache.commons.lang3.ObjectUtils.notEqual;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
||||||
import org.openide.util.Exceptions;
|
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.casemodule.events.ContentTagAddedEvent;
|
import org.sleuthkit.autopsy.casemodule.events.ContentTagAddedEvent;
|
||||||
@ -658,7 +657,7 @@ public class GroupManager {
|
|||||||
|
|
||||||
updateCurrentPathGroup(pathGroupKey);
|
updateCurrentPathGroup(pathGroupKey);
|
||||||
} catch (TskCoreException | TskDataException ex) {
|
} catch (TskCoreException | TskDataException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
logger.log(Level.WARNING, "Error getting drawabledb for fileId " + fileId, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update all the groups that this file belongs to
|
// Update all the groups that this file belongs to
|
||||||
@ -986,7 +985,7 @@ public class GroupManager {
|
|||||||
.findAny().ifPresent(obj_id -> types.add(mimeType));
|
.findAny().ifPresent(obj_id -> types.add(mimeType));
|
||||||
}
|
}
|
||||||
} catch (SQLException | TskCoreException ex) {
|
} catch (SQLException | TskCoreException ex) {
|
||||||
Exceptions.printStackTrace(ex);
|
logger.log(Level.WARNING, "Error getting group by MIME type", ex);
|
||||||
}
|
}
|
||||||
results.putAll(null, types);
|
results.putAll(null, types);
|
||||||
|
|
||||||
|
@ -174,7 +174,6 @@ public class SortChooser<X, Y extends Comparator<X>> extends HBox {
|
|||||||
Image icon = (Image) item.getClass().getMethod("getIcon").invoke(item);
|
Image icon = (Image) item.getClass().getMethod("getIcon").invoke(item);
|
||||||
setGraphic(new ImageView(icon));
|
setGraphic(new ImageView(icon));
|
||||||
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
|
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
|
||||||
// Exceptions.printStackTrace(ex);
|
|
||||||
setText(item.toString());
|
setText(item.toString());
|
||||||
setGraphic(null);
|
setGraphic(null);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2017 Basis Technology Corp.
|
* Copyright 2011-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -48,8 +48,6 @@ public class CreditCardValidatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLengthMatchesBin() {
|
public void testLengthMatchesBin() {
|
||||||
System.out.println("lengthMatchesBin");
|
|
||||||
|
|
||||||
//amex must be 15
|
//amex must be 15
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("3431 136294 58529"));
|
assertEquals(true, CreditCardValidator.isValidCCN("3431 136294 58529"));
|
||||||
assertEquals(false, CreditCardValidator.isValidCCN("3431-136294-5850")); //too short
|
assertEquals(false, CreditCardValidator.isValidCCN("3431-136294-5850")); //too short
|
||||||
@ -95,8 +93,6 @@ public class CreditCardValidatorTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testIsValidCCN16() {
|
public void testIsValidCCN16() {
|
||||||
System.out.println("isValidCCN");
|
|
||||||
|
|
||||||
//rules for separators and grouping for 16 digits
|
//rules for separators and grouping for 16 digits
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234567890318342"));// dashes
|
assertEquals(true, CreditCardValidator.isValidCCN("1234567890318342"));// dashes
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-5678-9031-8342"));// dashes
|
assertEquals(true, CreditCardValidator.isValidCCN("1234-5678-9031-8342"));// dashes
|
||||||
@ -111,8 +107,6 @@ public class CreditCardValidatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsValidCCN15() {
|
public void testIsValidCCN15() {
|
||||||
System.out.println("isValidCCN");
|
|
||||||
|
|
||||||
//amex are fifteen digits, and grouped 4 6 5
|
//amex are fifteen digits, and grouped 4 6 5
|
||||||
//amex cards that strart with 34
|
//amex cards that strart with 34
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("3431 136294 58529"));
|
assertEquals(true, CreditCardValidator.isValidCCN("3431 136294 58529"));
|
||||||
@ -143,7 +137,6 @@ public class CreditCardValidatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsValidCCN19() {
|
public void testIsValidCCN19() {
|
||||||
System.out.println("isValidCCN");
|
|
||||||
//nineteen digit (visa) cards 4-4-4-4-3
|
//nineteen digit (visa) cards 4-4-4-4-3
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("4539747947839518654"));
|
assertEquals(true, CreditCardValidator.isValidCCN("4539747947839518654"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("4539-7479-4783-9518-654"));
|
assertEquals(true, CreditCardValidator.isValidCCN("4539-7479-4783-9518-654"));
|
||||||
@ -168,8 +161,6 @@ public class CreditCardValidatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsValidCCN18() {
|
public void testIsValidCCN18() {
|
||||||
System.out.println("isValidCCN");
|
|
||||||
|
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("123456789031834267"));
|
assertEquals(true, CreditCardValidator.isValidCCN("123456789031834267"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 8342 67"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 8342 67"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-56789031834-267"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234-56789031834-267"));
|
||||||
@ -181,8 +172,6 @@ public class CreditCardValidatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsValidCCN17() {
|
public void testIsValidCCN17() {
|
||||||
System.out.println("isValidCCN");
|
|
||||||
|
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("12345678903183426"));
|
assertEquals(true, CreditCardValidator.isValidCCN("12345678903183426"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 8342 6"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 8342 6"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-56789031834-26"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234-56789031834-26"));
|
||||||
@ -194,8 +183,6 @@ public class CreditCardValidatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsValidCCN14() {
|
public void testIsValidCCN14() {
|
||||||
System.out.println("isValidCCN");
|
|
||||||
|
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("12345678903183"));
|
assertEquals(true, CreditCardValidator.isValidCCN("12345678903183"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 83"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 83"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-5678903183"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234-5678903183"));
|
||||||
@ -207,8 +194,6 @@ public class CreditCardValidatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsValidCCN13() {
|
public void testIsValidCCN13() {
|
||||||
System.out.println("isValidCCN");
|
|
||||||
|
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234567890318"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234567890318"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 8"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 8"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-567890318"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234-567890318"));
|
||||||
@ -220,8 +205,6 @@ public class CreditCardValidatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsValidCCN12() {
|
public void testIsValidCCN12() {
|
||||||
System.out.println("isValidCCN");
|
|
||||||
|
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("123456789031"));
|
assertEquals(true, CreditCardValidator.isValidCCN("123456789031"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031"));
|
||||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-56789031"));
|
assertEquals(true, CreditCardValidator.isValidCCN("1234-56789031"));
|
||||||
|
@ -421,12 +421,6 @@ class ExtractRegistry extends Extract {
|
|||||||
Element oroot = doc.getDocumentElement();
|
Element oroot = doc.getDocumentElement();
|
||||||
NodeList children = oroot.getChildNodes();
|
NodeList children = oroot.getChildNodes();
|
||||||
int len = children.getLength();
|
int len = children.getLength();
|
||||||
// Add all "usb" dataType nodes to collection of BlackboardArtifacts
|
|
||||||
// that we will submit in a ModuleDataEvent for additional processing.
|
|
||||||
Collection<BlackboardArtifact> usbBBartifacts = new ArrayList<>();
|
|
||||||
// Add all "ssid" dataType nodes to collection of BlackboardArtifacts
|
|
||||||
// that we will submit in a ModuleDataEvent for additional processing.
|
|
||||||
Collection<BlackboardArtifact> wifiBBartifacts = new ArrayList<>();
|
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
|
|
||||||
if (context.dataSourceIngestIsCancelled()) {
|
if (context.dataSourceIngestIsCancelled()) {
|
||||||
@ -683,10 +677,8 @@ class ExtractRegistry extends Extract {
|
|||||||
|
|
||||||
// index the artifact for keyword search
|
// index the artifact for keyword search
|
||||||
postArtifact(bbart);
|
postArtifact(bbart);
|
||||||
// add to collection for ModuleDataEvent
|
|
||||||
usbBBartifacts.add(bbart);
|
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Error adding device attached artifact to blackboard."); //NON-NLS
|
logger.log(Level.SEVERE, "Error adding device attached artifact to blackboard.", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "uninstall": //NON-NLS
|
case "uninstall": //NON-NLS
|
||||||
@ -697,8 +689,8 @@ class ExtractRegistry extends Extract {
|
|||||||
itemMtime = new SimpleDateFormat("EEE MMM d HH:mm:ss yyyy").parse(mTimeAttr).getTime(); //NON-NLS
|
itemMtime = new SimpleDateFormat("EEE MMM d HH:mm:ss yyyy").parse(mTimeAttr).getTime(); //NON-NLS
|
||||||
itemMtime /= MS_IN_SEC;
|
itemMtime /= MS_IN_SEC;
|
||||||
}
|
}
|
||||||
} catch (ParseException e) {
|
} catch (ParseException ex) {
|
||||||
logger.log(Level.WARNING, "Failed to parse epoch time for installed program artifact."); //NON-NLS
|
logger.log(Level.WARNING, "Failed to parse epoch time for installed program artifact.", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -710,7 +702,7 @@ class ExtractRegistry extends Extract {
|
|||||||
// index the artifact for keyword search
|
// index the artifact for keyword search
|
||||||
postArtifact(bbart);
|
postArtifact(bbart);
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Error adding installed program artifact to blackboard."); //NON-NLS
|
logger.log(Level.SEVERE, "Error adding installed program artifact to blackboard.", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "office": //NON-NLS
|
case "office": //NON-NLS
|
||||||
@ -730,7 +722,7 @@ class ExtractRegistry extends Extract {
|
|||||||
// index the artifact for keyword search
|
// index the artifact for keyword search
|
||||||
postArtifact(bbart);
|
postArtifact(bbart);
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Error adding recent object artifact to blackboard."); //NON-NLS
|
logger.log(Level.SEVERE, "Error adding recent object artifact to blackboard.", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -797,7 +789,7 @@ class ExtractRegistry extends Extract {
|
|||||||
// index the artifact for keyword search
|
// index the artifact for keyword search
|
||||||
postArtifact(bbart);
|
postArtifact(bbart);
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Error adding account artifact to blackboard."); //NON-NLS
|
logger.log(Level.SEVERE, "Error adding account artifact to blackboard.", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -814,7 +806,7 @@ class ExtractRegistry extends Extract {
|
|||||||
// index the artifact for keyword search
|
// index the artifact for keyword search
|
||||||
postArtifact(bbart);
|
postArtifact(bbart);
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Error adding network artifact to blackboard."); //NON-NLS
|
logger.log(Level.SEVERE, "Error adding network artifact to blackboard.", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "SSID": // NON-NLS
|
case "SSID": // NON-NLS
|
||||||
@ -829,9 +821,8 @@ class ExtractRegistry extends Extract {
|
|||||||
bbart.addAttributes(bbattributes);
|
bbart.addAttributes(bbattributes);
|
||||||
// index the artifact for keyword search
|
// index the artifact for keyword search
|
||||||
postArtifact(bbart);
|
postArtifact(bbart);
|
||||||
wifiBBartifacts.add(bbart);
|
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Error adding SSID artifact to blackboard."); //NON-NLS
|
logger.log(Level.SEVERE, "Error adding SSID artifact to blackboard.", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "shellfolders": // NON-NLS
|
case "shellfolders": // NON-NLS
|
||||||
@ -849,9 +840,6 @@ class ExtractRegistry extends Extract {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} // for
|
} // for
|
||||||
|
|
||||||
postArtifacts(usbBBartifacts);
|
|
||||||
postArtifacts(wifiBBartifacts);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (FileNotFoundException ex) {
|
} catch (FileNotFoundException ex) {
|
||||||
logger.log(Level.SEVERE, "Error finding the registry file.", ex); //NON-NLS
|
logger.log(Level.SEVERE, "Error finding the registry file.", ex); //NON-NLS
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013 Basis Technology Corp.
|
* Copyright 2013-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -79,11 +79,9 @@ public class ScalpelCarver {
|
|||||||
success = true;
|
success = true;
|
||||||
} catch (UnsatisfiedLinkError ex) {
|
} catch (UnsatisfiedLinkError ex) {
|
||||||
String msg = NbBundle.getMessage(ScalpelCarver.class, "ScalpelCarver.loadLib.errMsg.cannotLoadLib", id);
|
String msg = NbBundle.getMessage(ScalpelCarver.class, "ScalpelCarver.loadLib.errMsg.cannotLoadLib", id);
|
||||||
System.out.println(msg + ex.toString());
|
|
||||||
logger.log(Level.SEVERE, msg, ex);
|
logger.log(Level.SEVERE, msg, ex);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
String msg = NbBundle.getMessage(ScalpelCarver.class, "ScalpelCarver.loadLib.errMsg.cannotLoadLib2", id);
|
String msg = NbBundle.getMessage(ScalpelCarver.class, "ScalpelCarver.loadLib.errMsg.cannotLoadLib2", id);
|
||||||
System.out.println(msg + ex.toString());
|
|
||||||
logger.log(Level.SEVERE, msg, ex);
|
logger.log(Level.SEVERE, msg, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user