Temporary.
@ -36,10 +36,10 @@ GetTagNameDialog.tagNameExistsTskCore.msg=The {0} tag name already exists in the
|
|||||||
OpenLogFolder.error1=Log File Not Found: {0}
|
OpenLogFolder.error1=Log File Not Found: {0}
|
||||||
OpenLogFolder.CouldNotOpenLogFolder=Could not open log folder
|
OpenLogFolder.CouldNotOpenLogFolder=Could not open log folder
|
||||||
CTL_OpenLogFolder=Open Log Folder
|
CTL_OpenLogFolder=Open Log Folder
|
||||||
CTL_OpenOutputFolder=Open Output Folder
|
CTL_OpenOutputFolder=Open Case Folder
|
||||||
OpenOutputFolder.error1=Output Folder Not Found\: {0}
|
OpenOutputFolder.error1=Case Output Folder Not Found\: {0}
|
||||||
OpenOutputFolder.noCaseOpen=No open case, therefore no current output folder available.
|
OpenOutputFolder.noCaseOpen=No open case, therefore no current case output folder available.
|
||||||
OpenOutputFolder.CouldNotOpenOutputFolder=Could not open output folder
|
OpenOutputFolder.CouldNotOpenOutputFolder=Could not open case output folder
|
||||||
ShowIngestProgressSnapshotAction.actionName.text=Get Ingest Progress Snapshot
|
ShowIngestProgressSnapshotAction.actionName.text=Get Ingest Progress Snapshot
|
||||||
OpenPythonModulesFolderAction.actionName.text=Python Plugins
|
OpenPythonModulesFolderAction.actionName.text=Python Plugins
|
||||||
OpenPythonModulesFolderAction.errorMsg.folderNotFound=Python plugins folder not found: {0}
|
OpenPythonModulesFolderAction.errorMsg.folderNotFound=Python plugins folder not found: {0}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2017 Basis Technology Corp.
|
* Copyright 2011-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -35,7 +35,7 @@ import org.sleuthkit.autopsy.casemodule.Case;
|
|||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The action associated with the Tools/Open Output Folder menu item. It opens a
|
* The action associated with the Tools/Open Case Folder menu item. It opens a
|
||||||
* file explorer window for the root output directory for the currently open
|
* file explorer window for the root output directory for the currently open
|
||||||
* case. If the case is a single-user case, this is the case directory. If the
|
* case. If the case is a single-user case, this is the case directory. If the
|
||||||
* case is a multi-user case, this is a subdirectory of the case directory
|
* case is a multi-user case, this is a subdirectory of the case directory
|
||||||
@ -44,7 +44,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
|
|||||||
* This action should only be invoked in the event dispatch thread (EDT).
|
* This action should only be invoked in the event dispatch thread (EDT).
|
||||||
*/
|
*/
|
||||||
@ActionRegistration(displayName = "#CTL_OpenOutputFolder", iconInMenu = true, lazy = false)
|
@ActionRegistration(displayName = "#CTL_OpenOutputFolder", iconInMenu = true, lazy = false)
|
||||||
@ActionReference(path = "Menu/Tools", position = 1850, separatorBefore = 1849)
|
@ActionReference(path = "Menu/Case", position = 302)
|
||||||
@ActionID(id = "org.sleuthkit.autopsy.actions.OpenOutputFolderAction", category = "Help")
|
@ActionID(id = "org.sleuthkit.autopsy.actions.OpenOutputFolderAction", category = "Help")
|
||||||
public final class OpenOutputFolderAction extends CallableSystemAction {
|
public final class OpenOutputFolderAction extends CallableSystemAction {
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ public final class OpenOutputFolderAction extends CallableSystemAction {
|
|||||||
try {
|
try {
|
||||||
Desktop.getDesktop().open(outputDir);
|
Desktop.getDesktop().open(outputDir);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
logger.log(Level.SEVERE, String.format("Failed to open output folder %s", outputDir), ex); //NON-NLS
|
logger.log(Level.SEVERE, String.format("Failed to open case output folder %s", outputDir), ex); //NON-NLS
|
||||||
NotifyDescriptor descriptor = new NotifyDescriptor.Message(
|
NotifyDescriptor descriptor = new NotifyDescriptor.Message(
|
||||||
NbBundle.getMessage(this.getClass(), "OpenOutputFolder.CouldNotOpenOutputFolder", outputDir.getAbsolutePath()), NotifyDescriptor.ERROR_MESSAGE);
|
NbBundle.getMessage(this.getClass(), "OpenOutputFolder.CouldNotOpenOutputFolder", outputDir.getAbsolutePath()), NotifyDescriptor.ERROR_MESSAGE);
|
||||||
DialogDisplayer.getDefault().notify(descriptor);
|
DialogDisplayer.getDefault().notify(descriptor);
|
||||||
|
@ -229,5 +229,5 @@ CueBannerPanel.openCaseButton.text=
|
|||||||
CueBannerPanel.openCaseLabel.text=Open Case
|
CueBannerPanel.openCaseLabel.text=Open Case
|
||||||
MultiUserCasesPanel.bnOpenSingleUserCase.text=Open Single-User Case...
|
MultiUserCasesPanel.bnOpenSingleUserCase.text=Open Single-User Case...
|
||||||
CueBannerPanel.newCaseButton.text=
|
CueBannerPanel.newCaseButton.text=
|
||||||
MultiUserCasesPanel.searchLabel.text=Start typing to search by case name
|
MultiUserCasesPanel.searchLabel.text=Select any case and start typing to search by case name
|
||||||
MultiUserCasesPanel.cancelButton.text=Cancel
|
MultiUserCasesPanel.cancelButton.text=Cancel
|
||||||
|
@ -18,11 +18,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.casemodule;
|
package org.sleuthkit.autopsy.casemodule;
|
||||||
|
|
||||||
import java.awt.Component;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import javax.swing.ListSelectionModel;
|
import javax.swing.ListSelectionModel;
|
||||||
import javax.swing.event.ListSelectionListener;
|
import javax.swing.event.ListSelectionListener;
|
||||||
import javax.swing.table.TableCellRenderer;
|
|
||||||
import javax.swing.table.TableColumnModel;
|
import javax.swing.table.TableColumnModel;
|
||||||
import org.netbeans.swing.etable.ETableColumn;
|
import org.netbeans.swing.etable.ETableColumn;
|
||||||
import org.netbeans.swing.etable.ETableColumnModel;
|
import org.netbeans.swing.etable.ETableColumnModel;
|
||||||
@ -31,16 +29,16 @@ import org.netbeans.swing.outline.Outline;
|
|||||||
import org.openide.nodes.Node;
|
import org.openide.nodes.Node;
|
||||||
import java.awt.EventQueue;
|
import java.awt.EventQueue;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.LinkOption;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.HashMap;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.SwingWorker;
|
import javax.swing.SwingWorker;
|
||||||
import org.openide.explorer.ExplorerManager;
|
import org.openide.explorer.ExplorerManager;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.coordinationservice.CaseNodeData;
|
|
||||||
import org.sleuthkit.autopsy.coordinationservice.CoordinationService;
|
import org.sleuthkit.autopsy.coordinationservice.CoordinationService;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.datamodel.EmptyNode;
|
import org.sleuthkit.autopsy.datamodel.EmptyNode;
|
||||||
@ -61,7 +59,7 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
private final org.openide.explorer.view.OutlineView outlineView;
|
private final org.openide.explorer.view.OutlineView outlineView;
|
||||||
private int originalPathColumnIndex = 0;
|
private int originalPathColumnIndex = 0;
|
||||||
private static final Logger LOGGER = Logger.getLogger(CaseBrowser.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(CaseBrowser.class.getName());
|
||||||
private LoadCaseMapWorker tableWorker;
|
private LoadCaseListWorker tableWorker;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ExplorerManager getExplorerManager() {
|
public ExplorerManager getExplorerManager() {
|
||||||
@ -78,7 +76,6 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
outline = outlineView.getOutline();
|
outline = outlineView.getOutline();
|
||||||
outlineView.setPropertyColumns(
|
outlineView.setPropertyColumns(
|
||||||
Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
|
Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
|
||||||
Bundle.CaseNode_column_status(), Bundle.CaseNode_column_status(),
|
|
||||||
Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath());
|
Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath());
|
||||||
((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.CaseNode_column_name());
|
((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.CaseNode_column_name());
|
||||||
customize();
|
customize();
|
||||||
@ -100,7 +97,7 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
dateColumnIndex = index;
|
dateColumnIndex = index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Hide path column by default will need to
|
//Hide path column by default (user can unhide it)
|
||||||
ETableColumn column = (ETableColumn) columnModel.getColumn(originalPathColumnIndex);
|
ETableColumn column = (ETableColumn) columnModel.getColumn(originalPathColumnIndex);
|
||||||
((ETableColumnModel) columnModel).setColumnHidden(column, true);
|
((ETableColumnModel) columnModel).setColumnHidden(column, true);
|
||||||
outline.setRootVisible(false);
|
outline.setRootVisible(false);
|
||||||
@ -124,6 +121,11 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
outline.getSelectionModel().addListSelectionListener(listener);
|
outline.getSelectionModel().addListSelectionListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path to the .aut file for the selected case.
|
||||||
|
*
|
||||||
|
* @return the full path to the selected case's .aut file
|
||||||
|
*/
|
||||||
String getCasePath() {
|
String getCasePath() {
|
||||||
int[] selectedRows = outline.getSelectedRows();
|
int[] selectedRows = outline.getSelectedRows();
|
||||||
if (selectedRows.length == 1) {
|
if (selectedRows.length == 1) {
|
||||||
@ -157,7 +159,7 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
//set the table to display text informing the user that the list is being retreived and disable case selection
|
//set the table to display text informing the user that the list is being retreived and disable case selection
|
||||||
EmptyNode emptyNode = new EmptyNode(Bundle.CaseBrowser_caseListLoading_message());
|
EmptyNode emptyNode = new EmptyNode(Bundle.CaseBrowser_caseListLoading_message());
|
||||||
em.setRootContext(emptyNode);
|
em.setRootContext(emptyNode);
|
||||||
tableWorker = new LoadCaseMapWorker();
|
tableWorker = new LoadCaseListWorker();
|
||||||
tableWorker.execute();
|
tableWorker.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,13 +191,11 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Swingworker to fetch the updated map of cases and their status in a
|
* Swingworker to fetch the updated List of cases in a background thread
|
||||||
* background thread
|
|
||||||
*/
|
*/
|
||||||
private class LoadCaseMapWorker extends SwingWorker<Void, Void> {
|
private class LoadCaseListWorker extends SwingWorker<Void, Void> {
|
||||||
|
|
||||||
private static final String ALERT_FILE_NAME = "autoingest.alert";
|
private List<CaseMetadata> cases;
|
||||||
private Map<CaseMetadata, Boolean> cases;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a list of the cases in the top level case folder
|
* Gets a list of the cases in the top level case folder
|
||||||
@ -204,73 +204,42 @@ class CaseBrowser extends javax.swing.JPanel implements ExplorerManager.Provider
|
|||||||
*
|
*
|
||||||
* @throws CoordinationServiceException
|
* @throws CoordinationServiceException
|
||||||
*/
|
*/
|
||||||
private Map<CaseMetadata, Boolean> getCases() throws CoordinationService.CoordinationServiceException {
|
private List<CaseMetadata> getCases() throws CoordinationService.CoordinationServiceException {
|
||||||
Map<CaseMetadata, Boolean> casesMap = new HashMap<>();
|
List<CaseMetadata> caseList = new ArrayList<>();
|
||||||
List<String> nodeList = CoordinationService.getInstance().getNodeList(CoordinationService.CategoryNode.CASES);
|
List<String> nodeList = CoordinationService.getInstance().getNodeList(CoordinationService.CategoryNode.CASES);
|
||||||
|
|
||||||
for (String node : nodeList) {
|
for (String node : nodeList) {
|
||||||
Path casePath = Paths.get(node);
|
Path casePath;
|
||||||
File caseFolder = casePath.toFile();
|
try {
|
||||||
if (caseFolder.exists()) {
|
casePath = Paths.get(node).toRealPath(LinkOption.NOFOLLOW_LINKS);
|
||||||
/*
|
|
||||||
* Search for '*.aut' and 'autoingest.alert' files.
|
|
||||||
*/
|
|
||||||
File[] fileArray = caseFolder.listFiles();
|
|
||||||
if (fileArray == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String autFilePath = null;
|
|
||||||
boolean alertFileFound = false;
|
|
||||||
for (File file : fileArray) {
|
|
||||||
String name = file.getName().toLowerCase();
|
|
||||||
if (autFilePath == null && name.endsWith(".aut")) {
|
|
||||||
autFilePath = file.getAbsolutePath();
|
|
||||||
if (!alertFileFound) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!alertFileFound && name.endsWith(ALERT_FILE_NAME)) {
|
|
||||||
alertFileFound = true;
|
|
||||||
}
|
|
||||||
if (autFilePath != null && alertFileFound) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (autFilePath != null) {
|
File caseFolder = casePath.toFile();
|
||||||
try {
|
if (caseFolder.exists()) {
|
||||||
boolean hasAlertStatus = false;
|
/*
|
||||||
if (alertFileFound) {
|
* Search for '*.aut' files.
|
||||||
/*
|
*/
|
||||||
* When an alert file exists, ignore the node
|
File[] fileArray = caseFolder.listFiles();
|
||||||
* data and use the ALERT status.
|
if (fileArray == null) {
|
||||||
*/
|
continue;
|
||||||
hasAlertStatus = true;
|
}
|
||||||
} else {
|
String autFilePath = null;
|
||||||
byte[] rawData = CoordinationService.getInstance().getNodeData(CoordinationService.CategoryNode.CASES, node);
|
for (File file : fileArray) {
|
||||||
if (rawData != null && rawData.length > 0) {
|
String name = file.getName().toLowerCase();
|
||||||
/*
|
if (autFilePath == null && name.endsWith(".aut")) {
|
||||||
* When node data exists, use the status
|
try {
|
||||||
* stored in the node data.
|
caseList.add(new CaseMetadata(Paths.get(file.getAbsolutePath())));
|
||||||
*/
|
} catch (CaseMetadata.CaseMetadataException ex) {
|
||||||
CaseNodeData caseNodeData = new CaseNodeData(rawData);
|
LOGGER.log(Level.SEVERE, String.format("Error reading case metadata file '%s'.", autFilePath), ex);
|
||||||
if (caseNodeData.getErrorsOccurred()) {
|
|
||||||
hasAlertStatus = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
CaseMetadata caseMetadata = new CaseMetadata(Paths.get(autFilePath));
|
|
||||||
casesMap.put(caseMetadata, hasAlertStatus);
|
|
||||||
} catch (CaseMetadata.CaseMetadataException ex) {
|
|
||||||
LOGGER.log(Level.SEVERE, String.format("Error reading case metadata file '%s'.", autFilePath), ex);
|
|
||||||
} catch (InterruptedException | CaseNodeData.InvalidDataException ex) {
|
|
||||||
LOGGER.log(Level.SEVERE, String.format("Error reading case node data for '%s'.", node), ex);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (IOException ignore) {
|
||||||
|
//if a path could not be resolved to a real path do add it to the caseList
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return casesMap;
|
return caseList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2017 Basis Technology Corp.
|
* Copyright 2011-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -61,6 +61,11 @@ class CaseInformationPanel extends javax.swing.JPanel {
|
|||||||
@Override
|
@Override
|
||||||
public void stateChanged(ChangeEvent e) {
|
public void stateChanged(ChangeEvent e) {
|
||||||
tabbedPane.getSelectedComponent().setSize(tabbedPane.getSelectedComponent().getPreferredSize());
|
tabbedPane.getSelectedComponent().setSize(tabbedPane.getSelectedComponent().getPreferredSize());
|
||||||
|
if (tabbedPane.getSelectedComponent() instanceof CasePropertiesPanel) {
|
||||||
|
editDetailsButton.setVisible(true);
|
||||||
|
} else {
|
||||||
|
editDetailsButton.setVisible(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -27,13 +27,13 @@
|
|||||||
<Group type="103" groupAlignment="1" attributes="0">
|
<Group type="103" groupAlignment="1" attributes="0">
|
||||||
<Component id="caseExplorerScrollPane" max="32767" attributes="0"/>
|
<Component id="caseExplorerScrollPane" max="32767" attributes="0"/>
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<Component id="searchLabel" min="-2" pref="555" max="-2" attributes="0"/>
|
<Component id="searchLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace pref="175" max="32767" attributes="0"/>
|
<EmptySpace pref="120" max="32767" attributes="0"/>
|
||||||
<Component id="bnOpen" min="-2" pref="80" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="bnOpenSingleUserCase" min="-2" max="-2" attributes="0"/>
|
<Component id="bnOpenSingleUserCase" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" pref="226" max="-2" attributes="0"/>
|
||||||
|
<Component id="bnOpen" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="cancelButton" min="-2" max="-2" attributes="0"/>
|
<Component id="cancelButton" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
@ -52,7 +52,7 @@
|
|||||||
<Component id="bnOpenSingleUserCase" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="bnOpenSingleUserCase" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="searchLabel" alignment="3" max="32767" attributes="0"/>
|
<Component id="searchLabel" alignment="3" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -64,6 +64,15 @@
|
|||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="MultiUserCasesPanel.bnOpen.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="MultiUserCasesPanel.bnOpen.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="enabled" type="boolean" value="false"/>
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 23]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 23]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 23]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOpenActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOpenActionPerformed"/>
|
||||||
@ -74,6 +83,12 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="MultiUserCasesPanel.bnOpenSingleUserCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="MultiUserCasesPanel.bnOpenSingleUserCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[156, 23]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[156, 23]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOpenSingleUserCaseActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOpenSingleUserCaseActionPerformed"/>
|
||||||
@ -84,6 +99,15 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="MultiUserCasesPanel.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="MultiUserCasesPanel.cancelButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 23]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 23]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 23]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonActionPerformed"/>
|
||||||
|
@ -165,6 +165,9 @@ final class MultiUserCasesPanel extends JPanel{
|
|||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(bnOpen, org.openide.util.NbBundle.getMessage(MultiUserCasesPanel.class, "MultiUserCasesPanel.bnOpen.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(bnOpen, org.openide.util.NbBundle.getMessage(MultiUserCasesPanel.class, "MultiUserCasesPanel.bnOpen.text")); // NOI18N
|
||||||
bnOpen.setEnabled(false);
|
bnOpen.setEnabled(false);
|
||||||
|
bnOpen.setMaximumSize(new java.awt.Dimension(80, 23));
|
||||||
|
bnOpen.setMinimumSize(new java.awt.Dimension(80, 23));
|
||||||
|
bnOpen.setPreferredSize(new java.awt.Dimension(80, 23));
|
||||||
bnOpen.addActionListener(new java.awt.event.ActionListener() {
|
bnOpen.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
bnOpenActionPerformed(evt);
|
bnOpenActionPerformed(evt);
|
||||||
@ -172,6 +175,8 @@ final class MultiUserCasesPanel extends JPanel{
|
|||||||
});
|
});
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(bnOpenSingleUserCase, org.openide.util.NbBundle.getMessage(MultiUserCasesPanel.class, "MultiUserCasesPanel.bnOpenSingleUserCase.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(bnOpenSingleUserCase, org.openide.util.NbBundle.getMessage(MultiUserCasesPanel.class, "MultiUserCasesPanel.bnOpenSingleUserCase.text")); // NOI18N
|
||||||
|
bnOpenSingleUserCase.setMinimumSize(new java.awt.Dimension(156, 23));
|
||||||
|
bnOpenSingleUserCase.setPreferredSize(new java.awt.Dimension(156, 23));
|
||||||
bnOpenSingleUserCase.addActionListener(new java.awt.event.ActionListener() {
|
bnOpenSingleUserCase.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
bnOpenSingleUserCaseActionPerformed(evt);
|
bnOpenSingleUserCaseActionPerformed(evt);
|
||||||
@ -179,6 +184,9 @@ final class MultiUserCasesPanel extends JPanel{
|
|||||||
});
|
});
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(MultiUserCasesPanel.class, "MultiUserCasesPanel.cancelButton.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(cancelButton, org.openide.util.NbBundle.getMessage(MultiUserCasesPanel.class, "MultiUserCasesPanel.cancelButton.text")); // NOI18N
|
||||||
|
cancelButton.setMaximumSize(new java.awt.Dimension(80, 23));
|
||||||
|
cancelButton.setMinimumSize(new java.awt.Dimension(80, 23));
|
||||||
|
cancelButton.setPreferredSize(new java.awt.Dimension(80, 23));
|
||||||
cancelButton.addActionListener(new java.awt.event.ActionListener() {
|
cancelButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
cancelButtonActionPerformed(evt);
|
cancelButtonActionPerformed(evt);
|
||||||
@ -196,15 +204,18 @@ final class MultiUserCasesPanel extends JPanel{
|
|||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||||
.addComponent(caseExplorerScrollPane)
|
.addComponent(caseExplorerScrollPane)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addComponent(searchLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 555, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(searchLabel)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 175, Short.MAX_VALUE)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 120, Short.MAX_VALUE)
|
||||||
.addComponent(bnOpen, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(bnOpenSingleUserCase, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(226, 226, 226)
|
||||||
|
.addComponent(bnOpen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(bnOpenSingleUserCase)
|
.addComponent(cancelButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(cancelButton)))
|
|
||||||
.addContainerGap())
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnOpen, cancelButton});
|
||||||
|
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
@ -212,11 +223,11 @@ final class MultiUserCasesPanel extends JPanel{
|
|||||||
.addComponent(caseExplorerScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 450, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(caseExplorerScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 450, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(cancelButton)
|
.addComponent(cancelButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(bnOpen)
|
.addComponent(bnOpen, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(bnOpenSingleUserCase)
|
.addComponent(bnOpenSingleUserCase, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(searchLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addComponent(searchLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
@ -25,8 +25,6 @@ import java.nio.file.Path;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.AbstractAction;
|
import javax.swing.AbstractAction;
|
||||||
import javax.swing.Action;
|
import javax.swing.Action;
|
||||||
@ -49,7 +47,6 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
|
|
||||||
@Messages({"CaseNode.column.name=Name",
|
@Messages({"CaseNode.column.name=Name",
|
||||||
"CaseNode.column.createdTime=Created Time",
|
"CaseNode.column.createdTime=Created Time",
|
||||||
"CaseNode.column.status=Status",
|
|
||||||
"CaseNode.column.metadataFilePath=Path"})
|
"CaseNode.column.metadataFilePath=Path"})
|
||||||
private static final Logger LOGGER = Logger.getLogger(MultiUserNode.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(MultiUserNode.class.getName());
|
||||||
private static final String LOG_FILE_NAME = "auto_ingest_log.txt";
|
private static final String LOG_FILE_NAME = "auto_ingest_log.txt";
|
||||||
@ -57,31 +54,30 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
/**
|
/**
|
||||||
* Provides a root node with children which each represent a case.
|
* Provides a root node with children which each represent a case.
|
||||||
*
|
*
|
||||||
* @param caseMap the map of cases and a boolean indicating if they have an
|
* @param caseList the list of CaseMetadata objects representing the cases
|
||||||
* alert
|
|
||||||
*/
|
*/
|
||||||
MultiUserNode(Map<CaseMetadata, Boolean> caseMap) {
|
MultiUserNode(List<CaseMetadata> caseList) {
|
||||||
super(Children.create(new MultiUserNodeChildren(caseMap), true));
|
super(Children.create(new MultiUserNodeChildren(caseList), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
static class MultiUserNodeChildren extends ChildFactory<Entry<CaseMetadata, Boolean>> {
|
static class MultiUserNodeChildren extends ChildFactory<CaseMetadata> {
|
||||||
|
|
||||||
private final Map<CaseMetadata, Boolean> caseMap;
|
private final List<CaseMetadata> caseList;
|
||||||
|
|
||||||
MultiUserNodeChildren(Map<CaseMetadata, Boolean> caseMap) {
|
MultiUserNodeChildren(List<CaseMetadata> caseList) {
|
||||||
this.caseMap = caseMap;
|
this.caseList = caseList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean createKeys(List<Entry<CaseMetadata, Boolean>> list) {
|
protected boolean createKeys(List<CaseMetadata> list) {
|
||||||
if (caseMap != null && caseMap.size() > 0) {
|
if (caseList != null && caseList.size() > 0) {
|
||||||
list.addAll(caseMap.entrySet());
|
list.addAll(caseList);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Node createNodeForKey(Entry<CaseMetadata, Boolean> key) {
|
protected Node createNodeForKey(CaseMetadata key) {
|
||||||
return new MultiUserCaseNode(key);
|
return new MultiUserCaseNode(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,19 +91,17 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
private final String caseName;
|
private final String caseName;
|
||||||
private final String caseCreatedDate;
|
private final String caseCreatedDate;
|
||||||
private final String caseMetadataFilePath;
|
private final String caseMetadataFilePath;
|
||||||
private final boolean caseHasAlert;
|
|
||||||
private final Path caseLogFilePath;
|
private final Path caseLogFilePath;
|
||||||
|
|
||||||
MultiUserCaseNode(Entry<CaseMetadata, Boolean> multiUserCase) {
|
MultiUserCaseNode(CaseMetadata multiUserCase) {
|
||||||
super(Children.LEAF);
|
super(Children.LEAF);
|
||||||
caseName = multiUserCase.getKey().getCaseDisplayName();
|
caseName = multiUserCase.getCaseDisplayName();
|
||||||
caseCreatedDate = multiUserCase.getKey().getCreatedDate();
|
caseCreatedDate = multiUserCase.getCreatedDate();
|
||||||
caseHasAlert = multiUserCase.getValue();
|
|
||||||
super.setName(caseName);
|
super.setName(caseName);
|
||||||
setName(caseName);
|
setName(caseName);
|
||||||
setDisplayName(caseName);
|
setDisplayName(caseName);
|
||||||
caseMetadataFilePath = multiUserCase.getKey().getFilePath().toString();
|
caseMetadataFilePath = multiUserCase.getFilePath().toString();
|
||||||
caseLogFilePath = Paths.get(multiUserCase.getKey().getCaseDirectory(), LOG_FILE_NAME);
|
caseLogFilePath = Paths.get(multiUserCase.getCaseDirectory(), LOG_FILE_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -119,7 +113,6 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
return new OpenMultiUserCaseAction(caseMetadataFilePath);
|
return new OpenMultiUserCaseAction(caseMetadataFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Messages({"MultiUserNode.AlertColumn.text=Alert"}) //text to display when there is an alert present
|
|
||||||
@Override
|
@Override
|
||||||
protected Sheet createSheet() {
|
protected Sheet createSheet() {
|
||||||
Sheet s = super.createSheet();
|
Sheet s = super.createSheet();
|
||||||
@ -132,8 +125,6 @@ final class MultiUserNode extends AbstractNode {
|
|||||||
caseName));
|
caseName));
|
||||||
ss.put(new NodeProperty<>(Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
|
ss.put(new NodeProperty<>(Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(), Bundle.CaseNode_column_createdTime(),
|
||||||
caseCreatedDate));
|
caseCreatedDate));
|
||||||
ss.put(new NodeProperty<>(Bundle.CaseNode_column_status(), Bundle.CaseNode_column_status(), Bundle.CaseNode_column_status(),
|
|
||||||
(caseHasAlert == true ? Bundle.MultiUserNode_AlertColumn_text() : "")));
|
|
||||||
ss.put(new NodeProperty<>(Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(),
|
ss.put(new NodeProperty<>(Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(), Bundle.CaseNode_column_metadataFilePath(),
|
||||||
caseMetadataFilePath));
|
caseMetadataFilePath));
|
||||||
return s;
|
return s;
|
||||||
|
@ -489,12 +489,16 @@ public class DataContentViewerOtherCases extends javax.swing.JPanel implements D
|
|||||||
corAttrInstances.addAll(getCorrelatedInstances(corAttr, dataSourceName, deviceId));
|
corAttrInstances.addAll(getCorrelatedInstances(corAttr, dataSourceName, deviceId));
|
||||||
|
|
||||||
corAttrInstances.forEach((corAttrInstance) -> {
|
corAttrInstances.forEach((corAttrInstance) -> {
|
||||||
CorrelationAttribute newCeArtifact = new CorrelationAttribute(
|
try {
|
||||||
corAttr.getCorrelationType(),
|
CorrelationAttribute newCeArtifact = new CorrelationAttribute(
|
||||||
corAttr.getCorrelationValue()
|
corAttr.getCorrelationType(),
|
||||||
);
|
corAttr.getCorrelationValue()
|
||||||
newCeArtifact.addInstance(corAttrInstance);
|
);
|
||||||
tableModel.addEamArtifact(newCeArtifact);
|
newCeArtifact.addInstance(corAttrInstance);
|
||||||
|
tableModel.addEamArtifact(newCeArtifact);
|
||||||
|
} catch (EamDbException ex){
|
||||||
|
LOGGER.log(Level.SEVERE, "Error creating correlation attribute", ex);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,6 +271,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void updateCase(CorrelationCase eamCase) throws EamDbException {
|
public void updateCase(CorrelationCase eamCase) throws EamDbException {
|
||||||
|
if(eamCase == null) {
|
||||||
|
throw new EamDbException("CorrelationCase argument is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
PreparedStatement preparedStatement = null;
|
PreparedStatement preparedStatement = null;
|
||||||
@ -444,6 +448,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public CorrelationDataSource getDataSource(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException {
|
public CorrelationDataSource getDataSource(CorrelationCase correlationCase, String dataSourceDeviceId) throws EamDbException {
|
||||||
|
if(correlationCase == null) {
|
||||||
|
throw new EamDbException("CorrelationCase argument is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
CorrelationDataSource eamDataSourceResult = null;
|
CorrelationDataSource eamDataSourceResult = null;
|
||||||
@ -513,6 +521,16 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addArtifact(CorrelationAttribute eamArtifact) throws EamDbException {
|
public void addArtifact(CorrelationAttribute eamArtifact) throws EamDbException {
|
||||||
|
if(eamArtifact == null) {
|
||||||
|
throw new EamDbException("CorrelationAttribute is null");
|
||||||
|
}
|
||||||
|
if(eamArtifact.getCorrelationType() == null) {
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
if(eamArtifact.getCorrelationValue() == null) {
|
||||||
|
throw new EamDbException("Correlation value is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
List<CorrelationAttributeInstance> eamInstances = eamArtifact.getInstances();
|
List<CorrelationAttributeInstance> eamInstances = eamArtifact.getInstances();
|
||||||
@ -526,11 +544,21 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
sql.append("(case_id, data_source_id, value, file_path, known_status, comment) ");
|
sql.append("(case_id, data_source_id, value, file_path, known_status, comment) ");
|
||||||
sql.append("VALUES ((SELECT id FROM cases WHERE case_uid=? LIMIT 1), ");
|
sql.append("VALUES ((SELECT id FROM cases WHERE case_uid=? LIMIT 1), ");
|
||||||
sql.append("(SELECT id FROM data_sources WHERE device_id=? AND case_id=? LIMIT 1), ?, ?, ?, ?)");
|
sql.append("(SELECT id FROM data_sources WHERE device_id=? AND case_id=? LIMIT 1), ?, ?, ?, ?)");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
preparedStatement = conn.prepareStatement(sql.toString());
|
preparedStatement = conn.prepareStatement(sql.toString());
|
||||||
for (CorrelationAttributeInstance eamInstance : eamInstances) {
|
for (CorrelationAttributeInstance eamInstance : eamInstances) {
|
||||||
if (!eamArtifact.getCorrelationValue().isEmpty()) {
|
if (!eamArtifact.getCorrelationValue().isEmpty()) {
|
||||||
|
if(eamInstance.getCorrelationCase() == null) {
|
||||||
|
throw new EamDbException("CorrelationAttributeInstance has null case");
|
||||||
|
}
|
||||||
|
if(eamInstance.getCorrelationDataSource() == null) {
|
||||||
|
throw new EamDbException("CorrelationAttributeInstance has null data source");
|
||||||
|
}
|
||||||
|
if(eamInstance.getKnownStatus() == null) {
|
||||||
|
throw new EamDbException("CorrelationAttributeInstance has null known status");
|
||||||
|
}
|
||||||
|
|
||||||
preparedStatement.setString(1, eamInstance.getCorrelationCase().getCaseUUID());
|
preparedStatement.setString(1, eamInstance.getCorrelationCase().getCaseUUID());
|
||||||
preparedStatement.setString(2, eamInstance.getCorrelationDataSource().getDeviceID());
|
preparedStatement.setString(2, eamInstance.getCorrelationDataSource().getDeviceID());
|
||||||
preparedStatement.setInt(3, eamInstance.getCorrelationDataSource().getCaseID());
|
preparedStatement.setInt(3, eamInstance.getCorrelationDataSource().getCaseID());
|
||||||
@ -567,6 +595,9 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<CorrelationAttributeInstance> getArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
public List<CorrelationAttributeInstance> getArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
||||||
|
if(aType == null) {
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
List<CorrelationAttributeInstance> artifactInstances = new ArrayList<>();
|
List<CorrelationAttributeInstance> artifactInstances = new ArrayList<>();
|
||||||
@ -619,6 +650,12 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<CorrelationAttributeInstance> getArtifactInstancesByPath(CorrelationAttribute.Type aType, String filePath) throws EamDbException {
|
public List<CorrelationAttributeInstance> getArtifactInstancesByPath(CorrelationAttribute.Type aType, String filePath) throws EamDbException {
|
||||||
|
if(aType == null) {
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
if(filePath == null) {
|
||||||
|
throw new EamDbException("Correlation value is null");
|
||||||
|
}
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
List<CorrelationAttributeInstance> artifactInstances = new ArrayList<>();
|
List<CorrelationAttributeInstance> artifactInstances = new ArrayList<>();
|
||||||
@ -641,7 +678,7 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
preparedStatement = conn.prepareStatement(sql.toString());
|
preparedStatement = conn.prepareStatement(sql.toString());
|
||||||
preparedStatement.setString(1, filePath);
|
preparedStatement.setString(1, filePath.toLowerCase());
|
||||||
resultSet = preparedStatement.executeQuery();
|
resultSet = preparedStatement.executeQuery();
|
||||||
while (resultSet.next()) {
|
while (resultSet.next()) {
|
||||||
artifactInstance = getEamArtifactInstanceFromResultSet(resultSet);
|
artifactInstance = getEamArtifactInstanceFromResultSet(resultSet);
|
||||||
@ -670,6 +707,13 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Long getCountArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
public Long getCountArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
||||||
|
if(aType == null) {
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
if(value == null) {
|
||||||
|
throw new EamDbException("Correlation value is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
Long instanceCount = 0L;
|
Long instanceCount = 0L;
|
||||||
@ -684,7 +728,7 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
preparedStatement = conn.prepareStatement(sql.toString());
|
preparedStatement = conn.prepareStatement(sql.toString());
|
||||||
preparedStatement.setString(1, value);
|
preparedStatement.setString(1, value.toLowerCase());
|
||||||
resultSet = preparedStatement.executeQuery();
|
resultSet = preparedStatement.executeQuery();
|
||||||
resultSet.next();
|
resultSet.next();
|
||||||
instanceCount = resultSet.getLong(1);
|
instanceCount = resultSet.getLong(1);
|
||||||
@ -701,6 +745,9 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getFrequencyPercentage(CorrelationAttribute corAttr) throws EamDbException {
|
public int getFrequencyPercentage(CorrelationAttribute corAttr) throws EamDbException {
|
||||||
|
if (corAttr == null) {
|
||||||
|
throw new EamDbException("Correlation attribute is null");
|
||||||
|
}
|
||||||
Double uniqueTypeValueTuples = getCountUniqueCaseDataSourceTuplesHavingTypeValue(corAttr.getCorrelationType(), corAttr.getCorrelationValue()).doubleValue();
|
Double uniqueTypeValueTuples = getCountUniqueCaseDataSourceTuplesHavingTypeValue(corAttr.getCorrelationType(), corAttr.getCorrelationValue()).doubleValue();
|
||||||
Double uniqueCaseDataSourceTuples = getCountUniqueDataSources().doubleValue();
|
Double uniqueCaseDataSourceTuples = getCountUniqueDataSources().doubleValue();
|
||||||
Double commonalityPercentage = uniqueTypeValueTuples / uniqueCaseDataSourceTuples * 100;
|
Double commonalityPercentage = uniqueTypeValueTuples / uniqueCaseDataSourceTuples * 100;
|
||||||
@ -719,6 +766,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
||||||
|
if(aType == null) {
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
Long instanceCount = 0L;
|
Long instanceCount = 0L;
|
||||||
@ -840,6 +891,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
@Override
|
@Override
|
||||||
public void prepareBulkArtifact(CorrelationAttribute eamArtifact) throws EamDbException {
|
public void prepareBulkArtifact(CorrelationAttribute eamArtifact) throws EamDbException {
|
||||||
|
|
||||||
|
if(eamArtifact.getCorrelationType() == null) {
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
|
||||||
synchronized (bulkArtifacts) {
|
synchronized (bulkArtifacts) {
|
||||||
bulkArtifacts.get(eamArtifact.getCorrelationType().getDbTableName()).add(eamArtifact);
|
bulkArtifacts.get(eamArtifact.getCorrelationType().getDbTableName()).add(eamArtifact);
|
||||||
bulkArtifactsCount++;
|
bulkArtifactsCount++;
|
||||||
@ -893,6 +948,17 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
|
|
||||||
for (CorrelationAttributeInstance eamInstance : eamInstances) {
|
for (CorrelationAttributeInstance eamInstance : eamInstances) {
|
||||||
if (!eamArtifact.getCorrelationValue().isEmpty()) {
|
if (!eamArtifact.getCorrelationValue().isEmpty()) {
|
||||||
|
|
||||||
|
if(eamInstance.getCorrelationCase() == null) {
|
||||||
|
throw new EamDbException("Correlation attribute instance has null case");
|
||||||
|
}
|
||||||
|
if(eamInstance.getCorrelationDataSource() == null) {
|
||||||
|
throw new EamDbException("Correlation attribute instance has null data source");
|
||||||
|
}
|
||||||
|
if(eamInstance.getKnownStatus()== null) {
|
||||||
|
throw new EamDbException("Correlation attribute instance has null known known status");
|
||||||
|
}
|
||||||
|
|
||||||
bulkPs.setString(1, eamInstance.getCorrelationCase().getCaseUUID());
|
bulkPs.setString(1, eamInstance.getCorrelationCase().getCaseUUID());
|
||||||
bulkPs.setString(2, eamInstance.getCorrelationDataSource().getDeviceID());
|
bulkPs.setString(2, eamInstance.getCorrelationDataSource().getDeviceID());
|
||||||
bulkPs.setInt(3, eamInstance.getCorrelationDataSource().getCaseID());
|
bulkPs.setInt(3, eamInstance.getCorrelationDataSource().getCaseID());
|
||||||
@ -929,12 +995,16 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void bulkInsertCases(List<CorrelationCase> cases) throws EamDbException {
|
public void bulkInsertCases(List<CorrelationCase> cases) throws EamDbException {
|
||||||
Connection conn = connect();
|
if(cases == null) {
|
||||||
|
throw new EamDbException("cases argument is null");
|
||||||
|
}
|
||||||
|
|
||||||
if (cases.isEmpty()) {
|
if (cases.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Connection conn = connect();
|
||||||
|
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
PreparedStatement bulkPs = null;
|
PreparedStatement bulkPs = null;
|
||||||
try {
|
try {
|
||||||
@ -1012,15 +1082,28 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus) throws EamDbException {
|
public void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus) throws EamDbException {
|
||||||
Connection conn = connect();
|
if(eamArtifact == null) {
|
||||||
|
throw new EamDbException("Correlation attribute is null");
|
||||||
|
}
|
||||||
|
if(knownStatus == null) {
|
||||||
|
throw new EamDbException("Known status is null");
|
||||||
|
}
|
||||||
if (1 != eamArtifact.getInstances().size()) {
|
if (1 != eamArtifact.getInstances().size()) {
|
||||||
throw new EamDbException("Error: Artifact must have exactly one (1) Artifact Instance to set as notable."); // NON-NLS
|
throw new EamDbException("Error: Artifact must have exactly one (1) Artifact Instance to set as notable."); // NON-NLS
|
||||||
}
|
}
|
||||||
|
|
||||||
List<CorrelationAttributeInstance> eamInstances = eamArtifact.getInstances();
|
List<CorrelationAttributeInstance> eamInstances = eamArtifact.getInstances();
|
||||||
CorrelationAttributeInstance eamInstance = eamInstances.get(0);
|
CorrelationAttributeInstance eamInstance = eamInstances.get(0);
|
||||||
|
|
||||||
|
if(eamInstance.getCorrelationCase() == null) {
|
||||||
|
throw new EamDbException("Correlation case is null");
|
||||||
|
}
|
||||||
|
if(eamInstance.getCorrelationDataSource() == null) {
|
||||||
|
throw new EamDbException("Correlation data source is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
Connection conn = connect();
|
||||||
|
|
||||||
PreparedStatement preparedUpdate = null;
|
PreparedStatement preparedUpdate = null;
|
||||||
PreparedStatement preparedQuery = null;
|
PreparedStatement preparedQuery = null;
|
||||||
ResultSet resultSet = null;
|
ResultSet resultSet = null;
|
||||||
@ -1103,6 +1186,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
public List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
||||||
|
if(aType == null) {
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
List<CorrelationAttributeInstance> artifactInstances = new ArrayList<>();
|
List<CorrelationAttributeInstance> artifactInstances = new ArrayList<>();
|
||||||
@ -1153,6 +1240,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Long getCountArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
public Long getCountArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
||||||
|
if(aType == null) {
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
Long badInstances = 0L;
|
Long badInstances = 0L;
|
||||||
@ -1197,6 +1288,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<String> getListCasesHavingArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
public List<String> getListCasesHavingArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
||||||
|
if(aType == null) {
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
Collection<String> caseNames = new LinkedHashSet<>();
|
Collection<String> caseNames = new LinkedHashSet<>();
|
||||||
@ -1313,7 +1408,7 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
@Override
|
@Override
|
||||||
public boolean referenceSetIsValid(int referenceSetID, String setName, String version) throws EamDbException {
|
public boolean referenceSetIsValid(int referenceSetID, String setName, String version) throws EamDbException {
|
||||||
EamGlobalSet refSet = this.getReferenceSetByID(referenceSetID);
|
EamGlobalSet refSet = this.getReferenceSetByID(referenceSetID);
|
||||||
if (refSet == null) {
|
if(refSet == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1382,6 +1477,9 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isArtifactKnownBadByReference(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
public boolean isArtifactKnownBadByReference(CorrelationAttribute.Type aType, String value) throws EamDbException {
|
||||||
|
if(aType == null) {
|
||||||
|
throw new EamDbException("null correlation type");
|
||||||
|
}
|
||||||
|
|
||||||
// TEMP: Only support file correlation type
|
// TEMP: Only support file correlation type
|
||||||
if (aType.getId() != CorrelationAttribute.FILES_TYPE_ID) {
|
if (aType.getId() != CorrelationAttribute.FILES_TYPE_ID) {
|
||||||
@ -1424,6 +1522,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public long newOrganization(EamOrganization eamOrg) throws EamDbException {
|
public long newOrganization(EamOrganization eamOrg) throws EamDbException {
|
||||||
|
if(eamOrg == null) {
|
||||||
|
throw new EamDbException("EamOrganization is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
ResultSet generatedKeys = null;
|
ResultSet generatedKeys = null;
|
||||||
PreparedStatement preparedStatement = null;
|
PreparedStatement preparedStatement = null;
|
||||||
@ -1529,6 +1631,9 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
public EamOrganization getReferenceSetOrganization(int referenceSetID) throws EamDbException {
|
public EamOrganization getReferenceSetOrganization(int referenceSetID) throws EamDbException {
|
||||||
|
|
||||||
EamGlobalSet globalSet = getReferenceSetByID(referenceSetID);
|
EamGlobalSet globalSet = getReferenceSetByID(referenceSetID);
|
||||||
|
if(globalSet == null) {
|
||||||
|
throw new EamDbException("Reference set with ID " + referenceSetID + " not found");
|
||||||
|
}
|
||||||
return (getOrganizationByID(globalSet.getOrgID()));
|
return (getOrganizationByID(globalSet.getOrgID()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1542,6 +1647,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void updateOrganization(EamOrganization updatedOrganization) throws EamDbException {
|
public void updateOrganization(EamOrganization updatedOrganization) throws EamDbException {
|
||||||
|
if(updatedOrganization == null) {
|
||||||
|
throw new EamDbException("null updatedOrganization");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
PreparedStatement preparedStatement = null;
|
PreparedStatement preparedStatement = null;
|
||||||
String sql = "UPDATE organizations SET org_name = ?, poc_name = ?, poc_email = ?, poc_phone = ? WHERE id = ?";
|
String sql = "UPDATE organizations SET org_name = ?, poc_name = ?, poc_email = ?, poc_phone = ? WHERE id = ?";
|
||||||
@ -1566,6 +1675,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
"AbstractSqlEamDb.deleteOrganization.errorDeleting.message=Error executing query when attempting to delete organization by id."})
|
"AbstractSqlEamDb.deleteOrganization.errorDeleting.message=Error executing query when attempting to delete organization by id."})
|
||||||
@Override
|
@Override
|
||||||
public void deleteOrganization(EamOrganization organizationToDelete) throws EamDbException {
|
public void deleteOrganization(EamOrganization organizationToDelete) throws EamDbException {
|
||||||
|
if(organizationToDelete == null) {
|
||||||
|
throw new EamDbException("Organization to delete is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
PreparedStatement checkIfUsedStatement = null;
|
PreparedStatement checkIfUsedStatement = null;
|
||||||
ResultSet resultSet = null;
|
ResultSet resultSet = null;
|
||||||
@ -1605,6 +1718,18 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int newReferenceSet(EamGlobalSet eamGlobalSet) throws EamDbException {
|
public int newReferenceSet(EamGlobalSet eamGlobalSet) throws EamDbException {
|
||||||
|
if(eamGlobalSet == null){
|
||||||
|
throw new EamDbException("EamGlobalSet argument is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(eamGlobalSet.getFileKnownStatus() == null){
|
||||||
|
throw new EamDbException("File known status on the EamGlobalSet is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(eamGlobalSet.getType() == null){
|
||||||
|
throw new EamDbException("Type on the EamGlobalSet is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
PreparedStatement preparedStatement1 = null;
|
PreparedStatement preparedStatement1 = null;
|
||||||
@ -1666,8 +1791,11 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
preparedStatement1 = conn.prepareStatement(sql1);
|
preparedStatement1 = conn.prepareStatement(sql1);
|
||||||
preparedStatement1.setInt(1, referenceSetID);
|
preparedStatement1.setInt(1, referenceSetID);
|
||||||
resultSet = preparedStatement1.executeQuery();
|
resultSet = preparedStatement1.executeQuery();
|
||||||
resultSet.next();
|
if(resultSet.next()) {
|
||||||
return getEamGlobalSetFromResultSet(resultSet);
|
return getEamGlobalSetFromResultSet(resultSet);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
throw new EamDbException("Error getting reference set by id.", ex); // NON-NLS
|
throw new EamDbException("Error getting reference set by id.", ex); // NON-NLS
|
||||||
@ -1689,6 +1817,11 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<EamGlobalSet> getAllReferenceSets(CorrelationAttribute.Type correlationType) throws EamDbException {
|
public List<EamGlobalSet> getAllReferenceSets(CorrelationAttribute.Type correlationType) throws EamDbException {
|
||||||
|
|
||||||
|
if(correlationType == null){
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
|
||||||
List<EamGlobalSet> results = new ArrayList<>();
|
List<EamGlobalSet> results = new ArrayList<>();
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
@ -1723,6 +1856,13 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttribute.Type correlationType) throws EamDbException {
|
public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttribute.Type correlationType) throws EamDbException {
|
||||||
|
if(eamGlobalFileInstance.getKnownStatus() == null){
|
||||||
|
throw new EamDbException("known status of EamGlobalFileInstance is null");
|
||||||
|
}
|
||||||
|
if(correlationType == null){
|
||||||
|
throw new EamDbException("Correlation type is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
PreparedStatement preparedStatement = null;
|
PreparedStatement preparedStatement = null;
|
||||||
@ -1786,6 +1926,13 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void bulkInsertReferenceTypeEntries(Set<EamGlobalFileInstance> globalInstances, CorrelationAttribute.Type contentType) throws EamDbException {
|
public void bulkInsertReferenceTypeEntries(Set<EamGlobalFileInstance> globalInstances, CorrelationAttribute.Type contentType) throws EamDbException {
|
||||||
|
if(contentType == null) {
|
||||||
|
throw new EamDbException("Null correlation type");
|
||||||
|
}
|
||||||
|
if(globalInstances == null) {
|
||||||
|
throw new EamDbException("Null set of EamGlobalFileInstance");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
PreparedStatement bulkPs = null;
|
PreparedStatement bulkPs = null;
|
||||||
@ -1799,6 +1946,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
bulkPs = conn.prepareStatement(String.format(sql, EamDbUtil.correlationTypeToReferenceTableName(contentType)));
|
bulkPs = conn.prepareStatement(String.format(sql, EamDbUtil.correlationTypeToReferenceTableName(contentType)));
|
||||||
|
|
||||||
for (EamGlobalFileInstance globalInstance : globalInstances) {
|
for (EamGlobalFileInstance globalInstance : globalInstances) {
|
||||||
|
if(globalInstance.getKnownStatus() == null){
|
||||||
|
throw new EamDbException("EamGlobalFileInstance with value " + globalInstance.getMD5Hash() + " has null known status");
|
||||||
|
}
|
||||||
|
|
||||||
bulkPs.setInt(1, globalInstance.getGlobalSetID());
|
bulkPs.setInt(1, globalInstance.getGlobalSetID());
|
||||||
bulkPs.setString(2, globalInstance.getMD5Hash());
|
bulkPs.setString(2, globalInstance.getMD5Hash());
|
||||||
bulkPs.setByte(3, globalInstance.getKnownStatus().getFileKnownValue());
|
bulkPs.setByte(3, globalInstance.getKnownStatus().getFileKnownValue());
|
||||||
@ -1808,7 +1959,7 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
|
|
||||||
bulkPs.executeBatch();
|
bulkPs.executeBatch();
|
||||||
conn.commit();
|
conn.commit();
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException | EamDbException ex) {
|
||||||
try {
|
try {
|
||||||
conn.rollback();
|
conn.rollback();
|
||||||
} catch (SQLException ex2) {
|
} catch (SQLException ex2) {
|
||||||
@ -1833,6 +1984,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<EamGlobalFileInstance> getReferenceInstancesByTypeValue(CorrelationAttribute.Type aType, String aValue) throws EamDbException {
|
public List<EamGlobalFileInstance> getReferenceInstancesByTypeValue(CorrelationAttribute.Type aType, String aValue) throws EamDbException {
|
||||||
|
if(aType == null) {
|
||||||
|
throw new EamDbException("correlation type is null");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
List<EamGlobalFileInstance> globalFileInstances = new ArrayList<>();
|
List<EamGlobalFileInstance> globalFileInstances = new ArrayList<>();
|
||||||
@ -1869,6 +2024,10 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int newCorrelationType(CorrelationAttribute.Type newType) throws EamDbException {
|
public int newCorrelationType(CorrelationAttribute.Type newType) throws EamDbException {
|
||||||
|
if (newType == null) {
|
||||||
|
throw new EamDbException("null correlation type");
|
||||||
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
PreparedStatement preparedStatement = null;
|
PreparedStatement preparedStatement = null;
|
||||||
@ -1883,7 +2042,7 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
} else {
|
} else {
|
||||||
insertSql = "INSERT INTO correlation_types(id, display_name, db_table_name, supported, enabled) VALUES (?, ?, ?, ?, ?)";
|
insertSql = "INSERT INTO correlation_types(id, display_name, db_table_name, supported, enabled) VALUES (?, ?, ?, ?, ?)";
|
||||||
}
|
}
|
||||||
querySql = "SELECT id FROM correlation_types WHERE display_name=? AND db_table_name=?";
|
querySql = "SELECT * FROM correlation_types WHERE display_name=? AND db_table_name=?";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
preparedStatement = conn.prepareStatement(insertSql);
|
preparedStatement = conn.prepareStatement(insertSql);
|
||||||
@ -2073,9 +2232,12 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
preparedStatement = conn.prepareStatement(sql);
|
preparedStatement = conn.prepareStatement(sql);
|
||||||
preparedStatement.setInt(1, typeId);
|
preparedStatement.setInt(1, typeId);
|
||||||
resultSet = preparedStatement.executeQuery();
|
resultSet = preparedStatement.executeQuery();
|
||||||
resultSet.next();
|
if(resultSet.next()) {
|
||||||
aType = getCorrelationTypeFromResultSet(resultSet);
|
aType = getCorrelationTypeFromResultSet(resultSet);
|
||||||
return aType;
|
return aType;
|
||||||
|
} else {
|
||||||
|
throw new EamDbException("Failed to find entry for correlation type ID = " + typeId);
|
||||||
|
}
|
||||||
|
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
throw new EamDbException("Error getting correlation type by id.", ex); // NON-NLS
|
throw new EamDbException("Error getting correlation type by id.", ex); // NON-NLS
|
||||||
@ -2131,8 +2293,8 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CorrelationDataSource eamDataSource = new CorrelationDataSource(
|
CorrelationDataSource eamDataSource = new CorrelationDataSource(
|
||||||
resultSet.getInt("id"),
|
|
||||||
resultSet.getInt("case_id"),
|
resultSet.getInt("case_id"),
|
||||||
|
resultSet.getInt("id"),
|
||||||
resultSet.getString("device_id"),
|
resultSet.getString("device_id"),
|
||||||
resultSet.getString("name")
|
resultSet.getString("name")
|
||||||
);
|
);
|
||||||
@ -2166,13 +2328,13 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
*
|
*
|
||||||
* @throws SQLException when an expected column name is not in the resultSet
|
* @throws SQLException when an expected column name is not in the resultSet
|
||||||
*/
|
*/
|
||||||
private CorrelationAttributeInstance getEamArtifactInstanceFromResultSet(ResultSet resultSet) throws SQLException {
|
private CorrelationAttributeInstance getEamArtifactInstanceFromResultSet(ResultSet resultSet) throws SQLException, EamDbException {
|
||||||
if (null == resultSet) {
|
if (null == resultSet) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
CorrelationAttributeInstance eamArtifactInstance = new CorrelationAttributeInstance(
|
CorrelationAttributeInstance eamArtifactInstance = new CorrelationAttributeInstance(
|
||||||
new CorrelationCase(resultSet.getInt("case_id"), resultSet.getString("case_uid"), resultSet.getString("case_name")),
|
new CorrelationCase(resultSet.getInt("case_id"), resultSet.getString("case_uid"), resultSet.getString("case_name")),
|
||||||
new CorrelationDataSource(-1, resultSet.getInt("case_id"), resultSet.getString("device_id"), resultSet.getString("name")),
|
new CorrelationDataSource(resultSet.getInt("case_id"), -1, resultSet.getString("device_id"), resultSet.getString("name")),
|
||||||
resultSet.getString("file_path"),
|
resultSet.getString("file_path"),
|
||||||
resultSet.getString("comment"),
|
resultSet.getString("comment"),
|
||||||
TskData.FileKnown.valueOf(resultSet.getByte("known_status"))
|
TskData.FileKnown.valueOf(resultSet.getByte("known_status"))
|
||||||
@ -2216,7 +2378,7 @@ public abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
return eamGlobalSet;
|
return eamGlobalSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private EamGlobalFileInstance getEamGlobalFileInstanceFromResultSet(ResultSet resultSet) throws SQLException {
|
private EamGlobalFileInstance getEamGlobalFileInstanceFromResultSet(ResultSet resultSet) throws SQLException, EamDbException {
|
||||||
if (null == resultSet) {
|
if (null == resultSet) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ import org.openide.util.NbBundle.Messages;
|
|||||||
/**
|
/**
|
||||||
* Represents a type and value pair that can be used for correlation.
|
* Represents a type and value pair that can be used for correlation.
|
||||||
* CorrelationAttributeInstances store information about the actual
|
* CorrelationAttributeInstances store information about the actual
|
||||||
* occurences of the attribute.
|
* occurrences of the attribute.
|
||||||
*/
|
*/
|
||||||
public class CorrelationAttribute implements Serializable {
|
public class CorrelationAttribute implements Serializable {
|
||||||
|
|
||||||
@ -66,7 +66,10 @@ public class CorrelationAttribute implements Serializable {
|
|||||||
return DEFAULT_CORRELATION_TYPES;
|
return DEFAULT_CORRELATION_TYPES;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CorrelationAttribute(Type correlationType, String correlationValue) {
|
public CorrelationAttribute(Type correlationType, String correlationValue) throws EamDbException {
|
||||||
|
if(correlationValue == null) {
|
||||||
|
throw new EamDbException ("Correlation value is null");
|
||||||
|
}
|
||||||
this.ID = "";
|
this.ID = "";
|
||||||
this.correlationType = correlationType;
|
this.correlationType = correlationType;
|
||||||
// Lower-case all values to normalize and improve correlation hits, going forward make sure this makes sense for all correlation types
|
// Lower-case all values to normalize and improve correlation hits, going forward make sure this makes sense for all correlation types
|
||||||
@ -181,9 +184,12 @@ public class CorrelationAttribute implements Serializable {
|
|||||||
* Must start with a lowercase letter and only contain
|
* Must start with a lowercase letter and only contain
|
||||||
* lowercase letters, numbers, and '_' characters.
|
* lowercase letters, numbers, and '_' characters.
|
||||||
* @param supported Is this Type currently supported
|
* @param supported Is this Type currently supported
|
||||||
* @param enabled Is this Type currentl enabled.
|
* @param enabled Is this Type currently enabled.
|
||||||
*/
|
*/
|
||||||
public Type(int id, String displayName, String dbTableName, Boolean supported, Boolean enabled) throws EamDbException {
|
public Type(int id, String displayName, String dbTableName, Boolean supported, Boolean enabled) throws EamDbException {
|
||||||
|
if(dbTableName == null) {
|
||||||
|
throw new EamDbException("dbTableName is null");
|
||||||
|
}
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.displayName = displayName;
|
this.displayName = displayName;
|
||||||
this.dbTableName = dbTableName;
|
this.dbTableName = dbTableName;
|
||||||
@ -195,7 +201,7 @@ public class CorrelationAttribute implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructior for custom types where we do not know the Type ID until
|
* Constructor for custom types where we do not know the Type ID until
|
||||||
* the row has been entered into the correlation_types table
|
* the row has been entered into the correlation_types table
|
||||||
* in the central repository.
|
* in the central repository.
|
||||||
*
|
*
|
||||||
@ -204,7 +210,7 @@ public class CorrelationAttribute implements Serializable {
|
|||||||
* Must start with a lowercase letter and only contain
|
* Must start with a lowercase letter and only contain
|
||||||
* lowercase letters, numbers, and '_' characters.
|
* lowercase letters, numbers, and '_' characters.
|
||||||
* @param supported Is this Type currently supported
|
* @param supported Is this Type currently supported
|
||||||
* @param enabled Is this Type currentl enabled.
|
* @param enabled Is this Type currently enabled.
|
||||||
*/
|
*/
|
||||||
public Type(String displayName, String dbTableName, Boolean supported, Boolean enabled) throws EamDbException {
|
public Type(String displayName, String dbTableName, Boolean supported, Boolean enabled) throws EamDbException {
|
||||||
this(-1, displayName, dbTableName, supported, enabled);
|
this(-1, displayName, dbTableName, supported, enabled);
|
||||||
|
@ -46,7 +46,7 @@ public class CorrelationAttributeInstance implements Serializable {
|
|||||||
public CorrelationAttributeInstance(
|
public CorrelationAttributeInstance(
|
||||||
CorrelationCase eamCase,
|
CorrelationCase eamCase,
|
||||||
CorrelationDataSource eamDataSource
|
CorrelationDataSource eamDataSource
|
||||||
) {
|
) throws EamDbException {
|
||||||
this(-1, eamCase, eamDataSource, "", null, TskData.FileKnown.UNKNOWN);
|
this(-1, eamCase, eamDataSource, "", null, TskData.FileKnown.UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ public class CorrelationAttributeInstance implements Serializable {
|
|||||||
CorrelationCase eamCase,
|
CorrelationCase eamCase,
|
||||||
CorrelationDataSource eamDataSource,
|
CorrelationDataSource eamDataSource,
|
||||||
String filePath
|
String filePath
|
||||||
) {
|
) throws EamDbException {
|
||||||
this(-1, eamCase, eamDataSource, filePath, null, TskData.FileKnown.UNKNOWN);
|
this(-1, eamCase, eamDataSource, filePath, null, TskData.FileKnown.UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ public class CorrelationAttributeInstance implements Serializable {
|
|||||||
CorrelationDataSource eamDataSource,
|
CorrelationDataSource eamDataSource,
|
||||||
String filePath,
|
String filePath,
|
||||||
String comment
|
String comment
|
||||||
) {
|
) throws EamDbException {
|
||||||
this(-1, eamCase, eamDataSource, filePath, comment, TskData.FileKnown.UNKNOWN);
|
this(-1, eamCase, eamDataSource, filePath, comment, TskData.FileKnown.UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ public class CorrelationAttributeInstance implements Serializable {
|
|||||||
String filePath,
|
String filePath,
|
||||||
String comment,
|
String comment,
|
||||||
TskData.FileKnown knownStatus
|
TskData.FileKnown knownStatus
|
||||||
) {
|
) throws EamDbException {
|
||||||
this(-1, eamCase, eamDataSource, filePath, comment, knownStatus);
|
this(-1, eamCase, eamDataSource, filePath, comment, knownStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +84,11 @@ public class CorrelationAttributeInstance implements Serializable {
|
|||||||
String filePath,
|
String filePath,
|
||||||
String comment,
|
String comment,
|
||||||
TskData.FileKnown knownStatus
|
TskData.FileKnown knownStatus
|
||||||
) {
|
) throws EamDbException {
|
||||||
|
if(filePath == null) {
|
||||||
|
throw new EamDbException("file path is null");
|
||||||
|
}
|
||||||
|
|
||||||
this.ID = ID;
|
this.ID = ID;
|
||||||
this.correlationCase = eamCase;
|
this.correlationCase = eamCase;
|
||||||
this.correlationDataSource = eamDataSource;
|
this.correlationDataSource = eamDataSource;
|
||||||
|
@ -50,6 +50,10 @@ public class CorrelationCase implements Serializable {
|
|||||||
* @param caseUUID Globally unique identifier
|
* @param caseUUID Globally unique identifier
|
||||||
* @param displayName
|
* @param displayName
|
||||||
*/
|
*/
|
||||||
|
public CorrelationCase(String caseUUID, String displayName) {
|
||||||
|
this(-1, caseUUID, displayName);
|
||||||
|
}
|
||||||
|
|
||||||
CorrelationCase(int ID, String caseUUID, String displayName) {
|
CorrelationCase(int ID, String caseUUID, String displayName) {
|
||||||
this(ID, caseUUID, null, displayName, DATE_FORMAT.format(new Date()), null, null, null, null, null);
|
this(ID, caseUUID, null, displayName, DATE_FORMAT.format(new Date()), null, null, null, null, null);
|
||||||
}
|
}
|
||||||
@ -156,7 +160,7 @@ public class CorrelationCase implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* @return the database ID for the case or -1 if it is unknown (or not in the DB)
|
* @return the database ID for the case or -1 if it is unknown (or not in the DB)
|
||||||
*/
|
*/
|
||||||
int getID() {
|
public int getID() {
|
||||||
// @@@ Should probably have some lazy logic here to lead the ID from the DB if it is -1
|
// @@@ Should probably have some lazy logic here to lead the ID from the DB if it is -1
|
||||||
return databaseId;
|
return databaseId;
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,16 @@ public class CorrelationDataSource implements Serializable {
|
|||||||
private final String deviceID; //< Unique to its associated case (not necessarily globally unique)
|
private final String deviceID; //< Unique to its associated case (not necessarily globally unique)
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param caseId
|
||||||
|
* @param deviceId
|
||||||
|
* @param name
|
||||||
|
*/
|
||||||
|
public CorrelationDataSource(int caseId, String deviceId, String name) {
|
||||||
|
this(caseId, -1, deviceId, name);
|
||||||
|
}
|
||||||
|
|
||||||
CorrelationDataSource(int caseId,
|
CorrelationDataSource(int caseId,
|
||||||
int dataSourceId,
|
int dataSourceId,
|
||||||
String deviceId,
|
String deviceId,
|
||||||
|
@ -135,7 +135,8 @@ public class EamArtifactUtil {
|
|||||||
* @return the new EamArtifact, or null if one was not created because
|
* @return the new EamArtifact, or null if one was not created because
|
||||||
* bbArtifact did not contain the needed data
|
* bbArtifact did not contain the needed data
|
||||||
*/
|
*/
|
||||||
private static CorrelationAttribute getCorrelationAttributeFromBlackboardArtifact(CorrelationAttribute.Type correlationType, BlackboardArtifact bbArtifact) {
|
private static CorrelationAttribute getCorrelationAttributeFromBlackboardArtifact(CorrelationAttribute.Type correlationType,
|
||||||
|
BlackboardArtifact bbArtifact) throws EamDbException {
|
||||||
String value = null;
|
String value = null;
|
||||||
int artifactTypeID = bbArtifact.getArtifactTypeID();
|
int artifactTypeID = bbArtifact.getArtifactTypeID();
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ public class EamGlobalFileInstance {
|
|||||||
int globalSetID,
|
int globalSetID,
|
||||||
String MD5Hash,
|
String MD5Hash,
|
||||||
TskData.FileKnown knownStatus,
|
TskData.FileKnown knownStatus,
|
||||||
String comment) {
|
String comment) throws EamDbException {
|
||||||
this(-1, globalSetID, MD5Hash, knownStatus, comment);
|
this(-1, globalSetID, MD5Hash, knownStatus, comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,7 +45,13 @@ public class EamGlobalFileInstance {
|
|||||||
int globalSetID,
|
int globalSetID,
|
||||||
String MD5Hash,
|
String MD5Hash,
|
||||||
TskData.FileKnown knownStatus,
|
TskData.FileKnown knownStatus,
|
||||||
String comment) {
|
String comment) throws EamDbException {
|
||||||
|
if(MD5Hash == null){
|
||||||
|
throw new EamDbException("null MD5 hash");
|
||||||
|
}
|
||||||
|
if(knownStatus == null){
|
||||||
|
throw new EamDbException("null known status");
|
||||||
|
}
|
||||||
this.instanceID = instanceID;
|
this.instanceID = instanceID;
|
||||||
this.globalSetID = globalSetID;
|
this.globalSetID = globalSetID;
|
||||||
// Normalize hashes by lower casing
|
// Normalize hashes by lower casing
|
||||||
@ -111,7 +117,10 @@ public class EamGlobalFileInstance {
|
|||||||
/**
|
/**
|
||||||
* @param MD5Hash the MD5Hash to set
|
* @param MD5Hash the MD5Hash to set
|
||||||
*/
|
*/
|
||||||
public void setMD5Hash(String MD5Hash) {
|
public void setMD5Hash(String MD5Hash) throws EamDbException {
|
||||||
|
if(MD5Hash == null){
|
||||||
|
throw new EamDbException("null MD5 hash");
|
||||||
|
}
|
||||||
// Normalize hashes by lower casing
|
// Normalize hashes by lower casing
|
||||||
this.MD5Hash = MD5Hash.toLowerCase();
|
this.MD5Hash = MD5Hash.toLowerCase();
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ import java.io.File;
|
|||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
@ -165,6 +166,7 @@ public class SqliteEamDb extends AbstractSqlEamDb {
|
|||||||
connectionPool.setMaxIdle(-1);
|
connectionPool.setMaxIdle(-1);
|
||||||
connectionPool.setMaxWaitMillis(1000);
|
connectionPool.setMaxWaitMillis(1000);
|
||||||
connectionPool.setValidationQuery(dbSettings.getValidationQuery());
|
connectionPool.setValidationQuery(dbSettings.getValidationQuery());
|
||||||
|
connectionPool.setConnectionInitSqls(Arrays.asList("PRAGMA foreign_keys = ON"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,3 +33,13 @@ MessageContentViewer.directionText.text=direction
|
|||||||
MessageContentViewer.ccLabel.text=CC:
|
MessageContentViewer.ccLabel.text=CC:
|
||||||
MessageContentViewer.attachmentsPanel.TabConstraints.tabTitle=Attachments
|
MessageContentViewer.attachmentsPanel.TabConstraints.tabTitle=Attachments
|
||||||
MessageContentViewer.viewInNewWindowButton.text=View in New Window
|
MessageContentViewer.viewInNewWindowButton.text=View in New Window
|
||||||
|
JPEGViewerDummy.jLabel1.text=You are looking at a JPEG file:
|
||||||
|
JPEGViewerDummy.jTextField1.text=jTextField1
|
||||||
|
SQLiteViewer.nextPageButton.text=
|
||||||
|
SQLiteViewer.prevPageButton.text=
|
||||||
|
SQLiteViewer.numPagesLabel.text=N
|
||||||
|
SQLiteViewer.jLabel3.text=of
|
||||||
|
SQLiteViewer.currPageLabel.text=x
|
||||||
|
SQLiteViewer.jLabel2.text=Page
|
||||||
|
SQLiteViewer.numEntriesField.text=num Entries
|
||||||
|
SQLiteViewer.jLabel1.text=Table
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2018 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.contentviewers;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.util.List;
|
||||||
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines an interface for application specific content viewer
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
interface FileTypeViewer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns list of MIME types supported by this viewer
|
||||||
|
*/
|
||||||
|
List<String> getSupportedMIMETypes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the given file's content in the view panel
|
||||||
|
*/
|
||||||
|
void setFile(AbstractFile file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns panel
|
||||||
|
*/
|
||||||
|
Component getComponent();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the data in the panel
|
||||||
|
*/
|
||||||
|
void resetComponent();
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.9" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
</AuxValues>
|
||||||
|
<LayoutCode>
|
||||||
|
<CodeStatement>
|
||||||
|
<CodeExpression id="1">
|
||||||
|
<ExpressionOrigin>
|
||||||
|
<ExpressionProvider type="ComponentRef">
|
||||||
|
<ComponentRef name="."/>
|
||||||
|
</ExpressionProvider>
|
||||||
|
</ExpressionOrigin>
|
||||||
|
</CodeExpression>
|
||||||
|
<StatementProvider type="CodeMethod">
|
||||||
|
<CodeMethod name="setLayout" class="java.awt.Container" parameterTypes="java.awt.LayoutManager"/>
|
||||||
|
</StatementProvider>
|
||||||
|
<Parameters>
|
||||||
|
<CodeExpression id="2">
|
||||||
|
<ExpressionOrigin>
|
||||||
|
<ExpressionProvider type="CodeConstructor">
|
||||||
|
<CodeConstructor class="javax.swing.OverlayLayout" parameterTypes="java.awt.Container"/>
|
||||||
|
</ExpressionProvider>
|
||||||
|
<Parameters>
|
||||||
|
<CodeExpression id="1"/>
|
||||||
|
</Parameters>
|
||||||
|
</ExpressionOrigin>
|
||||||
|
</CodeExpression>
|
||||||
|
</Parameters>
|
||||||
|
</CodeStatement>
|
||||||
|
</LayoutCode>
|
||||||
|
</Form>
|
235
Core/src/org/sleuthkit/autopsy/contentviewers/FileViewer.java
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2018 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.contentviewers;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import org.openide.nodes.Node;
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
import org.openide.util.lookup.ServiceProvider;
|
||||||
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector;
|
||||||
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic Application content viewer
|
||||||
|
*/
|
||||||
|
@ServiceProvider(service = DataContentViewer.class, position = 5)
|
||||||
|
public class FileViewer extends javax.swing.JPanel implements DataContentViewer {
|
||||||
|
|
||||||
|
private static final int CONFIDENCE_LEVEL = 7;
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(FileViewer.class.getName());
|
||||||
|
|
||||||
|
private final Map<String, FileTypeViewer> mimeTypeToViewerMap = new HashMap<>();
|
||||||
|
|
||||||
|
// TBD: This hardcoded list of viewers should be replaced with a dynamic lookup
|
||||||
|
private static final FileTypeViewer[] KNOWN_VIEWERS = new FileTypeViewer[]{
|
||||||
|
// new JPEGViewerDummy(), // this if for testing only
|
||||||
|
new SQLiteViewer()
|
||||||
|
};
|
||||||
|
|
||||||
|
private FileTypeViewer lastViewer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new form ApplicationContentViewer
|
||||||
|
*/
|
||||||
|
public FileViewer() {
|
||||||
|
|
||||||
|
// init the mimetype to viewer map
|
||||||
|
for (FileTypeViewer cv : KNOWN_VIEWERS) {
|
||||||
|
cv.getSupportedMIMETypes().forEach((mimeType) -> {
|
||||||
|
if (mimeTypeToViewerMap.containsKey(mimeType) == false) {
|
||||||
|
mimeTypeToViewerMap.put(mimeType, cv);
|
||||||
|
} else {
|
||||||
|
LOGGER.log(Level.WARNING, "Duplicate viewer for mimtype: {0}", mimeType); //NON-NLS
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
initComponents();
|
||||||
|
|
||||||
|
LOGGER.log(Level.INFO, "Created ApplicationContentViewer instance: {0}", this); //NON-NLS
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the FileTypeViewer for a given mimetype
|
||||||
|
*
|
||||||
|
* @param mimeType
|
||||||
|
*
|
||||||
|
* @return FileTypeViewer, null if no known content viewer supports the mimetype
|
||||||
|
*/
|
||||||
|
private FileTypeViewer getSupportingViewer(String mimeType) {
|
||||||
|
return mimeTypeToViewerMap.get(mimeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called from within the constructor to initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is always
|
||||||
|
* regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
setLayout(new javax.swing.OverlayLayout(this));
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setNode(Node selectedNode) {
|
||||||
|
|
||||||
|
resetComponent();
|
||||||
|
|
||||||
|
if (selectedNode == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AbstractFile file = selectedNode.getLookup().lookup(AbstractFile.class);
|
||||||
|
if (file == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String mimeType = file.getMIMEType();
|
||||||
|
if (Strings.isNullOrEmpty(mimeType)) {
|
||||||
|
LOGGER.log(Level.INFO, "Mimetype not known for file: {0}", file.getName()); //NON-NLS
|
||||||
|
try {
|
||||||
|
FileTypeDetector fileTypeDetector = new FileTypeDetector();
|
||||||
|
mimeType = fileTypeDetector.getMIMEType(file);
|
||||||
|
}catch (FileTypeDetector.FileTypeDetectorInitException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Failed to initialize FileTypeDetector.", ex); //NON-NLS
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mimeType.equalsIgnoreCase("application/octet-stream")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
FileTypeViewer viewer = getSupportingViewer(mimeType);
|
||||||
|
if (viewer != null) {
|
||||||
|
lastViewer = viewer;
|
||||||
|
|
||||||
|
viewer.setFile(file);
|
||||||
|
this.removeAll();
|
||||||
|
this.add(viewer.getComponent());
|
||||||
|
this.repaint();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages("ApplicationContentViewer.title=Application")
|
||||||
|
public String getTitle() {
|
||||||
|
return Bundle.ApplicationContentViewer_title();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages("ApplicationContentViewer.toolTip=Displays file contents.")
|
||||||
|
public String getToolTip() {
|
||||||
|
return Bundle.ApplicationContentViewer_toolTip();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DataContentViewer createInstance() {
|
||||||
|
return new FileViewer();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Component getComponent() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetComponent() {
|
||||||
|
|
||||||
|
if (lastViewer != null) {
|
||||||
|
lastViewer.resetComponent();
|
||||||
|
}
|
||||||
|
this.removeAll();
|
||||||
|
lastViewer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSupported(Node node) {
|
||||||
|
|
||||||
|
if (node == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
AbstractFile aFile = node.getLookup().lookup(AbstractFile.class);
|
||||||
|
if (aFile == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String mimeType = aFile.getMIMEType();
|
||||||
|
if (Strings.isNullOrEmpty(mimeType)) {
|
||||||
|
LOGGER.log(Level.INFO, "Mimetype not known for file: {0}", aFile.getName()); //NON-NLS
|
||||||
|
try {
|
||||||
|
FileTypeDetector fileTypeDetector = new FileTypeDetector();
|
||||||
|
mimeType = fileTypeDetector.getMIMEType(aFile);
|
||||||
|
}catch (FileTypeDetector.FileTypeDetectorInitException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Failed to initialize FileTypeDetector.", ex); //NON-NLS
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mimeType.equalsIgnoreCase("application/octet-stream")) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return (getSupportingViewer(mimeType) != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int isPreferred(Node node) {
|
||||||
|
AbstractFile file = node.getLookup().lookup(AbstractFile.class);
|
||||||
|
String mimeType = file.getMIMEType();
|
||||||
|
|
||||||
|
if (Strings.isNullOrEmpty(mimeType)) {
|
||||||
|
LOGGER.log(Level.INFO, "Mimetype not known for file: {0}", file.getName()); //NON-NLS
|
||||||
|
try {
|
||||||
|
FileTypeDetector fileTypeDetector = new FileTypeDetector();
|
||||||
|
mimeType = fileTypeDetector.getMIMEType(file);
|
||||||
|
}catch (FileTypeDetector.FileTypeDetectorInitException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Failed to initialize FileTypeDetector.", ex); //NON-NLS
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mimeType.equalsIgnoreCase("application/octet-stream")) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if (null != getSupportingViewer(mimeType)) {
|
||||||
|
return CONFIDENCE_LEVEL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<EmptySpace min="-2" pref="43" max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" pref="35" max="-2" attributes="0"/>
|
||||||
|
<Component id="jTextField1" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace pref="120" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jTextField1" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace pref="269" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel1">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="JPEGViewerDummy.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="jTextField1">
|
||||||
|
<Properties>
|
||||||
|
<Property name="editable" type="boolean" value="false"/>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="JPEGViewerDummy.jTextField1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.contentviewers;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
|
||||||
|
public class JPEGViewerDummy extends javax.swing.JPanel implements FileTypeViewer {
|
||||||
|
|
||||||
|
public static final String[] SUPPORTED_MIMETYPES = new String[]{"image/jpeg"};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new form JPEGViewer
|
||||||
|
*/
|
||||||
|
public JPEGViewerDummy() {
|
||||||
|
initComponents();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called from within the constructor to initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is always
|
||||||
|
* regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
jLabel1 = new javax.swing.JLabel();
|
||||||
|
jTextField1 = new javax.swing.JTextField();
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(JPEGViewerDummy.class, "JPEGViewerDummy.jLabel1.text")); // NOI18N
|
||||||
|
|
||||||
|
jTextField1.setEditable(false);
|
||||||
|
jTextField1.setText(org.openide.util.NbBundle.getMessage(JPEGViewerDummy.class, "JPEGViewerDummy.jTextField1.text")); // NOI18N
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
|
this.setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGap(43, 43, 43)
|
||||||
|
.addComponent(jLabel1)
|
||||||
|
.addGap(35, 35, 35)
|
||||||
|
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addContainerGap(120, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(jLabel1)
|
||||||
|
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addContainerGap(269, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getSupportedMIMETypes() {
|
||||||
|
return Arrays.asList(SUPPORTED_MIMETYPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Component getComponent() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetComponent() {
|
||||||
|
this.jTextField1.setText("");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFile(AbstractFile file) {
|
||||||
|
this.jTextField1.setText(file.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JLabel jLabel1;
|
||||||
|
private javax.swing.JTextField jTextField1;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2018 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.contentviewers;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import org.openide.nodes.AbstractNode;
|
||||||
|
import org.openide.nodes.ChildFactory;
|
||||||
|
import org.openide.nodes.Children;
|
||||||
|
import org.openide.nodes.Node;
|
||||||
|
import org.openide.nodes.Sheet;
|
||||||
|
import org.sleuthkit.autopsy.datamodel.NodeProperty;
|
||||||
|
|
||||||
|
public class SQLiteTableRowFactory extends ChildFactory<Integer> {
|
||||||
|
|
||||||
|
private final List<Map<String, Object>> rows;
|
||||||
|
|
||||||
|
public SQLiteTableRowFactory(List<Map<String, Object>> rows) {
|
||||||
|
this.rows = rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean createKeys(List<Integer> keys) {
|
||||||
|
if (rows != null) {
|
||||||
|
for (int i = 0; i < rows.size(); i++) {
|
||||||
|
keys.add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Node createNodeForKey(Integer key) {
|
||||||
|
if (Objects.isNull(rows) || rows.isEmpty() || key >= rows.size()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SQLiteTableRowNode(rows.get(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class SQLiteTableRowNode extends AbstractNode {
|
||||||
|
|
||||||
|
private final Map<String, Object> row;
|
||||||
|
|
||||||
|
SQLiteTableRowNode(Map<String, Object> row) {
|
||||||
|
super(Children.LEAF);
|
||||||
|
this.row = row;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Sheet createSheet() {
|
||||||
|
|
||||||
|
Sheet s = super.createSheet();
|
||||||
|
Sheet.Set properties = s.get(Sheet.PROPERTIES);
|
||||||
|
if (properties == null) {
|
||||||
|
properties = Sheet.createPropertiesSet();
|
||||||
|
s.put(properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, Object> col : row.entrySet()) {
|
||||||
|
String colName = col.getKey();
|
||||||
|
String colVal = col.getValue().toString();
|
||||||
|
|
||||||
|
properties.put(new NodeProperty<>(colName, colName, colName, colVal)); // NON-NLS
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.4" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||||
|
</Form>
|
@ -0,0 +1,163 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2018 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.contentviewers;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JTable;
|
||||||
|
import javax.swing.ListSelectionModel;
|
||||||
|
import javax.swing.ScrollPaneConstants;
|
||||||
|
import javax.swing.SwingWorker;
|
||||||
|
import javax.swing.table.TableCellRenderer;
|
||||||
|
import javax.swing.table.TableColumnModel;
|
||||||
|
import org.netbeans.swing.etable.ETableColumn;
|
||||||
|
import org.netbeans.swing.etable.ETableColumnModel;
|
||||||
|
import org.netbeans.swing.outline.Outline;
|
||||||
|
import org.openide.explorer.ExplorerManager;
|
||||||
|
import org.openide.nodes.AbstractNode;
|
||||||
|
import org.openide.nodes.Children;
|
||||||
|
|
||||||
|
class SQLiteTableView extends JPanel implements ExplorerManager.Provider {
|
||||||
|
|
||||||
|
private final org.openide.explorer.view.OutlineView outlineView;
|
||||||
|
private final Outline outline;
|
||||||
|
private final ExplorerManager explorerManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new form SQLiteTableView
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
SQLiteTableView() {
|
||||||
|
|
||||||
|
initComponents();
|
||||||
|
outlineView = new org.openide.explorer.view.OutlineView();
|
||||||
|
add(outlineView, BorderLayout.CENTER);
|
||||||
|
outlineView.setPropertyColumns(); // column headers will be set later
|
||||||
|
outlineView.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
|
||||||
|
outlineView.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
|
||||||
|
|
||||||
|
outline = outlineView.getOutline();
|
||||||
|
|
||||||
|
outline.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||||
|
outline.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
|
||||||
|
outline.setRowSelectionAllowed(false);
|
||||||
|
outline.setRootVisible(false);
|
||||||
|
|
||||||
|
explorerManager = new ExplorerManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up the columns in the display table
|
||||||
|
*
|
||||||
|
* @param tableRows
|
||||||
|
*/
|
||||||
|
void setupTable(List<Map<String, Object>> tableRows) {
|
||||||
|
|
||||||
|
|
||||||
|
if (Objects.isNull(tableRows) || tableRows.isEmpty()) {
|
||||||
|
outlineView.setPropertyColumns();
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Set up the column names
|
||||||
|
Map<String, Object> row = tableRows.get(0);
|
||||||
|
String[] propStrings = new String[row.size() * 2];
|
||||||
|
int i = 0;
|
||||||
|
for (Map.Entry<String, Object> col : row.entrySet()) {
|
||||||
|
String colName = col.getKey();
|
||||||
|
propStrings[2 * i] = colName;
|
||||||
|
propStrings[2 * i + 1] = colName;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
outlineView.setPropertyColumns(propStrings);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide the 'Nodes' column
|
||||||
|
TableColumnModel columnModel = outline.getColumnModel();
|
||||||
|
ETableColumn column = (ETableColumn) columnModel.getColumn(0);
|
||||||
|
((ETableColumnModel) columnModel).setColumnHidden(column, true);
|
||||||
|
|
||||||
|
// Set the Nodes for the ExplorerManager.
|
||||||
|
// The Swingworker ensures that setColumnWidths() is called after all nodes have been created.
|
||||||
|
new SwingWorker<Boolean, Void>() {
|
||||||
|
@Override
|
||||||
|
protected Boolean doInBackground() throws Exception {
|
||||||
|
|
||||||
|
explorerManager.setRootContext(new AbstractNode(Children.create(new SQLiteTableRowFactory(tableRows), true)));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void done() {
|
||||||
|
super.done();
|
||||||
|
|
||||||
|
setColumnWidths();
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setColumnWidths() {
|
||||||
|
int margin = 4;
|
||||||
|
int padding = 8;
|
||||||
|
|
||||||
|
// find the maximum width needed to fit the values for the first N rows, at most
|
||||||
|
final int rows = Math.min(20, outline.getRowCount());
|
||||||
|
for (int col = 1; col < outline.getColumnCount(); col++) {
|
||||||
|
int columnWidthLimit = 500;
|
||||||
|
int columnWidth = 50;
|
||||||
|
|
||||||
|
for (int row = 0; row < rows; row++) {
|
||||||
|
TableCellRenderer renderer = outline.getCellRenderer(row, col);
|
||||||
|
Component comp = outline.prepareRenderer(renderer, row, col);
|
||||||
|
|
||||||
|
columnWidth = Math.max(comp.getPreferredSize().width, columnWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
columnWidth += 2 * margin + padding; // add margin and regular padding
|
||||||
|
columnWidth = Math.min(columnWidth, columnWidthLimit);
|
||||||
|
outline.getColumnModel().getColumn(col).setPreferredWidth(columnWidth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called from within the constructor to initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is always
|
||||||
|
* regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
setLayout(new java.awt.BorderLayout());
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ExplorerManager getExplorerManager() {
|
||||||
|
return explorerManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
}
|
209
Core/src/org/sleuthkit/autopsy/contentviewers/SQLiteViewer.form
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.9" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="jHdrPanel" max="32767" attributes="0"/>
|
||||||
|
<Component id="jTableDataPanel" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="jHdrPanel" min="-2" pref="53" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
|
||||||
|
<Component id="jTableDataPanel" pref="317" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JPanel" name="jHdrPanel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[536, 40]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="tablesDropdownList" min="-2" pref="130" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="numEntriesField" min="-2" pref="71" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" pref="15" max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="currPageLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="numPagesLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="prevPageButton" min="-2" pref="23" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
|
||||||
|
<Component id="nextPageButton" min="-2" pref="23" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace pref="133" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="nextPageButton" alignment="0" min="-2" pref="23" max="-2" attributes="0"/>
|
||||||
|
<Component id="prevPageButton" alignment="0" min="-2" pref="23" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="tablesDropdownList" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="numEntriesField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="currPageLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="numPagesLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JComboBox" name="tablesDropdownList">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="4">
|
||||||
|
<StringItem index="0" value="Item 1"/>
|
||||||
|
<StringItem index="1" value="Item 2"/>
|
||||||
|
<StringItem index="2" value="Item 3"/>
|
||||||
|
<StringItem index="3" value="Item 4"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="tablesDropdownListActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<String>"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel1">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="SQLiteViewer.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="numEntriesField">
|
||||||
|
<Properties>
|
||||||
|
<Property name="editable" type="boolean" value="false"/>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="SQLiteViewer.numEntriesField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||||
|
<Border info="null"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel2">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="SQLiteViewer.jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="currPageLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="SQLiteViewer.currPageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel3">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="SQLiteViewer.jLabel3.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="numPagesLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="SQLiteViewer.numPagesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="prevPageButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="SQLiteViewer.prevPageButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="borderPainted" type="boolean" value="false"/>
|
||||||
|
<Property name="contentAreaFilled" type="boolean" value="false"/>
|
||||||
|
<Property name="disabledSelectedIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
|
||||||
|
<Insets value="[2, 0, 2, 0]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[23, 23]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="prevPageButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="nextPageButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/contentviewers/Bundle.properties" key="SQLiteViewer.nextPageButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="borderPainted" type="boolean" value="false"/>
|
||||||
|
<Property name="contentAreaFilled" type="boolean" value="false"/>
|
||||||
|
<Property name="disabledSelectedIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
|
||||||
|
<Insets value="[2, 0, 2, 0]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[23, 23]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="nextPageButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JPanel" name="jTableDataPanel">
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
514
Core/src/org/sleuthkit/autopsy/contentviewers/SQLiteViewer.java
Normal file
@ -0,0 +1,514 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2018 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.contentviewers;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.ResultSetMetaData;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.SwingWorker;
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
||||||
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
|
||||||
|
public class SQLiteViewer extends javax.swing.JPanel implements FileTypeViewer {
|
||||||
|
|
||||||
|
public static final String[] SUPPORTED_MIMETYPES = new String[]{"application/x-sqlite3"};
|
||||||
|
private static final Logger LOGGER = Logger.getLogger(FileViewer.class.getName());
|
||||||
|
private Connection connection = null;
|
||||||
|
|
||||||
|
private String tmpDBPathName = null;
|
||||||
|
private File tmpDBFile = null;
|
||||||
|
|
||||||
|
private final Map<String, String> dbTablesMap = new TreeMap<>();
|
||||||
|
|
||||||
|
private static final int ROWS_PER_PAGE = 100;
|
||||||
|
private int numRows; // num of rows in the selected table
|
||||||
|
private int currPage = 0; // curr page of rows being displayed
|
||||||
|
|
||||||
|
SQLiteTableView selectedTableView = new SQLiteTableView();
|
||||||
|
|
||||||
|
private SwingWorker<? extends Object, ? extends Object> worker;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new form SQLiteViewer
|
||||||
|
*/
|
||||||
|
public SQLiteViewer() {
|
||||||
|
initComponents();
|
||||||
|
jTableDataPanel.add(selectedTableView, BorderLayout.CENTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called from within the constructor to initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is always
|
||||||
|
* regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
jHdrPanel = new javax.swing.JPanel();
|
||||||
|
tablesDropdownList = new javax.swing.JComboBox<>();
|
||||||
|
jLabel1 = new javax.swing.JLabel();
|
||||||
|
numEntriesField = new javax.swing.JTextField();
|
||||||
|
jLabel2 = new javax.swing.JLabel();
|
||||||
|
currPageLabel = new javax.swing.JLabel();
|
||||||
|
jLabel3 = new javax.swing.JLabel();
|
||||||
|
numPagesLabel = new javax.swing.JLabel();
|
||||||
|
prevPageButton = new javax.swing.JButton();
|
||||||
|
nextPageButton = new javax.swing.JButton();
|
||||||
|
jTableDataPanel = new javax.swing.JPanel();
|
||||||
|
|
||||||
|
jHdrPanel.setPreferredSize(new java.awt.Dimension(536, 40));
|
||||||
|
|
||||||
|
tablesDropdownList.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
|
||||||
|
tablesDropdownList.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
tablesDropdownListActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(SQLiteViewer.class, "SQLiteViewer.jLabel1.text")); // NOI18N
|
||||||
|
|
||||||
|
numEntriesField.setEditable(false);
|
||||||
|
numEntriesField.setText(org.openide.util.NbBundle.getMessage(SQLiteViewer.class, "SQLiteViewer.numEntriesField.text")); // NOI18N
|
||||||
|
numEntriesField.setBorder(null);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(SQLiteViewer.class, "SQLiteViewer.jLabel2.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(currPageLabel, org.openide.util.NbBundle.getMessage(SQLiteViewer.class, "SQLiteViewer.currPageLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(SQLiteViewer.class, "SQLiteViewer.jLabel3.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(numPagesLabel, org.openide.util.NbBundle.getMessage(SQLiteViewer.class, "SQLiteViewer.numPagesLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
prevPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(prevPageButton, org.openide.util.NbBundle.getMessage(SQLiteViewer.class, "SQLiteViewer.prevPageButton.text")); // NOI18N
|
||||||
|
prevPageButton.setBorderPainted(false);
|
||||||
|
prevPageButton.setContentAreaFilled(false);
|
||||||
|
prevPageButton.setDisabledSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); // NOI18N
|
||||||
|
prevPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
|
||||||
|
prevPageButton.setPreferredSize(new java.awt.Dimension(23, 23));
|
||||||
|
prevPageButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
prevPageButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
nextPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); // NOI18N
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(nextPageButton, org.openide.util.NbBundle.getMessage(SQLiteViewer.class, "SQLiteViewer.nextPageButton.text")); // NOI18N
|
||||||
|
nextPageButton.setBorderPainted(false);
|
||||||
|
nextPageButton.setContentAreaFilled(false);
|
||||||
|
nextPageButton.setDisabledSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"))); // NOI18N
|
||||||
|
nextPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0));
|
||||||
|
nextPageButton.setPreferredSize(new java.awt.Dimension(23, 23));
|
||||||
|
nextPageButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
nextPageButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
javax.swing.GroupLayout jHdrPanelLayout = new javax.swing.GroupLayout(jHdrPanel);
|
||||||
|
jHdrPanel.setLayout(jHdrPanelLayout);
|
||||||
|
jHdrPanelLayout.setHorizontalGroup(
|
||||||
|
jHdrPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(jHdrPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addComponent(jLabel1)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(tablesDropdownList, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(numEntriesField, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(15, 15, 15)
|
||||||
|
.addComponent(jLabel2)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(currPageLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(jLabel3)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(numPagesLabel)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(0, 0, 0)
|
||||||
|
.addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addContainerGap(133, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
jHdrPanelLayout.setVerticalGroup(
|
||||||
|
jHdrPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(jHdrPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(jHdrPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(nextPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(prevPageButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGroup(jHdrPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(tablesDropdownList, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(jLabel1)
|
||||||
|
.addComponent(numEntriesField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(jLabel2)
|
||||||
|
.addComponent(currPageLabel)
|
||||||
|
.addComponent(jLabel3)
|
||||||
|
.addComponent(numPagesLabel)))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
|
||||||
|
jTableDataPanel.setLayout(new java.awt.BorderLayout());
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
|
this.setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jHdrPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(jTableDataPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(jHdrPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(0, 0, 0)
|
||||||
|
.addComponent(jTableDataPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 317, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextPageButtonActionPerformed
|
||||||
|
|
||||||
|
currPage++;
|
||||||
|
if (currPage * ROWS_PER_PAGE > numRows) {
|
||||||
|
nextPageButton.setEnabled(false);
|
||||||
|
}
|
||||||
|
currPageLabel.setText(Integer.toString(currPage));
|
||||||
|
prevPageButton.setEnabled(true);
|
||||||
|
|
||||||
|
// read and display a page of rows
|
||||||
|
String tableName = (String) this.tablesDropdownList.getSelectedItem();
|
||||||
|
readTable(tableName, (currPage - 1) * ROWS_PER_PAGE + 1, ROWS_PER_PAGE);
|
||||||
|
}//GEN-LAST:event_nextPageButtonActionPerformed
|
||||||
|
|
||||||
|
private void prevPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prevPageButtonActionPerformed
|
||||||
|
|
||||||
|
currPage--;
|
||||||
|
if (currPage == 1) {
|
||||||
|
prevPageButton.setEnabled(false);
|
||||||
|
}
|
||||||
|
currPageLabel.setText(Integer.toString(currPage));
|
||||||
|
nextPageButton.setEnabled(true);
|
||||||
|
|
||||||
|
// read and display a page of rows
|
||||||
|
String tableName = (String) this.tablesDropdownList.getSelectedItem();
|
||||||
|
readTable(tableName, (currPage - 1) * ROWS_PER_PAGE + 1, ROWS_PER_PAGE);
|
||||||
|
}//GEN-LAST:event_prevPageButtonActionPerformed
|
||||||
|
|
||||||
|
private void tablesDropdownListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tablesDropdownListActionPerformed
|
||||||
|
JComboBox<?> cb = (JComboBox<?>) evt.getSource();
|
||||||
|
String tableName = (String) cb.getSelectedItem();
|
||||||
|
if (null == tableName) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectTable(tableName);
|
||||||
|
}//GEN-LAST:event_tablesDropdownListActionPerformed
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JLabel currPageLabel;
|
||||||
|
private javax.swing.JPanel jHdrPanel;
|
||||||
|
private javax.swing.JLabel jLabel1;
|
||||||
|
private javax.swing.JLabel jLabel2;
|
||||||
|
private javax.swing.JLabel jLabel3;
|
||||||
|
private javax.swing.JPanel jTableDataPanel;
|
||||||
|
private javax.swing.JButton nextPageButton;
|
||||||
|
private javax.swing.JTextField numEntriesField;
|
||||||
|
private javax.swing.JLabel numPagesLabel;
|
||||||
|
private javax.swing.JButton prevPageButton;
|
||||||
|
private javax.swing.JComboBox<String> tablesDropdownList;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getSupportedMIMETypes() {
|
||||||
|
return Arrays.asList(SUPPORTED_MIMETYPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFile(AbstractFile file) {
|
||||||
|
processSQLiteFile(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Component getComponent() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resetComponent() {
|
||||||
|
|
||||||
|
dbTablesMap.clear();
|
||||||
|
|
||||||
|
tablesDropdownList.setEnabled(true);
|
||||||
|
tablesDropdownList.removeAllItems();
|
||||||
|
numEntriesField.setText("");
|
||||||
|
|
||||||
|
// close DB connection to file
|
||||||
|
if (null != connection) {
|
||||||
|
try {
|
||||||
|
connection.close();
|
||||||
|
connection = null;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Failed to close DB connection to file.", ex); //NON-NLS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete last temp file
|
||||||
|
if (null != tmpDBFile) {
|
||||||
|
tmpDBFile.delete();
|
||||||
|
tmpDBFile = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the given SQLite DB file
|
||||||
|
*
|
||||||
|
* @param sqliteFile -
|
||||||
|
*
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
private void processSQLiteFile(AbstractFile sqliteFile) {
|
||||||
|
|
||||||
|
tablesDropdownList.removeAllItems();
|
||||||
|
|
||||||
|
new SwingWorker<Boolean, Void>() {
|
||||||
|
@Override
|
||||||
|
protected Boolean doInBackground() throws Exception {
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Copy the file to temp folder
|
||||||
|
tmpDBPathName = Case.getCurrentCase().getTempDirectory() + File.separator + sqliteFile.getName() + "-" + sqliteFile.getId();
|
||||||
|
tmpDBFile = new File(tmpDBPathName);
|
||||||
|
ContentUtils.writeToFile(sqliteFile, tmpDBFile);
|
||||||
|
|
||||||
|
// Open copy using JDBC
|
||||||
|
Class.forName("org.sqlite.JDBC"); //NON-NLS //load JDBC driver
|
||||||
|
connection = DriverManager.getConnection("jdbc:sqlite:" + tmpDBPathName); //NON-NLS
|
||||||
|
|
||||||
|
// Read all table names and schema
|
||||||
|
return getTables();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Failed to copy DB file.", ex); //NON-NLS
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Failed to Open DB.", ex); //NON-NLS
|
||||||
|
} catch (ClassNotFoundException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Failed to initialize JDBC Sqlite.", ex); //NON-NLS
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void done() {
|
||||||
|
super.done();
|
||||||
|
try {
|
||||||
|
boolean status = get();
|
||||||
|
if ((status == true) && (dbTablesMap.size() > 0)) {
|
||||||
|
dbTablesMap.keySet().forEach((tableName) -> {
|
||||||
|
tablesDropdownList.addItem(tableName);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Populate error message
|
||||||
|
tablesDropdownList.addItem("No tables found");
|
||||||
|
tablesDropdownList.setEnabled(false);
|
||||||
|
}
|
||||||
|
} catch (InterruptedException | ExecutionException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Unexpected exception while opening DB file", ex); //NON-NLS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the table names and their schema from loaded SQLite db file
|
||||||
|
*
|
||||||
|
* @return true if success, false otherwise
|
||||||
|
*/
|
||||||
|
private boolean getTables() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
Statement statement = connection.createStatement();
|
||||||
|
|
||||||
|
ResultSet resultSet = statement.executeQuery(
|
||||||
|
"SELECT name, sql FROM sqlite_master "
|
||||||
|
+ " WHERE type= 'table' "
|
||||||
|
+ " ORDER BY name;"); //NON-NLS
|
||||||
|
|
||||||
|
while (resultSet.next()) {
|
||||||
|
String tableName = resultSet.getString("name"); //NON-NLS
|
||||||
|
String tableSQL = resultSet.getString("sql"); //NON-NLS
|
||||||
|
|
||||||
|
dbTablesMap.put(tableName, tableSQL);
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Error getting table names from the DB", e); //NON-NLS
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void selectTable(String tableName) {
|
||||||
|
if (worker != null && !worker.isDone()) {
|
||||||
|
worker.cancel(false);
|
||||||
|
worker = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
worker = new SwingWorker<Integer, Void>() {
|
||||||
|
@Override
|
||||||
|
protected Integer doInBackground() throws Exception {
|
||||||
|
|
||||||
|
try {
|
||||||
|
Statement statement = connection.createStatement();
|
||||||
|
ResultSet resultSet = statement.executeQuery(
|
||||||
|
"SELECT count (*) as count FROM " + tableName); //NON-NLS
|
||||||
|
|
||||||
|
return resultSet.getInt("count");
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Failed to get data for table.", ex); //NON-NLS
|
||||||
|
}
|
||||||
|
//NON-NLS
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void done() {
|
||||||
|
super.done();
|
||||||
|
try {
|
||||||
|
|
||||||
|
numRows = get();
|
||||||
|
numEntriesField.setText(numRows + " entries");
|
||||||
|
|
||||||
|
currPage = 1;
|
||||||
|
currPageLabel.setText(Integer.toString(currPage));
|
||||||
|
numPagesLabel.setText(Integer.toString((numRows / ROWS_PER_PAGE) + 1));
|
||||||
|
|
||||||
|
prevPageButton.setEnabled(false);
|
||||||
|
|
||||||
|
|
||||||
|
if (numRows > 0) {
|
||||||
|
nextPageButton.setEnabled(((numRows > ROWS_PER_PAGE)));
|
||||||
|
readTable(tableName, (currPage - 1) * ROWS_PER_PAGE + 1, ROWS_PER_PAGE);
|
||||||
|
} else {
|
||||||
|
nextPageButton.setEnabled(false);
|
||||||
|
selectedTableView.setupTable(Collections.emptyList());
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (InterruptedException | ExecutionException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Unexpected exception while reading table.", ex); //NON-NLS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
worker.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readTable(String tableName, int startRow, int numRowsToRead) {
|
||||||
|
|
||||||
|
if (worker != null && !worker.isDone()) {
|
||||||
|
worker.cancel(false);
|
||||||
|
worker = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
worker = new SwingWorker<ArrayList<Map<String, Object>>, Void>() {
|
||||||
|
@Override
|
||||||
|
protected ArrayList<Map<String, Object>> doInBackground() throws Exception {
|
||||||
|
try {
|
||||||
|
Statement statement = connection.createStatement();
|
||||||
|
ResultSet resultSet = statement.executeQuery(
|
||||||
|
"SELECT * FROM " + tableName
|
||||||
|
+ " LIMIT " + Integer.toString(numRowsToRead)
|
||||||
|
+ " OFFSET " + Integer.toString(startRow - 1)
|
||||||
|
); //NON-NLS
|
||||||
|
|
||||||
|
return resultSetToArrayList(resultSet);
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Failed to get data for table " + tableName, ex); //NON-NLS
|
||||||
|
}
|
||||||
|
//NON-NLS
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void done() {
|
||||||
|
|
||||||
|
if (isCancelled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
super.done();
|
||||||
|
try {
|
||||||
|
ArrayList<Map<String, Object>> rows = get();
|
||||||
|
if (Objects.nonNull(rows)) {
|
||||||
|
selectedTableView.setupTable(rows);
|
||||||
|
}else{
|
||||||
|
selectedTableView.setupTable(Collections.emptyList());
|
||||||
|
}
|
||||||
|
} catch (InterruptedException | ExecutionException ex) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Unexpected exception while reading table " + tableName, ex); //NON-NLS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
worker.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NbBundle.Messages("SQLiteViewer.BlobNotShown.message=BLOB Data not shown")
|
||||||
|
private ArrayList<Map<String, Object>> resultSetToArrayList(ResultSet rs) throws SQLException {
|
||||||
|
ResultSetMetaData metaData = rs.getMetaData();
|
||||||
|
int columns = metaData.getColumnCount();
|
||||||
|
ArrayList<Map<String, Object>> rowlist = new ArrayList<>();
|
||||||
|
while (rs.next()) {
|
||||||
|
Map<String, Object> row = new LinkedHashMap<>(columns);
|
||||||
|
for (int i = 1; i <= columns; ++i) {
|
||||||
|
if (rs.getObject(i) == null) {
|
||||||
|
row.put(metaData.getColumnName(i), "");
|
||||||
|
} else {
|
||||||
|
if (metaData.getColumnTypeName(i).compareToIgnoreCase("blob") == 0) {
|
||||||
|
row.put(metaData.getColumnName(i), Bundle.SQLiteViewer_BlobNotShown_message());
|
||||||
|
} else {
|
||||||
|
row.put(metaData.getColumnName(i), rs.getObject(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rowlist.add(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rowlist;
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2014-2017 Basis Technology Corp.
|
* Copyright 2014-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -67,7 +67,9 @@ public final class UserPreferences {
|
|||||||
private static final String APP_NAME = "AppName";
|
private static final String APP_NAME = "AppName";
|
||||||
public static final String SETTINGS_PROPERTIES = "AutoIngest";
|
public static final String SETTINGS_PROPERTIES = "AutoIngest";
|
||||||
private static final String MODE = "AutopsyMode"; // NON-NLS
|
private static final String MODE = "AutopsyMode"; // NON-NLS
|
||||||
|
private static final String MAX_NUM_OF_LOG_FILE = "MaximumNumberOfLogFiles";
|
||||||
|
private static final int LOG_FILE_NUM_INT = 10;
|
||||||
|
|
||||||
// Prevent instantiation.
|
// Prevent instantiation.
|
||||||
private UserPreferences() {
|
private UserPreferences() {
|
||||||
}
|
}
|
||||||
@ -369,4 +371,26 @@ public final class UserPreferences {
|
|||||||
preferences.put(APP_NAME, name);
|
preferences.put(APP_NAME, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the maximum number of log files to save
|
||||||
|
* @return Number of log files
|
||||||
|
*/
|
||||||
|
public static int getLogFileCount() {
|
||||||
|
return preferences.getInt(MAX_NUM_OF_LOG_FILE, LOG_FILE_NUM_INT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the default number of log files to save
|
||||||
|
* @return LOG_FILE_COUNT
|
||||||
|
*/
|
||||||
|
public static int getDefaultLogFileCount() {
|
||||||
|
return LOG_FILE_NUM_INT;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set the maximum number of log files to save
|
||||||
|
* @param count number of log files
|
||||||
|
*/
|
||||||
|
public static void setLogFileCount(int count) {
|
||||||
|
preferences.putInt(MAX_NUM_OF_LOG_FILE, count);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -198,10 +198,10 @@
|
|||||||
<file name="org-openide-actions-ToolsAction.shadow_hidden"/>
|
<file name="org-openide-actions-ToolsAction.shadow_hidden"/>
|
||||||
<file name="org-sleuthkit-autopsy-filesearch-FileSearchAction.shadow">
|
<file name="org-sleuthkit-autopsy-filesearch-FileSearchAction.shadow">
|
||||||
<attr name="originalFile" stringvalue="Actions/Tools/org-sleuthkit-autopsy-filesearch-FileSearchAction.instance"/>
|
<attr name="originalFile" stringvalue="Actions/Tools/org-sleuthkit-autopsy-filesearch-FileSearchAction.instance"/>
|
||||||
<attr name="position" intvalue="200"/>
|
<attr name="position" intvalue="104"/>
|
||||||
</file>
|
</file>
|
||||||
<folder name="RunIngestModules">
|
<folder name="RunIngestModules">
|
||||||
<attr name="position" intvalue="201"/>
|
<attr name="position" intvalue="105"/>
|
||||||
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.sleuthkit.autopsy.ingest.Bundle"/>
|
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.sleuthkit.autopsy.ingest.Bundle"/>
|
||||||
<file name="org-sleuthkit-autopsy-ingest-RunIngestAction.shadow">
|
<file name="org-sleuthkit-autopsy-ingest-RunIngestAction.shadow">
|
||||||
<attr name="originalFile" stringvalue="Actions/Tools/org-sleuthkit-autopsy-ingest-RunIngestAction.instance"/>
|
<attr name="originalFile" stringvalue="Actions/Tools/org-sleuthkit-autopsy-ingest-RunIngestAction.instance"/>
|
||||||
@ -213,7 +213,7 @@
|
|||||||
</file>-->
|
</file>-->
|
||||||
<file name="org-sleuthkit-autopsy-report-ReportWizardAction-separatorAfter.instance">
|
<file name="org-sleuthkit-autopsy-report-ReportWizardAction-separatorAfter.instance">
|
||||||
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
<attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
|
||||||
<attr name="position" intvalue="104"/>
|
<attr name="position" intvalue="199"/>
|
||||||
</file>
|
</file>
|
||||||
<!--<file name="Separator1.instance_hidden"/>
|
<!--<file name="Separator1.instance_hidden"/>
|
||||||
<file name="Separator3.instance_hidden"/>-->
|
<file name="Separator3.instance_hidden"/>-->
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
<Layout>
|
<Layout>
|
||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="jScrollPane1" alignment="0" max="32767" attributes="0"/>
|
<Component id="jScrollPane1" alignment="0" pref="1010" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
<DimensionLayout dim="1">
|
<DimensionLayout dim="1">
|
||||||
@ -44,18 +44,26 @@
|
|||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JPanel" name="jPanel1">
|
<Container class="javax.swing.JPanel" name="jPanel1">
|
||||||
|
<Properties>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[671, 488]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
<Layout>
|
<Layout>
|
||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="1" attributes="0">
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="1" attributes="0">
|
||||||
<Component id="logoPanel" max="32767" attributes="0"/>
|
<Component id="logoPanel" max="32767" attributes="0"/>
|
||||||
<Component id="viewPanel" alignment="0" max="32767" attributes="0"/>
|
<Group type="102" attributes="0">
|
||||||
<Component id="runtimePanel" alignment="1" max="32767" attributes="0"/>
|
<Component id="viewPanel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="runtimePanel" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -63,10 +71,11 @@
|
|||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
|
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
|
||||||
<Component id="viewPanel" min="-2" max="-2" attributes="0"/>
|
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<Component id="viewPanel" max="32767" attributes="0"/>
|
||||||
<Component id="runtimePanel" min="-2" max="-2" attributes="0"/>
|
<Component id="runtimePanel" max="32767" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
<Component id="logoPanel" min="-2" max="-2" attributes="0"/>
|
<Component id="logoPanel" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
@ -245,7 +254,7 @@
|
|||||||
<Component id="viewsHideSlackCB" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="viewsHideSlackCB" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="useLocalTimeRB" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="useLocalTimeRB" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
<EmptySpace pref="158" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
@ -436,28 +445,43 @@
|
|||||||
<Layout>
|
<Layout>
|
||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
|
||||||
<Component id="maxMemoryLabel" min="-2" pref="114" max="-2" attributes="0"/>
|
|
||||||
<Component id="totalMemoryLabel" pref="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
|
||||||
<Component id="systemMemoryTotal" max="32767" attributes="0"/>
|
|
||||||
<Component id="memField" pref="37" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="maxMemoryUnitsLabel" min="-2" pref="17" max="-2" attributes="0"/>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Component id="maxMemoryUnitsLabel1" min="-2" pref="17" max="-2" attributes="0"/>
|
<Component id="totalMemoryLabel" min="-2" pref="114" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="systemMemoryTotal" min="-2" pref="37" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" pref="2" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="maxMemoryUnitsLabel1" min="-2" pref="17" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="restartNecessaryWarning" pref="333" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="maxMemoryUnitsLabel" min="-2" pref="17" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="memFieldValidationLabel" min="-2" pref="263" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="maxMemoryLabel" min="-2" pref="114" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="memField" min="-2" pref="37" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="maxLogFileCount" min="-2" pref="114" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="logFileCount" min="-2" pref="37" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="logNumAlert" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Component id="restartNecessaryWarning" pref="417" max="32767" attributes="0"/>
|
|
||||||
<Component id="memFieldValidationLabel" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -466,22 +490,29 @@
|
|||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||||
|
<Component id="totalMemoryLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="maxMemoryUnitsLabel" alignment="3" min="-2" pref="20" max="-2" attributes="0"/>
|
|
||||||
<Component id="memField" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<Component id="memFieldValidationLabel" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="maxMemoryLabel" alignment="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
|
||||||
<Group type="103" alignment="0" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="restartNecessaryWarning" alignment="3" min="-2" pref="20" max="-2" attributes="0"/>
|
<Component id="restartNecessaryWarning" alignment="3" min="-2" pref="20" max="-2" attributes="0"/>
|
||||||
<Component id="maxMemoryUnitsLabel1" alignment="3" min="-2" pref="20" max="-2" attributes="0"/>
|
<Component id="maxMemoryUnitsLabel1" alignment="3" min="-2" pref="20" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<Component id="totalMemoryLabel" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="systemMemoryTotal" alignment="0" max="32767" attributes="0"/>
|
<Component id="systemMemoryTotal" alignment="0" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="1" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="maxMemoryLabel" alignment="3" min="-2" pref="20" max="-2" attributes="0"/>
|
||||||
|
<Component id="memField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="maxMemoryUnitsLabel" alignment="3" min="-2" pref="20" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Component id="memFieldValidationLabel" min="-2" pref="17" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="maxLogFileCount" alignment="3" min="-2" pref="19" max="-2" attributes="0"/>
|
||||||
|
<Component id="logFileCount" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="logNumAlert" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -545,6 +576,40 @@
|
|||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="maxLogFileCount">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.maxLogFileCount.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="logFileCount">
|
||||||
|
<Properties>
|
||||||
|
<Property name="horizontalAlignment" type="int" value="11"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="logFileCountKeyReleased"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="logNumAlert">
|
||||||
|
<Properties>
|
||||||
|
<Property name="editable" type="boolean" value="false"/>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.modules.form.editors2.FontEditor">
|
||||||
|
<FontInfo relative="true">
|
||||||
|
<Font bold="false" component="logNumAlert" property="font" relativeSize="false" size="11"/>
|
||||||
|
</FontInfo>
|
||||||
|
</Property>
|
||||||
|
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||||
|
<Color blue="0" green="0" red="ff" type="rgb"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/corecomponents/Bundle.properties" key="AutopsyOptionsPanel.logNumAlert.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||||
|
<Border info="null"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2017 Basis Technology Corp.
|
* Copyright 2011-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -73,7 +73,9 @@ import org.sleuthkit.autopsy.report.ReportBranding;
|
|||||||
"AutopsyOptionsPanel.browseLogosButton.text=Browse",
|
"AutopsyOptionsPanel.browseLogosButton.text=Browse",
|
||||||
"AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.invalidPath.text=Path is not valid.",
|
"AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.invalidPath.text=Path is not valid.",
|
||||||
"AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.invalidImageSpecified.text=Invalid image file specified.",
|
"AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.invalidImageSpecified.text=Invalid image file specified.",
|
||||||
"AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.pathNotSet.text=Agency logo path must be set."
|
"AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.pathNotSet.text=Agency logo path must be set.",
|
||||||
|
"AutopsyOptionsPanel.maxLogFileCount.text=Maximum Log Files:",
|
||||||
|
"AutopsyOptionsPanel.logNumAlert.invalidInput.text=A positive integer is required here."
|
||||||
})
|
})
|
||||||
|
|
||||||
final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
||||||
@ -110,6 +112,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
|
|
||||||
textFieldListener = new TextFieldListener();
|
textFieldListener = new TextFieldListener();
|
||||||
agencyLogoPathField.getDocument().addDocumentListener(textFieldListener);
|
agencyLogoPathField.getDocument().addDocumentListener(textFieldListener);
|
||||||
|
logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -309,6 +312,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
specifyLogoRB.setSelected(!useDefault);
|
specifyLogoRB.setSelected(!useDefault);
|
||||||
agencyLogoPathField.setEnabled(!useDefault);
|
agencyLogoPathField.setEnabled(!useDefault);
|
||||||
browseLogosButton.setEnabled(!useDefault);
|
browseLogosButton.setEnabled(!useDefault);
|
||||||
|
logFileCount.setText(String.valueOf(UserPreferences.getLogFileCount()));
|
||||||
try {
|
try {
|
||||||
updateAgencyLogo(path);
|
updateAgencyLogo(path);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
@ -363,6 +367,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
UserPreferences.setHideSlackFilesInDataSourcesTree(dataSourcesHideSlackCB.isSelected());
|
UserPreferences.setHideSlackFilesInDataSourcesTree(dataSourcesHideSlackCB.isSelected());
|
||||||
UserPreferences.setHideSlackFilesInViewsTree(viewsHideSlackCB.isSelected());
|
UserPreferences.setHideSlackFilesInViewsTree(viewsHideSlackCB.isSelected());
|
||||||
UserPreferences.setDisplayTimesInLocalTime(useLocalTimeRB.isSelected());
|
UserPreferences.setDisplayTimesInLocalTime(useLocalTimeRB.isSelected());
|
||||||
|
UserPreferences.setLogFileCount(Integer.parseInt(logFileCount.getText()));
|
||||||
if (!agencyLogoPathField.getText().isEmpty()) {
|
if (!agencyLogoPathField.getText().isEmpty()) {
|
||||||
File file = new File(agencyLogoPathField.getText());
|
File file = new File(agencyLogoPathField.getText());
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
@ -394,6 +399,9 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
if (!isMemFieldValid()) {
|
if (!isMemFieldValid()) {
|
||||||
valid = false;
|
valid = false;
|
||||||
}
|
}
|
||||||
|
if (!isLogNumFieldValid()) {
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
@ -476,6 +484,26 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the logFileCount field is valid.
|
||||||
|
*
|
||||||
|
* @return true if the logFileCount is valid false if it is not
|
||||||
|
*/
|
||||||
|
private boolean isLogNumFieldValid() {
|
||||||
|
String count = logFileCount.getText();
|
||||||
|
logNumAlert.setText("");
|
||||||
|
try {
|
||||||
|
int count_num = Integer.parseInt(count);
|
||||||
|
if (count_num < 1) {
|
||||||
|
logNumAlert.setText(Bundle.AutopsyOptionsPanel_logNumAlert_invalidInput_text());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
logNumAlert.setText(Bundle.AutopsyOptionsPanel_logNumAlert_invalidInput_text());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Listens for registered text fields that have changed and fires a
|
* Listens for registered text fields that have changed and fires a
|
||||||
* PropertyChangeEvent accordingly.
|
* PropertyChangeEvent accordingly.
|
||||||
@ -540,9 +568,14 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
memField = new javax.swing.JTextField();
|
memField = new javax.swing.JTextField();
|
||||||
memFieldValidationLabel = new javax.swing.JLabel();
|
memFieldValidationLabel = new javax.swing.JLabel();
|
||||||
maxMemoryUnitsLabel1 = new javax.swing.JLabel();
|
maxMemoryUnitsLabel1 = new javax.swing.JLabel();
|
||||||
|
maxLogFileCount = new javax.swing.JLabel();
|
||||||
|
logFileCount = new javax.swing.JTextField();
|
||||||
|
logNumAlert = new javax.swing.JTextField();
|
||||||
|
|
||||||
jScrollPane1.setBorder(null);
|
jScrollPane1.setBorder(null);
|
||||||
|
|
||||||
|
jPanel1.setPreferredSize(new java.awt.Dimension(671, 488));
|
||||||
|
|
||||||
logoPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.logoPanel.border.title"))); // NOI18N
|
logoPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.logoPanel.border.title"))); // NOI18N
|
||||||
|
|
||||||
agencyLogoPathField.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.agencyLogoPathField.text")); // NOI18N
|
agencyLogoPathField.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.agencyLogoPathField.text")); // NOI18N
|
||||||
@ -712,7 +745,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
.addComponent(dataSourcesHideSlackCB)
|
.addComponent(dataSourcesHideSlackCB)
|
||||||
.addComponent(viewsHideSlackCB)
|
.addComponent(viewsHideSlackCB)
|
||||||
.addComponent(useLocalTimeRB))
|
.addComponent(useLocalTimeRB))
|
||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
|
.addContainerGap(158, Short.MAX_VALUE))))
|
||||||
.addGroup(viewPanelLayout.createSequentialGroup()
|
.addGroup(viewPanelLayout.createSequentialGroup()
|
||||||
.addGroup(viewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(viewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(jLabelHideSlackFiles)
|
.addComponent(jLabelHideSlackFiles)
|
||||||
@ -774,68 +807,103 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(maxMemoryUnitsLabel1, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.maxMemoryUnitsLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(maxMemoryUnitsLabel1, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.maxMemoryUnitsLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(maxLogFileCount, org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.maxLogFileCount.text")); // NOI18N
|
||||||
|
|
||||||
|
logFileCount.setHorizontalAlignment(javax.swing.JTextField.TRAILING);
|
||||||
|
logFileCount.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
|
logFileCountKeyReleased(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
logNumAlert.setEditable(false);
|
||||||
|
logNumAlert.setFont(logNumAlert.getFont().deriveFont(logNumAlert.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
logNumAlert.setForeground(new java.awt.Color(255, 0, 0));
|
||||||
|
logNumAlert.setText(org.openide.util.NbBundle.getMessage(AutopsyOptionsPanel.class, "AutopsyOptionsPanel.logNumAlert.text")); // NOI18N
|
||||||
|
logNumAlert.setBorder(null);
|
||||||
|
|
||||||
javax.swing.GroupLayout runtimePanelLayout = new javax.swing.GroupLayout(runtimePanel);
|
javax.swing.GroupLayout runtimePanelLayout = new javax.swing.GroupLayout(runtimePanel);
|
||||||
runtimePanel.setLayout(runtimePanelLayout);
|
runtimePanel.setLayout(runtimePanelLayout);
|
||||||
runtimePanelLayout.setHorizontalGroup(
|
runtimePanelLayout.setHorizontalGroup(
|
||||||
runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(runtimePanelLayout.createSequentialGroup()
|
.addGroup(runtimePanelLayout.createSequentialGroup()
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
|
||||||
.addComponent(maxMemoryLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addComponent(totalMemoryLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
||||||
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
|
||||||
.addComponent(systemMemoryTotal, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(memField, javax.swing.GroupLayout.DEFAULT_SIZE, 37, Short.MAX_VALUE))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(maxMemoryUnitsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addGroup(runtimePanelLayout.createSequentialGroup()
|
||||||
.addComponent(maxMemoryUnitsLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE))
|
.addComponent(totalMemoryLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addGap(18, 18, 18)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addComponent(systemMemoryTotal, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(restartNecessaryWarning, javax.swing.GroupLayout.DEFAULT_SIZE, 417, Short.MAX_VALUE)
|
.addGap(2, 2, 2)
|
||||||
.addComponent(memFieldValidationLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addGroup(runtimePanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(maxMemoryUnitsLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(restartNecessaryWarning, javax.swing.GroupLayout.DEFAULT_SIZE, 333, Short.MAX_VALUE))
|
||||||
|
.addGroup(runtimePanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(maxMemoryUnitsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(memFieldValidationLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 263, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(0, 0, Short.MAX_VALUE))))
|
||||||
|
.addGroup(runtimePanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(maxMemoryLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(memField, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(0, 0, Short.MAX_VALUE))
|
||||||
|
.addGroup(runtimePanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(maxLogFileCount, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(logFileCount, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(logNumAlert)))
|
||||||
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
runtimePanelLayout.setVerticalGroup(
|
runtimePanelLayout.setVerticalGroup(
|
||||||
runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(runtimePanelLayout.createSequentialGroup()
|
.addGroup(runtimePanelLayout.createSequentialGroup()
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||||
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addComponent(totalMemoryLabel)
|
||||||
.addComponent(maxMemoryUnitsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addComponent(memField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
||||||
.addComponent(memFieldValidationLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(maxMemoryLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
||||||
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
|
||||||
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(restartNecessaryWarning, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(restartNecessaryWarning, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(maxMemoryUnitsLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
|
.addComponent(maxMemoryUnitsLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addComponent(totalMemoryLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addComponent(systemMemoryTotal, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
.addComponent(systemMemoryTotal, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||||
|
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(maxMemoryLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(memField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(maxMemoryUnitsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addComponent(memFieldValidationLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(runtimePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(maxLogFileCount, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(logFileCount, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(logNumAlert, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
|
|
||||||
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
|
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
|
||||||
jPanel1.setLayout(jPanel1Layout);
|
jPanel1.setLayout(jPanel1Layout);
|
||||||
jPanel1Layout.setHorizontalGroup(
|
jPanel1Layout.setHorizontalGroup(
|
||||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||||
.addComponent(logoPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addComponent(logoPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addComponent(viewPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||||
.addComponent(runtimePanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addComponent(viewPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(runtimePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
|
||||||
.addContainerGap())
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
jPanel1Layout.setVerticalGroup(
|
jPanel1Layout.setVerticalGroup(
|
||||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||||
.addGap(0, 0, 0)
|
.addGap(0, 0, 0)
|
||||||
.addComponent(viewPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addComponent(viewPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addComponent(runtimePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(runtimePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(logoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(logoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addContainerGap())
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
@ -846,7 +914,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
this.setLayout(layout);
|
this.setLayout(layout);
|
||||||
layout.setHorizontalGroup(
|
layout.setHorizontalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(jScrollPane1)
|
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 1010, Short.MAX_VALUE)
|
||||||
);
|
);
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
@ -854,60 +922,14 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
);
|
);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
private void useBestViewerRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useBestViewerRBActionPerformed
|
private void logFileCountKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_logFileCountKeyReleased
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
String count = logFileCount.getText();
|
||||||
}//GEN-LAST:event_useBestViewerRBActionPerformed
|
if (count.equals(String.valueOf(UserPreferences.getDefaultLogFileCount()))) {
|
||||||
|
//if it is still the default value don't fire change
|
||||||
private void keepCurrentViewerRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_keepCurrentViewerRBActionPerformed
|
return;
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
|
||||||
}//GEN-LAST:event_keepCurrentViewerRBActionPerformed
|
|
||||||
|
|
||||||
private void dataSourcesHideKnownCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dataSourcesHideKnownCBActionPerformed
|
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
|
||||||
}//GEN-LAST:event_dataSourcesHideKnownCBActionPerformed
|
|
||||||
|
|
||||||
private void viewsHideKnownCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewsHideKnownCBActionPerformed
|
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
|
||||||
}//GEN-LAST:event_viewsHideKnownCBActionPerformed
|
|
||||||
|
|
||||||
private void useLocalTimeRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useLocalTimeRBActionPerformed
|
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
|
||||||
}//GEN-LAST:event_useLocalTimeRBActionPerformed
|
|
||||||
|
|
||||||
private void useGMTTimeRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useGMTTimeRBActionPerformed
|
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
|
||||||
}//GEN-LAST:event_useGMTTimeRBActionPerformed
|
|
||||||
|
|
||||||
private void dataSourcesHideSlackCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dataSourcesHideSlackCBActionPerformed
|
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
|
||||||
}//GEN-LAST:event_dataSourcesHideSlackCBActionPerformed
|
|
||||||
|
|
||||||
private void viewsHideSlackCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewsHideSlackCBActionPerformed
|
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
|
||||||
}//GEN-LAST:event_viewsHideSlackCBActionPerformed
|
|
||||||
|
|
||||||
private void browseLogosButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseLogosButtonActionPerformed
|
|
||||||
String oldLogoPath = agencyLogoPathField.getText();
|
|
||||||
int returnState = fileChooser.showOpenDialog(this);
|
|
||||||
if (returnState == JFileChooser.APPROVE_OPTION) {
|
|
||||||
String path = fileChooser.getSelectedFile().getPath();
|
|
||||||
try {
|
|
||||||
updateAgencyLogo(path);
|
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
|
||||||
} catch (IOException | IndexOutOfBoundsException ex) {
|
|
||||||
JOptionPane.showMessageDialog(null,
|
|
||||||
NbBundle.getMessage(this.getClass(),
|
|
||||||
"AutopsyOptionsPanel.invalidImageFile.msg"),
|
|
||||||
NbBundle.getMessage(this.getClass(), "AutopsyOptionsPanel.invalidImageFile.title"),
|
|
||||||
JOptionPane.ERROR_MESSAGE);
|
|
||||||
try {
|
|
||||||
updateAgencyLogo(oldLogoPath); //restore previous setting if new one is invalid
|
|
||||||
} catch (IOException ex1) {
|
|
||||||
LOGGER.log(Level.WARNING, "Error loading image from previously saved agency logo path", ex1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}//GEN-LAST:event_browseLogosButtonActionPerformed
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}//GEN-LAST:event_logFileCountKeyReleased
|
||||||
|
|
||||||
private void memFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_memFieldKeyReleased
|
private void memFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_memFieldKeyReleased
|
||||||
String memText = memField.getText();
|
String memText = memField.getText();
|
||||||
@ -918,17 +940,37 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
}//GEN-LAST:event_memFieldKeyReleased
|
}//GEN-LAST:event_memFieldKeyReleased
|
||||||
|
|
||||||
private void defaultLogoRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_defaultLogoRBActionPerformed
|
private void useGMTTimeRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useGMTTimeRBActionPerformed
|
||||||
agencyLogoPathField.setEnabled(false);
|
|
||||||
browseLogosButton.setEnabled(false);
|
|
||||||
try {
|
|
||||||
updateAgencyLogo("");
|
|
||||||
} catch (IOException ex) {
|
|
||||||
// This should never happen since we're not reading from a file.
|
|
||||||
LOGGER.log(Level.SEVERE, "Unexpected error occurred while updating the agency logo.", ex);
|
|
||||||
}
|
|
||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
}//GEN-LAST:event_defaultLogoRBActionPerformed
|
}//GEN-LAST:event_useGMTTimeRBActionPerformed
|
||||||
|
|
||||||
|
private void useLocalTimeRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useLocalTimeRBActionPerformed
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}//GEN-LAST:event_useLocalTimeRBActionPerformed
|
||||||
|
|
||||||
|
private void viewsHideSlackCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewsHideSlackCBActionPerformed
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}//GEN-LAST:event_viewsHideSlackCBActionPerformed
|
||||||
|
|
||||||
|
private void dataSourcesHideSlackCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dataSourcesHideSlackCBActionPerformed
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}//GEN-LAST:event_dataSourcesHideSlackCBActionPerformed
|
||||||
|
|
||||||
|
private void viewsHideKnownCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewsHideKnownCBActionPerformed
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}//GEN-LAST:event_viewsHideKnownCBActionPerformed
|
||||||
|
|
||||||
|
private void dataSourcesHideKnownCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dataSourcesHideKnownCBActionPerformed
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}//GEN-LAST:event_dataSourcesHideKnownCBActionPerformed
|
||||||
|
|
||||||
|
private void keepCurrentViewerRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_keepCurrentViewerRBActionPerformed
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}//GEN-LAST:event_keepCurrentViewerRBActionPerformed
|
||||||
|
|
||||||
|
private void useBestViewerRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_useBestViewerRBActionPerformed
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}//GEN-LAST:event_useBestViewerRBActionPerformed
|
||||||
|
|
||||||
private void specifyLogoRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_specifyLogoRBActionPerformed
|
private void specifyLogoRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_specifyLogoRBActionPerformed
|
||||||
agencyLogoPathField.setEnabled(true);
|
agencyLogoPathField.setEnabled(true);
|
||||||
@ -946,6 +988,41 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
}//GEN-LAST:event_specifyLogoRBActionPerformed
|
}//GEN-LAST:event_specifyLogoRBActionPerformed
|
||||||
|
|
||||||
|
private void defaultLogoRBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_defaultLogoRBActionPerformed
|
||||||
|
agencyLogoPathField.setEnabled(false);
|
||||||
|
browseLogosButton.setEnabled(false);
|
||||||
|
try {
|
||||||
|
updateAgencyLogo("");
|
||||||
|
} catch (IOException ex) {
|
||||||
|
// This should never happen since we're not reading from a file.
|
||||||
|
LOGGER.log(Level.SEVERE, "Unexpected error occurred while updating the agency logo.", ex);
|
||||||
|
}
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
}//GEN-LAST:event_defaultLogoRBActionPerformed
|
||||||
|
|
||||||
|
private void browseLogosButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseLogosButtonActionPerformed
|
||||||
|
String oldLogoPath = agencyLogoPathField.getText();
|
||||||
|
int returnState = fileChooser.showOpenDialog(this);
|
||||||
|
if (returnState == JFileChooser.APPROVE_OPTION) {
|
||||||
|
String path = fileChooser.getSelectedFile().getPath();
|
||||||
|
try {
|
||||||
|
updateAgencyLogo(path);
|
||||||
|
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
|
||||||
|
} catch (IOException | IndexOutOfBoundsException ex) {
|
||||||
|
JOptionPane.showMessageDialog(null,
|
||||||
|
NbBundle.getMessage(this.getClass(),
|
||||||
|
"AutopsyOptionsPanel.invalidImageFile.msg"),
|
||||||
|
NbBundle.getMessage(this.getClass(), "AutopsyOptionsPanel.invalidImageFile.title"),
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
try {
|
||||||
|
updateAgencyLogo(oldLogoPath); //restore previous setting if new one is invalid
|
||||||
|
} catch (IOException ex1) {
|
||||||
|
LOGGER.log(Level.WARNING, "Error loading image from previously saved agency logo path", ex1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_browseLogosButtonActionPerformed
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private javax.swing.JTextField agencyLogoPathField;
|
private javax.swing.JTextField agencyLogoPathField;
|
||||||
private javax.swing.JLabel agencyLogoPathFieldValidationLabel;
|
private javax.swing.JLabel agencyLogoPathFieldValidationLabel;
|
||||||
@ -963,8 +1040,11 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel {
|
|||||||
private javax.swing.JPanel jPanel1;
|
private javax.swing.JPanel jPanel1;
|
||||||
private javax.swing.JScrollPane jScrollPane1;
|
private javax.swing.JScrollPane jScrollPane1;
|
||||||
private javax.swing.JRadioButton keepCurrentViewerRB;
|
private javax.swing.JRadioButton keepCurrentViewerRB;
|
||||||
|
private javax.swing.JTextField logFileCount;
|
||||||
|
private javax.swing.JTextField logNumAlert;
|
||||||
private javax.swing.JPanel logoPanel;
|
private javax.swing.JPanel logoPanel;
|
||||||
private javax.swing.ButtonGroup logoSourceButtonGroup;
|
private javax.swing.ButtonGroup logoSourceButtonGroup;
|
||||||
|
private javax.swing.JLabel maxLogFileCount;
|
||||||
private javax.swing.JLabel maxMemoryLabel;
|
private javax.swing.JLabel maxMemoryLabel;
|
||||||
private javax.swing.JLabel maxMemoryUnitsLabel;
|
private javax.swing.JLabel maxMemoryUnitsLabel;
|
||||||
private javax.swing.JLabel maxMemoryUnitsLabel1;
|
private javax.swing.JLabel maxMemoryUnitsLabel1;
|
||||||
|
@ -200,3 +200,4 @@ CriterionChooser.ascendingRadio.text=\u25b2 Ascending\n
|
|||||||
CriterionChooser.removeButton.text=Remove
|
CriterionChooser.removeButton.text=Remove
|
||||||
CriterionChooser.descendingRadio.text=\u25bc Descending
|
CriterionChooser.descendingRadio.text=\u25bc Descending
|
||||||
AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.text=
|
AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.text=
|
||||||
|
AutopsyOptionsPanel.logNumAlert.text=
|
||||||
|
@ -453,7 +453,7 @@ public class DataContentViewerHex extends javax.swing.JPanel implements DataCont
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Content content = (selectedNode).getLookup().lookup(Content.class);
|
Content content = DataContentViewerUtility.getDefaultContent(selectedNode);
|
||||||
if (content == null) {
|
if (content == null) {
|
||||||
resetComponent();
|
resetComponent();
|
||||||
return;
|
return;
|
||||||
|
@ -452,8 +452,7 @@ public class DataContentViewerString extends javax.swing.JPanel implements DataC
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Lookup lookup = selectedNode.getLookup();
|
Content content = DataContentViewerUtility.getDefaultContent(selectedNode);
|
||||||
Content content = lookup.lookup(Content.class);
|
|
||||||
if (content != null) {
|
if (content != null) {
|
||||||
this.setDataView(content, 0);
|
this.setDataView(content, 0);
|
||||||
return;
|
return;
|
||||||
|
54
Core/src/org/sleuthkit/autopsy/corecomponents/DataContentViewerUtility.java
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2018 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.corecomponents;
|
||||||
|
|
||||||
|
import org.sleuthkit.datamodel.Content;
|
||||||
|
import org.openide.nodes.Node;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility classes for content viewers.
|
||||||
|
* In theory, this would live in the contentviewer package,
|
||||||
|
* but the initial method was needed only be viewers in
|
||||||
|
* corecomponents and therefore can stay out of public API.
|
||||||
|
*/
|
||||||
|
class DataContentViewerUtility {
|
||||||
|
/**
|
||||||
|
* Returns the first non-Blackboard Artifact from a Node.
|
||||||
|
* Needed for (at least) Hex and Strings that want to view
|
||||||
|
* all types of content (not just AbstractFile), but don't want
|
||||||
|
* to display an artifact unless that's the only thing there.
|
||||||
|
* Scenario is hash hit or interesting item hit.
|
||||||
|
*
|
||||||
|
* @param node Node passed into content viewer
|
||||||
|
* @return highest priority content or null if there is no content
|
||||||
|
*/
|
||||||
|
static Content getDefaultContent(Node node) {
|
||||||
|
Content bbContentSeen = null;
|
||||||
|
for (Content content : (node).getLookup().lookupAll(Content.class)) {
|
||||||
|
if (content instanceof BlackboardArtifact) {
|
||||||
|
bbContentSeen = content;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bbContentSeen;
|
||||||
|
}
|
||||||
|
}
|
@ -151,7 +151,7 @@ public abstract class MediaViewVideoPanel extends JPanel implements FrameCapture
|
|||||||
if (AUDIO_EXTENSIONS.contains("." + extension) || getExtensionsList().contains("." + extension)) {
|
if (AUDIO_EXTENSIONS.contains("." + extension) || getExtensionsList().contains("." + extension)) {
|
||||||
SortedSet<String> mimeTypes = new TreeSet<>(getMimeTypes());
|
SortedSet<String> mimeTypes = new TreeSet<>(getMimeTypes());
|
||||||
try {
|
try {
|
||||||
String mimeType = new FileTypeDetector().detectMIMEType(file);
|
String mimeType = new FileTypeDetector().getMIMEType(file);
|
||||||
return mimeTypes.contains(mimeType);
|
return mimeTypes.contains(mimeType);
|
||||||
} catch (FileTypeDetector.FileTypeDetectorInitException ex) {
|
} catch (FileTypeDetector.FileTypeDetectorInitException ex) {
|
||||||
logger.log(Level.WARNING, "Failed to look up mimetype for " + file.getName() + " using FileTypeDetector. Fallingback on AbstractFile.isMimeType", ex);
|
logger.log(Level.WARNING, "Failed to look up mimetype for " + file.getName() + " using FileTypeDetector. Fallingback on AbstractFile.isMimeType", ex);
|
||||||
|
@ -263,7 +263,7 @@ public class ImageUtils {
|
|||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
String mimeType = getFileTypeDetector().detectMIMEType(file);
|
String mimeType = getFileTypeDetector().getMIMEType(file);
|
||||||
if (StringUtils.isNotBlank(mimeTypePrefix) && mimeType.startsWith(mimeTypePrefix)) {
|
if (StringUtils.isNotBlank(mimeTypePrefix) && mimeType.startsWith(mimeTypePrefix)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2012-2015 Basis Technology Corp.
|
* Copyright 2012-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -24,68 +24,36 @@ import java.util.logging.FileHandler;
|
|||||||
import java.util.logging.Formatter;
|
import java.util.logging.Formatter;
|
||||||
import java.util.logging.Handler;
|
import java.util.logging.Handler;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.LogRecord;
|
import java.util.logging.LogRecord;
|
||||||
|
import org.sleuthkit.autopsy.core.UserPreferences;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Autopsy specialization of the Java Logger class with custom file handlers.
|
* Autopsy specialization of the Java Logger class with a custom file handler.
|
||||||
* Note that the custom loggers are not obtained from the global log manager.
|
* Note that the custom loggers are not obtained from the global log manager.
|
||||||
*/
|
*/
|
||||||
public final class Logger extends java.util.logging.Logger {
|
public final class Logger extends java.util.logging.Logger {
|
||||||
|
|
||||||
private static final String LOG_ENCODING = PlatformUtil.getLogFileEncoding();
|
private static final String LOG_ENCODING = PlatformUtil.getLogFileEncoding();
|
||||||
private static final int LOG_SIZE = 0; // In bytes, zero is unlimited
|
private static final int LOG_SIZE = 0; // In bytes, zero is unlimited
|
||||||
private static final int LOG_FILE_COUNT = 10;
|
private static final String LOG_FILE_NAME = "autopsy.log"; //NON-NLS
|
||||||
private static final String LOG_WITHOUT_STACK_TRACES = "autopsy.log"; //NON-NLS
|
|
||||||
private static final String LOG_WITH_STACK_TRACES = "autopsy_traces.log"; //NON-NLS
|
|
||||||
private static final Map<String, Logger> namesToLoggers = new HashMap<>();
|
private static final Map<String, Logger> namesToLoggers = new HashMap<>();
|
||||||
private static final Handler consoleHandler = new java.util.logging.ConsoleHandler();
|
private static final Handler consoleHandler = new java.util.logging.ConsoleHandler();
|
||||||
private static FileHandler userFriendlyHandler = createFileHandlerWithoutTraces(PlatformUtil.getLogDirectory());
|
private static FileHandler logFileHandler = createFileHandlerWithTraces(PlatformUtil.getLogDirectory());
|
||||||
private static FileHandler developerFriendlyHandler = createFileHandlerWithTraces(PlatformUtil.getLogDirectory());
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a custom file handler with a custom message formatter that does
|
|
||||||
* not include stack traces.
|
|
||||||
*
|
|
||||||
* @param logDirectory The directory where the log files should reside.
|
|
||||||
*
|
|
||||||
* @return A custom file handler.
|
|
||||||
*/
|
|
||||||
private static FileHandler createFileHandlerWithoutTraces(String logDirectory) {
|
|
||||||
String logFilePath = Paths.get(logDirectory, LOG_WITHOUT_STACK_TRACES).toString();
|
|
||||||
try {
|
|
||||||
FileHandler fileHandler = new FileHandler(logFilePath, LOG_SIZE, LOG_FILE_COUNT);
|
|
||||||
fileHandler.setEncoding(LOG_ENCODING);
|
|
||||||
fileHandler.setFormatter(new Formatter() {
|
|
||||||
@Override
|
|
||||||
public String format(LogRecord record) {
|
|
||||||
return (new Date(record.getMillis())).toString() + " "
|
|
||||||
+ record.getSourceClassName() + " "
|
|
||||||
+ record.getSourceMethodName() + "\n"
|
|
||||||
+ record.getLevel() + ": "
|
|
||||||
+ this.formatMessage(record) + "\n";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return fileHandler;
|
|
||||||
} catch (IOException ex) {
|
|
||||||
throw new RuntimeException(String.format("Error initializing file handler for %s", logFilePath), ex); //NON-NLS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a custom file handler with a custom message formatter that
|
* Creates a custom file handler with a custom message formatter that
|
||||||
* incldues stack traces.
|
* includes stack traces.
|
||||||
*
|
*
|
||||||
* @param logDirectory The directory where the log files should reside.
|
* @param logDirectory The directory where the log files should reside.
|
||||||
*
|
*
|
||||||
* @return A custom file handler.
|
* @return A custom file handler.
|
||||||
*/
|
*/
|
||||||
private static FileHandler createFileHandlerWithTraces(String logDirectory) {
|
private static FileHandler createFileHandlerWithTraces(String logDirectory) {
|
||||||
String logFilePath = Paths.get(logDirectory, LOG_WITH_STACK_TRACES).toString();
|
String logFilePath = Paths.get(logDirectory, LOG_FILE_NAME).toString();
|
||||||
try {
|
try {
|
||||||
FileHandler fileHandler = new FileHandler(logFilePath, LOG_SIZE, LOG_FILE_COUNT);
|
FileHandler fileHandler = new FileHandler(logFilePath, LOG_SIZE, UserPreferences.getLogFileCount());
|
||||||
fileHandler.setEncoding(LOG_ENCODING);
|
fileHandler.setEncoding(LOG_ENCODING);
|
||||||
fileHandler.setFormatter(new Formatter() {
|
fileHandler.setFormatter(new Formatter() {
|
||||||
@Override
|
@Override
|
||||||
@ -120,7 +88,7 @@ public final class Logger extends java.util.logging.Logger {
|
|||||||
*/
|
*/
|
||||||
synchronized public static void setLogDirectory(String directoryPath) {
|
synchronized public static void setLogDirectory(String directoryPath) {
|
||||||
/*
|
/*
|
||||||
* Create file handlers for the new directory and swap them into all of
|
* Create a file handler for the new directory and swap it into all of
|
||||||
* the existing loggers using thread-safe Logger methods. The new
|
* the existing loggers using thread-safe Logger methods. The new
|
||||||
* handlers are added before the old handlers so that no messages will
|
* handlers are added before the old handlers so that no messages will
|
||||||
* be lost, but this makes it possible for log messages to be written
|
* be lost, but this makes it possible for log messages to be written
|
||||||
@ -128,25 +96,20 @@ public final class Logger extends java.util.logging.Logger {
|
|||||||
* add/remove handler calls (currently, the base class handlers
|
* add/remove handler calls (currently, the base class handlers
|
||||||
* collection is a CopyOnWriteArrayList).
|
* collection is a CopyOnWriteArrayList).
|
||||||
*/
|
*/
|
||||||
FileHandler newUserFriendlyHandler = createFileHandlerWithoutTraces(directoryPath);
|
FileHandler newFileHandler = createFileHandlerWithTraces(directoryPath);
|
||||||
FileHandler newDeveloperFriendlyHandler = createFileHandlerWithTraces(directoryPath);
|
|
||||||
for (Logger logger : namesToLoggers.values()) {
|
for (Logger logger : namesToLoggers.values()) {
|
||||||
logger.addHandler(newUserFriendlyHandler);
|
logger.addHandler(newFileHandler);
|
||||||
logger.addHandler(newDeveloperFriendlyHandler);
|
logger.removeHandler(logFileHandler);
|
||||||
logger.removeHandler(userFriendlyHandler);
|
|
||||||
logger.removeHandler(userFriendlyHandler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Close the old file handlers and save references to the new handlers
|
* Close the old file handler and save reference to the new handler
|
||||||
* so they can be added to any new loggers. This swap is why this method
|
* so they can be added to any new loggers. This swap is why this method
|
||||||
* and the two overloads of getLogger() are synchronized, serializing
|
* and the two overloads of getLogger() are synchronized, serializing
|
||||||
* access to userFriendlyHandler and developerFriendlyHandler.
|
* access to logFileHandler.
|
||||||
*/
|
*/
|
||||||
userFriendlyHandler.close();
|
logFileHandler.close();
|
||||||
userFriendlyHandler = newUserFriendlyHandler;
|
logFileHandler = newFileHandler;
|
||||||
developerFriendlyHandler.close();
|
|
||||||
developerFriendlyHandler = newDeveloperFriendlyHandler;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -178,8 +141,7 @@ public final class Logger extends java.util.logging.Logger {
|
|||||||
synchronized public static Logger getLogger(String name, String resourceBundleName) {
|
synchronized public static Logger getLogger(String name, String resourceBundleName) {
|
||||||
if (!namesToLoggers.containsKey(name)) {
|
if (!namesToLoggers.containsKey(name)) {
|
||||||
Logger logger = new Logger(name, resourceBundleName);
|
Logger logger = new Logger(name, resourceBundleName);
|
||||||
logger.addHandler(userFriendlyHandler);
|
logger.addHandler(logFileHandler);
|
||||||
logger.addHandler(developerFriendlyHandler);
|
|
||||||
namesToLoggers.put(name, logger);
|
namesToLoggers.put(name, logger);
|
||||||
}
|
}
|
||||||
return namesToLoggers.get(name);
|
return namesToLoggers.get(name);
|
||||||
|
@ -202,7 +202,7 @@ public class ViewContextAction extends AbstractAction {
|
|||||||
undecoratedParentNode.setChildNodeSelectionInfo(new ContentNodeSelectionInfo(content));
|
undecoratedParentNode.setChildNodeSelectionInfo(new ContentNodeSelectionInfo(content));
|
||||||
TreeView treeView = treeViewTopComponent.getTree();
|
TreeView treeView = treeViewTopComponent.getTree();
|
||||||
treeView.expandNode(parentTreeViewNode);
|
treeView.expandNode(parentTreeViewNode);
|
||||||
if (treeViewTopComponent.getSelectedNode().getDisplayName().equals(parentTreeViewNode.getDisplayName())) {
|
if (treeViewTopComponent.getSelectedNode().equals(parentTreeViewNode)) {
|
||||||
//In the case where our tree view already has the destination directory selected
|
//In the case where our tree view already has the destination directory selected
|
||||||
//due to an optimization in the ExplorerManager.setExploredContextAndSelection method
|
//due to an optimization in the ExplorerManager.setExploredContextAndSelection method
|
||||||
//the property change we listen for to call DirectoryTreeTopComponent.respondSelection
|
//the property change we listen for to call DirectoryTreeTopComponent.respondSelection
|
||||||
|
@ -135,7 +135,7 @@ class MSOfficeEmbeddedContentExtractor {
|
|||||||
* supported. Else it returns false.
|
* supported. Else it returns false.
|
||||||
*/
|
*/
|
||||||
boolean isContentExtractionSupported(AbstractFile abstractFile) {
|
boolean isContentExtractionSupported(AbstractFile abstractFile) {
|
||||||
String abstractFileMimeType = fileTypeDetector.detectMIMEType(abstractFile);
|
String abstractFileMimeType = fileTypeDetector.getMIMEType(abstractFile);
|
||||||
for (SupportedExtractionFormats s : SupportedExtractionFormats.values()) {
|
for (SupportedExtractionFormats s : SupportedExtractionFormats.values()) {
|
||||||
if (s.toString().equals(abstractFileMimeType)) {
|
if (s.toString().equals(abstractFileMimeType)) {
|
||||||
abstractFileExtractionFormat = s;
|
abstractFileExtractionFormat = s;
|
||||||
|
@ -139,7 +139,7 @@ class SevenZipExtractor {
|
|||||||
* supported. Else it returns false.
|
* supported. Else it returns false.
|
||||||
*/
|
*/
|
||||||
boolean isSevenZipExtractionSupported(AbstractFile abstractFile) {
|
boolean isSevenZipExtractionSupported(AbstractFile abstractFile) {
|
||||||
String abstractFileMimeType = fileTypeDetector.detectMIMEType(abstractFile);
|
String abstractFileMimeType = fileTypeDetector.getMIMEType(abstractFile);
|
||||||
for (SupportedArchiveExtractionFormats s : SupportedArchiveExtractionFormats.values()) {
|
for (SupportedArchiveExtractionFormats s : SupportedArchiveExtractionFormats.values()) {
|
||||||
if (s.toString().equals(abstractFileMimeType)) {
|
if (s.toString().equals(abstractFileMimeType)) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -187,7 +187,7 @@ final class EncryptionDetectionFileIngestModule extends FileIngestModuleAdapter
|
|||||||
/*
|
/*
|
||||||
* Qualify the MIME type.
|
* Qualify the MIME type.
|
||||||
*/
|
*/
|
||||||
String mimeType = fileTypeDetector.detectMIMEType(file);
|
String mimeType = fileTypeDetector.getMIMEType(file);
|
||||||
if (mimeType.equals("application/octet-stream")) {
|
if (mimeType.equals("application/octet-stream")) {
|
||||||
possiblyEncrypted = true;
|
possiblyEncrypted = true;
|
||||||
}
|
}
|
||||||
|
@ -250,7 +250,7 @@ public final class ExifParserFileIngestModule implements FileIngestModule {
|
|||||||
* @return true if to be processed
|
* @return true if to be processed
|
||||||
*/
|
*/
|
||||||
private boolean parsableFormat(AbstractFile f) {
|
private boolean parsableFormat(AbstractFile f) {
|
||||||
String mimeType = fileTypeDetector.detectMIMEType(f);
|
String mimeType = fileTypeDetector.getMIMEType(f);
|
||||||
return supportedMimeTypes.contains(mimeType);
|
return supportedMimeTypes.contains(mimeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +169,7 @@ public class FileExtMismatchIngestModule implements FileIngestModule {
|
|||||||
if (settings.skipFilesWithNoExtension() && currActualExt.isEmpty()) {
|
if (settings.skipFilesWithNoExtension() && currActualExt.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String currActualSigType = detector.detectMIMEType(abstractFile);
|
String currActualSigType = detector.getMIMEType(abstractFile);
|
||||||
if (settings.getCheckType() != CHECK_TYPE.ALL) {
|
if (settings.getCheckType() != CHECK_TYPE.ALL) {
|
||||||
if (settings.getCheckType() == CHECK_TYPE.NO_TEXT_FILES) {
|
if (settings.getCheckType() == CHECK_TYPE.NO_TEXT_FILES) {
|
||||||
if (!currActualExt.isEmpty() && currActualSigType.equals("text/plain")) { //NON-NLS
|
if (!currActualExt.isEmpty() && currActualSigType.equals("text/plain")) { //NON-NLS
|
||||||
|
@ -165,14 +165,17 @@ public class FileTypeDetector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detects the MIME type of a file.
|
* Detects the MIME type of a file, then writes it the AbstractFile object
|
||||||
|
* representing the file and returns the detected type.
|
||||||
*
|
*
|
||||||
* @param file The file to test.
|
* @param file The file to test.
|
||||||
*
|
*
|
||||||
* @return A MIME type name. If file type could not be detected, or results
|
* @return A MIME type name. If file type could not be detected, or results
|
||||||
* were uncertain, octet-stream is returned.
|
* were uncertain, octet-stream is returned.
|
||||||
|
*
|
||||||
|
|
||||||
*/
|
*/
|
||||||
public String detectMIMEType(AbstractFile file) {
|
public String getMIMEType(AbstractFile file) {
|
||||||
/*
|
/*
|
||||||
* Check to see if the file has already been typed.
|
* Check to see if the file has already been typed.
|
||||||
*/
|
*/
|
||||||
@ -244,6 +247,11 @@ public class FileTypeDetector {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Documented side effect: write the result to the AbstractFile object.
|
||||||
|
*/
|
||||||
|
file.setMIMEType(mimeType);
|
||||||
|
|
||||||
return mimeType;
|
return mimeType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -365,7 +373,7 @@ public class FileTypeDetector {
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public String detectAndPostToBlackboard(AbstractFile file) throws TskCoreException {
|
public String detectAndPostToBlackboard(AbstractFile file) throws TskCoreException {
|
||||||
String fileType = detectMIMEType(file);
|
String fileType = getMIMEType(file);
|
||||||
file.setMIMEType(fileType);
|
file.setMIMEType(fileType);
|
||||||
file.save();
|
file.save();
|
||||||
return fileType;
|
return fileType;
|
||||||
@ -389,7 +397,7 @@ public class FileTypeDetector {
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public String getFileType(AbstractFile file) throws TskCoreException {
|
public String getFileType(AbstractFile file) throws TskCoreException {
|
||||||
String fileType = detectMIMEType(file);
|
String fileType = getMIMEType(file);
|
||||||
file.setMIMEType(fileType);
|
file.setMIMEType(fileType);
|
||||||
file.save();
|
file.save();
|
||||||
return fileType;
|
return fileType;
|
||||||
@ -409,7 +417,7 @@ public class FileTypeDetector {
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public String detect(AbstractFile file) throws TskCoreException {
|
public String detect(AbstractFile file) throws TskCoreException {
|
||||||
String fileType = detectMIMEType(file);
|
String fileType = getMIMEType(file);
|
||||||
return fileType;
|
return fileType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1232,9 +1232,10 @@ public class HashDbManager implements PropertyChangeListener {
|
|||||||
} else {
|
} else {
|
||||||
type = TskData.FileKnown.KNOWN;
|
type = TskData.FileKnown.KNOWN;
|
||||||
}
|
}
|
||||||
EamGlobalFileInstance fileInstance = new EamGlobalFileInstance(referenceSetID, file.getMd5Hash(),
|
|
||||||
type, comment);
|
|
||||||
try{
|
try{
|
||||||
|
EamGlobalFileInstance fileInstance = new EamGlobalFileInstance(referenceSetID, file.getMd5Hash(),
|
||||||
|
type, comment);
|
||||||
EamDb.getInstance().addReferenceInstance(fileInstance,EamDb.getInstance().getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID));
|
EamDb.getInstance().addReferenceInstance(fileInstance,EamDb.getInstance().getCorrelationTypeById(CorrelationAttribute.FILES_TYPE_ID));
|
||||||
} catch (EamDbException ex){
|
} catch (EamDbException ex){
|
||||||
throw new TskCoreException("Error adding hashes to " + getDisplayName(), ex);
|
throw new TskCoreException("Error adding hashes to " + getDisplayName(), ex);
|
||||||
@ -1259,8 +1260,12 @@ public class HashDbManager implements PropertyChangeListener {
|
|||||||
type = TskData.FileKnown.BAD;
|
type = TskData.FileKnown.BAD;
|
||||||
} else {
|
} else {
|
||||||
type = TskData.FileKnown.KNOWN;
|
type = TskData.FileKnown.KNOWN;
|
||||||
}
|
}
|
||||||
globalFileInstances.add(new EamGlobalFileInstance(referenceSetID, hashEntry.getMd5Hash(), type, hashEntry.getComment()));
|
try {
|
||||||
|
globalFileInstances.add(new EamGlobalFileInstance(referenceSetID, hashEntry.getMd5Hash(), type, hashEntry.getComment()));
|
||||||
|
} catch (EamDbException ex){
|
||||||
|
throw new TskCoreException("Error adding hashes to " + getDisplayName(), ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
|
@ -34,6 +34,7 @@ class ReportExcel implements TableReportModule {
|
|||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(ReportExcel.class.getName());
|
private static final Logger logger = Logger.getLogger(ReportExcel.class.getName());
|
||||||
private static ReportExcel instance;
|
private static ReportExcel instance;
|
||||||
|
private static final int EXCEL_CELL_MAXIMUM_SIZE = 36767; //Specified at:https://poi.apache.org/apidocs/org/apache/poi/ss/SpreadsheetVersion.html
|
||||||
|
|
||||||
private Workbook wb;
|
private Workbook wb;
|
||||||
private Sheet sheet;
|
private Sheet sheet;
|
||||||
@ -236,10 +237,24 @@ class ReportExcel implements TableReportModule {
|
|||||||
* @param row cells to add
|
* @param row cells to add
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportExcel.exceptionMessage.dataTooLarge=Value is too long to fit into an Excel cell. ",
|
||||||
|
"ReportExcel.exceptionMessage.errorText=Error showing data into an Excel cell."
|
||||||
|
})
|
||||||
|
|
||||||
public void addRow(List<String> rowData) {
|
public void addRow(List<String> rowData) {
|
||||||
Row row = sheet.createRow(rowIndex);
|
Row row = sheet.createRow(rowIndex);
|
||||||
for (int i = 0; i < rowData.size(); ++i) {
|
for (int i = 0; i < rowData.size(); ++i) {
|
||||||
row.createCell(i).setCellValue(rowData.get(i));
|
Cell excelCell = row.createCell(i);
|
||||||
|
try {
|
||||||
|
excelCell.setCellValue(rowData.get(i));
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (e instanceof java.lang.IllegalArgumentException && rowData.get(i).length() > EXCEL_CELL_MAXIMUM_SIZE) {
|
||||||
|
excelCell.setCellValue(Bundle.ReportExcel_exceptionMessage_dataTooLarge() + e.getMessage());
|
||||||
|
} else {
|
||||||
|
excelCell.setCellValue(Bundle.ReportExcel_exceptionMessage_errorText());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
++rowIndex;
|
++rowIndex;
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ class ReportGenerator {
|
|||||||
*/
|
*/
|
||||||
private ReportProgressPanel progressPanel;
|
private ReportProgressPanel progressPanel;
|
||||||
|
|
||||||
private String reportPathFormatString;
|
private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
|
||||||
private final ReportGenerationPanel reportGenerationPanel = new ReportGenerationPanel();
|
private final ReportGenerationPanel reportGenerationPanel = new ReportGenerationPanel();
|
||||||
|
|
||||||
static final String REPORTS_DIR = "Reports"; //NON-NLS
|
static final String REPORTS_DIR = "Reports"; //NON-NLS
|
||||||
@ -89,12 +89,6 @@ class ReportGenerator {
|
|||||||
* Creates a report generator.
|
* Creates a report generator.
|
||||||
*/
|
*/
|
||||||
ReportGenerator() {
|
ReportGenerator() {
|
||||||
// Create the root reports directory path of the form: <CASE DIRECTORY>/Reports/<Case fileName> <Timestamp>/
|
|
||||||
DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy-HH-mm-ss");
|
|
||||||
Date date = new Date();
|
|
||||||
String dateNoTime = dateFormat.format(date);
|
|
||||||
this.reportPathFormatString = currentCase.getReportDirectory() + File.separator + currentCase.getDisplayName() + " %s " + dateNoTime + File.separator;
|
|
||||||
|
|
||||||
this.errorList = new ArrayList<>();
|
this.errorList = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,19 +130,12 @@ class ReportGenerator {
|
|||||||
/**
|
/**
|
||||||
* Run the GeneralReportModules using a SwingWorker.
|
* Run the GeneralReportModules using a SwingWorker.
|
||||||
*/
|
*/
|
||||||
void generateGeneralReport(GeneralReportModule generalReportModule) {
|
void generateGeneralReport(GeneralReportModule generalReportModule) throws IOException {
|
||||||
if (generalReportModule != null) {
|
if (generalReportModule != null) {
|
||||||
reportPathFormatString = String.format(reportPathFormatString, generalReportModule.getName());
|
String reportDir = createReportDirectory(generalReportModule);
|
||||||
// Create the root reports directory.
|
setupProgressPanel(generalReportModule, reportDir);
|
||||||
try {
|
|
||||||
FileUtil.createFolder(new File(reportPathFormatString));
|
|
||||||
} catch (IOException ex) {
|
|
||||||
errorList.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.errList.failedMakeRptFolder"));
|
|
||||||
logger.log(Level.SEVERE, "Failed to make report folder, may be unable to generate reports.", ex); //NON-NLS
|
|
||||||
}
|
|
||||||
setupProgressPanel(generalReportModule);
|
|
||||||
ReportWorker worker = new ReportWorker(() -> {
|
ReportWorker worker = new ReportWorker(() -> {
|
||||||
generalReportModule.generateReport(reportPathFormatString, progressPanel);
|
generalReportModule.generateReport(reportDir, progressPanel);
|
||||||
});
|
});
|
||||||
worker.execute();
|
worker.execute();
|
||||||
displayProgressPanel();
|
displayProgressPanel();
|
||||||
@ -163,19 +150,12 @@ class ReportGenerator {
|
|||||||
* @param tagSelections the enabled/disabled state of the tag names
|
* @param tagSelections the enabled/disabled state of the tag names
|
||||||
* to be included in the report
|
* to be included in the report
|
||||||
*/
|
*/
|
||||||
void generateTableReport(TableReportModule tableReport, Map<BlackboardArtifact.Type, Boolean> artifactTypeSelections, Map<String, Boolean> tagNameSelections) {
|
void generateTableReport(TableReportModule tableReport, Map<BlackboardArtifact.Type, Boolean> artifactTypeSelections, Map<String, Boolean> tagNameSelections) throws IOException {
|
||||||
if (tableReport != null && null != artifactTypeSelections) {
|
if (tableReport != null && null != artifactTypeSelections) {
|
||||||
reportPathFormatString = String.format(reportPathFormatString, tableReport.getName());
|
String reportDir = createReportDirectory(tableReport);
|
||||||
// Create the root reports directory.
|
setupProgressPanel(tableReport, reportDir);
|
||||||
try {
|
|
||||||
FileUtil.createFolder(new File(reportPathFormatString));
|
|
||||||
} catch (IOException ex) {
|
|
||||||
errorList.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.errList.failedMakeRptFolder"));
|
|
||||||
logger.log(Level.SEVERE, "Failed to make report folder, may be unable to generate reports.", ex); //NON-NLS
|
|
||||||
}
|
|
||||||
setupProgressPanel(tableReport);
|
|
||||||
ReportWorker worker = new ReportWorker(() -> {
|
ReportWorker worker = new ReportWorker(() -> {
|
||||||
tableReport.startReport(reportPathFormatString);
|
tableReport.startReport(reportDir);
|
||||||
TableReportGenerator generator = new TableReportGenerator(artifactTypeSelections, tagNameSelections, progressPanel, tableReport);
|
TableReportGenerator generator = new TableReportGenerator(artifactTypeSelections, tagNameSelections, progressPanel, tableReport);
|
||||||
generator.execute();
|
generator.execute();
|
||||||
tableReport.endReport();
|
tableReport.endReport();
|
||||||
@ -194,23 +174,16 @@ class ReportGenerator {
|
|||||||
* @param enabledInfo the Information that should be included about each
|
* @param enabledInfo the Information that should be included about each
|
||||||
* file in the report.
|
* file in the report.
|
||||||
*/
|
*/
|
||||||
void generateFileListReport(FileReportModule fileReportModule, Map<FileReportDataTypes, Boolean> enabledInfo) {
|
void generateFileListReport(FileReportModule fileReportModule, Map<FileReportDataTypes, Boolean> enabledInfo) throws IOException {
|
||||||
if (fileReportModule != null && null != enabledInfo) {
|
if (fileReportModule != null && null != enabledInfo) {
|
||||||
reportPathFormatString = String.format(reportPathFormatString, fileReportModule.getName());
|
String reportDir = createReportDirectory(fileReportModule);
|
||||||
// Create the root reports directory.
|
|
||||||
try {
|
|
||||||
FileUtil.createFolder(new File(reportPathFormatString));
|
|
||||||
} catch (IOException ex) {
|
|
||||||
errorList.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.errList.failedMakeRptFolder"));
|
|
||||||
logger.log(Level.SEVERE, "Failed to make report folder, may be unable to generate reports.", ex); //NON-NLS
|
|
||||||
}
|
|
||||||
List<FileReportDataTypes> enabled = new ArrayList<>();
|
List<FileReportDataTypes> enabled = new ArrayList<>();
|
||||||
for (Entry<FileReportDataTypes, Boolean> e : enabledInfo.entrySet()) {
|
for (Entry<FileReportDataTypes, Boolean> e : enabledInfo.entrySet()) {
|
||||||
if (e.getValue()) {
|
if (e.getValue()) {
|
||||||
enabled.add(e.getKey());
|
enabled.add(e.getKey());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setupProgressPanel(fileReportModule);
|
setupProgressPanel(fileReportModule, reportDir);
|
||||||
ReportWorker worker = new ReportWorker(() -> {
|
ReportWorker worker = new ReportWorker(() -> {
|
||||||
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
||||||
progressPanel.start();
|
progressPanel.start();
|
||||||
@ -221,7 +194,7 @@ class ReportGenerator {
|
|||||||
List<AbstractFile> files = getFiles();
|
List<AbstractFile> files = getFiles();
|
||||||
int numFiles = files.size();
|
int numFiles = files.size();
|
||||||
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
||||||
fileReportModule.startReport(reportPathFormatString);
|
fileReportModule.startReport(reportDir);
|
||||||
fileReportModule.startTable(enabled);
|
fileReportModule.startTable(enabled);
|
||||||
}
|
}
|
||||||
progressPanel.setIndeterminate(false);
|
progressPanel.setIndeterminate(false);
|
||||||
@ -276,15 +249,31 @@ class ReportGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupProgressPanel(ReportModule module) {
|
private void setupProgressPanel(ReportModule module, String reportDir) {
|
||||||
String reportFilePath = module.getRelativeFilePath();
|
String reportFilePath = module.getRelativeFilePath();
|
||||||
if (!reportFilePath.isEmpty()) {
|
if (!reportFilePath.isEmpty()) {
|
||||||
this.progressPanel = reportGenerationPanel.addReport(module.getName(), String.format(reportPathFormatString, module.getName()) + reportFilePath);
|
this.progressPanel = reportGenerationPanel.addReport(module.getName(), reportDir + reportFilePath);
|
||||||
} else {
|
} else {
|
||||||
this.progressPanel = reportGenerationPanel.addReport(module.getName(), null);
|
this.progressPanel = reportGenerationPanel.addReport(module.getName(), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String createReportDirectory(ReportModule module) throws IOException {
|
||||||
|
Case currentCase = Case.getCurrentCase();
|
||||||
|
// Create the root reports directory path of the form: <CASE DIRECTORY>/Reports/<Case fileName> <Timestamp>/
|
||||||
|
DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy-HH-mm-ss");
|
||||||
|
Date date = new Date();
|
||||||
|
String dateNoTime = dateFormat.format(date);
|
||||||
|
String reportPath = String.format(REPORT_PATH_FMT_STR, currentCase.getReportDirectory(), currentCase.getDisplayName(), module.getName(), dateNoTime);
|
||||||
|
// Create the root reports directory.
|
||||||
|
try {
|
||||||
|
FileUtil.createFolder(new File(reportPath));
|
||||||
|
} catch (IOException ex) {
|
||||||
|
throw new IOException("Failed to make report folder, unable to generate reports.", ex);
|
||||||
|
}
|
||||||
|
return reportPath;
|
||||||
|
}
|
||||||
|
|
||||||
private class ReportWorker extends SwingWorker<Void, Void> {
|
private class ReportWorker extends SwingWorker<Void, Void> {
|
||||||
|
|
||||||
private final Runnable doInBackground;
|
private final Runnable doInBackground;
|
||||||
|
@ -51,6 +51,7 @@ import org.openide.util.NbBundle;
|
|||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.casemodule.services.Services;
|
import org.sleuthkit.autopsy.casemodule.services.Services;
|
||||||
import org.sleuthkit.autopsy.casemodule.services.TagsManager;
|
import org.sleuthkit.autopsy.casemodule.services.TagsManager;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.EscapeUtil;
|
||||||
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.datamodel.ContentUtils.ExtractFscContentVisitor;
|
import org.sleuthkit.autopsy.datamodel.ContentUtils.ExtractFscContentVisitor;
|
||||||
@ -554,7 +555,8 @@ class ReportHTML implements TableReportModule {
|
|||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append("\t<tr>\n"); //NON-NLS
|
builder.append("\t<tr>\n"); //NON-NLS
|
||||||
for (String cell : row) {
|
for (String cell : row) {
|
||||||
builder.append("\t\t<td>").append(cell).append("</td>\n"); //NON-NLS
|
String escapeHTMLCell = EscapeUtil.escapeHtml(cell);
|
||||||
|
builder.append("\t\t<td>").append(escapeHTMLCell).append("</td>\n"); //NON-NLS
|
||||||
}
|
}
|
||||||
builder.append("\t</tr>\n"); //NON-NLS
|
builder.append("\t</tr>\n"); //NON-NLS
|
||||||
rowCount++;
|
rowCount++;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
*
|
*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013-2015 Basis Technology Corp.
|
* Copyright 2013-2018 Basis Technology Corp.
|
||||||
*
|
*
|
||||||
* Copyright 2012 42six Solutions.
|
* Copyright 2012 42six Solutions.
|
||||||
* Contact: aebadirad <at> 42six <dot> com
|
* Contact: aebadirad <at> 42six <dot> com
|
||||||
@ -26,12 +26,14 @@ import java.awt.Component;
|
|||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.io.IOException;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import org.openide.DialogDisplayer;
|
import org.openide.DialogDisplayer;
|
||||||
|
import org.openide.NotifyDescriptor;
|
||||||
import org.openide.WizardDescriptor;
|
import org.openide.WizardDescriptor;
|
||||||
import org.openide.awt.ActionID;
|
import org.openide.awt.ActionID;
|
||||||
import org.openide.awt.ActionReference;
|
import org.openide.awt.ActionReference;
|
||||||
@ -70,12 +72,17 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
|
|||||||
TableReportModule tableReport = (TableReportModule) wiz.getProperty("tableModule");
|
TableReportModule tableReport = (TableReportModule) wiz.getProperty("tableModule");
|
||||||
GeneralReportModule generalReport = (GeneralReportModule) wiz.getProperty("generalModule");
|
GeneralReportModule generalReport = (GeneralReportModule) wiz.getProperty("generalModule");
|
||||||
FileReportModule fileReport = (FileReportModule) wiz.getProperty("fileModule");
|
FileReportModule fileReport = (FileReportModule) wiz.getProperty("fileModule");
|
||||||
if (tableReport != null) {
|
try {
|
||||||
generator.generateTableReport(tableReport, (Map<BlackboardArtifact.Type, Boolean>) wiz.getProperty("artifactStates"), (Map<String, Boolean>) wiz.getProperty("tagStates")); //NON-NLS
|
if (tableReport != null) {
|
||||||
} else if (generalReport != null) {
|
generator.generateTableReport(tableReport, (Map<BlackboardArtifact.Type, Boolean>) wiz.getProperty("artifactStates"), (Map<String, Boolean>) wiz.getProperty("tagStates")); //NON-NLS
|
||||||
generator.generateGeneralReport(generalReport);
|
} else if (generalReport != null) {
|
||||||
} else if (fileReport != null) {
|
generator.generateGeneralReport(generalReport);
|
||||||
generator.generateFileListReport(fileReport, (Map<FileReportDataTypes, Boolean>) wiz.getProperty("fileReportOptions")); //NON-NLS
|
} else if (fileReport != null) {
|
||||||
|
generator.generateFileListReport(fileReport, (Map<FileReportDataTypes, Boolean>) wiz.getProperty("fileReportOptions")); //NON-NLS
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
NotifyDescriptor descriptor = new NotifyDescriptor.Message(e.getMessage(), NotifyDescriptor.ERROR_MESSAGE);
|
||||||
|
DialogDisplayer.getDefault().notify(descriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013-16 Basis Technology Corp.
|
* Copyright 2013-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -40,7 +40,6 @@ import java.util.logging.Level;
|
|||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.casemodule.services.TagsManager;
|
import org.sleuthkit.autopsy.casemodule.services.TagsManager;
|
||||||
import org.sleuthkit.autopsy.coreutils.EscapeUtil;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
import org.sleuthkit.autopsy.datamodel.ContentUtils;
|
||||||
@ -666,8 +665,7 @@ class TableReportGenerator {
|
|||||||
tableModule.startTable(columnHeaderNames);
|
tableModule.startTable(columnHeaderNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
String previewreplace = EscapeUtil.escapeHtml(preview);
|
tableModule.addRow(Arrays.asList(new String[]{preview, uniquePath, tagsList}));
|
||||||
tableModule.addRow(Arrays.asList(new String[]{previewreplace.replaceAll("<!", ""), uniquePath, tagsList}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finish the current data type
|
// Finish the current data type
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2017 Basis Technology Corp.
|
* Copyright 2017-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -28,13 +28,14 @@ import org.sleuthkit.autopsy.core.UserPreferences;
|
|||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
|
||||||
@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardOpenAction")
|
@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardOpenAction")
|
||||||
@ActionReference(path = "Menu/Tools", position = 104)
|
@ActionReference(path = "Menu/Tools", position = 201)
|
||||||
@ActionRegistration(displayName = "#CTL_AutoIngestDashboardOpenAction", lazy = false)
|
@ActionRegistration(displayName = "#CTL_AutoIngestDashboardOpenAction", lazy = false)
|
||||||
@Messages({"CTL_AutoIngestDashboardOpenAction=Auto Ingest Dashboard"})
|
@Messages({"CTL_AutoIngestDashboardOpenAction=Auto Ingest Dashboard"})
|
||||||
public final class AutoIngestDashboardOpenAction extends CallableSystemAction {
|
public final class AutoIngestDashboardOpenAction extends CallableSystemAction {
|
||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardOpenAction.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardOpenAction.class.getName());
|
||||||
private static final String DISPLAY_NAME = Bundle.CTL_AutoIngestDashboardOpenAction();
|
private static final String DISPLAY_NAME = Bundle.CTL_AutoIngestDashboardOpenAction();
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEnabled() {
|
public boolean isEnabled() {
|
||||||
|
@ -220,7 +220,7 @@ public enum FileTypeUtils {
|
|||||||
* mimetype could not be detected.
|
* mimetype could not be detected.
|
||||||
*/
|
*/
|
||||||
static boolean hasDrawableMIMEType(AbstractFile file) throws FileTypeDetector.FileTypeDetectorInitException {
|
static boolean hasDrawableMIMEType(AbstractFile file) throws FileTypeDetector.FileTypeDetectorInitException {
|
||||||
String mimeType = getFileTypeDetector().detectMIMEType(file).toLowerCase();
|
String mimeType = getFileTypeDetector().getMIMEType(file).toLowerCase();
|
||||||
return isDrawableMimeType(mimeType) || (mimeType.equals("audio/x-aiff") && "tiff".equalsIgnoreCase(file.getNameExtension()));
|
return isDrawableMimeType(mimeType) || (mimeType.equals("audio/x-aiff") && "tiff".equalsIgnoreCase(file.getNameExtension()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,7 +235,7 @@ public enum FileTypeUtils {
|
|||||||
*/
|
*/
|
||||||
public static boolean hasVideoMIMEType(AbstractFile file) {
|
public static boolean hasVideoMIMEType(AbstractFile file) {
|
||||||
try {
|
try {
|
||||||
String mimeType = getFileTypeDetector().detectMIMEType(file).toLowerCase();
|
String mimeType = getFileTypeDetector().getMIMEType(file).toLowerCase();
|
||||||
return mimeType.startsWith("video/") || videoMimeTypes.contains(mimeType);
|
return mimeType.startsWith("video/") || videoMimeTypes.contains(mimeType);
|
||||||
} catch (FileTypeDetector.FileTypeDetectorInitException ex) {
|
} catch (FileTypeDetector.FileTypeDetectorInitException ex) {
|
||||||
LOGGER.log(Level.SEVERE, "Error determining MIME type of " + getContentPathSafe(file), ex);
|
LOGGER.log(Level.SEVERE, "Error determining MIME type of " + getContentPathSafe(file), ex);
|
||||||
|
@ -365,81 +365,84 @@ class GlobalListsManagementPanel extends javax.swing.JPanel implements OptionsPa
|
|||||||
chooser.addChoosableFileFilter(autopsyFilter);
|
chooser.addChoosableFileFilter(autopsyFilter);
|
||||||
chooser.addChoosableFileFilter(encaseFilter);
|
chooser.addChoosableFileFilter(encaseFilter);
|
||||||
chooser.setAcceptAllFileFilterUsed(false);
|
chooser.setAcceptAllFileFilterUsed(false);
|
||||||
|
chooser.setMultiSelectionEnabled(true);
|
||||||
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
|
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
|
||||||
|
|
||||||
String listName = null;
|
String listName = null;
|
||||||
int returnVal = chooser.showOpenDialog(this);
|
int returnVal = chooser.showOpenDialog(this);
|
||||||
if (returnVal == JFileChooser.APPROVE_OPTION) {
|
if (returnVal == JFileChooser.APPROVE_OPTION) {
|
||||||
File selFile = chooser.getSelectedFile();
|
File[] selFiles = chooser.getSelectedFiles();
|
||||||
if (selFile == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//force append extension if not given
|
for (File file : selFiles) {
|
||||||
String fileAbs = selFile.getAbsolutePath();
|
if (file == null) {
|
||||||
|
continue;
|
||||||
final KeywordSearchList reader;
|
}
|
||||||
|
|
||||||
if (KeywordSearchUtil.isXMLList(fileAbs)) {
|
//force append extension if not given
|
||||||
reader = new XmlKeywordSearchList(fileAbs);
|
String fileAbs = file.getAbsolutePath();
|
||||||
} else {
|
final KeywordSearchList reader;
|
||||||
reader = new EnCaseKeywordSearchList(fileAbs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!reader.load()) {
|
|
||||||
KeywordSearchUtil.displayDialog(
|
|
||||||
NbBundle.getMessage(this.getClass(), "KeywordSearch.listImportFeatureTitle"), NbBundle.getMessage(this.getClass(), "KeywordSearch.importListFileDialogMsg", fileAbs), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<KeywordList> toImport = reader.getListsL();
|
|
||||||
List<KeywordList> toImportConfirmed = new ArrayList<>();
|
|
||||||
|
|
||||||
final XmlKeywordSearchList writer = XmlKeywordSearchList.getCurrent();
|
|
||||||
|
|
||||||
for (KeywordList list : toImport) {
|
|
||||||
//check name collisions
|
|
||||||
listName = list.getName();
|
|
||||||
if (writer.listExists(listName)) {
|
|
||||||
String[] options;
|
|
||||||
if (toImport.size() == 1) { //only give them cancel and yes buttons for single list imports
|
|
||||||
options = new String[]{NbBundle.getMessage(this.getClass(), "KeywordSearch.yesOwMsg"),
|
|
||||||
NbBundle.getMessage(this.getClass(), "KeywordSearch.cancelImportMsg")};
|
|
||||||
} else {
|
|
||||||
options = new String[]{NbBundle.getMessage(this.getClass(), "KeywordSearch.yesOwMsg"),
|
|
||||||
NbBundle.getMessage(this.getClass(), "KeywordSearch.noSkipMsg"),
|
|
||||||
NbBundle.getMessage(this.getClass(), "KeywordSearch.cancelImportMsg")};
|
|
||||||
}
|
|
||||||
int choice = JOptionPane.showOptionDialog(this,
|
|
||||||
NbBundle.getMessage(this.getClass(), "KeywordSearch.overwriteListPrompt", listName),
|
|
||||||
NbBundle.getMessage(this.getClass(), "KeywordSearch.importOwConflict"),
|
|
||||||
JOptionPane.YES_NO_CANCEL_OPTION,
|
|
||||||
JOptionPane.QUESTION_MESSAGE,
|
|
||||||
null,
|
|
||||||
options,
|
|
||||||
options[0]);
|
|
||||||
if (choice == JOptionPane.OK_OPTION) {
|
|
||||||
toImportConfirmed.add(list);
|
|
||||||
} else if (choice == JOptionPane.CANCEL_OPTION) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (KeywordSearchUtil.isXMLList(fileAbs)) {
|
||||||
|
reader = new XmlKeywordSearchList(fileAbs);
|
||||||
} else {
|
} else {
|
||||||
//no conflict
|
reader = new EnCaseKeywordSearchList(fileAbs);
|
||||||
toImportConfirmed.add(list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
if (!reader.load()) {
|
||||||
|
KeywordSearchUtil.displayDialog(
|
||||||
|
NbBundle.getMessage(this.getClass(), "KeywordSearch.listImportFeatureTitle"), NbBundle.getMessage(this.getClass(), "KeywordSearch.importListFileDialogMsg", fileAbs), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (toImportConfirmed.isEmpty()) {
|
List<KeywordList> toImport = reader.getListsL();
|
||||||
return;
|
List<KeywordList> toImportConfirmed = new ArrayList<>();
|
||||||
}
|
|
||||||
|
|
||||||
if (!writer.writeLists(toImportConfirmed)) {
|
final XmlKeywordSearchList writer = XmlKeywordSearchList.getCurrent();
|
||||||
KeywordSearchUtil.displayDialog(
|
|
||||||
NbBundle.getMessage(this.getClass(), "KeywordSearch.listImportFeatureTitle"), NbBundle.getMessage(this.getClass(), "KeywordSearch.kwListFailImportMsg"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO);
|
for (KeywordList list : toImport) {
|
||||||
|
//check name collisions
|
||||||
|
listName = list.getName();
|
||||||
|
if (writer.listExists(listName)) {
|
||||||
|
String[] options;
|
||||||
|
if (toImport.size() == 1) { //only give them cancel and yes buttons for single list imports
|
||||||
|
options = new String[]{NbBundle.getMessage(this.getClass(), "KeywordSearch.yesOwMsg"),
|
||||||
|
NbBundle.getMessage(this.getClass(), "KeywordSearch.cancelImportMsg")};
|
||||||
|
} else {
|
||||||
|
options = new String[]{NbBundle.getMessage(this.getClass(), "KeywordSearch.yesOwMsg"),
|
||||||
|
NbBundle.getMessage(this.getClass(), "KeywordSearch.noSkipMsg"),
|
||||||
|
NbBundle.getMessage(this.getClass(), "KeywordSearch.cancelImportMsg")};
|
||||||
|
}
|
||||||
|
int choice = JOptionPane.showOptionDialog(this,
|
||||||
|
NbBundle.getMessage(this.getClass(), "KeywordSearch.overwriteListPrompt", listName),
|
||||||
|
NbBundle.getMessage(this.getClass(), "KeywordSearch.importOwConflict"),
|
||||||
|
JOptionPane.YES_NO_CANCEL_OPTION,
|
||||||
|
JOptionPane.QUESTION_MESSAGE,
|
||||||
|
null,
|
||||||
|
options,
|
||||||
|
options[0]);
|
||||||
|
if (choice == JOptionPane.OK_OPTION) {
|
||||||
|
toImportConfirmed.add(list);
|
||||||
|
} else if (choice == JOptionPane.CANCEL_OPTION) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//no conflict
|
||||||
|
toImportConfirmed.add(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (toImportConfirmed.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!writer.writeLists(toImportConfirmed)) {
|
||||||
|
KeywordSearchUtil.displayDialog(
|
||||||
|
NbBundle.getMessage(this.getClass(), "KeywordSearch.listImportFeatureTitle"), NbBundle.getMessage(this.getClass(), "KeywordSearch.kwListFailImportMsg"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO);
|
||||||
|
}
|
||||||
|
ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_KEYWORD_LIST_PATH_KEY, file.getParent());
|
||||||
}
|
}
|
||||||
ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_KEYWORD_LIST_PATH_KEY, selFile.getParent());
|
|
||||||
}
|
}
|
||||||
tableModel.resync();
|
tableModel.resync();
|
||||||
|
|
||||||
|
@ -511,7 +511,7 @@ public final class KeywordSearchIngestModule implements FileIngestModule {
|
|||||||
if (context.fileIngestIsCancelled()) {
|
if (context.fileIngestIsCancelled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String fileType = fileTypeDetector.detectMIMEType(aFile);
|
String fileType = fileTypeDetector.getMIMEType(aFile);
|
||||||
|
|
||||||
// we skip archive formats that are opened by the archive module.
|
// we skip archive formats that are opened by the archive module.
|
||||||
// @@@ We could have a check here to see if the archive module was enabled though...
|
// @@@ We could have a check here to see if the archive module was enabled though...
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#Updated by build script
|
#Updated by build script
|
||||||
#Fri, 05 Jan 2018 10:31:22 -0500
|
#Tue, 23 Jan 2018 11:28:07 -0500
|
||||||
LBL_splash_window_title=Starting Autopsy
|
LBL_splash_window_title=Starting Autopsy
|
||||||
SPLASH_HEIGHT=314
|
SPLASH_HEIGHT=314
|
||||||
SPLASH_WIDTH=538
|
SPLASH_WIDTH=538
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#Updated by build script
|
#Updated by build script
|
||||||
#Fri, 05 Jan 2018 10:31:22 -0500
|
#Tue, 23 Jan 2018 11:28:07 -0500
|
||||||
CTL_MainWindow_Title=Autopsy 4.5.0
|
CTL_MainWindow_Title=Autopsy 4.5.0
|
||||||
CTL_MainWindow_Title_No_Project=Autopsy 4.5.0
|
CTL_MainWindow_Title_No_Project=Autopsy 4.5.0
|
||||||
|
24
build.xml
@ -32,7 +32,10 @@
|
|||||||
</condition>
|
</condition>
|
||||||
<condition property="os.family" value="windows">
|
<condition property="os.family" value="windows">
|
||||||
<os family="windows"/>
|
<os family="windows"/>
|
||||||
</condition>
|
</condition>
|
||||||
|
<condition property="os.family" value="mac">
|
||||||
|
<os family="mac"/>
|
||||||
|
</condition>
|
||||||
<import file="build-${os.family}.xml"/>
|
<import file="build-${os.family}.xml"/>
|
||||||
|
|
||||||
<!-- Third party tools dependencies -->
|
<!-- Third party tools dependencies -->
|
||||||
@ -82,7 +85,13 @@
|
|||||||
<copy file="${basedir}/LICENSE-2.0.txt" tofile="${zip-tmp}/${app.name}/LICENSE-2.0.txt"/>
|
<copy file="${basedir}/LICENSE-2.0.txt" tofile="${zip-tmp}/${app.name}/LICENSE-2.0.txt"/>
|
||||||
<copy file="${basedir}/NEWS.txt" tofile="${zip-tmp}/${app.name}/NEWS.txt"/>
|
<copy file="${basedir}/NEWS.txt" tofile="${zip-tmp}/${app.name}/NEWS.txt"/>
|
||||||
<copy file="${basedir}/KNOWN_ISSUES.txt" tofile="${zip-tmp}/${app.name}/KNOWN_ISSUES.txt"/>
|
<copy file="${basedir}/KNOWN_ISSUES.txt" tofile="${zip-tmp}/${app.name}/KNOWN_ISSUES.txt"/>
|
||||||
<unzip src="${thirdparty.dir}/gstreamer/${os.family}/i386/0.10.7/gstreamer.zip" dest="${zip-tmp}/${app.name}/gstreamer"/>
|
<if>
|
||||||
|
<equals arg1="${os.family}" arg2="windows"/>
|
||||||
|
<then>
|
||||||
|
<unzip src="${thirdparty.dir}/gstreamer/${os.family}/i386/0.10.7/gstreamer.zip" dest="${zip-tmp}/${app.name}/gstreamer"/>
|
||||||
|
</then>
|
||||||
|
</if>
|
||||||
|
|
||||||
<copy file="${basedir}/icons/icon.ico" tofile="${zip-tmp}/${app.name}/icon.ico" overwrite="true"/>
|
<copy file="${basedir}/icons/icon.ico" tofile="${zip-tmp}/${app.name}/icon.ico" overwrite="true"/>
|
||||||
|
|
||||||
<!-- Copy the Autopsy documentation to the docs folder -->
|
<!-- Copy the Autopsy documentation to the docs folder -->
|
||||||
@ -91,8 +100,17 @@
|
|||||||
</copy>
|
</copy>
|
||||||
|
|
||||||
<property name="app.property.file" value="${zip-tmp}/${app.name}/etc/${app.name}.conf" />
|
<property name="app.property.file" value="${zip-tmp}/${app.name}/etc/${app.name}.conf" />
|
||||||
|
<var name="jvm-value" value="--branding ${app.name} -J-Xms24m -J-Xmx4G -J-Xverify:none -J-XX:+UseG1GC -J-XX:+UseStringDeduplication"/>
|
||||||
<!-- for Japanese localized version add option: -Duser.language=ja -->
|
<!-- for Japanese localized version add option: -Duser.language=ja -->
|
||||||
<property name="jvm.options" value=""--branding ${app.name} -J-Xms24m -J-Xmx4G -J-XX:MaxPermSize=128M -J-Xverify:none -J-XX:+UseG1GC -J-XX:+UseStringDeduplication -J-Xdock:name=${app.title}"" />
|
<if>
|
||||||
|
<equals arg1="${os.family}" arg2="mac"/>
|
||||||
|
<then>
|
||||||
|
<property name="jvm.options" value=""${jvm-value} -J-Xdock:name=${app.title}""/>
|
||||||
|
</then>
|
||||||
|
<else>
|
||||||
|
<property name="jvm.options" value=""${jvm-value}""/>
|
||||||
|
</else>
|
||||||
|
</if>
|
||||||
<propertyfile file="${app.property.file}">
|
<propertyfile file="${app.property.file}">
|
||||||
<!-- Note: can be higher on 64 bit systems, should be in sync with project.properties -->
|
<!-- Note: can be higher on 64 bit systems, should be in sync with project.properties -->
|
||||||
<entry key="default_options" value="@JVM_OPTIONS" />
|
<entry key="default_options" value="@JVM_OPTIONS" />
|
||||||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
BIN
docs/doxygen-user/images/live_triage_case.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
docs/doxygen-user/images/live_triage_dialog.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
docs/doxygen-user/images/live_triage_ds.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
docs/doxygen-user/images/live_triage_script.png
Normal file
After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 16 KiB |
33
docs/doxygen-user/live_triage.dox
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*! \page live_triage_page Live Triage
|
||||||
|
|
||||||
|
\section live_triage_overview Overview
|
||||||
|
|
||||||
|
The Live Triage feature allows you to load Autopsy onto a removable drive to run on target systems while making minimal changes to that target system. This will currently only work on Windows systems.
|
||||||
|
|
||||||
|
\section live_triage_create_drive Creating a live triage drive
|
||||||
|
|
||||||
|
To create a live triage drive, go to Tools->Make Live Triage Drive to bring up the main dialog.
|
||||||
|
|
||||||
|
\image html live_triage_dialog.png
|
||||||
|
|
||||||
|
Select the drive you want to use - any type of USB storage device will work. For best results use the fastest drive available. Once the process is complete the root folder will contain an Autopsy folder and a RunFromUSB.bat file.
|
||||||
|
|
||||||
|
\section live_triage_usage Running Autopsy from the live triage drive
|
||||||
|
|
||||||
|
Insert the drive into the target machine and browse to it in Windows Explorer. Right click on RunFromUSB.bat and select "Run as administrator". This is necessary to analyze the local drives.
|
||||||
|
|
||||||
|
\image html live_triage_script.png
|
||||||
|
|
||||||
|
Running the script will generate a few more directories on the USB drive. The configData directory stores all the data used by Autopsy - primarily configuration files and temporary files. You can make changes to the Autopsy settings and they will persist between runs. The cases directory is created as a recommended place to save your case data. You will need to browse to it when creating a case in Autopsy.
|
||||||
|
|
||||||
|
Once Autopsy is running, proceed to create a case as normal, making sure to save it on the USB drive.
|
||||||
|
|
||||||
|
\image html live_triage_case.png
|
||||||
|
|
||||||
|
Then choose the Local Disk data source and select the desired drive.
|
||||||
|
|
||||||
|
\image html live_triage_ds.png
|
||||||
|
|
||||||
|
See the \ref ds_local page for more information on local disk data sources.
|
||||||
|
|
||||||
|
*/
|
@ -60,6 +60,7 @@ The following topics are available here:
|
|||||||
- \subpage windows_authentication
|
- \subpage windows_authentication
|
||||||
- \subpage multiuser_sec_page
|
- \subpage multiuser_sec_page
|
||||||
- \subpage multiuser_page
|
- \subpage multiuser_page
|
||||||
|
- \subpage live_triage_page
|
||||||
- \subpage advanced_page
|
- \subpage advanced_page
|
||||||
|
|
||||||
If the topic you need is not listed, refer to the <a href="http://wiki.sleuthkit.org/index.php?title=Autopsy_User%27s_Guide">Autopsy Wiki</a> or join the <a href="https://lists.sourceforge.net/lists/listinfo/sleuthkit-users">SleuthKit User List</a> at SourceForge.
|
If the topic you need is not listed, refer to the <a href="http://wiki.sleuthkit.org/index.php?title=Autopsy_User%27s_Guide">Autopsy Wiki</a> or join the <a href="https://lists.sourceforge.net/lists/listinfo/sleuthkit-users">SleuthKit User List</a> at SourceForge.
|
||||||
|
281
ruleset.xml
@ -1,13 +1,280 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<ruleset name="Custom ruleset"
|
<ruleset name="Autopsy ruleset"
|
||||||
xmlns="http://pmd.sf.net/ruleset/1.0.0"
|
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
|
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
|
||||||
xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
|
|
||||||
<description>
|
<description>
|
||||||
Ruleset used by Autopsy
|
Ruleset used by Autopsy
|
||||||
</description>
|
</description>
|
||||||
|
<rule ref="rulesets/java/basic.xml/SimplifiedTernary"/>
|
||||||
<rule ref="rulesets/java/unusedcode.xml"/>
|
<rule ref="rulesets/java/basic.xml/AvoidUsingOctalValues"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/BigIntegerInstantiation"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/ClassCastExceptionWithToArray"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/ForLoopShouldBeWhileLoop"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/CheckResultSet"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/UnconditionalIfStatement"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/CheckSkipResult"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/DontUseFloatTypeForLoopIndices"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/MisplacedNullCheck"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/AvoidDecimalLiteralsInBigDecimalConstructor"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/BooleanInstantiation"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/ExtendsObject"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/AvoidBranchingStatementAsLastInLoop"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/DoubleCheckedLocking"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/ReturnFromFinallyBlock"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/AvoidThreadGroup"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/CollapsibleIfStatements"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/AvoidUsingHardCodedIP"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/CheckResultSet"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/DontCallThreadRun"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/BrokenNullCheck"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/AvoidMultipleUnaryOperators"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/OverrideBothEqualsAndHashcode"/>
|
||||||
|
<rule ref="rulesets/java/basic.xml/JumbledIncrementer"/>
|
||||||
|
<rule ref="rulesets/java/braces.xml/WhileLoopsMustUseBraces"/>
|
||||||
|
<rule ref="rulesets/java/braces.xml/IfStmtsMustUseBraces"/>
|
||||||
|
<rule ref="rulesets/java/braces.xml/IfElseStmtsMustUseBraces"/>
|
||||||
|
<rule ref="rulesets/java/braces.xml/ForLoopsMustUseBraces"/>
|
||||||
|
<rule ref="rulesets/java/clone.xml/ProperCloneImplementation"/>
|
||||||
|
<rule ref="rulesets/java/clone.xml/CloneThrowsCloneNotSupportedException"/>
|
||||||
|
<rule ref="rulesets/java/clone.xml/CloneMethodMustImplementCloneable"/>
|
||||||
|
<rule ref="rulesets/java/clone.xml/CloneMethodReturnTypeMustMatchClassName"/>
|
||||||
|
<rule ref="rulesets/java/clone.xml/CloneMethodMustBePublic"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/NPathComplexity"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/ExcessiveMethodLength"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/ExcessiveParameterList"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/ExcessiveClassLength"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/CyclomaticComplexity"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/StdCyclomaticComplexity"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/ModifiedCyclomaticComplexity"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/ExcessivePublicCount"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/TooManyFields"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/NcssMethodCount"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/NcssTypeCount"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/NcssConstructorCount"/>
|
||||||
|
<rule ref="rulesets/java/codesize.xml/TooManyMethods"/>
|
||||||
|
<rule ref="rulesets/java/comments.xml/CommentRequired">
|
||||||
|
<properties>
|
||||||
|
<!-- Disabled because we have lots of undocumented fields -->
|
||||||
|
<property name="fieldCommentRequirement" value="Unwanted"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
<!-- Commented out because it was flagged some of our header / copyright comments
|
||||||
|
<rule ref="rulesets/java/comments.xml/CommentSize"/> -->
|
||||||
|
<rule ref="rulesets/java/comments.xml/CommentContent"/>
|
||||||
|
<rule ref="rulesets/java/comments.xml/CommentDefaultAccessModifier"/>
|
||||||
|
<!--
|
||||||
|
Commented out because they are controversial and we want basics right now.
|
||||||
|
<rule ref="rulesets/java/controversial.xml/NullAssignment"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/OnlyOneReturn"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/AssignmentInOperand"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/AtLeastOneConstructor"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/DontImportSun"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/SuspiciousOctalEscape"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/CallSuperInConstructor"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/UnnecessaryParentheses"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/DataflowAnomalyAnalysis"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/AvoidFinalLocalVariable"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/AvoidUsingShortType"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/AvoidUsingVolatile"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/AvoidUsingNativeCode"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/AvoidAccessibilityAlteration"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/DoNotCallGarbageCollectionExplicitly"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/AvoidPrefixingMethodParameters"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/AvoidLiteralsInIfCondition"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/UseObjectForClearerAPI"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/UseConcurrentHashMap"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/OneDeclarationPerLine"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/DefaultPackage"/>
|
||||||
|
<rule ref="rulesets/java/controversial.xml/UnnecessaryConstructor"/>
|
||||||
|
-->
|
||||||
|
<rule ref="rulesets/java/coupling.xml/CouplingBetweenObjects"/>
|
||||||
|
<rule ref="rulesets/java/coupling.xml/ExcessiveImports"/>
|
||||||
|
<rule ref="rulesets/java/coupling.xml/LooseCoupling"/>
|
||||||
|
<rule ref="rulesets/java/coupling.xml/LoosePackageCoupling"/>
|
||||||
|
<!-- Commented out because we have not enforced this in the past
|
||||||
|
<rule ref="rulesets/java/coupling.xml/LawOfDemeter"/> -->
|
||||||
|
<rule ref="rulesets/java/design.xml/UseUtilityClass"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AvoidDeeplyNestedIfStmts"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/SwitchDensity"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/ConstructorCallsOverridableMethod"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AccessorClassGeneration"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/FinalFieldCouldBeStatic"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/CloseResource"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/NonStaticInitializer"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/DefaultLabelNotLastInSwitchStmt"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/OptimizableToArrayCall"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/BadComparison"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/ConfusingTernary"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/InstantiationToGetClass"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/IdempotentOperations"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/SimpleDateFormatNeedsLocale"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/ImmutableField"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/UseLocaleWithCaseConversions"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AvoidProtectedFieldInFinalClass"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AvoidSynchronizedAtMethodLevel"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/UseNotifyAllInsteadOfNotify"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AbstractClassWithoutAbstractMethod"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/SimplifyConditional"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/PositionLiteralsFirstInCaseInsensitiveComparisons"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/UnnecessaryLocalBeforeReturn"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/NonThreadSafeSingleton"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/SingleMethodSingleton"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/SingletonClassReturningNewInstance"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/UncommentedEmptyConstructor"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AvoidConstantsInterface"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/UnsynchronizedStaticDateFormatter"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/PreserveStackTrace"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/UseCollectionIsEmpty"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/ClassWithOnlyPrivateConstructorsShouldBeFinal"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/EmptyMethodInAbstractClassShouldBeAbstract"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/ReturnEmptyArrayRatherThanNull"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AbstractClassWithoutAnyMethod"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/TooFewBranchesForASwitchStatement"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/UseVarargs"/>
|
||||||
|
<!-- Commented out because it flagged many of the NetBeans created UI classes that place
|
||||||
|
fields at various places in the class
|
||||||
|
<rule ref="rulesets/java/design.xml/FieldDeclarationsShouldBeAtStartOfClass"/> -->
|
||||||
|
<rule ref="rulesets/java/design.xml/GodClass"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AvoidProtectedMethodInFinalClassNotExtending"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/ConstantsInInterface"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/CompareObjectsWithEquals"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/LogicInversion"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/SingularField"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/SimplifyBooleanReturns"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AvoidInstanceofChecksInCatchClause"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/NonCaseLabelInSwitchStatement"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/NonStaticInitializer"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AvoidReassigningParameters"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/SwitchStmtsShouldHaveDefault"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/MissingBreakInSwitch"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/EqualsNull"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/UncommentedEmptyMethodBody"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/SimplifyBooleanExpressions"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/AssignmentToNonFinalStatic"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/MissingStaticMethodInNonInstantiatableClass"/>
|
||||||
|
<rule ref="rulesets/java/design.xml/PositionLiteralsFirstInComparisons"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptyCatchBlock"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptyWhileStmt"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptyFinallyBlock"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptyIfStmt"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptyStatementNotInLoop"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptyTryBlock"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptyStatementBlock"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptyStaticInitializer"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptyInitializer"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptySwitchStatements"/>
|
||||||
|
<rule ref="rulesets/java/empty.xml/EmptySynchronizedBlock"/>
|
||||||
|
<rule ref="rulesets/java/finalizers.xml/FinalizeOnlyCallsSuperFinalize"/>
|
||||||
|
<rule ref="rulesets/java/finalizers.xml/FinalizeOverloaded"/>
|
||||||
|
<rule ref="rulesets/java/finalizers.xml/FinalizeDoesNotCallSuperFinalize"/>
|
||||||
|
<rule ref="rulesets/java/finalizers.xml/FinalizeShouldBeProtected"/>
|
||||||
|
<rule ref="rulesets/java/finalizers.xml/AvoidCallingFinalize"/>
|
||||||
|
<rule ref="rulesets/java/finalizers.xml/EmptyFinalizer"/>
|
||||||
|
<rule ref="rulesets/java/imports.xml/TooManyStaticImports"/>
|
||||||
|
<rule ref="rulesets/java/imports.xml/UnusedImports"/>
|
||||||
|
<rule ref="rulesets/java/imports.xml/ImportFromSamePackage"/>
|
||||||
|
<rule ref="rulesets/java/imports.xml/DuplicateImports"/>
|
||||||
|
<rule ref="rulesets/java/imports.xml/DontImportJavaLang"/>
|
||||||
|
<rule ref="rulesets/java/imports.xml/UnnecessaryFullyQualifiedName"/>
|
||||||
|
<!-- Disabled because it generated a lot of errors for non-Beans
|
||||||
|
<rule ref="rulesets/java/javabeans.xml/BeanMembersShouldSerialize"/>-->
|
||||||
|
<rule ref="rulesets/java/javabeans.xml/MissingSerialVersionUID"/>
|
||||||
|
<rule ref="rulesets/java/logging-java.xml/MoreThanOneLogger"/>
|
||||||
|
<rule ref="rulesets/java/logging-java.xml/LoggerIsNotStaticFinal"/>
|
||||||
|
<rule ref="rulesets/java/logging-java.xml/SystemPrintln"/>
|
||||||
|
<rule ref="rulesets/java/logging-java.xml/AvoidPrintStackTrace"/>
|
||||||
|
<rule ref="rulesets/java/logging-java.xml/GuardLogStatementJavaUtil"/>
|
||||||
|
<rule ref="rulesets/java/logging-java.xml/InvalidSlf4jMessageFormat"/>
|
||||||
|
<rule ref="rulesets/java/migrating.xml/ReplaceVectorWithList"/>
|
||||||
|
<rule ref="rulesets/java/migrating.xml/ReplaceHashtableWithMap"/>
|
||||||
|
<rule ref="rulesets/java/migrating.xml/ReplaceEnumerationWithIterator"/>
|
||||||
|
<rule ref="rulesets/java/migrating.xml/AvoidEnumAsIdentifier"/>
|
||||||
|
<rule ref="rulesets/java/migrating.xml/AvoidAssertAsIdentifier"/>
|
||||||
|
<rule ref="rulesets/java/migrating.xml/IntegerInstantiation"/>
|
||||||
|
<rule ref="rulesets/java/migrating.xml/ByteInstantiation"/>
|
||||||
|
<rule ref="rulesets/java/migrating.xml/ShortInstantiation"/>
|
||||||
|
<rule ref="rulesets/java/migrating.xml/LongInstantiation"/>
|
||||||
|
<!-- Disabled because it wanted all private static to be caps
|
||||||
|
<rule ref="rulesets/java/naming.xml/VariableNamingConventions"/> -->
|
||||||
|
<rule ref="rulesets/java/naming.xml/AvoidDollarSigns"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/AbstractNaming"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/SuspiciousHashcodeMethodName"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/SuspiciousConstantFieldName"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/SuspiciousEqualsMethodName"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/AvoidFieldNameMatchingTypeName"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/AvoidFieldNameMatchingMethodName"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/MisleadingVariableName"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/ShortClassName"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/ClassNamingConventions"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/MethodNamingConventions"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/GenericsNaming"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/NoPackage"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/MethodWithSameNameAsEnclosingClass"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/ShortVariable"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/LongVariable"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/ShortMethodName"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/BooleanGetMethodName"/>
|
||||||
|
<rule ref="rulesets/java/naming.xml/PackageCase"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/LocalVariableCouldBeFinal"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/MethodArgumentCouldBeFinal"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/AvoidInstantiatingObjectsInLoops"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/UseArrayListInsteadOfVector"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/SimplifyStartsWith"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/UseStringBufferForStringAppends"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/UseArraysAsList"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/AvoidArrayLoops"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/UnnecessaryWrapperObjectCreation"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/AddEmptyString"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/RedundantFieldInitializer"/>
|
||||||
|
<rule ref="rulesets/java/optimizations.xml/PrematureDeclaration"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/SignatureDeclareThrowsException"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/AvoidCatchingThrowable"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/ExceptionAsFlowControl"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/AvoidCatchingNPE"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/AvoidRethrowingException"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/DoNotExtendJavaLangError"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/DoNotThrowExceptionInFinally"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/AvoidThrowingNewInstanceOfSameException"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/AvoidLosingExceptionInformation"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/AvoidCatchingGenericException"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/AvoidThrowingRawExceptionTypes"/>
|
||||||
|
<rule ref="rulesets/java/strictexception.xml/AvoidThrowingNullPointerException"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/AvoidDuplicateLiterals"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/InefficientStringBuffering"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/AppendCharacterWithChar"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/ConsecutiveAppendsShouldReuse"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/ConsecutiveLiteralAppends"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/UseIndexOfChar"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/InefficientEmptyStringCheck"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/InsufficientStringBufferDeclaration"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/UselessStringValueOf"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/StringBufferInstantiationWithChar"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/AvoidStringBufferField"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/StringInstantiation"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/UseEqualsToCompareStrings"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/StringToString"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/UseStringBufferLength"/>
|
||||||
|
<rule ref="rulesets/java/strings.xml/UnnecessaryCaseChange"/>
|
||||||
|
<rule ref="rulesets/java/sunsecure.xml/MethodReturnsInternalArray"/>
|
||||||
|
<rule ref="rulesets/java/sunsecure.xml/ArrayIsStoredDirectly"/>
|
||||||
|
<rule ref="rulesets/java/typeresolution.xml/LooseCoupling"/>
|
||||||
|
<rule ref="rulesets/java/typeresolution.xml/CloneMethodMustImplementCloneable"/>
|
||||||
|
<rule ref="rulesets/java/typeresolution.xml/UnusedImports"/>
|
||||||
|
<rule ref="rulesets/java/typeresolution.xml/SignatureDeclareThrowsException"/>
|
||||||
|
<rule ref="rulesets/java/unnecessary.xml/UnnecessaryConversionTemporary"/>
|
||||||
|
<rule ref="rulesets/java/unnecessary.xml/UnnecessaryFinalModifier"/>
|
||||||
|
<rule ref="rulesets/java/unnecessary.xml/UselessOverridingMethod"/>
|
||||||
|
<rule ref="rulesets/java/unnecessary.xml/UnusedNullCheckInEquals"/>
|
||||||
|
<rule ref="rulesets/java/unnecessary.xml/UselessParentheses"/>
|
||||||
|
<rule ref="rulesets/java/unnecessary.xml/UselessQualifiedThis"/>
|
||||||
|
<rule ref="rulesets/java/unnecessary.xml/UselessOperationOnImmutable"/>
|
||||||
|
<rule ref="rulesets/java/unnecessary.xml/UnnecessaryReturn"/>
|
||||||
|
<rule ref="rulesets/java/unusedcode.xml/UnusedModifier"/>
|
||||||
|
<rule ref="rulesets/java/unusedcode.xml/UnusedLocalVariable"/>
|
||||||
|
<!-- Commented out because it flagged many event listeners and other interfaces.
|
||||||
|
<rule ref="rulesets/java/unusedcode.xml/UnusedFormalParameter"/> -->
|
||||||
|
<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateField"/>
|
||||||
|
<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateMethod"/>
|
||||||
|
|
||||||
</ruleset>
|
</ruleset>
|
||||||
|
@ -810,7 +810,7 @@ class TestConfiguration(object):
|
|||||||
if parsed_config.getElementsByTagName("singleUser_golddir"):
|
if parsed_config.getElementsByTagName("singleUser_golddir"):
|
||||||
self.singleUser_gold = parsed_config.getElementsByTagName("singleUser_golddir")[0].getAttribute("value").encode().decode("utf_8")
|
self.singleUser_gold = parsed_config.getElementsByTagName("singleUser_golddir")[0].getAttribute("value").encode().decode("utf_8")
|
||||||
if parsed_config.getElementsByTagName("timing"):
|
if parsed_config.getElementsByTagName("timing"):
|
||||||
self.timing = parsed_config.getElementsByTagName("timing")[0].getAttribute("value").encode().decode("utf_8")
|
self.timing = ("True" == parsed_config.getElementsByTagName("timing")[0].getAttribute("value").encode().decode("utf_8"))
|
||||||
if parsed_config.getElementsByTagName("autopsyPlatform"):
|
if parsed_config.getElementsByTagName("autopsyPlatform"):
|
||||||
self.autopsyPlatform = parsed_config.getElementsByTagName("autopsyPlatform")[0].getAttribute("value").encode().decode("utf_8")
|
self.autopsyPlatform = parsed_config.getElementsByTagName("autopsyPlatform")[0].getAttribute("value").encode().decode("utf_8")
|
||||||
# Multi-user settings
|
# Multi-user settings
|
||||||
@ -1392,7 +1392,7 @@ class Logs(object):
|
|||||||
try:
|
try:
|
||||||
Logs._fill_ingest_data(test_data)
|
Logs._fill_ingest_data(test_data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
Errors.print_error("Error: Unknown fatal error when filling test_config data.")
|
Errors.print_error("Error when filling test_config data.")
|
||||||
Errors.print_error(str(e) + "\n")
|
Errors.print_error(str(e) + "\n")
|
||||||
logging.critical(traceback.format_exc())
|
logging.critical(traceback.format_exc())
|
||||||
# If running in verbose mode (-v)
|
# If running in verbose mode (-v)
|
||||||
@ -1469,7 +1469,6 @@ class Logs(object):
|
|||||||
test_data.heap_space = search_logs("Heap memory usage:", test_data)[0].rstrip().split(": ")[1]
|
test_data.heap_space = search_logs("Heap memory usage:", test_data)[0].rstrip().split(": ")[1]
|
||||||
ingest_line = search_logs("Ingest (including enqueue)", test_data)[0]
|
ingest_line = search_logs("Ingest (including enqueue)", test_data)[0]
|
||||||
test_data.total_ingest_time = get_word_at(ingest_line, 6).rstrip()
|
test_data.total_ingest_time = get_word_at(ingest_line, 6).rstrip()
|
||||||
|
|
||||||
message_line_count = find_msg_in_log_set("Ingest messages count:", test_data)
|
message_line_count = find_msg_in_log_set("Ingest messages count:", test_data)
|
||||||
test_data.indexed_files = message_line_count
|
test_data.indexed_files = message_line_count
|
||||||
|
|
||||||
|