mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 07:56:16 +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.logging.Level;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.casemodule.services.FileManager;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
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.TskCoreException;
|
||||
import org.sleuthkit.datamodel.TskDataException;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Copyright 2011-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* 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.util.logging.Level;
|
||||
import javax.swing.JComboBox;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||
@ -573,7 +572,7 @@ final class OptionalCasePropertiesPanel extends javax.swing.JPanel {
|
||||
examinerTextField.getText(), tfExaminerPhoneText.getText(),
|
||||
tfExaminerEmailText.getText(), taNotesText.getText()));
|
||||
} catch (CaseActionException ex) {
|
||||
Exceptions.printStackTrace(ex);
|
||||
logger.log(Level.WARNING, "Error updating case details", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2013 Basis Technology Corp.
|
||||
* Copyright 2013-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -62,7 +62,6 @@ public class StartupWindowProvider implements StartupWindowInterface {
|
||||
if (isRunningFromCommandLine()) {
|
||||
// Autopsy is running from command line
|
||||
logger.log(Level.INFO, "Running from command line"); //NON-NLS
|
||||
System.out.println("Running from command line");
|
||||
startupWindowToUse = new CommandLineStartupWindow();
|
||||
// kick off command line processing
|
||||
new CommandLineIngestManager().start();
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Central Repository
|
||||
*
|
||||
* Copyright 2015-2018 Basis Technology Corp.
|
||||
* Copyright 2015-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* 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.table.DefaultTableModel;
|
||||
import javax.swing.table.TableModel;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
@ -74,7 +73,7 @@ final class ManageCorrelationPropertiesDialog extends javax.swing.JDialog {
|
||||
correlationTypes.clear();
|
||||
correlationTypes.addAll(dbManager.getDefinedCorrelationTypes());
|
||||
} catch (EamDbException ex) {
|
||||
Exceptions.printStackTrace(ex);
|
||||
LOGGER.log(Level.WARNING, "Error loading data", ex);
|
||||
}
|
||||
|
||||
correlationTypes.forEach((aType) -> {
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Central Repository
|
||||
*
|
||||
* Copyright 2015-2018 Basis Technology Corp.
|
||||
* Copyright 2015-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* 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.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
|
||||
@ -78,7 +77,7 @@ public final class ManageOrganizationsDialog extends JDialog {
|
||||
setButtonsEnabled(organizationList.getSelectedValue());
|
||||
newOrg = null;
|
||||
} catch (EamDbException ex) {
|
||||
Exceptions.printStackTrace(ex);
|
||||
logger.log(Level.WARNING, "Error getting Central Repo for Organizations dialog", ex);
|
||||
}
|
||||
display();
|
||||
}
|
||||
|
@ -27,10 +27,11 @@ import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Observable;
|
||||
import java.util.Observer;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.ComboBoxModel;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||
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
|
||||
@ -38,6 +39,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
||||
*/
|
||||
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 final Observable fileTypeFilterObservable;
|
||||
static final int NO_CASE_SELECTED = -1;
|
||||
@ -121,7 +123,7 @@ public final class InterCasePanel extends javax.swing.JPanel {
|
||||
this.correlationTypeComboBox.addItem(type.getDisplayName());
|
||||
}
|
||||
} catch (EamDbException ex) {
|
||||
Exceptions.printStackTrace(ex);
|
||||
logger.log(Level.WARNING, "Error getting correlation types", ex);
|
||||
}
|
||||
this.correlationTypeComboBox.setSelectedIndex(0);
|
||||
}
|
||||
|
@ -1,12 +1,10 @@
|
||||
ContactDetailsPane.nameLabel.text=Placeholder
|
||||
SummaryViewer.countsPanel.border.title=Counts
|
||||
SummaryViewer.contactsLabel.text=Contacts:
|
||||
SummaryViewer.attachmentsLabel.text=Media Attachments:
|
||||
OutlineViewPanel.messageLabel.text=<Control Disabled>
|
||||
SummaryViewer.messagesDataLabel.text=messages
|
||||
SummaryViewer.callLogsDataLabel.text=callLogs
|
||||
SummaryViewer.contactsDataLabel.text=contacts
|
||||
SummaryViewer.attachmentsDataLabel.text=attachments
|
||||
SummaryViewer.messagesLabel.text=Messages:
|
||||
SummaryViewer.callLogsLabel.text=Call Logs:
|
||||
ThreadRootMessagePanel.showAllCheckBox.text=Show All Messages
|
||||
@ -19,3 +17,7 @@ MessageViewer.showingMessagesLabel.text=Showing Messages for Thread:
|
||||
MessageViewer.backButton.AccessibleContext.accessibleDescription=
|
||||
MessageViewer.backButton.text=Threads
|
||||
MessageViewer.showAllButton.text=All Messages
|
||||
SummaryViewer.thumbnailCntLabel.text=Media Attachments:
|
||||
SummaryViewer.attachmentsLable.text=Total Attachments:
|
||||
SummaryViewer.thumbnailsDataLabel.text=attachments
|
||||
SummaryViewer.attachmentDataLabel.text=count
|
||||
|
@ -37,12 +37,10 @@ MessageViewer_viewMessage_selected=Selected
|
||||
MessageViewer_viewMessage_unthreaded=Unthreaded
|
||||
SummaryViewer.countsPanel.border.title=Counts
|
||||
SummaryViewer.contactsLabel.text=Contacts:
|
||||
SummaryViewer.attachmentsLabel.text=Media Attachments:
|
||||
OutlineViewPanel.messageLabel.text=<Control Disabled>
|
||||
SummaryViewer.messagesDataLabel.text=messages
|
||||
SummaryViewer.callLogsDataLabel.text=callLogs
|
||||
SummaryViewer.contactsDataLabel.text=contacts
|
||||
SummaryViewer.attachmentsDataLabel.text=attachments
|
||||
SummaryViewer.messagesLabel.text=Messages:
|
||||
SummaryViewer.callLogsLabel.text=Call Logs:
|
||||
SummaryViewer_CaseRefNameColumn_Title=Case Name
|
||||
@ -61,3 +59,7 @@ MessageViewer.showingMessagesLabel.text=Showing Messages for Thread:
|
||||
MessageViewer.backButton.AccessibleContext.accessibleDescription=
|
||||
MessageViewer.backButton.text=Threads
|
||||
MessageViewer.showAllButton.text=All Messages
|
||||
SummaryViewer.thumbnailCntLabel.text=Media Attachments:
|
||||
SummaryViewer.attachmentsLable.text=Total Attachments:
|
||||
SummaryViewer.thumbnailsDataLabel.text=attachments
|
||||
SummaryViewer.attachmentDataLabel.text=count
|
||||
|
@ -47,7 +47,6 @@ import org.openide.nodes.Children;
|
||||
import org.openide.nodes.Node;
|
||||
import org.openide.nodes.Node.Property;
|
||||
import org.openide.nodes.Node.PropertySet;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.Lookup;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.communications.ModifiableProxyLookup;
|
||||
@ -397,7 +396,7 @@ public class MessageViewer extends JPanel implements RelationshipsViewer {
|
||||
try {
|
||||
rootTablePane.getExplorerManager().setSelectedNodes(new Node[0]);
|
||||
} catch (PropertyVetoException ex) {
|
||||
Exceptions.printStackTrace(ex);
|
||||
logger.log(Level.WARNING, "Error setting selected nodes", ex);
|
||||
}
|
||||
showThreadsPane();
|
||||
}//GEN-LAST:event_backButtonActionPerformed
|
||||
|
@ -24,6 +24,7 @@ import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
||||
import org.sleuthkit.datamodel.Account;
|
||||
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
@ -37,30 +38,30 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* VisualizationPane
|
||||
*/
|
||||
public final class SelectionInfo {
|
||||
|
||||
|
||||
private static final Logger logger = Logger.getLogger(SelectionInfo.class.getName());
|
||||
|
||||
private final Set<AccountDeviceInstance> selectedNodes;
|
||||
private final Set<GraphEdge> selectedEdges;
|
||||
private final CommunicationsFilter communicationFilter;
|
||||
private final Set<Account> accounts;
|
||||
|
||||
|
||||
private Set<BlackboardArtifact> accountArtifacts = null;
|
||||
private SelectionSummary summary = null;
|
||||
|
||||
/**
|
||||
* Wraps the details of the currently selected accounts.
|
||||
*
|
||||
* @param selectedNodes Selected AccountDeviceInstances
|
||||
* @param selectedEdges Selected pairs of AccountDeviceInstances
|
||||
* @param communicationFilter Currently selected communications filters
|
||||
* @param selectedNodes Selected AccountDeviceInstances
|
||||
* @param selectedEdges Selected pairs of AccountDeviceInstances
|
||||
* @param communicationFilter Currently selected communications filters
|
||||
*/
|
||||
public SelectionInfo(Set<AccountDeviceInstance> selectedNodes, Set<GraphEdge> selectedEdges,
|
||||
public SelectionInfo(Set<AccountDeviceInstance> selectedNodes, Set<GraphEdge> selectedEdges,
|
||||
CommunicationsFilter communicationFilter) {
|
||||
this.selectedNodes = selectedNodes;
|
||||
this.selectedEdges = selectedEdges;
|
||||
this.communicationFilter = communicationFilter;
|
||||
|
||||
|
||||
accounts = new HashSet<>();
|
||||
selectedNodes.forEach((instance) -> {
|
||||
accounts.add(instance.getAccount());
|
||||
@ -75,10 +76,10 @@ public final class SelectionInfo {
|
||||
public Set<AccountDeviceInstance> getSelectedNodes() {
|
||||
return selectedNodes;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the currently selected edges
|
||||
*
|
||||
*
|
||||
* @return Set of GraphEdge objects
|
||||
*/
|
||||
public Set<GraphEdge> getSelectedEdges() {
|
||||
@ -93,16 +94,17 @@ public final class SelectionInfo {
|
||||
public CommunicationsFilter getCommunicationsFilter() {
|
||||
return communicationFilter;
|
||||
}
|
||||
|
||||
|
||||
public Set<Account> getAccounts() {
|
||||
return accounts;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the set of relationship sources from the case database
|
||||
*
|
||||
*
|
||||
* @return the relationship sources (may be empty)
|
||||
* @throws TskCoreException
|
||||
*
|
||||
* @throws TskCoreException
|
||||
*/
|
||||
Set<Content> getRelationshipSources() throws TskCoreException {
|
||||
|
||||
@ -112,28 +114,28 @@ public final class SelectionInfo {
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
throw new TskCoreException("Failed to get current case", ex);
|
||||
}
|
||||
|
||||
|
||||
Set<Content> relationshipSources = new HashSet<>();
|
||||
try {
|
||||
// Add all nodes
|
||||
relationshipSources.addAll(communicationManager.getRelationshipSources(getSelectedNodes(), getCommunicationsFilter()));
|
||||
|
||||
|
||||
// Add all edges. For edges, the relationship has to include both endpoints
|
||||
for (SelectionInfo.GraphEdge edge : getSelectedEdges()) {
|
||||
relationshipSources.addAll(communicationManager.getRelationshipSources(edge.getStartNode(),
|
||||
relationshipSources.addAll(communicationManager.getRelationshipSources(edge.getStartNode(),
|
||||
edge.getEndNode(), getCommunicationsFilter()));
|
||||
}
|
||||
} catch (TskCoreException ex) {
|
||||
logger.log(Level.SEVERE, "Failed to get relationships from case database.", ex); //NON-NLS
|
||||
|
||||
|
||||
}
|
||||
return relationshipSources;
|
||||
}
|
||||
|
||||
|
||||
public Set<BlackboardArtifact> getArtifacts() {
|
||||
if(accountArtifacts == null) {
|
||||
if (accountArtifacts == null) {
|
||||
accountArtifacts = new HashSet<>();
|
||||
|
||||
|
||||
try {
|
||||
final Set<Content> relationshipSources = getRelationshipSources();
|
||||
relationshipSources.stream().filter((content) -> (content instanceof BlackboardArtifact)).forEachOrdered((content) -> {
|
||||
@ -144,58 +146,67 @@ public final class SelectionInfo {
|
||||
return accountArtifacts;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return accountArtifacts;
|
||||
}
|
||||
|
||||
|
||||
public SelectionSummary getSummary() {
|
||||
if(summary == null) {
|
||||
if (summary == null) {
|
||||
summary = new SelectionSummary();
|
||||
}
|
||||
|
||||
|
||||
return summary;
|
||||
}
|
||||
|
||||
final class SelectionSummary{
|
||||
|
||||
final class SelectionSummary {
|
||||
|
||||
int attachmentCnt;
|
||||
int messagesCnt;
|
||||
int emailCnt;
|
||||
int callLogCnt;
|
||||
int contactsCnt;
|
||||
|
||||
int mediaCnt;
|
||||
|
||||
SelectionSummary() {
|
||||
getCounts();
|
||||
}
|
||||
|
||||
private void getCounts(){
|
||||
for(BlackboardArtifact artifact: getArtifacts()) {
|
||||
|
||||
private void getCounts() {
|
||||
for (BlackboardArtifact artifact : getArtifacts()) {
|
||||
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
|
||||
if(null != fromID) switch (fromID) {
|
||||
case TSK_EMAIL_MSG:
|
||||
emailCnt++;
|
||||
break;
|
||||
case TSK_CALLLOG:
|
||||
callLogCnt++;
|
||||
break;
|
||||
case TSK_MESSAGE:
|
||||
messagesCnt++;
|
||||
break;
|
||||
case TSK_CONTACT:
|
||||
contactsCnt++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (null != fromID) {
|
||||
switch (fromID) {
|
||||
case TSK_EMAIL_MSG:
|
||||
emailCnt++;
|
||||
break;
|
||||
case TSK_CALLLOG:
|
||||
callLogCnt++;
|
||||
break;
|
||||
case TSK_MESSAGE:
|
||||
messagesCnt++;
|
||||
break;
|
||||
case TSK_CONTACT:
|
||||
contactsCnt++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
try{
|
||||
attachmentCnt+= artifact.getChildrenCount();
|
||||
try {
|
||||
attachmentCnt += artifact.getChildrenCount();
|
||||
for (Content childContent : artifact.getChildren()) {
|
||||
if (ImageUtils.thumbnailSupported(childContent)) {
|
||||
mediaCnt++;
|
||||
}
|
||||
}
|
||||
} catch (TskCoreException ex) {
|
||||
logger.log(Level.WARNING, String.format("Exception thrown "
|
||||
+ "from getChildrenCount artifactID: %d",
|
||||
+ "from getChildrenCount artifactID: %d",
|
||||
artifact.getArtifactID()), ex); //NON-NLS
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int getAttachmentCnt() {
|
||||
return attachmentCnt;
|
||||
}
|
||||
@ -215,24 +226,29 @@ public final class SelectionInfo {
|
||||
public int getContactsCnt() {
|
||||
return contactsCnt;
|
||||
}
|
||||
|
||||
public int getThumbnailCnt() {
|
||||
return mediaCnt;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility class to represent an edge from the graph visualization.
|
||||
*/
|
||||
public static class GraphEdge {
|
||||
|
||||
AccountDeviceInstance startNode;
|
||||
AccountDeviceInstance endNode;
|
||||
|
||||
|
||||
public GraphEdge(AccountDeviceInstance startNode, AccountDeviceInstance endNode) {
|
||||
this.startNode = startNode;
|
||||
this.endNode = endNode;
|
||||
}
|
||||
|
||||
|
||||
public AccountDeviceInstance getStartNode() {
|
||||
return startNode;
|
||||
}
|
||||
|
||||
|
||||
public AccountDeviceInstance getEndNode() {
|
||||
return endNode;
|
||||
}
|
||||
|
@ -41,16 +41,18 @@
|
||||
<Component id="messagesLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="callLogsLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="contactsLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="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>
|
||||
<EmptySpace type="separate" max="-2" 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="callLogsDataLabel" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="messagesDataLabel" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace pref="959" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="845" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@ -74,10 +76,14 @@
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="attachmentsLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="attachmentsDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="thumbnailCntLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="thumbnailsDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="attachmentsLable" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="attachmentDataLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
@ -104,17 +110,17 @@
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="attachmentsLabel">
|
||||
<Component class="javax.swing.JLabel" name="thumbnailCntLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.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>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="attachmentsDataLabel">
|
||||
<Component class="javax.swing.JLabel" name="thumbnailsDataLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.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>
|
||||
</Properties>
|
||||
</Component>
|
||||
@ -139,6 +145,20 @@
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="attachmentsLable">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentsLable.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="attachmentDataLabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/relationships/Bundle.properties" key="SummaryViewer.attachmentDataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel" name="fileReferencesPanel">
|
||||
|
@ -104,10 +104,11 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
||||
} else {
|
||||
SelectionSummary summaryDetails = info.getSummary();
|
||||
|
||||
attachmentsDataLabel.setText(Integer.toString(summaryDetails.getAttachmentCnt()));
|
||||
thumbnailsDataLabel.setText(Integer.toString(summaryDetails.getThumbnailCnt()));
|
||||
callLogsDataLabel.setText(Integer.toString(summaryDetails.getCallLogCnt()));
|
||||
contactsDataLabel.setText(Integer.toString(summaryDetails.getContactsCnt()));
|
||||
messagesDataLabel.setText(Integer.toString(summaryDetails.getMessagesCnt() + summaryDetails.getEmailCnt()));
|
||||
attachmentDataLabel.setText(Integer.toString(summaryDetails.getAttachmentCnt()));
|
||||
|
||||
fileReferencesPanel.showOutlineView();
|
||||
|
||||
@ -131,7 +132,7 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
||||
@Override
|
||||
public void setEnabled(boolean enabled) {
|
||||
super.setEnabled(enabled);
|
||||
attachmentsLabel.setEnabled(enabled);
|
||||
thumbnailCntLabel.setEnabled(enabled);
|
||||
callLogsLabel.setEnabled(enabled);
|
||||
contactsLabel.setEnabled(enabled);
|
||||
messagesLabel.setEnabled(enabled);
|
||||
@ -144,10 +145,11 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
||||
* Clears the text fields and OutlookViews.
|
||||
*/
|
||||
private void clearControls() {
|
||||
attachmentsDataLabel.setText("");
|
||||
thumbnailsDataLabel.setText("");
|
||||
callLogsDataLabel.setText("");
|
||||
contactsDataLabel.setText("");
|
||||
messagesDataLabel.setText("");
|
||||
attachmentDataLabel.setText("");
|
||||
|
||||
fileReferencesPanel.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();
|
||||
messagesLabel = new javax.swing.JLabel();
|
||||
callLogsLabel = new javax.swing.JLabel();
|
||||
attachmentsLabel = new javax.swing.JLabel();
|
||||
attachmentsDataLabel = new javax.swing.JLabel();
|
||||
thumbnailCntLabel = new javax.swing.JLabel();
|
||||
thumbnailsDataLabel = new javax.swing.JLabel();
|
||||
messagesDataLabel = new javax.swing.JLabel();
|
||||
callLogsDataLabel = new javax.swing.JLabel();
|
||||
contactsDataLabel = new javax.swing.JLabel();
|
||||
attachmentsLable = new javax.swing.JLabel();
|
||||
attachmentDataLabel = new javax.swing.JLabel();
|
||||
fileReferencesPanel = 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(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
|
||||
|
||||
@ -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(attachmentsLable, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentsLable.text")); // NOI18N
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(attachmentDataLabel, org.openide.util.NbBundle.getMessage(SummaryViewer.class, "SummaryViewer.attachmentDataLabel.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout countsPanelLayout = new javax.swing.GroupLayout(countsPanel);
|
||||
countsPanel.setLayout(countsPanelLayout);
|
||||
countsPanelLayout.setHorizontalGroup(
|
||||
@ -225,14 +233,16 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
||||
.addComponent(messagesLabel)
|
||||
.addComponent(callLogsLabel)
|
||||
.addComponent(contactsLabel)
|
||||
.addComponent(attachmentsLabel))
|
||||
.addComponent(thumbnailCntLabel)
|
||||
.addComponent(attachmentsLable))
|
||||
.addGap(18, 18, 18)
|
||||
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(attachmentsDataLabel)
|
||||
.addComponent(attachmentDataLabel)
|
||||
.addComponent(thumbnailsDataLabel)
|
||||
.addComponent(contactsDataLabel)
|
||||
.addComponent(callLogsDataLabel)
|
||||
.addComponent(messagesDataLabel))
|
||||
.addContainerGap(959, Short.MAX_VALUE))
|
||||
.addContainerGap(845, Short.MAX_VALUE))
|
||||
);
|
||||
countsPanelLayout.setVerticalGroup(
|
||||
countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
@ -251,9 +261,12 @@ public class SummaryViewer extends javax.swing.JPanel implements RelationshipsVi
|
||||
.addComponent(contactsDataLabel))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(attachmentsLabel)
|
||||
.addComponent(attachmentsDataLabel))
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addComponent(thumbnailCntLabel)
|
||||
.addComponent(thumbnailsDataLabel))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(countsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(attachmentsLable)
|
||||
.addComponent(attachmentDataLabel)))
|
||||
);
|
||||
|
||||
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
|
||||
private javax.swing.JLabel attachmentsDataLabel;
|
||||
private javax.swing.JLabel attachmentsLabel;
|
||||
private javax.swing.JLabel attachmentDataLabel;
|
||||
private javax.swing.JLabel attachmentsLable;
|
||||
private javax.swing.JLabel callLogsDataLabel;
|
||||
private javax.swing.JLabel callLogsLabel;
|
||||
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 javax.swing.JLabel messagesDataLabel;
|
||||
private javax.swing.JLabel messagesLabel;
|
||||
private javax.swing.JLabel thumbnailCntLabel;
|
||||
private javax.swing.JLabel thumbnailsDataLabel;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Copyright 2011-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-18 Basis Technology Corp.
|
||||
* Copyright 2011-19 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* 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.FilterNode;
|
||||
import org.openide.nodes.Node;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.lookup.Lookups;
|
||||
import org.sleuthkit.autopsy.corecomponents.ResultViewerPersistence.SortCriterion;
|
||||
@ -197,7 +196,7 @@ class ThumbnailViewChildren extends Children.Keys<Integer> {
|
||||
}
|
||||
|
||||
} 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
|
||||
*
|
||||
* Copyright 2012-2018 Basis Technology Corp.
|
||||
* Copyright 2012-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -119,19 +119,19 @@ public class PlatformUtil {
|
||||
public static String getUserPythonModulesPath() {
|
||||
return getUserDirectory().getAbsolutePath() + File.separator + PYTHON_MODULES_SUBDIRECTORY;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get root path where the user's Ocr language packs are stored.
|
||||
*
|
||||
*
|
||||
* @return Absolute path to the Ocr language packs root directory.
|
||||
*/
|
||||
public static String getOcrLanguagePacksPath() {
|
||||
return getUserDirectory().getAbsolutePath() + File.separator + OCR_LANGUAGE_SUBDIRECTORY;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the names of the language packs installed at the user directory.
|
||||
*
|
||||
*
|
||||
* @return List of language packs base names
|
||||
*/
|
||||
public static List<String> getOcrLanguagePacks() {
|
||||
@ -139,20 +139,20 @@ public class PlatformUtil {
|
||||
|
||||
List<String> languagePacks = new ArrayList<>();
|
||||
for (File languagePack : languagePackRootDir.listFiles()) {
|
||||
String fileExt = FilenameUtils.getExtension(languagePack.getName());
|
||||
String fileExt = FilenameUtils.getExtension(languagePack.getName());
|
||||
if (!languagePack.isDirectory() && OCR_LANGUAGE_PACK_EXT.equals(fileExt)) {
|
||||
String packageName = FilenameUtils.getBaseName(languagePack.getName());
|
||||
languagePacks.add(packageName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return languagePacks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get root path where the user's object detection classifiers are stored.
|
||||
*
|
||||
* @return Absolute path to the object detection classifiers root directory.
|
||||
*
|
||||
* @return Absolute path to the object detection classifiers root directory.
|
||||
*/
|
||||
public static String getObjectDetectionClassifierPath() {
|
||||
return getUserDirectory().getAbsolutePath() + File.separator + CLASSIFIERS_SUBDIRECTORY;
|
||||
|
@ -336,7 +336,6 @@ public abstract class AbstractAbstractFileNode<T extends AbstractFile> extends A
|
||||
backgroundTasksPool.submit(new GetSCOTask(
|
||||
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<>(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)));
|
||||
@ -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_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<>(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<>(MIMETYPE.toString(), MIMETYPE.toString(), NO_DESCR, StringUtils.defaultString(content.getMIMEType())));
|
||||
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.put(ps.getProperties());
|
||||
if (newPs.remove(AbstractFsContentNode.HIDE_PARENT) != null) {
|
||||
newPs.remove(AbstractFilePropertyType.LOCATION.toString());
|
||||
}
|
||||
newPs.remove(AbstractFsContentNode.HIDE_PARENT);
|
||||
propertySets[i] = newPs;
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* 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.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
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.PlatformUtil;
|
||||
|
||||
@ -40,7 +41,7 @@ public final class IngestProfiles {
|
||||
private static final String PROFILE_DESC_KEY = "Profile_Description";
|
||||
private static final String PROFILE_FILTER_KEY = "Profile_Filter";
|
||||
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.
|
||||
*
|
||||
@ -143,7 +144,7 @@ public final class IngestProfiles {
|
||||
Files.deleteIfExists(Paths.get(PlatformUtil.getUserConfigDirectory(), selectedProfile.getName() + PROFILE_FILE_EXT));
|
||||
FileUtils.deleteDirectory(IngestJobSettings.getSavedModuleSettingsFolder(selectedProfile.getName() + File.separator).toFile());
|
||||
} 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
|
||||
*
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Copyright 2011-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* 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.Collections;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JMenuItem;
|
||||
import org.openide.awt.DynamicMenuContent;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.datamodel.Content;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
@ -37,6 +39,8 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
*/
|
||||
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
|
||||
* 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
|
||||
return getEmpty();
|
||||
} 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()];
|
||||
|
||||
|
@ -105,7 +105,7 @@ EditNonFullPathsRulePanel.minSizeCheckbox.text=Minimum size:
|
||||
NewRulePanel.chooseLabel.text=Choose the type of rule
|
||||
ConfigVisualPanel1.configureDriveRadioButton.text_1=Configure selected external drive:
|
||||
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
|
||||
ConfigVisualPanel3.saveButton.text=Save
|
||||
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.
|
||||
ConfigVisualPanel2.promptBeforeExit.text=Prompt before exiting imager
|
||||
ConfigVisualPanel2.promptBeforeExit.actionCommand=
|
||||
ConfigVisualPanel2.createVHDCheckBox.text=Create VHD
|
||||
|
@ -26,10 +26,16 @@ ConfigVisualPanel1.chooseFileTitle=Select a Logical Imager configuration
|
||||
# {0} - filename
|
||||
ConfigVisualPanel1.configFileIsEmpty=Configuration file {0} is empty
|
||||
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.invalidConfigJson=Invalid config JSON:
|
||||
ConfigVisualPanel1.messageLabel.noExternalDriveFound=No drive found
|
||||
ConfigVisualPanel1.selectConfigurationFile=Select location
|
||||
ConfigVisualPanel1.unknown=Unknown
|
||||
ConfigVisualPanel2.cancel=Cancel
|
||||
ConfigVisualPanel2.deleteRuleSet=Delete rule
|
||||
ConfigVisualPanel2.deleteRuleSetConfirmation=Delete rule confirmation
|
||||
@ -174,7 +180,7 @@ LogicalImagerConfigDeserializer.unsupportedKeyException=Unsupported key: {0}
|
||||
NewRulePanel.chooseLabel.text=Choose the type of rule
|
||||
ConfigVisualPanel1.configureDriveRadioButton.text_1=Configure selected external drive:
|
||||
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
|
||||
ConfigVisualPanel3.saveButton.text=Save
|
||||
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.
|
||||
ConfigVisualPanel2.promptBeforeExit.text=Prompt before exiting imager
|
||||
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.name=Attribute
|
||||
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.nio.charset.StandardCharsets;
|
||||
import java.nio.file.FileStore;
|
||||
import java.nio.file.FileSystem;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.spi.FileSystemProvider;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
@ -241,10 +245,31 @@ final class ConfigVisualPanel1 extends JPanel {
|
||||
firePropertyChange(UPDATE_UI_EVENT_NAME, false, true); // NON-NLS
|
||||
}//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
|
||||
*/
|
||||
@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() {
|
||||
List<String> listData = new ArrayList<>();
|
||||
File[] roots = File.listRoots();
|
||||
@ -257,7 +282,8 @@ final class ConfigVisualPanel1 extends JPanel {
|
||||
String description = FileSystemView.getFileSystemView().getSystemTypeDescription(root);
|
||||
long spaceInBytes = root.getTotalSpace();
|
||||
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) {
|
||||
try {
|
||||
FileStore fileStore = Files.getFileStore(root.toPath());
|
||||
@ -266,7 +292,7 @@ final class ConfigVisualPanel1 extends JPanel {
|
||||
}
|
||||
} catch (IOException ignored) {
|
||||
//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++;
|
||||
@ -431,8 +457,7 @@ final class ConfigVisualPanel1 extends JPanel {
|
||||
return UPDATE_UI_EVENT_NAME;
|
||||
}
|
||||
|
||||
void setConfigFilename(String filename
|
||||
) {
|
||||
void setConfigFilename(String filename) {
|
||||
configFileTextField.setText(filename);
|
||||
}
|
||||
|
||||
@ -442,9 +467,11 @@ final class ConfigVisualPanel1 extends JPanel {
|
||||
* @return true if panel has valid settings selected, false otherwise
|
||||
*/
|
||||
boolean isPanelValid() {
|
||||
return !StringUtils.isBlank(getConfigPath()) && ((configureDriveRadioButton.isSelected() && !StringUtils.isBlank(driveList.getSelectedValue()))
|
||||
|| (configureFolderRadioButton.isSelected() && (!configFileTextField.getText().isEmpty())));
|
||||
|
||||
return !StringUtils.isBlank(getConfigPath())
|
||||
&& !(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="finalizeImageWriter" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="promptBeforeExit" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="createVHDCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
@ -193,7 +194,8 @@
|
||||
<Component id="finalizeImageWriter" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="promptBeforeExit" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace 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>
|
||||
@ -582,5 +584,15 @@
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="promptBeforeExitActionPerformed"/>
|
||||
</Events>
|
||||
</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>
|
||||
</Form>
|
||||
|
@ -111,6 +111,7 @@ final class ConfigVisualPanel2 extends JPanel {
|
||||
maxSizeLabel = new javax.swing.JLabel();
|
||||
maxSizeTextField = new javax.swing.JFormattedTextField();
|
||||
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
|
||||
|
||||
@ -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);
|
||||
this.setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
@ -338,7 +346,8 @@ final class ConfigVisualPanel2 extends JPanel {
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(flagEncryptionProgramsCheckBox)
|
||||
.addComponent(finalizeImageWriter)
|
||||
.addComponent(promptBeforeExit))
|
||||
.addComponent(promptBeforeExit)
|
||||
.addComponent(createVHDCheckBox))
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
.addComponent(jSeparator1)))))
|
||||
);
|
||||
@ -412,7 +421,8 @@ final class ConfigVisualPanel2 extends JPanel {
|
||||
.addComponent(finalizeImageWriter)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(promptBeforeExit)
|
||||
.addGap(21, 21, 21))))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(createVHDCheckBox))))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
@ -546,6 +556,10 @@ final class ConfigVisualPanel2 extends JPanel {
|
||||
config.setPromptBeforeExit(promptBeforeExit.isSelected());
|
||||
}//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
|
||||
* added to the rules in this config
|
||||
@ -588,6 +602,7 @@ final class ConfigVisualPanel2 extends JPanel {
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JTextField configFileTextField;
|
||||
private javax.swing.JCheckBox createVHDCheckBox;
|
||||
private javax.swing.JLabel daysIncludedLabel;
|
||||
private javax.swing.JButton deleteRuleButton;
|
||||
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
|
||||
*
|
||||
* @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
|
||||
*/
|
||||
private void updatePanel(String configFilePath, LogicalImagerConfig config, String rowSelectionkey) {
|
||||
configFileTextField.setText(configFilePath);
|
||||
finalizeImageWriter.setSelected(config.isFinalizeImageWriter());
|
||||
promptBeforeExit.setSelected(config.isPromptBeforeExit());
|
||||
createVHDCheckBox.setSelected(config.isCreateVHD());
|
||||
LogicalImagerRuleSet ruleSet = getRuleSetFromCurrentConfig();
|
||||
flagEncryptionProgramsCheckBox.setSelected(ruleSet.find(EncryptionProgramsRule.getName()) != null);
|
||||
RulesTableModel rulesTableModel = new RulesTableModel();
|
||||
|
@ -42,6 +42,10 @@ class LogicalImagerConfig {
|
||||
@Expose(serialize = true)
|
||||
private boolean promptBeforeExit;
|
||||
|
||||
@SerializedName("create-VHD")
|
||||
@Expose(serialize = true)
|
||||
private boolean createVHD;
|
||||
|
||||
@SerializedName("rule-sets")
|
||||
@Expose(serialize = true)
|
||||
private List<LogicalImagerRuleSet> ruleSets;
|
||||
@ -50,6 +54,7 @@ class LogicalImagerConfig {
|
||||
this.version = CURRENT_VERSION;
|
||||
this.finalizeImageWriter = false;
|
||||
this.promptBeforeExit = true;
|
||||
this.createVHD = false;
|
||||
this.ruleSets = new ArrayList<>();
|
||||
}
|
||||
|
||||
@ -60,6 +65,7 @@ class LogicalImagerConfig {
|
||||
this.version = CURRENT_VERSION;
|
||||
this.finalizeImageWriter = finalizeImageWriter;
|
||||
this.promptBeforeExit = true;
|
||||
this.createVHD = false;
|
||||
this.ruleSets = ruleSets;
|
||||
}
|
||||
|
||||
@ -71,6 +77,7 @@ class LogicalImagerConfig {
|
||||
this.version = version;
|
||||
this.finalizeImageWriter = finalizeImageWriter;
|
||||
this.promptBeforeExit = true;
|
||||
this.createVHD = false;
|
||||
this.ruleSets = ruleSets;
|
||||
}
|
||||
|
||||
@ -78,11 +85,13 @@ class LogicalImagerConfig {
|
||||
String version,
|
||||
boolean finalizeImageWriter,
|
||||
boolean promptBeforeExit,
|
||||
boolean createVHD,
|
||||
List<LogicalImagerRuleSet> ruleSets
|
||||
) {
|
||||
this.version = version;
|
||||
this.finalizeImageWriter = finalizeImageWriter;
|
||||
this.promptBeforeExit = promptBeforeExit;
|
||||
this.createVHD = createVHD;
|
||||
this.ruleSets = ruleSets;
|
||||
}
|
||||
|
||||
@ -114,6 +123,14 @@ class LogicalImagerConfig {
|
||||
this.promptBeforeExit = promptBeforeExit;
|
||||
}
|
||||
|
||||
boolean isCreateVHD() {
|
||||
return createVHD;
|
||||
}
|
||||
|
||||
void setCreateVHD(boolean createVHD) {
|
||||
this.createVHD = createVHD;
|
||||
}
|
||||
|
||||
List<LogicalImagerRuleSet> getRuleSets() {
|
||||
return ruleSets;
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ class LogicalImagerConfigDeserializer implements JsonDeserializer<LogicalImagerC
|
||||
String version = LogicalImagerConfig.getCurrentVersion();
|
||||
boolean finalizeImageWriter = false;
|
||||
boolean promptBeforeExit = true;
|
||||
boolean createVHD = false;
|
||||
|
||||
final JsonObject jsonObject = je.getAsJsonObject();
|
||||
final JsonElement jsonVersion = jsonObject.get("version"); // NON-NLS
|
||||
@ -63,6 +64,11 @@ class LogicalImagerConfigDeserializer implements JsonDeserializer<LogicalImagerC
|
||||
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
|
||||
if (asJsonArray == null) {
|
||||
throw new JsonParseException(Bundle.LogicalImagerConfigDeserializer_missingRuleSetException());
|
||||
@ -80,7 +86,7 @@ class LogicalImagerConfigDeserializer implements JsonDeserializer<LogicalImagerC
|
||||
LogicalImagerRuleSet ruleSet = new LogicalImagerRuleSet(setName, rules);
|
||||
ruleSets.add(ruleSet);
|
||||
}
|
||||
return new LogicalImagerConfig(version, finalizeImageWriter, promptBeforeExit, ruleSets);
|
||||
return new LogicalImagerConfig(version, finalizeImageWriter, promptBeforeExit, createVHD, ruleSets);
|
||||
}
|
||||
|
||||
private List<LogicalImagerRule> parseRules(JsonArray asJsonArray) {
|
||||
|
@ -31,19 +31,21 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.casemodule.services.Blackboard;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.ingest.IngestServices;
|
||||
import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
|
||||
import org.sleuthkit.autopsy.datamodel.utils.LocalFileImporter;
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.datamodel.Blackboard;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||
import org.sleuthkit.datamodel.Content;
|
||||
import org.sleuthkit.datamodel.LocalFilesDataSource;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
/**
|
||||
@ -51,33 +53,39 @@ import org.sleuthkit.datamodel.TskCoreException;
|
||||
* SearchResults.txt and users.txt files to report - add an image data source to the
|
||||
* 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 String SEARCH_RESULTS_TXT = "SearchResults.txt"; //NON-NLS
|
||||
private final static String USERS_TXT = "users.txt"; //NON-NLS
|
||||
private final static String MODULE_NAME = "Logical Imager"; //NON-NLS
|
||||
private final static String ROOT_STR = "root"; // NON-NLS
|
||||
private final static String VHD_EXTENSION = ".vhd"; // NON-NLS
|
||||
private final String deviceId;
|
||||
private final String timeZone;
|
||||
private final File src;
|
||||
private final File dest;
|
||||
private final DataSourceProcessorCallback callback;
|
||||
private final DataSourceProcessorProgressMonitor progressMonitor;
|
||||
private final Blackboard blackboard;
|
||||
private final Case currentCase;
|
||||
|
||||
private volatile boolean cancelled;
|
||||
|
||||
AddLogicalImageTask(String deviceId,
|
||||
List<String> imagePaths,
|
||||
String timeZone,
|
||||
File src, File dest,
|
||||
DataSourceProcessorProgressMonitor progressMonitor,
|
||||
DataSourceProcessorCallback callback
|
||||
) throws NoCurrentCaseException {
|
||||
super(deviceId, imagePaths, timeZone, progressMonitor, callback);
|
||||
this.deviceId = deviceId;
|
||||
this.timeZone = timeZone;
|
||||
this.src = src;
|
||||
this.dest = dest;
|
||||
this.progressMonitor = progressMonitor;
|
||||
this.callback = callback;
|
||||
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} - file", "AddLogicalImageTask.addingToReport=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.doneAddingInterestingFiles=Done adding search results as interesting files",
|
||||
"# {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
|
||||
public void run() {
|
||||
List<String> errorList = 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
|
||||
String resultsFilename;
|
||||
if (Paths.get(dest.toString(), SEARCH_RESULTS_TXT).toFile().exists()) {
|
||||
@ -107,8 +131,13 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
||||
} else {
|
||||
errorList.add(Bundle.AddLogicalImageTask_cannotFindFiles(SEARCH_RESULTS_TXT, dest.toString()));
|
||||
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
if (cancelled) {
|
||||
return;
|
||||
}
|
||||
|
||||
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_addingToReport(resultsFilename));
|
||||
String status = addReport(Paths.get(dest.toString(), resultsFilename), resultsFilename + " " + src.getName());
|
||||
if (status != null) {
|
||||
@ -127,17 +156,75 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
||||
}
|
||||
progressMonitor.setProgressText(Bundle.AddLogicalImageTask_doneAddingToReport(USERS_TXT));
|
||||
|
||||
super.run();
|
||||
if (super.getResult() == DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS) {
|
||||
callback.done(super.getResult(), super.getErrorMessages(), super.getNewDataSources());
|
||||
return;
|
||||
// Get all VHD files in the dest directory
|
||||
List<String> imagePaths = new ArrayList<>();
|
||||
for (File f : dest.listFiles()) {
|
||||
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 {
|
||||
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());
|
||||
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) {
|
||||
errorList.add(Bundle.AddLogicalImageTask_failedToAddInterestingFiles(ex.getMessage()));
|
||||
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) {
|
||||
Map<String, Long> imagePathToObjIdMap = new HashMap<>();
|
||||
for (Map.Entry<Long, List<String>> entry : imagePaths.entrySet()) {
|
||||
@ -182,33 +278,28 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
||||
}
|
||||
return imagePathToObjIdMap;
|
||||
}
|
||||
|
||||
|
||||
@Messages({
|
||||
"# {0} - line number", "# {1} - fields length", "# {2} - expected length", "AddLogicalImageTask.notEnoughFields=File does not contain enough fields at line {0}, got {1}, expecting {2}",
|
||||
"# {0} - target image path", "AddLogicalImageTask.cannotFindDataSourceObjId=Cannot find obj_id in tsk_image_names for {0}"
|
||||
})
|
||||
private void addInterestingFiles(File src, Path resultsPath) throws IOException, TskCoreException {
|
||||
Map<Long, List<String>> imagePaths = currentCase.getSleuthkitCase().getImagePaths();
|
||||
Map<String, Long> imagePathToObjIdMap = imagePathsToDataSourceObjId(imagePaths);
|
||||
|
||||
private void addInterestingFiles(File src, Path resultsPath, boolean createVHD) throws IOException, TskCoreException {
|
||||
|
||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(
|
||||
new FileInputStream(resultsPath.toFile()), "UTF8"))) { // NON-NLS
|
||||
List<BlackboardArtifact> artifacts = new ArrayList<>();
|
||||
String line;
|
||||
br.readLine(); // skip the header line
|
||||
int lineNumber = 2;
|
||||
while ((line = br.readLine()) != null) {
|
||||
if (cancelled) {
|
||||
return;
|
||||
}
|
||||
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));
|
||||
}
|
||||
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 fileMetaAddressStr = fields[2];
|
||||
// String extractStatusStr = fields[3];
|
||||
@ -216,37 +307,131 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
||||
String ruleName = fields[5];
|
||||
// String description = fields[6];
|
||||
String filename = fields[7];
|
||||
// String parentPath = fields[8];
|
||||
|
||||
String query = String.format("data_source_obj_id = '%s' AND meta_addr = '%s' AND name = '%s'", // NON-NLS
|
||||
dataSourceObjId.toString(), fileMetaAddressStr, filename);
|
||||
String parentPath = fields[8];
|
||||
|
||||
String query = makeQuery(createVHD, vhdFilename, fileMetaAddressStr, parentPath, filename);
|
||||
|
||||
// TODO - findAllFilesWhere should SQL-escape the query
|
||||
List<AbstractFile> matchedFiles = Case.getCurrentCase().getSleuthkitCase().findAllFilesWhere(query);
|
||||
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<>();
|
||||
BlackboardAttribute setNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, MODULE_NAME, ruleSetName);
|
||||
attributes.add(setNameAttribute);
|
||||
BlackboardAttribute ruleNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY, MODULE_NAME, ruleName);
|
||||
attributes.add(ruleNameAttribute);
|
||||
org.sleuthkit.datamodel.Blackboard tskBlackboard = Case.getCurrentCase().getSleuthkitCase().getBlackboard();
|
||||
if (!tskBlackboard.artifactExists(file, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, attributes)) {
|
||||
BlackboardArtifact artifact = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
|
||||
if (!blackboard.artifactExists(file, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, attributes)) {
|
||||
BlackboardArtifact artifact = this.currentCase.getSleuthkitCase().newBlackboardArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, file.getId());
|
||||
artifact.addAttributes(attributes);
|
||||
artifacts.add(artifact);
|
||||
}
|
||||
}
|
||||
|
||||
private void 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 {
|
||||
// index the artifact for keyword search
|
||||
blackboard.indexArtifact(artifact);
|
||||
} catch (Blackboard.BlackboardException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Unable to index blackboard artifact " + artifact.getArtifactID(), ex); //NON-NLS
|
||||
trans.rollback();
|
||||
} catch (TskCoreException ex) {
|
||||
LOGGER.log(Level.SEVERE, String.format("Failed to rollback transaction: %s", ex.getMessage()), 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
|
||||
# and open the template in the editor.
|
||||
|
||||
AddLogicalImageTask.addingExtractedFiles=Adding extracted files
|
||||
AddLogicalImageTask.addingInterestingFiles=Adding search results as interesting files
|
||||
# {0} - file
|
||||
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
|
||||
# {1} - directory
|
||||
AddLogicalImageTask.cannotFindFiles=Cannot find {0} in {1}
|
||||
# {0} - src
|
||||
# {1} - dest
|
||||
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
|
||||
# {0} - file
|
||||
AddLogicalImageTask.doneAddingToReport=Done adding {0} to report
|
||||
@ -23,6 +29,10 @@ AddLogicalImageTask.failedToAddReport=Failed to add report {0}. Reason= {1}
|
||||
# {0} - src
|
||||
# {1} - dest
|
||||
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
|
||||
# {1} - fields length
|
||||
# {2} - expected length
|
||||
@ -52,8 +62,6 @@ LogicalImagerDSProcessor.dataSourceType=Autopsy Logical Imager Results
|
||||
LogicalImagerDSProcessor.directoryAlreadyExists=Directory {0} already exists
|
||||
# {0} - directory
|
||||
LogicalImagerDSProcessor.failToCreateDirectory=Failed to create directory {0}
|
||||
# {0} - file
|
||||
LogicalImagerDSProcessor.failToGetCanonicalPath=Fail to get canonical path for {0}
|
||||
# {0} - imageDirPath
|
||||
LogicalImagerDSProcessor.imageDirPathNotFound={0} not found.\nUSB drive has been ejected.
|
||||
LogicalImagerDSProcessor.noCurrentCase=No current case
|
||||
|
@ -19,7 +19,6 @@
|
||||
package org.sleuthkit.autopsy.logicalimager.dsp;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
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} - directory", "LogicalImagerDSProcessor.failToCreateDirectory=Failed to create directory {0}",
|
||||
"# {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
|
||||
public void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback) {
|
||||
configPanel.storeSettings();
|
||||
@ -171,37 +170,10 @@ public final class LogicalImagerDSProcessor implements DataSourceProcessor {
|
||||
}
|
||||
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 {
|
||||
String deviceId = UUID.randomUUID().toString();
|
||||
String timeZone = Calendar.getInstance().getTimeZone().getID();
|
||||
run(deviceId, imagePaths,
|
||||
timeZone, src, dest,
|
||||
run(deviceId, timeZone, src, dest,
|
||||
progressMonitor, callback);
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
String msg = Bundle.LogicalImagerDSProcessor_noCurrentCase();
|
||||
@ -220,7 +192,6 @@ public final class LogicalImagerDSProcessor implements DataSourceProcessor {
|
||||
* @param deviceId An ASCII-printable identifier for the device
|
||||
* associated with the data source that is intended
|
||||
* 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
|
||||
* times for the image, obtained from
|
||||
* java.util.TimeZone.getID.
|
||||
@ -230,11 +201,11 @@ public final class LogicalImagerDSProcessor implements DataSourceProcessor {
|
||||
* processing.
|
||||
* @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,
|
||||
DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback
|
||||
) throws NoCurrentCaseException {
|
||||
addLogicalImageTask = new AddLogicalImageTask(deviceId, imagePaths, timeZone, src, dest,
|
||||
addLogicalImageTask = new AddLogicalImageTask(deviceId, timeZone, src, dest,
|
||||
progressMonitor, callback);
|
||||
new Thread(addLogicalImageTask).start();
|
||||
}
|
||||
|
@ -333,9 +333,19 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
||||
}
|
||||
});
|
||||
if (vhdFiles.length == 0) {
|
||||
setErrorMessage(Bundle.LogicalImagerPanel_messageLabel_directoryDoesNotContainSparseImage(path));
|
||||
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), true, false);
|
||||
return;
|
||||
// No VHD files, try directories for individual files
|
||||
String[] directories = dir.list(new FilenameFilter() {
|
||||
@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);
|
||||
setNormalMessage(path);
|
||||
@ -360,11 +370,11 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean dirHasVhdFiles(File dir) {
|
||||
File[] fList = dir.listFiles(new FilenameFilter() {
|
||||
private boolean dirHasImagerResult(File dir) {
|
||||
String[] fList = dir.list(new FilenameFilter() {
|
||||
@Override
|
||||
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);
|
||||
@ -382,9 +392,9 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
||||
if (fList != null) {
|
||||
imageTableModel = new ImageTableModel();
|
||||
// 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) {
|
||||
if (file.isDirectory() && dirHasVhdFiles(file)) {
|
||||
if (file.isDirectory() && dirHasImagerResult(file)) {
|
||||
String dir = file.getName();
|
||||
Matcher m = regex.matcher(dir);
|
||||
if (m.find()) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2014-2018 Basis Technology Corp.
|
||||
* Copyright 2014-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -216,7 +216,6 @@ final class ContactAnalyzer {
|
||||
try {
|
||||
while ((length = is.read(buffer)) != -1) {
|
||||
os.write(buffer, 0, length);
|
||||
System.out.println(length);
|
||||
os.flush();
|
||||
|
||||
}
|
||||
@ -239,13 +238,13 @@ final class ContactAnalyzer {
|
||||
ostream.write(c);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
System.out.println("Error: " + e.getMessage()); //NON-NLS
|
||||
logger.log(Level.WARNING, "Error copying file", e);
|
||||
} finally {
|
||||
try {
|
||||
istream.close();
|
||||
ostream.close();
|
||||
} 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
|
||||
*
|
||||
* Copyright 2013-2018 Basis Technology Corp.
|
||||
*
|
||||
* Copyright 2013-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* 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.",
|
||||
"StixArtifactData.noOpenCase.errMsg=No open case available."})
|
||||
public void createArtifact(String a_title) throws TskCoreException {
|
||||
void createArtifact(String a_title) throws TskCoreException {
|
||||
Blackboard blackboard;
|
||||
try {
|
||||
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
|
||||
*
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Copyright 2011-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* 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.Collection;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
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);
|
||||
return ProcessResult.ERROR;
|
||||
} catch (Blackboard.BlackboardException ex) {
|
||||
Exceptions.printStackTrace(ex);
|
||||
logger.log(Level.WARNING, "Blackboard Exception processing file with obj_id = " + file.getId(), ex);
|
||||
}
|
||||
return ProcessResult.OK;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2018 Basis Technology Corp.
|
||||
* Copyright 2011-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -454,7 +454,6 @@ final class StringsTextExtractor implements TextExtractor {
|
||||
convertBuffRemain = bytesInConvertBuff - convertBuffOffset;
|
||||
}
|
||||
} catch (TskCoreException ex) {
|
||||
//Exceptions.printStackTrace(ex);
|
||||
fileEOF = true;
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2018 Basis Technology Corp.
|
||||
* Copyright 2018-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* 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.datamodel.TskCoreException;
|
||||
import junit.framework.Assert;
|
||||
import org.sleuthkit.autopsy.casemodule.CaseActionException;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
|
||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
|
||||
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.commonpropertiessearch.CommonAttributeValue;
|
||||
import org.sleuthkit.autopsy.commonpropertiessearch.CommonAttributeValueList;
|
||||
import org.sleuthkit.autopsy.coreutils.TimeStampUtils;
|
||||
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
|
||||
import org.sleuthkit.autopsy.modules.dataSourceIntegrity.DataSourceIntegrityModuleFactory;
|
||||
@ -279,10 +271,8 @@ class InterCaseTestUtils {
|
||||
for (CorrelationCase correlationCase : EamDb.getInstance().getCases()) {
|
||||
mapOfCaseIdsToCase.put(correlationCase.getDisplayName(), correlationCase.getID());
|
||||
}
|
||||
System.out.println("EAM IS ENABLED");
|
||||
return mapOfCaseIdsToCase;
|
||||
} else {
|
||||
System.out.println("EAMDB NOT ENABLED");
|
||||
//it is reasonable that this might happen...
|
||||
// for example when we test the feature in the absence of an enabled eamdb
|
||||
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 helpful to have this in your debug process.
|
||||
// System.out.println(translation);
|
||||
// assertEquals(expectedTranslation, translation);
|
||||
// assertEquals("Result did not match expected result", expectedTranslation, translation);
|
||||
// */
|
||||
// }
|
||||
}
|
||||
|
@ -37,8 +37,8 @@ public class GoogleTranslatorTest {
|
||||
// //It's unrealistic to expect the same answer every time, but sometimes
|
||||
// //it's helpful to have this in your debug process.
|
||||
//
|
||||
// String expResult = "translate"; assertEquals(expResult, result);
|
||||
// System.out.println(result);
|
||||
// String expResult = "translate"; assertEquals(expResult, 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
|
||||
@ -63,7 +63,6 @@ public class GoogleTranslatorTest {
|
||||
// //It's unrealistic to expect the same answer every time, but sometimes
|
||||
// //it's helpful to have this in your debug process.
|
||||
// String expResult = "¡Hola Mundo!";
|
||||
// assertEquals(expResult, result);
|
||||
// System.out.println(result);
|
||||
// assertEquals("Result did not match expected result", expResult, result);
|
||||
// }
|
||||
}
|
||||
|
@ -64,7 +64,6 @@ import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
|
||||
import static org.apache.commons.lang3.ObjectUtils.notEqual;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
|
||||
import org.openide.util.Exceptions;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.events.ContentTagAddedEvent;
|
||||
@ -658,7 +657,7 @@ public class GroupManager {
|
||||
|
||||
updateCurrentPathGroup(pathGroupKey);
|
||||
} 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
|
||||
@ -986,7 +985,7 @@ public class GroupManager {
|
||||
.findAny().ifPresent(obj_id -> types.add(mimeType));
|
||||
}
|
||||
} catch (SQLException | TskCoreException ex) {
|
||||
Exceptions.printStackTrace(ex);
|
||||
logger.log(Level.WARNING, "Error getting group by MIME type", ex);
|
||||
}
|
||||
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);
|
||||
setGraphic(new ImageView(icon));
|
||||
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
|
||||
// Exceptions.printStackTrace(ex);
|
||||
setText(item.toString());
|
||||
setGraphic(null);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011-2017 Basis Technology Corp.
|
||||
* Copyright 2011-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -48,8 +48,6 @@ public class CreditCardValidatorTest {
|
||||
|
||||
@Test
|
||||
public void testLengthMatchesBin() {
|
||||
System.out.println("lengthMatchesBin");
|
||||
|
||||
//amex must be 15
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("3431 136294 58529"));
|
||||
assertEquals(false, CreditCardValidator.isValidCCN("3431-136294-5850")); //too short
|
||||
@ -95,8 +93,6 @@ public class CreditCardValidatorTest {
|
||||
*/
|
||||
@Test
|
||||
public void testIsValidCCN16() {
|
||||
System.out.println("isValidCCN");
|
||||
|
||||
//rules for separators and grouping for 16 digits
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234567890318342"));// dashes
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-5678-9031-8342"));// dashes
|
||||
@ -111,8 +107,6 @@ public class CreditCardValidatorTest {
|
||||
|
||||
@Test
|
||||
public void testIsValidCCN15() {
|
||||
System.out.println("isValidCCN");
|
||||
|
||||
//amex are fifteen digits, and grouped 4 6 5
|
||||
//amex cards that strart with 34
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("3431 136294 58529"));
|
||||
@ -143,7 +137,6 @@ public class CreditCardValidatorTest {
|
||||
|
||||
@Test
|
||||
public void testIsValidCCN19() {
|
||||
System.out.println("isValidCCN");
|
||||
//nineteen digit (visa) cards 4-4-4-4-3
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("4539747947839518654"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("4539-7479-4783-9518-654"));
|
||||
@ -168,8 +161,6 @@ public class CreditCardValidatorTest {
|
||||
|
||||
@Test
|
||||
public void testIsValidCCN18() {
|
||||
System.out.println("isValidCCN");
|
||||
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("123456789031834267"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 8342 67"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-56789031834-267"));
|
||||
@ -181,8 +172,6 @@ public class CreditCardValidatorTest {
|
||||
|
||||
@Test
|
||||
public void testIsValidCCN17() {
|
||||
System.out.println("isValidCCN");
|
||||
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("12345678903183426"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 8342 6"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-56789031834-26"));
|
||||
@ -194,8 +183,6 @@ public class CreditCardValidatorTest {
|
||||
|
||||
@Test
|
||||
public void testIsValidCCN14() {
|
||||
System.out.println("isValidCCN");
|
||||
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("12345678903183"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 83"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-5678903183"));
|
||||
@ -207,8 +194,6 @@ public class CreditCardValidatorTest {
|
||||
|
||||
@Test
|
||||
public void testIsValidCCN13() {
|
||||
System.out.println("isValidCCN");
|
||||
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234567890318"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031 8"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-567890318"));
|
||||
@ -220,8 +205,6 @@ public class CreditCardValidatorTest {
|
||||
|
||||
@Test
|
||||
public void testIsValidCCN12() {
|
||||
System.out.println("isValidCCN");
|
||||
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("123456789031"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234 5678 9031"));
|
||||
assertEquals(true, CreditCardValidator.isValidCCN("1234-56789031"));
|
||||
|
@ -421,12 +421,6 @@ class ExtractRegistry extends Extract {
|
||||
Element oroot = doc.getDocumentElement();
|
||||
NodeList children = oroot.getChildNodes();
|
||||
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++) {
|
||||
|
||||
if (context.dataSourceIngestIsCancelled()) {
|
||||
@ -683,10 +677,8 @@ class ExtractRegistry extends Extract {
|
||||
|
||||
// index the artifact for keyword search
|
||||
postArtifact(bbart);
|
||||
// add to collection for ModuleDataEvent
|
||||
usbBBartifacts.add(bbart);
|
||||
} 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;
|
||||
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 /= MS_IN_SEC;
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
logger.log(Level.WARNING, "Failed to parse epoch time for installed program artifact."); //NON-NLS
|
||||
} catch (ParseException ex) {
|
||||
logger.log(Level.WARNING, "Failed to parse epoch time for installed program artifact.", ex); //NON-NLS
|
||||
}
|
||||
|
||||
try {
|
||||
@ -710,7 +702,7 @@ class ExtractRegistry extends Extract {
|
||||
// index the artifact for keyword search
|
||||
postArtifact(bbart);
|
||||
} 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;
|
||||
case "office": //NON-NLS
|
||||
@ -730,7 +722,7 @@ class ExtractRegistry extends Extract {
|
||||
// index the artifact for keyword search
|
||||
postArtifact(bbart);
|
||||
} 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;
|
||||
|
||||
@ -797,7 +789,7 @@ class ExtractRegistry extends Extract {
|
||||
// index the artifact for keyword search
|
||||
postArtifact(bbart);
|
||||
} 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;
|
||||
|
||||
@ -814,7 +806,7 @@ class ExtractRegistry extends Extract {
|
||||
// index the artifact for keyword search
|
||||
postArtifact(bbart);
|
||||
} 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;
|
||||
case "SSID": // NON-NLS
|
||||
@ -829,9 +821,8 @@ class ExtractRegistry extends Extract {
|
||||
bbart.addAttributes(bbattributes);
|
||||
// index the artifact for keyword search
|
||||
postArtifact(bbart);
|
||||
wifiBBartifacts.add(bbart);
|
||||
} 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;
|
||||
case "shellfolders": // NON-NLS
|
||||
@ -849,9 +840,6 @@ class ExtractRegistry extends Extract {
|
||||
break;
|
||||
}
|
||||
} // for
|
||||
|
||||
postArtifacts(usbBBartifacts);
|
||||
postArtifacts(wifiBBartifacts);
|
||||
return true;
|
||||
} catch (FileNotFoundException ex) {
|
||||
logger.log(Level.SEVERE, "Error finding the registry file.", ex); //NON-NLS
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2013 Basis Technology Corp.
|
||||
* Copyright 2013-2019 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> org
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -79,11 +79,9 @@ public class ScalpelCarver {
|
||||
success = true;
|
||||
} catch (UnsatisfiedLinkError ex) {
|
||||
String msg = NbBundle.getMessage(ScalpelCarver.class, "ScalpelCarver.loadLib.errMsg.cannotLoadLib", id);
|
||||
System.out.println(msg + ex.toString());
|
||||
logger.log(Level.SEVERE, msg, ex);
|
||||
} catch (Exception ex) {
|
||||
String msg = NbBundle.getMessage(ScalpelCarver.class, "ScalpelCarver.loadLib.errMsg.cannotLoadLib2", id);
|
||||
System.out.println(msg + ex.toString());
|
||||
logger.log(Level.SEVERE, msg, ex);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user