mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-19 02:57:44 +00:00
Merge remote-tracking branch 'upstream/develop' into file-search
This commit is contained in:
commit
f0ce002c04
@ -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 Folder Not Found: {0}
|
||||||
OpenOutputFolder.noCaseOpen=No open case, therefore no current output folder available.
|
OpenOutputFolder.noCaseOpen=No open case, therefore no current case folder available.
|
||||||
OpenOutputFolder.CouldNotOpenOutputFolder=Could not open output folder
|
OpenOutputFolder.CouldNotOpenOutputFolder=Could not open case 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}
|
||||||
|
@ -79,10 +79,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 Folder Not Found: {0}
|
||||||
OpenOutputFolder.noCaseOpen=No open case, therefore no current output folder available.
|
OpenOutputFolder.noCaseOpen=No open case, therefore no current case folder available.
|
||||||
OpenOutputFolder.CouldNotOpenOutputFolder=Could not open output folder
|
OpenOutputFolder.CouldNotOpenOutputFolder=Could not open case folder
|
||||||
# {0} - old tag name
|
# {0} - old tag name
|
||||||
# {1} - artifactID
|
# {1} - artifactID
|
||||||
ReplaceBlackboardArtifactTagAction.replaceTag.alert=Unable to replace tag {0} for artifact {1}.
|
ReplaceBlackboardArtifactTagAction.replaceTag.alert=Unable to replace tag {0} for artifact {1}.
|
||||||
|
@ -76,6 +76,7 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="OpenRecentCasePanel.openButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/casemodule/Bundle.properties" key="OpenRecentCasePanel.openButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="openButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="openButtonActionPerformed"/>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2018 Basis Technology Corp.
|
* Copyright 2011-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -24,7 +24,10 @@ import java.io.File;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.JTable;
|
import javax.swing.JTable;
|
||||||
|
import javax.swing.ListSelectionModel;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
import javax.swing.event.ListSelectionEvent;
|
||||||
|
import javax.swing.event.ListSelectionListener;
|
||||||
import javax.swing.table.AbstractTableModel;
|
import javax.swing.table.AbstractTableModel;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.windows.WindowManager;
|
import org.openide.windows.WindowManager;
|
||||||
@ -51,6 +54,16 @@ class OpenRecentCasePanel extends javax.swing.JPanel {
|
|||||||
*/
|
*/
|
||||||
private OpenRecentCasePanel() {
|
private OpenRecentCasePanel() {
|
||||||
initComponents();
|
initComponents();
|
||||||
|
imagesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||||
|
imagesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
|
||||||
|
@Override
|
||||||
|
public void valueChanged(ListSelectionEvent e) {
|
||||||
|
//enable the ok button when something is selected
|
||||||
|
if (!e.getValueIsAdjusting()){
|
||||||
|
openButton.setEnabled(imagesTable.getSelectedRowCount() > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -90,9 +103,6 @@ class OpenRecentCasePanel extends javax.swing.JPanel {
|
|||||||
// If there are any images, let's select the first one
|
// If there are any images, let's select the first one
|
||||||
if (imagesTable.getRowCount() > 0) {
|
if (imagesTable.getRowCount() > 0) {
|
||||||
imagesTable.setRowSelectionInterval(0, 0);
|
imagesTable.setRowSelectionInterval(0, 0);
|
||||||
openButton.setEnabled(true);
|
|
||||||
} else {
|
|
||||||
openButton.setEnabled(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,6 +261,7 @@ class OpenRecentCasePanel extends javax.swing.JPanel {
|
|||||||
cancelButton.setText(org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class, "OpenRecentCasePanel.cancelButton.text")); // NOI18N
|
cancelButton.setText(org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class, "OpenRecentCasePanel.cancelButton.text")); // NOI18N
|
||||||
|
|
||||||
openButton.setText(org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class, "OpenRecentCasePanel.openButton.text")); // NOI18N
|
openButton.setText(org.openide.util.NbBundle.getMessage(OpenRecentCasePanel.class, "OpenRecentCasePanel.openButton.text")); // NOI18N
|
||||||
|
openButton.setEnabled(false);
|
||||||
openButton.addActionListener(new java.awt.event.ActionListener() {
|
openButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
openButtonActionPerformed(evt);
|
openButtonActionPerformed(evt);
|
||||||
|
@ -754,9 +754,8 @@ public class FileManager implements Closeable {
|
|||||||
* the parent local directory.
|
* the parent local directory.
|
||||||
* @param localFile The local/logical file or directory.
|
* @param localFile The local/logical file or directory.
|
||||||
* @param progressUpdater notifier to receive progress notifications on
|
* @param progressUpdater notifier to receive progress notifications on
|
||||||
* folders added, or null if not used
|
* folders added, or null if not used. Called after
|
||||||
* @param progressUpdater Called after each file/directory is added to the
|
* each file/directory is added to the case database.
|
||||||
* case database.
|
|
||||||
*
|
*
|
||||||
* @return An AbstractFile representation of the local/logical file.
|
* @return An AbstractFile representation of the local/logical file.
|
||||||
*
|
*
|
||||||
|
@ -810,6 +810,13 @@ public class DataContentViewerOtherCases extends JPanel implements DataContentVi
|
|||||||
occurrencePanel.getPreferredSize();
|
occurrencePanel.getPreferredSize();
|
||||||
detailsPanelScrollPane.setViewportView(occurrencePanel);
|
detailsPanelScrollPane.setViewportView(occurrencePanel);
|
||||||
} else {
|
} else {
|
||||||
|
String currentCaseName;
|
||||||
|
try {
|
||||||
|
currentCaseName = Case.getCurrentCaseThrows().getName();
|
||||||
|
} catch (NoCurrentCaseException ex) {
|
||||||
|
currentCaseName = null;
|
||||||
|
LOGGER.log(Level.WARNING, "Unable to get current case for other occurrences content viewer", ex);
|
||||||
|
}
|
||||||
for (CorrelationAttributeInstance corAttr : correlationAttributes) {
|
for (CorrelationAttributeInstance corAttr : correlationAttributes) {
|
||||||
Map<UniquePathKey, OtherOccurrenceNodeInstanceData> correlatedNodeDataMap = new HashMap<>(0);
|
Map<UniquePathKey, OtherOccurrenceNodeInstanceData> correlatedNodeDataMap = new HashMap<>(0);
|
||||||
|
|
||||||
@ -823,7 +830,7 @@ public class DataContentViewerOtherCases extends JPanel implements DataContentVi
|
|||||||
&& casesTableModel.getCorrelationCase(casesTable.convertRowIndexToModel(selectedRow)).getCaseUUID().equals(nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID())) {
|
&& casesTableModel.getCorrelationCase(casesTable.convertRowIndexToModel(selectedRow)).getCaseUUID().equals(nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID())) {
|
||||||
dataSourcesTableModel.addNodeData(nodeData);
|
dataSourcesTableModel.addNodeData(nodeData);
|
||||||
}
|
}
|
||||||
} else {
|
} else if (currentCaseName != null && (casesTableModel.getCorrelationCase(casesTable.convertRowIndexToModel(selectedRow)).getCaseUUID().equals(currentCaseName))) {
|
||||||
dataSourcesTableModel.addNodeData(nodeData);
|
dataSourcesTableModel.addNodeData(nodeData);
|
||||||
}
|
}
|
||||||
} catch (EamDbException ex) {
|
} catch (EamDbException ex) {
|
||||||
@ -1153,8 +1160,14 @@ public class DataContentViewerOtherCases extends JPanel implements DataContentVi
|
|||||||
try {
|
try {
|
||||||
tempCaseUUID = nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID();
|
tempCaseUUID = nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID();
|
||||||
} catch (EamDbException ignored) {
|
} catch (EamDbException ignored) {
|
||||||
tempCaseUUID = UUID_PLACEHOLDER_STRING;
|
//non central repo nodeData won't have a correlation case
|
||||||
//place holder value will be used since correlation attribute was unavailble
|
try {
|
||||||
|
tempCaseUUID = Case.getCurrentCaseThrows().getName();
|
||||||
|
//place holder value will be used since correlation attribute was unavailble
|
||||||
|
} catch (NoCurrentCaseException ex) {
|
||||||
|
LOGGER.log(Level.WARNING, "Unable to get current case", ex);
|
||||||
|
tempCaseUUID = UUID_PLACEHOLDER_STRING;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
caseUUID = tempCaseUUID;
|
caseUUID = tempCaseUUID;
|
||||||
}
|
}
|
||||||
|
@ -21,9 +21,13 @@ package org.sleuthkit.autopsy.centralrepository.contentviewer;
|
|||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.logging.Level;
|
||||||
import javax.swing.table.AbstractTableModel;
|
import javax.swing.table.AbstractTableModel;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model for cells in the data sources section of the other occurrences data
|
* Model for cells in the data sources section of the other occurrences data
|
||||||
@ -32,6 +36,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
|||||||
final class OtherOccurrencesDataSourcesTableModel extends AbstractTableModel {
|
final class OtherOccurrencesDataSourcesTableModel extends AbstractTableModel {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
private static final Logger logger = Logger.getLogger(OtherOccurrencesDataSourcesTableModel.class.getName());
|
||||||
private final Set<DataSourceColumnItem> dataSourceSet = new LinkedHashSet<>();
|
private final Set<DataSourceColumnItem> dataSourceSet = new LinkedHashSet<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -140,8 +145,14 @@ final class OtherOccurrencesDataSourcesTableModel extends AbstractTableModel {
|
|||||||
try {
|
try {
|
||||||
caseUUID = nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID();
|
caseUUID = nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID();
|
||||||
} catch (EamDbException ignored) {
|
} catch (EamDbException ignored) {
|
||||||
caseUUID = DataContentViewerOtherCases.getPlaceholderUUID();
|
//non central repo nodeData won't have a correlation case
|
||||||
//place holder value will be used since correlation attribute was unavailble
|
try {
|
||||||
|
caseUUID = Case.getCurrentCaseThrows().getName();
|
||||||
|
//place holder value will be used since correlation attribute was unavailble
|
||||||
|
} catch (NoCurrentCaseException ex) {
|
||||||
|
logger.log(Level.WARNING, "Unable to get current case", ex);
|
||||||
|
caseUUID = DataContentViewerOtherCases.getPlaceholderUUID();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dataSourceSet.add(new DataSourceColumnItem(nodeData.getCaseName(), nodeData.getDeviceID(), nodeData.getDataSourceName(), caseUUID));
|
dataSourceSet.add(new DataSourceColumnItem(nodeData.getCaseName(), nodeData.getDeviceID(), nodeData.getDataSourceName(), caseUUID));
|
||||||
fireTableDataChanged();
|
fireTableDataChanged();
|
||||||
|
@ -22,10 +22,14 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.logging.Level;
|
||||||
import javax.swing.table.AbstractTableModel;
|
import javax.swing.table.AbstractTableModel;
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model for cells in the files section of the other occurrences data content
|
* Model for cells in the files section of the other occurrences data content
|
||||||
@ -34,6 +38,7 @@ import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
|
|||||||
public class OtherOccurrencesFilesTableModel extends AbstractTableModel {
|
public class OtherOccurrencesFilesTableModel extends AbstractTableModel {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
private static final Logger logger = Logger.getLogger(OtherOccurrencesFilesTableModel.class.getName());
|
||||||
private final List<String> nodeKeys = new ArrayList<>();
|
private final List<String> nodeKeys = new ArrayList<>();
|
||||||
private final Map<String, List<OtherOccurrenceNodeData>> nodeMap = new HashMap<>();
|
private final Map<String, List<OtherOccurrenceNodeData>> nodeMap = new HashMap<>();
|
||||||
|
|
||||||
@ -119,8 +124,14 @@ public class OtherOccurrencesFilesTableModel extends AbstractTableModel {
|
|||||||
try {
|
try {
|
||||||
caseUUID = nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID();
|
caseUUID = nodeData.getCorrelationAttributeInstance().getCorrelationCase().getCaseUUID();
|
||||||
} catch (EamDbException ignored) {
|
} catch (EamDbException ignored) {
|
||||||
caseUUID = DataContentViewerOtherCases.getPlaceholderUUID();
|
//non central repo nodeData won't have a correlation case
|
||||||
//place holder value will be used since correlation attribute was unavailble
|
try {
|
||||||
|
caseUUID = Case.getCurrentCaseThrows().getName();
|
||||||
|
//place holder value will be used since correlation attribute was unavailble
|
||||||
|
} catch (NoCurrentCaseException ex) {
|
||||||
|
logger.log(Level.WARNING, "Unable to get current case", ex);
|
||||||
|
caseUUID = DataContentViewerOtherCases.getPlaceholderUUID();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nodeData.getCaseName() + nodeData.getDataSourceName() + nodeData.getDeviceID() + nodeData.getFilePath() + caseUUID;
|
return nodeData.getCaseName() + nodeData.getDataSourceName() + nodeData.getDeviceID() + nodeData.getFilePath() + caseUUID;
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ final public class CorrelationAttributeNormalizer {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify there are no slashes or invalid domain name characters (such as
|
* Verify there are no slashes or invalid domain name characters (such as
|
||||||
* '?' or \: ). Normalize to lower case.
|
* '?'). Normalize to lower case.
|
||||||
*/
|
*/
|
||||||
private static String normalizeDomain(String data) throws CorrelationAttributeNormalizationException {
|
private static String normalizeDomain(String data) throws CorrelationAttributeNormalizationException {
|
||||||
DomainValidator validator = DomainValidator.getInstance(true);
|
DomainValidator validator = DomainValidator.getInstance(true);
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace pref="65" max="32767" attributes="0"/>
|
<EmptySpace pref="47" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -44,7 +44,7 @@
|
|||||||
<Component id="flagTaggedNotableItemsCheckbox" min="-2" max="-2" attributes="0"/>
|
<Component id="flagTaggedNotableItemsCheckbox" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="flagPreviouslySeenDevicesCheckbox" min="-2" max="-2" attributes="0"/>
|
<Component id="flagPreviouslySeenDevicesCheckbox" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace pref="197" max="32767" attributes="0"/>
|
<EmptySpace pref="47" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
|
@ -88,7 +88,7 @@ final class IngestSettingsPanel extends IngestModuleIngestJobSettingsPanel {
|
|||||||
.addComponent(flagTaggedNotableItemsCheckbox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addComponent(flagTaggedNotableItemsCheckbox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addComponent(flagPreviouslySeenDevicesCheckbox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addComponent(flagPreviouslySeenDevicesCheckbox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addComponent(createCorrelationPropertiesCheckbox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
|
.addComponent(createCorrelationPropertiesCheckbox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
|
||||||
.addContainerGap(65, Short.MAX_VALUE))
|
.addContainerGap(47, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
@ -101,7 +101,7 @@ final class IngestSettingsPanel extends IngestModuleIngestJobSettingsPanel {
|
|||||||
.addComponent(flagTaggedNotableItemsCheckbox)
|
.addComponent(flagTaggedNotableItemsCheckbox)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(flagPreviouslySeenDevicesCheckbox)
|
.addComponent(flagPreviouslySeenDevicesCheckbox)
|
||||||
.addContainerGap(197, Short.MAX_VALUE))
|
.addContainerGap(47, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
@ -57,7 +57,6 @@ ManageCorrelationPropertiesDialog.cancelButton.text=Cancel
|
|||||||
ManageCorrelationPropertiesDialog.okButton.text=OK
|
ManageCorrelationPropertiesDialog.okButton.text=OK
|
||||||
GlobalSettingsPanel.bnManageProperties.text=Manage Correlation Properties
|
GlobalSettingsPanel.bnManageProperties.text=Manage Correlation Properties
|
||||||
EamDbSettingsDialog.lbDatabaseDesc.text=Database File:
|
EamDbSettingsDialog.lbDatabaseDesc.text=Database File:
|
||||||
EamDbSettingsDialog.lbFullDbPath.text=
|
|
||||||
GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository
|
GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository
|
||||||
GlobalSettingsPanel.organizationTextArea.text=Organization information can be tracked in the Central Repository.
|
GlobalSettingsPanel.organizationTextArea.text=Organization information can be tracked in the Central Repository.
|
||||||
GlobalSettingsPanel.manageOrganizationButton.text=Manage Organizations
|
GlobalSettingsPanel.manageOrganizationButton.text=Manage Organizations
|
||||||
@ -84,4 +83,4 @@ ManageCasesDialog.orgLabel.text=Organization:
|
|||||||
ManageCasesDialog.closeButton.text=Close
|
ManageCasesDialog.closeButton.text=Close
|
||||||
ManageCasesDialog.notesLabel.text=Notes:
|
ManageCasesDialog.notesLabel.text=Notes:
|
||||||
ManageCasesDialog.dataSourcesLabel.text=Data Sources:
|
ManageCasesDialog.dataSourcesLabel.text=Data Sources:
|
||||||
ManageCasesDialog.caseInfoLabel.text=Case Info:
|
ManageCasesDialog.caseInfoLabel.text=Case Info:
|
||||||
|
@ -115,7 +115,6 @@ ManageCorrelationPropertiesDialog.cancelButton.text=Cancel
|
|||||||
ManageCorrelationPropertiesDialog.okButton.text=OK
|
ManageCorrelationPropertiesDialog.okButton.text=OK
|
||||||
GlobalSettingsPanel.bnManageProperties.text=Manage Correlation Properties
|
GlobalSettingsPanel.bnManageProperties.text=Manage Correlation Properties
|
||||||
EamDbSettingsDialog.lbDatabaseDesc.text=Database File:
|
EamDbSettingsDialog.lbDatabaseDesc.text=Database File:
|
||||||
EamDbSettingsDialog.lbFullDbPath.text=
|
|
||||||
GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository
|
GlobalSettingsPanel.cbUseCentralRepo.text=Use a Central Repository
|
||||||
GlobalSettingsPanel.organizationTextArea.text=Organization information can be tracked in the Central Repository.
|
GlobalSettingsPanel.organizationTextArea.text=Organization information can be tracked in the Central Repository.
|
||||||
GlobalSettingsPanel.manageOrganizationButton.text=Manage Organizations
|
GlobalSettingsPanel.manageOrganizationButton.text=Manage Organizations
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
</NonVisualComponents>
|
</NonVisualComponents>
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||||
|
<Property name="resizable" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<SyntheticProperties>
|
<SyntheticProperties>
|
||||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||||
@ -35,18 +36,18 @@
|
|||||||
<Component id="pnButtons" max="32767" attributes="0"/>
|
<Component id="pnButtons" max="32767" attributes="0"/>
|
||||||
<Component id="pnSQLiteSettings" alignment="0" max="32767" attributes="0"/>
|
<Component id="pnSQLiteSettings" alignment="0" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
<DimensionLayout dim="1">
|
<DimensionLayout dim="1">
|
||||||
<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="-2" pref="10" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="pnSQLiteSettings" min="-2" max="-2" attributes="0"/>
|
<Component id="pnSQLiteSettings" max="32767" attributes="0"/>
|
||||||
<EmptySpace pref="11" max="32767" attributes="0"/>
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
<Component id="pnButtons" min="-2" max="-2" attributes="0"/>
|
<Component id="pnButtons" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -59,9 +60,9 @@
|
|||||||
<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 max="32767" attributes="0"/>
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
<Component id="bnOk" min="-2" max="-2" attributes="0"/>
|
<Component id="bnOk" linkSize="2" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" pref="11" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="11" max="-2" attributes="0"/>
|
||||||
<Component id="bnCancel" min="-2" max="-2" attributes="0"/>
|
<Component id="bnCancel" linkSize="2" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
@ -85,6 +86,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/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.bnCancel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.bnCancel.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="[79, 23]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[79, 23]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[79, 23]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelActionPerformed"/>
|
||||||
@ -115,43 +125,37 @@
|
|||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="lbHostName" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="lbHostName" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="lbPort" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="lbUserName" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="lbDatabaseType" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="lbDatabaseType" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="lbDatabasePath" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="lbUserName" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="lbPort" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" alignment="0" groupAlignment="1" max="-2" attributes="0">
|
<Group type="103" alignment="0" groupAlignment="1" max="-2" attributes="0">
|
||||||
<Component id="lbDatabasePath" alignment="0" max="32767" attributes="0"/>
|
<Component id="lbDatabaseDesc" alignment="0" max="32767" attributes="0"/>
|
||||||
<Component id="lbUserPassword" alignment="0" max="32767" attributes="0"/>
|
<Component id="lbUserPassword" alignment="0" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<Component id="lbDatabaseDesc" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="lbFullDbPath" max="32767" attributes="0"/>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Group type="102" attributes="0">
|
<Component id="tfDatabasePath" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="cbDatabaseType" min="-2" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<Component id="bnDatabasePathFileOpen" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="lbSingleUserSqLite" pref="467" max="32767" attributes="0"/>
|
|
||||||
<EmptySpace min="-2" pref="9" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Component id="tfDatabasePath" max="32767" attributes="0"/>
|
<Component id="cbDatabaseType" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
<Component id="bnDatabasePathFileOpen" min="-2" max="-2" attributes="0"/>
|
<Component id="lbSingleUserSqLite" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" pref="11" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<Group type="102" alignment="1" attributes="0">
|
|
||||||
<Group type="103" groupAlignment="1" attributes="0">
|
|
||||||
<Component id="tbDbHostname" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="jpDbPassword" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="tbDbUsername" alignment="1" max="32767" attributes="0"/>
|
|
||||||
<Component id="tbDbPort" alignment="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
</Group>
|
||||||
|
<Component id="jpDbPassword" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="tbDbUsername" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="tbDbPort" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="tbDbHostname" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="dataBaseFileScrollPane" alignment="0" min="-2" pref="509" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace min="-2" pref="55" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="55" max="-2" attributes="0"/>
|
||||||
@ -171,40 +175,42 @@
|
|||||||
</Group>
|
</Group>
|
||||||
<Component id="lbDatabaseType" alignment="1" min="-2" max="-2" attributes="0"/>
|
<Component id="lbDatabaseType" alignment="1" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="lbDatabasePath" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="lbDatabasePath" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="tfDatabasePath" alignment="3" min="-2" pref="23" max="-2" attributes="0"/>
|
<Component id="tfDatabasePath" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="bnDatabasePathFileOpen" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="bnDatabasePathFileOpen" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="tbDbHostname" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="tbDbHostname" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="lbHostName" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="lbHostName" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="tbDbPort" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="tbDbPort" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="lbPort" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="lbPort" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="tbDbUsername" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="tbDbUsername" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="lbUserName" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="lbUserName" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="jpDbPassword" min="-2" max="-2" attributes="0"/>
|
<Component id="jpDbPassword" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="lbUserPassword" min="-2" max="-2" attributes="0"/>
|
<Component id="lbUserPassword" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="lbFullDbPath" alignment="3" max="32767" attributes="0"/>
|
<Group type="102" attributes="0">
|
||||||
<Component id="lbDatabaseDesc" alignment="3" max="32767" attributes="0"/>
|
<Component id="lbDatabaseDesc" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="filler1" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Component id="dataBaseFileScrollPane" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="filler1" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -215,6 +221,9 @@
|
|||||||
<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/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbDatabasePath.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbDatabasePath.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 14]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="tfDatabasePath">
|
<Component class="javax.swing.JTextField" name="tfDatabasePath">
|
||||||
@ -225,6 +234,9 @@
|
|||||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.tfDatabasePath.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.tfDatabasePath.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[420, 23]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JButton" name="bnDatabasePathFileOpen">
|
<Component class="javax.swing.JButton" name="bnDatabasePathFileOpen">
|
||||||
@ -242,42 +254,77 @@
|
|||||||
<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/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbHostName.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbHostName.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 14]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="tbDbHostname">
|
<Component class="javax.swing.JTextField" name="tbDbHostname">
|
||||||
|
<Properties>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[509, 20]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="lbPort">
|
<Component class="javax.swing.JLabel" name="lbPort">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbPort.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbPort.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 14]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="tbDbPort">
|
<Component class="javax.swing.JTextField" name="tbDbPort">
|
||||||
|
<Properties>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[509, 20]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="lbUserName">
|
<Component class="javax.swing.JLabel" name="lbUserName">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbUserName.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbUserName.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 14]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="tbDbUsername">
|
<Component class="javax.swing.JTextField" name="tbDbUsername">
|
||||||
|
<Properties>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[509, 20]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="lbUserPassword">
|
<Component class="javax.swing.JLabel" name="lbUserPassword">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbUserPassword.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbUserPassword.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 14]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JPasswordField" name="jpDbPassword">
|
<Component class="javax.swing.JPasswordField" name="jpDbPassword">
|
||||||
|
<Properties>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[509, 20]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JComboBox" name="cbDatabaseType">
|
<Component class="javax.swing.JComboBox" name="cbDatabaseType">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||||
<Connection code="new javax.swing.DefaultComboBoxModel<>(new EamDbPlatformEnum[]{EamDbPlatformEnum.POSTGRESQL, EamDbPlatformEnum.SQLITE})" type="code"/>
|
<Connection code="new javax.swing.DefaultComboBoxModel<>(new EamDbPlatformEnum[]{EamDbPlatformEnum.POSTGRESQL, EamDbPlatformEnum.SQLITE})" type="code"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[120, 20]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbDatabaseTypeActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbDatabaseTypeActionPerformed"/>
|
||||||
@ -291,6 +338,9 @@
|
|||||||
<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/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbSingleUserSqLite.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbSingleUserSqLite.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[381, 14]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="lbDatabaseType">
|
<Component class="javax.swing.JLabel" name="lbDatabaseType">
|
||||||
@ -298,6 +348,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/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbDatabaseType.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbDatabaseType.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, 14]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 14]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[80, 14]"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="lbDatabaseDesc">
|
<Component class="javax.swing.JLabel" name="lbDatabaseDesc">
|
||||||
@ -305,12 +364,8 @@
|
|||||||
<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/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbDatabaseDesc.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbDatabaseDesc.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
</Component>
|
<Dimension value="[80, 14]"/>
|
||||||
<Component class="javax.swing.JLabel" name="lbFullDbPath">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties" key="EamDbSettingsDialog.lbFullDbPath.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -324,6 +379,34 @@
|
|||||||
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.VerticalGlue"/>
|
<AuxValue name="classDetails" type="java.lang.String" value="Box.Filler.VerticalGlue"/>
|
||||||
</AuxValues>
|
</AuxValues>
|
||||||
</Component>
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="dataBaseFileScrollPane">
|
||||||
|
<Properties>
|
||||||
|
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||||
|
<Border info="null"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTextArea" name="dataBaseFileTextArea">
|
||||||
|
<Properties>
|
||||||
|
<Property name="editable" type="boolean" value="false"/>
|
||||||
|
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||||
|
<Color blue="f0" green="f0" red="f0" type="rgb"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="columns" type="int" value="20"/>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||||
|
<Font name="Tahoma" size="11" style="0"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="lineWrap" type="boolean" value="true"/>
|
||||||
|
<Property name="rows" type="int" value="3"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
|
@ -142,12 +142,17 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
lbSingleUserSqLite = new javax.swing.JLabel();
|
lbSingleUserSqLite = new javax.swing.JLabel();
|
||||||
lbDatabaseType = new javax.swing.JLabel();
|
lbDatabaseType = new javax.swing.JLabel();
|
||||||
lbDatabaseDesc = new javax.swing.JLabel();
|
lbDatabaseDesc = new javax.swing.JLabel();
|
||||||
lbFullDbPath = new javax.swing.JLabel();
|
|
||||||
filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767));
|
filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767));
|
||||||
|
dataBaseFileScrollPane = new javax.swing.JScrollPane();
|
||||||
|
dataBaseFileTextArea = new javax.swing.JTextArea();
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
|
setResizable(false);
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(bnCancel, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnCancel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(bnCancel, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnCancel.text")); // NOI18N
|
||||||
|
bnCancel.setMaximumSize(new java.awt.Dimension(79, 23));
|
||||||
|
bnCancel.setMinimumSize(new java.awt.Dimension(79, 23));
|
||||||
|
bnCancel.setPreferredSize(new java.awt.Dimension(79, 23));
|
||||||
bnCancel.addActionListener(new java.awt.event.ActionListener() {
|
bnCancel.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
bnCancelActionPerformed(evt);
|
bnCancelActionPerformed(evt);
|
||||||
@ -169,25 +174,30 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addComponent(bnOk)
|
.addComponent(bnOk)
|
||||||
.addGap(11, 11, 11)
|
.addGap(11, 11, 11)
|
||||||
.addComponent(bnCancel)
|
.addComponent(bnCancel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addContainerGap())
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
pnButtonsLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnCancel, bnOk});
|
||||||
|
|
||||||
pnButtonsLayout.setVerticalGroup(
|
pnButtonsLayout.setVerticalGroup(
|
||||||
pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(pnButtonsLayout.createSequentialGroup()
|
.addGroup(pnButtonsLayout.createSequentialGroup()
|
||||||
.addGap(0, 0, 0)
|
.addGap(0, 0, 0)
|
||||||
.addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(pnButtonsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(bnOk)
|
.addComponent(bnOk)
|
||||||
.addComponent(bnCancel))
|
.addComponent(bnCancel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addGap(0, 0, 0))
|
.addGap(0, 0, 0))
|
||||||
);
|
);
|
||||||
|
|
||||||
pnSQLiteSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder());
|
pnSQLiteSettings.setBorder(javax.swing.BorderFactory.createEtchedBorder());
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabasePath.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(lbDatabasePath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabasePath.text")); // NOI18N
|
||||||
|
lbDatabasePath.setPreferredSize(new java.awt.Dimension(80, 14));
|
||||||
|
|
||||||
tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N
|
tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N
|
||||||
tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N
|
tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N
|
||||||
|
tfDatabasePath.setPreferredSize(new java.awt.Dimension(420, 23));
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N
|
||||||
bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() {
|
bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() {
|
||||||
@ -197,14 +207,27 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
});
|
});
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lbHostName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbHostName.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(lbHostName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbHostName.text")); // NOI18N
|
||||||
|
lbHostName.setPreferredSize(new java.awt.Dimension(80, 14));
|
||||||
|
|
||||||
|
tbDbHostname.setPreferredSize(new java.awt.Dimension(509, 20));
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lbPort, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbPort.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(lbPort, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbPort.text")); // NOI18N
|
||||||
|
lbPort.setPreferredSize(new java.awt.Dimension(80, 14));
|
||||||
|
|
||||||
|
tbDbPort.setPreferredSize(new java.awt.Dimension(509, 20));
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lbUserName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserName.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(lbUserName, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserName.text")); // NOI18N
|
||||||
|
lbUserName.setPreferredSize(new java.awt.Dimension(80, 14));
|
||||||
|
|
||||||
|
tbDbUsername.setPreferredSize(new java.awt.Dimension(509, 20));
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lbUserPassword, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserPassword.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(lbUserPassword, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbUserPassword.text")); // NOI18N
|
||||||
|
lbUserPassword.setPreferredSize(new java.awt.Dimension(80, 14));
|
||||||
|
|
||||||
|
jpDbPassword.setPreferredSize(new java.awt.Dimension(509, 20));
|
||||||
|
|
||||||
cbDatabaseType.setModel(new javax.swing.DefaultComboBoxModel<>(new EamDbPlatformEnum[]{EamDbPlatformEnum.POSTGRESQL, EamDbPlatformEnum.SQLITE}));
|
cbDatabaseType.setModel(new javax.swing.DefaultComboBoxModel<>(new EamDbPlatformEnum[]{EamDbPlatformEnum.POSTGRESQL, EamDbPlatformEnum.SQLITE}));
|
||||||
|
cbDatabaseType.setPreferredSize(new java.awt.Dimension(120, 20));
|
||||||
cbDatabaseType.addActionListener(new java.awt.event.ActionListener() {
|
cbDatabaseType.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
cbDatabaseTypeActionPerformed(evt);
|
cbDatabaseTypeActionPerformed(evt);
|
||||||
@ -212,12 +235,25 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
});
|
});
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lbSingleUserSqLite, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbSingleUserSqLite.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(lbSingleUserSqLite, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbSingleUserSqLite.text")); // NOI18N
|
||||||
|
lbSingleUserSqLite.setPreferredSize(new java.awt.Dimension(381, 14));
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseType.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseType.text")); // NOI18N
|
||||||
|
lbDatabaseType.setMaximumSize(new java.awt.Dimension(80, 14));
|
||||||
|
lbDatabaseType.setMinimumSize(new java.awt.Dimension(80, 14));
|
||||||
|
lbDatabaseType.setPreferredSize(new java.awt.Dimension(80, 14));
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseDesc, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseDesc.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseDesc, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseDesc.text")); // NOI18N
|
||||||
|
lbDatabaseDesc.setPreferredSize(new java.awt.Dimension(80, 14));
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(lbFullDbPath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbFullDbPath.text")); // NOI18N
|
dataBaseFileScrollPane.setBorder(null);
|
||||||
|
|
||||||
|
dataBaseFileTextArea.setEditable(false);
|
||||||
|
dataBaseFileTextArea.setBackground(new java.awt.Color(240, 240, 240));
|
||||||
|
dataBaseFileTextArea.setColumns(20);
|
||||||
|
dataBaseFileTextArea.setFont(new java.awt.Font("Tahoma", 0, 11)); // NOI18N
|
||||||
|
dataBaseFileTextArea.setLineWrap(true);
|
||||||
|
dataBaseFileTextArea.setRows(3);
|
||||||
|
dataBaseFileScrollPane.setViewportView(dataBaseFileTextArea);
|
||||||
|
|
||||||
javax.swing.GroupLayout pnSQLiteSettingsLayout = new javax.swing.GroupLayout(pnSQLiteSettings);
|
javax.swing.GroupLayout pnSQLiteSettingsLayout = new javax.swing.GroupLayout(pnSQLiteSettings);
|
||||||
pnSQLiteSettings.setLayout(pnSQLiteSettingsLayout);
|
pnSQLiteSettings.setLayout(pnSQLiteSettingsLayout);
|
||||||
@ -226,34 +262,30 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
.addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
|
.addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(lbHostName)
|
.addComponent(lbHostName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(lbPort)
|
.addComponent(lbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(lbUserName)
|
.addComponent(lbDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(lbDatabaseType)
|
.addComponent(lbUserName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(lbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
||||||
.addComponent(lbDatabasePath, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addComponent(lbDatabaseDesc, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
|
||||||
.addComponent(lbDatabaseDesc))
|
|
||||||
.addGap(10, 10, 10)
|
.addGap(10, 10, 10)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
|
||||||
|
.addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(bnDatabasePathFileOpen))
|
||||||
.addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
|
.addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
|
||||||
.addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(cbDatabaseType, 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, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE)
|
.addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addGap(9, 9, 9))
|
.addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
|
.addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(tfDatabasePath)
|
.addComponent(tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(bnDatabasePathFileOpen)
|
.addComponent(dataBaseFileScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 509, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addGap(11, 11, 11))
|
.addContainerGap())
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnSQLiteSettingsLayout.createSequentialGroup()
|
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
||||||
.addComponent(tbDbHostname, javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(jpDbPassword, javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(tbDbUsername)
|
|
||||||
.addComponent(tbDbPort, javax.swing.GroupLayout.Alignment.LEADING))
|
|
||||||
.addGap(10, 10, 10))))
|
|
||||||
.addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
|
.addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
|
||||||
.addGap(55, 55, 55)
|
.addGap(55, 55, 55)
|
||||||
.addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
@ -266,35 +298,36 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(lbSingleUserSqLite))
|
.addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addComponent(lbDatabaseType, javax.swing.GroupLayout.Alignment.TRAILING))
|
.addComponent(lbDatabaseType, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(lbDatabasePath)
|
.addComponent(lbDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(bnDatabasePathFileOpen))
|
.addComponent(bnDatabasePathFileOpen))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(lbHostName))
|
.addComponent(lbHostName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(tbDbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(lbPort))
|
.addComponent(lbPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(lbUserName))
|
.addComponent(lbUserName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addComponent(lbUserPassword))
|
.addComponent(lbUserPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addGroup(pnSQLiteSettingsLayout.createSequentialGroup()
|
||||||
.addComponent(lbDatabaseDesc, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addComponent(lbDatabaseDesc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addGap(18, 18, 18)
|
||||||
.addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addComponent(dataBaseFileScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
.addContainerGap())
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -312,11 +345,11 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addGap(10, 10, 10)
|
.addContainerGap()
|
||||||
.addComponent(pnSQLiteSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(pnSQLiteSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addComponent(pnButtons, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(pnButtons, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addGap(10, 10, 10))
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
|
|
||||||
pack();
|
pack();
|
||||||
@ -357,6 +390,7 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
tfDatabasePath.setText(databaseFile.getCanonicalPath());
|
tfDatabasePath.setText(databaseFile.getCanonicalPath());
|
||||||
|
tfDatabasePath.setCaretPosition(tfDatabasePath.getText().length());
|
||||||
valid();
|
valid();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
logger.log(Level.SEVERE, "Failed to get path of selected database file", ex); // NON-NLS
|
logger.log(Level.SEVERE, "Failed to get path of selected database file", ex); // NON-NLS
|
||||||
@ -584,14 +618,15 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
}//GEN-LAST:event_cbDatabaseTypeActionPerformed
|
}//GEN-LAST:event_cbDatabaseTypeActionPerformed
|
||||||
|
|
||||||
private void updateFullDbPath() {
|
private void updateFullDbPath() {
|
||||||
lbFullDbPath.setText(tfDatabasePath.getText() + File.separator + CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT);
|
dataBaseFileTextArea.setText(tfDatabasePath.getText() + File.separator + CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT);
|
||||||
|
dataBaseFileTextArea.setCaretPosition(dataBaseFileTextArea.getText().length());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void displayDatabaseSettings(boolean isPostgres) {
|
private void displayDatabaseSettings(boolean isPostgres) {
|
||||||
lbDatabasePath.setVisible(!isPostgres);
|
lbDatabasePath.setVisible(!isPostgres);
|
||||||
tfDatabasePath.setVisible(!isPostgres);
|
tfDatabasePath.setVisible(!isPostgres);
|
||||||
lbDatabaseDesc.setVisible(!isPostgres);
|
lbDatabaseDesc.setVisible(!isPostgres);
|
||||||
lbFullDbPath.setVisible(!isPostgres);
|
dataBaseFileTextArea.setVisible(!isPostgres);
|
||||||
lbSingleUserSqLite.setVisible(!isPostgres);
|
lbSingleUserSqLite.setVisible(!isPostgres);
|
||||||
bnDatabasePathFileOpen.setVisible(!isPostgres);
|
bnDatabasePathFileOpen.setVisible(!isPostgres);
|
||||||
lbHostName.setVisible(isPostgres);
|
lbHostName.setVisible(isPostgres);
|
||||||
@ -855,13 +890,14 @@ public class EamDbSettingsDialog extends JDialog {
|
|||||||
private javax.swing.ButtonGroup bnGrpDatabasePlatforms;
|
private javax.swing.ButtonGroup bnGrpDatabasePlatforms;
|
||||||
private javax.swing.JButton bnOk;
|
private javax.swing.JButton bnOk;
|
||||||
private javax.swing.JComboBox<EamDbPlatformEnum> cbDatabaseType;
|
private javax.swing.JComboBox<EamDbPlatformEnum> cbDatabaseType;
|
||||||
|
private javax.swing.JScrollPane dataBaseFileScrollPane;
|
||||||
|
private javax.swing.JTextArea dataBaseFileTextArea;
|
||||||
private javax.swing.JFileChooser fcDatabasePath;
|
private javax.swing.JFileChooser fcDatabasePath;
|
||||||
private javax.swing.Box.Filler filler1;
|
private javax.swing.Box.Filler filler1;
|
||||||
private javax.swing.JPasswordField jpDbPassword;
|
private javax.swing.JPasswordField jpDbPassword;
|
||||||
private javax.swing.JLabel lbDatabaseDesc;
|
private javax.swing.JLabel lbDatabaseDesc;
|
||||||
private javax.swing.JLabel lbDatabasePath;
|
private javax.swing.JLabel lbDatabasePath;
|
||||||
private javax.swing.JLabel lbDatabaseType;
|
private javax.swing.JLabel lbDatabaseType;
|
||||||
private javax.swing.JLabel lbFullDbPath;
|
|
||||||
private javax.swing.JLabel lbHostName;
|
private javax.swing.JLabel lbHostName;
|
||||||
private javax.swing.JLabel lbPort;
|
private javax.swing.JLabel lbPort;
|
||||||
private javax.swing.JLabel lbSingleUserSqLite;
|
private javax.swing.JLabel lbSingleUserSqLite;
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
</NonVisualComponents>
|
</NonVisualComponents>
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||||
|
<Property name="resizable" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<SyntheticProperties>
|
<SyntheticProperties>
|
||||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||||
@ -49,16 +50,16 @@
|
|||||||
<Group type="102" alignment="1" attributes="0">
|
<Group type="102" alignment="1" attributes="0">
|
||||||
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
|
||||||
<Component id="taInstructions" min="-2" pref="34" max="-2" attributes="0"/>
|
<Component id="taInstructions" min="-2" pref="34" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jScrollPane1" min="-2" pref="180" max="-2" attributes="0"/>
|
<Component id="jScrollPane1" pref="254" max="32767" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="lbWarningMsg" min="-2" pref="25" max="-2" attributes="0"/>
|
<Component id="lbWarningMsg" min="-2" pref="25" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="okButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="okButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="cancelButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="cancelButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
|
@ -132,6 +132,7 @@ final class ManageCorrelationPropertiesDialog extends javax.swing.JDialog {
|
|||||||
taInstructions = new javax.swing.JTextArea();
|
taInstructions = new javax.swing.JTextArea();
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
|
setResizable(false);
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(okButton, org.openide.util.NbBundle.getMessage(ManageCorrelationPropertiesDialog.class, "ManageCorrelationPropertiesDialog.okButton.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(okButton, org.openide.util.NbBundle.getMessage(ManageCorrelationPropertiesDialog.class, "ManageCorrelationPropertiesDialog.okButton.text")); // NOI18N
|
||||||
okButton.addActionListener(new java.awt.event.ActionListener() {
|
okButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
@ -220,14 +221,14 @@ final class ManageCorrelationPropertiesDialog extends javax.swing.JDialog {
|
|||||||
.addGap(20, 20, 20)
|
.addGap(20, 20, 20)
|
||||||
.addComponent(taInstructions, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(taInstructions, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 254, Short.MAX_VALUE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(lbWarningMsg, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(lbWarningMsg, javax.swing.GroupLayout.PREFERRED_SIZE, 25, 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(okButton)
|
.addComponent(okButton)
|
||||||
.addComponent(cancelButton))
|
.addComponent(cancelButton))
|
||||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
|
|
||||||
pack();
|
pack();
|
||||||
|
@ -3,7 +3,10 @@
|
|||||||
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
<Dimension value="[545, 415]"/>
|
<Dimension value="[600, 450]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[600, 450]"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<SyntheticProperties>
|
<SyntheticProperties>
|
||||||
@ -27,7 +30,7 @@
|
|||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="1" attributes="0">
|
<Group type="102" alignment="1" attributes="0">
|
||||||
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="0" max="-2" attributes="0"/>
|
||||||
<Component id="manageOrganizationsScrollPane" max="32767" attributes="0"/>
|
<Component id="manageOrganizationsScrollPane" pref="603" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -35,7 +38,7 @@
|
|||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="1" attributes="0">
|
<Group type="102" alignment="1" attributes="0">
|
||||||
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
|
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
|
||||||
<Component id="manageOrganizationsScrollPane" max="32767" attributes="0"/>
|
<Component id="manageOrganizationsScrollPane" pref="443" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
|
@ -159,7 +159,8 @@ public final class ManageOrganizationsDialog extends JDialog {
|
|||||||
editButton = new javax.swing.JButton();
|
editButton = new javax.swing.JButton();
|
||||||
orgDetailsLabel = new javax.swing.JLabel();
|
orgDetailsLabel = new javax.swing.JLabel();
|
||||||
|
|
||||||
setMinimumSize(new java.awt.Dimension(545, 415));
|
setMinimumSize(new java.awt.Dimension(600, 450));
|
||||||
|
setPreferredSize(new java.awt.Dimension(600, 450));
|
||||||
|
|
||||||
manageOrganizationsScrollPane.setMinimumSize(null);
|
manageOrganizationsScrollPane.setMinimumSize(null);
|
||||||
manageOrganizationsScrollPane.setPreferredSize(new java.awt.Dimension(535, 415));
|
manageOrganizationsScrollPane.setPreferredSize(new java.awt.Dimension(535, 415));
|
||||||
@ -331,13 +332,13 @@ public final class ManageOrganizationsDialog extends JDialog {
|
|||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||||
.addGap(0, 0, 0)
|
.addGap(0, 0, 0)
|
||||||
.addComponent(manageOrganizationsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addComponent(manageOrganizationsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 603, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||||
.addGap(0, 0, 0)
|
.addGap(0, 0, 0)
|
||||||
.addComponent(manageOrganizationsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addComponent(manageOrganizationsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 443, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
|
|
||||||
pack();
|
pack();
|
||||||
|
@ -54,11 +54,9 @@ final class AccountDeviceInstanceNodeFactory extends ChildFactory<AccountDeviceI
|
|||||||
final List<AccountDeviceInstance> accountDeviceInstancesWithRelationships =
|
final List<AccountDeviceInstance> accountDeviceInstancesWithRelationships =
|
||||||
commsManager.getAccountDeviceInstancesWithRelationships(commsFilter);
|
commsManager.getAccountDeviceInstancesWithRelationships(commsFilter);
|
||||||
for (AccountDeviceInstance accountDeviceInstance : accountDeviceInstancesWithRelationships) {
|
for (AccountDeviceInstance accountDeviceInstance : accountDeviceInstancesWithRelationships) {
|
||||||
//Filter out device accounts, in the table.
|
long communicationsCount = commsManager.getRelationshipSourcesCount(accountDeviceInstance, commsFilter);
|
||||||
if (Account.Type.DEVICE.equals(accountDeviceInstance.getAccount().getAccountType()) ==false) {
|
accountDeviceInstanceKeys.add(new AccountDeviceInstanceKey(accountDeviceInstance, commsFilter, communicationsCount));
|
||||||
long communicationsCount = commsManager.getRelationshipSourcesCount(accountDeviceInstance, commsFilter);
|
|
||||||
accountDeviceInstanceKeys.add(new AccountDeviceInstanceKey(accountDeviceInstance, commsFilter, communicationsCount));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (TskCoreException tskCoreException) {
|
} catch (TskCoreException tskCoreException) {
|
||||||
logger.log(Level.SEVERE, "Error getting filtered account device instances", tskCoreException);
|
logger.log(Level.SEVERE, "Error getting filtered account device instances", tskCoreException);
|
||||||
|
@ -22,15 +22,13 @@ CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName=Visualiz
|
|||||||
CVTTopComponent.vizPanel.TabConstraints.tabTitle_1=Visualize
|
CVTTopComponent.vizPanel.TabConstraints.tabTitle_1=Visualize
|
||||||
VisualizationPanel.fitGraphButton.text=
|
VisualizationPanel.fitGraphButton.text=
|
||||||
VisualizationPanel.jTextArea1.text=Right-click an account in the Browse Accounts table, and select 'Visualize' to begin.
|
VisualizationPanel.jTextArea1.text=Right-click an account in the Browse Accounts table, and select 'Visualize' to begin.
|
||||||
VisualizationPanel.zoomLabel.text=100%
|
VisualizationPanel.fitZoomButton.toolTipText=Fit visualization to available space.
|
||||||
VisualizationPanel.jLabel2.text=Zoom:
|
|
||||||
VisualizationPanel.fitZoomButton.toolTipText=fit visualization
|
|
||||||
VisualizationPanel.fitZoomButton.text=
|
VisualizationPanel.fitZoomButton.text=
|
||||||
VisualizationPanel.zoomActualButton.toolTipText=reset zoom
|
VisualizationPanel.zoomActualButton.toolTipText=Reset visualization default zoom state.
|
||||||
VisualizationPanel.zoomActualButton.text=
|
VisualizationPanel.zoomActualButton.text=
|
||||||
VisualizationPanel.zoomInButton.toolTipText=Zoom in
|
VisualizationPanel.zoomInButton.toolTipText=Zoom visualization in.
|
||||||
VisualizationPanel.zoomInButton.text=
|
VisualizationPanel.zoomInButton.text=
|
||||||
VisualizationPanel.zoomOutButton.toolTipText=Zoom out
|
VisualizationPanel.zoomOutButton.toolTipText=Zoom visualization out.
|
||||||
VisualizationPanel.zoomOutButton.text=
|
VisualizationPanel.zoomOutButton.text=
|
||||||
VisualizationPanel.fastOrganicLayoutButton.text=
|
VisualizationPanel.fastOrganicLayoutButton.text=
|
||||||
VisualizationPanel.backButton.text_1=
|
VisualizationPanel.backButton.text_1=
|
||||||
@ -40,11 +38,14 @@ VisualizationPanel.hierarchyLayoutButton.text=Hierarchical
|
|||||||
VisualizationPanel.clearVizButton.text_1=
|
VisualizationPanel.clearVizButton.text_1=
|
||||||
VisualizationPanel.snapshotButton.text_1=Snapshot Report
|
VisualizationPanel.snapshotButton.text_1=Snapshot Report
|
||||||
VisualizationPanel.clearVizButton.actionCommand=
|
VisualizationPanel.clearVizButton.actionCommand=
|
||||||
VisualizationPanel.backButton.toolTipText=Click to go back
|
VisualizationPanel.backButton.toolTipText=Click to go back to previous state.
|
||||||
VisualizationPanel.forwardButton.toolTipText=Click to go forward
|
VisualizationPanel.forwardButton.toolTipText=Click to move state forward.
|
||||||
VisualizationPanel.fastOrganicLayoutButton.toolTipText=Click to redraw the chart
|
VisualizationPanel.fastOrganicLayoutButton.toolTipText=Click to redraw visualization.
|
||||||
VisualizationPanel.clearVizButton.toolTipText=Click to clear the chart
|
VisualizationPanel.clearVizButton.toolTipText=Click to clear visualization.
|
||||||
FiltersPanel.limitHeaderLabel.text=Communications Limit:
|
FiltersPanel.limitHeaderLabel.text=Communications Limit:
|
||||||
FiltersPanel.mostRecentLabel.text=Most Recent:
|
FiltersPanel.mostRecentLabel.text=Most Recent:
|
||||||
FiltersPanel.limitErrorMsgLabel.text=Invalid integer value.
|
FiltersPanel.limitErrorMsgLabel.text=Invalid integer value.
|
||||||
VisualizationPanel.forwardButton.text=
|
VisualizationPanel.forwardButton.text=
|
||||||
|
VisualizationPanel.zoomPercentLabel.text=100%
|
||||||
|
VisualizationPanel.zoomLabel.text=Zoom:
|
||||||
|
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report.
|
||||||
|
@ -57,6 +57,8 @@ CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName=Visualiz
|
|||||||
CVTTopComponent.vizPanel.TabConstraints.tabTitle_1=Visualize
|
CVTTopComponent.vizPanel.TabConstraints.tabTitle_1=Visualize
|
||||||
VisualizationPanel.fitGraphButton.text=
|
VisualizationPanel.fitGraphButton.text=
|
||||||
VisualizationPanel.jTextArea1.text=Right-click an account in the Browse Accounts table, and select 'Visualize' to begin.
|
VisualizationPanel.jTextArea1.text=Right-click an account in the Browse Accounts table, and select 'Visualize' to begin.
|
||||||
|
VisualizationPanel.fitZoomButton.toolTipText=Fit Visualization
|
||||||
|
VisualizationPanel.fitZoomButton.text=
|
||||||
# {0} - layout name
|
# {0} - layout name
|
||||||
VisualizationPanel.layoutFail.text={0} layout failed. Try a different layout.
|
VisualizationPanel.layoutFail.text={0} layout failed. Try a different layout.
|
||||||
# {0} - layout name
|
# {0} - layout name
|
||||||
@ -65,15 +67,11 @@ VisualizationPanel.lockAction.pluralText=Lock Selected Accounts
|
|||||||
VisualizationPanel.lockAction.singularText=Lock Selected Account
|
VisualizationPanel.lockAction.singularText=Lock Selected Account
|
||||||
VisualizationPanel.unlockAction.pluralText=Unlock Selected Accounts
|
VisualizationPanel.unlockAction.pluralText=Unlock Selected Accounts
|
||||||
VisualizationPanel.unlockAction.singularText=Unlock Selected Account
|
VisualizationPanel.unlockAction.singularText=Unlock Selected Account
|
||||||
VisualizationPanel.zoomLabel.text=100%
|
VisualizationPanel.zoomActualButton.toolTipText=Reset Zoom
|
||||||
VisualizationPanel.jLabel2.text=Zoom:
|
|
||||||
VisualizationPanel.fitZoomButton.toolTipText=fit visualization
|
|
||||||
VisualizationPanel.fitZoomButton.text=
|
|
||||||
VisualizationPanel.zoomActualButton.toolTipText=reset zoom
|
|
||||||
VisualizationPanel.zoomActualButton.text=
|
VisualizationPanel.zoomActualButton.text=
|
||||||
VisualizationPanel.zoomInButton.toolTipText=Zoom in
|
VisualizationPanel.zoomInButton.toolTipText=Zoom In
|
||||||
VisualizationPanel.zoomInButton.text=
|
VisualizationPanel.zoomInButton.text=
|
||||||
VisualizationPanel.zoomOutButton.toolTipText=Zoom out
|
VisualizationPanel.zoomOutButton.toolTipText=Zoom Out
|
||||||
VisualizationPanel.zoomOutButton.text=
|
VisualizationPanel.zoomOutButton.text=
|
||||||
VisualizationPanel.fastOrganicLayoutButton.text=
|
VisualizationPanel.fastOrganicLayoutButton.text=
|
||||||
VisualizationPanel.backButton.text_1=
|
VisualizationPanel.backButton.text_1=
|
||||||
@ -83,14 +81,17 @@ VisualizationPanel.hierarchyLayoutButton.text=Hierarchical
|
|||||||
VisualizationPanel.clearVizButton.text_1=
|
VisualizationPanel.clearVizButton.text_1=
|
||||||
VisualizationPanel.snapshotButton.text_1=Snapshot Report
|
VisualizationPanel.snapshotButton.text_1=Snapshot Report
|
||||||
VisualizationPanel.clearVizButton.actionCommand=
|
VisualizationPanel.clearVizButton.actionCommand=
|
||||||
VisualizationPanel.backButton.toolTipText=Click to go back
|
VisualizationPanel.backButton.toolTipText=Click to Go Back
|
||||||
VisualizationPanel.forwardButton.toolTipText=Click to go forward
|
VisualizationPanel.forwardButton.toolTipText=Click to Go Forward
|
||||||
VisualizationPanel.fastOrganicLayoutButton.toolTipText=Click to redraw the chart
|
VisualizationPanel.fastOrganicLayoutButton.toolTipText=Click to Redraw Chart
|
||||||
VisualizationPanel.clearVizButton.toolTipText=Click to clear the chart
|
VisualizationPanel.clearVizButton.toolTipText=Click to Clear Chart
|
||||||
FiltersPanel.limitHeaderLabel.text=Communications Limit:
|
FiltersPanel.limitHeaderLabel.text=Communications Limit:
|
||||||
FiltersPanel.mostRecentLabel.text=Most Recent:
|
FiltersPanel.mostRecentLabel.text=Most Recent:
|
||||||
FiltersPanel.limitErrorMsgLabel.text=Invalid integer value.
|
FiltersPanel.limitErrorMsgLabel.text=Invalid integer value.
|
||||||
VisualizationPanel.forwardButton.text=
|
VisualizationPanel.forwardButton.text=
|
||||||
|
VisualizationPanel.zoomPercentLabel.text=100%
|
||||||
|
VisualizationPanel.zoomLabel.text=Zoom:
|
||||||
|
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot Report
|
||||||
VisualizationPanel_action_dialogs_title=Communications
|
VisualizationPanel_action_dialogs_title=Communications
|
||||||
VisualizationPanel_action_name_text=Snapshot Report
|
VisualizationPanel_action_name_text=Snapshot Report
|
||||||
VisualizationPanel_module_name=Communications
|
VisualizationPanel_module_name=Communications
|
||||||
|
@ -16,61 +16,72 @@
|
|||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JTabbedPane" name="browseVisualizeTabPane">
|
<Container class="javax.swing.JSplitPane" name="mainSplitPane">
|
||||||
<Properties>
|
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
|
||||||
<Font name="Tahoma" size="18" style="0"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<AccessibilityProperties>
|
|
||||||
<Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</AccessibilityProperties>
|
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
<GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="15" insetsRight="15" anchor="18" weightX="0.75" weightY="1.0"/>
|
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="1.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Component class="org.sleuthkit.autopsy.communications.AccountsBrowser" name="accountsBrowser">
|
<Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane">
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Browse">
|
<JSplitPaneConstraints position="left"/>
|
||||||
<Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.accountsBrowser.TabConstraints.tabTitle_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="tabIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/table.png"/>
|
|
||||||
</Property>
|
|
||||||
</JTabbedPaneConstraints>
|
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="org.sleuthkit.autopsy.communications.VisualizationPanel" name="vizPanel">
|
<Container class="javax.swing.JTabbedPane" name="browseVisualizeTabPane">
|
||||||
|
<Properties>
|
||||||
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||||
|
<Font name="Tahoma" size="18" style="0"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<AccessibilityProperties>
|
||||||
|
<Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</AccessibilityProperties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Visualize">
|
<JSplitPaneConstraints position="right"/>
|
||||||
<Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.vizPanel.TabConstraints.tabTitle_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="tabIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/emblem-web.png"/>
|
|
||||||
</Property>
|
|
||||||
</JTabbedPaneConstraints>
|
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="org.sleuthkit.autopsy.communications.AccountsBrowser" name="accountsBrowser">
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
|
<JTabbedPaneConstraints tabName="Browse">
|
||||||
|
<Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.accountsBrowser.TabConstraints.tabTitle_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="tabIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/table.png"/>
|
||||||
|
</Property>
|
||||||
|
</JTabbedPaneConstraints>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="org.sleuthkit.autopsy.communications.VisualizationPanel" name="vizPanel">
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
|
<JTabbedPaneConstraints tabName="Visualize">
|
||||||
|
<Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.vizPanel.TabConstraints.tabTitle_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="tabIcon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/emblem-web.png"/>
|
||||||
|
</Property>
|
||||||
|
</JTabbedPaneConstraints>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane">
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
|
||||||
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="15" insetsBottom="15" insetsRight="5" anchor="18" weightX="0.25" weightY="1.0"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
</Component>
|
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Form>
|
</Form>
|
||||||
|
@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.communications;
|
|||||||
|
|
||||||
import com.google.common.eventbus.Subscribe;
|
import com.google.common.eventbus.Subscribe;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.GridBagConstraints;
|
import java.awt.GridBagConstraints;
|
||||||
import java.awt.GridBagLayout;
|
import java.awt.GridBagLayout;
|
||||||
@ -28,6 +27,7 @@ import java.awt.Insets;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
|
import javax.swing.JSplitPane;
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JTabbedPane;
|
||||||
import org.openide.util.Lookup;
|
import org.openide.util.Lookup;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
@ -68,7 +68,6 @@ public final class CVTTopComponent extends TopComponent {
|
|||||||
Lookup lookup = ((Lookup.Provider)selectedComponent).getLookup();
|
Lookup lookup = ((Lookup.Provider)selectedComponent).getLookup();
|
||||||
proxyLookup.setNewLookups(lookup);
|
proxyLookup.setNewLookups(lookup);
|
||||||
}
|
}
|
||||||
filtersPane.setDeviceAccountTypeEnabled(browseVisualizeTabPane.getSelectedIndex() != 0);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@ -80,6 +79,9 @@ public final class CVTTopComponent extends TopComponent {
|
|||||||
CVTEvents.getCVTEventBus().register(vizPanel);
|
CVTEvents.getCVTEventBus().register(vizPanel);
|
||||||
CVTEvents.getCVTEventBus().register(accountsBrowser);
|
CVTEvents.getCVTEventBus().register(accountsBrowser);
|
||||||
CVTEvents.getCVTEventBus().register(filtersPane);
|
CVTEvents.getCVTEventBus().register(filtersPane);
|
||||||
|
|
||||||
|
mainSplitPane.setResizeWeight(0.5);
|
||||||
|
mainSplitPane.setDividerLocation(0.25);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
@ -96,37 +98,28 @@ public final class CVTTopComponent extends TopComponent {
|
|||||||
private void initComponents() {
|
private void initComponents() {
|
||||||
GridBagConstraints gridBagConstraints;
|
GridBagConstraints gridBagConstraints;
|
||||||
|
|
||||||
|
mainSplitPane = new JSplitPane();
|
||||||
|
filtersPane = new FiltersPanel();
|
||||||
browseVisualizeTabPane = new JTabbedPane();
|
browseVisualizeTabPane = new JTabbedPane();
|
||||||
accountsBrowser = new AccountsBrowser();
|
accountsBrowser = new AccountsBrowser();
|
||||||
vizPanel = new VisualizationPanel();
|
vizPanel = new VisualizationPanel();
|
||||||
filtersPane = new FiltersPanel();
|
|
||||||
|
|
||||||
setLayout(new GridBagLayout());
|
setLayout(new GridBagLayout());
|
||||||
|
|
||||||
|
mainSplitPane.setLeftComponent(filtersPane);
|
||||||
|
|
||||||
browseVisualizeTabPane.setFont(new Font("Tahoma", 0, 18)); // NOI18N
|
browseVisualizeTabPane.setFont(new Font("Tahoma", 0, 18)); // NOI18N
|
||||||
browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.accountsBrowser.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/table.png")), accountsBrowser); // NOI18N
|
browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.accountsBrowser.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/table.png")), accountsBrowser); // NOI18N
|
||||||
browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.vizPanel.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/emblem-web.png")), vizPanel); // NOI18N
|
browseVisualizeTabPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.vizPanel.TabConstraints.tabTitle_1"), new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/emblem-web.png")), vizPanel); // NOI18N
|
||||||
|
|
||||||
gridBagConstraints = new GridBagConstraints();
|
mainSplitPane.setRightComponent(browseVisualizeTabPane);
|
||||||
gridBagConstraints.gridx = 1;
|
|
||||||
gridBagConstraints.gridy = 0;
|
|
||||||
gridBagConstraints.fill = GridBagConstraints.BOTH;
|
|
||||||
gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
|
|
||||||
gridBagConstraints.weightx = 0.75;
|
|
||||||
gridBagConstraints.weighty = 1.0;
|
|
||||||
gridBagConstraints.insets = new Insets(15, 0, 15, 15);
|
|
||||||
add(browseVisualizeTabPane, gridBagConstraints);
|
|
||||||
browseVisualizeTabPane.getAccessibleContext().setAccessibleName(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName")); // NOI18N
|
browseVisualizeTabPane.getAccessibleContext().setAccessibleName(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.browseVisualizeTabPane.AccessibleContext.accessibleName")); // NOI18N
|
||||||
|
|
||||||
gridBagConstraints = new GridBagConstraints();
|
gridBagConstraints = new GridBagConstraints();
|
||||||
gridBagConstraints.gridx = 0;
|
|
||||||
gridBagConstraints.gridy = 0;
|
|
||||||
gridBagConstraints.fill = GridBagConstraints.BOTH;
|
gridBagConstraints.fill = GridBagConstraints.BOTH;
|
||||||
gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
|
gridBagConstraints.weightx = 1.0;
|
||||||
gridBagConstraints.weightx = 0.25;
|
|
||||||
gridBagConstraints.weighty = 1.0;
|
gridBagConstraints.weighty = 1.0;
|
||||||
gridBagConstraints.insets = new Insets(15, 15, 15, 5);
|
add(mainSplitPane, gridBagConstraints);
|
||||||
add(filtersPane, gridBagConstraints);
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
|
||||||
@ -134,6 +127,7 @@ public final class CVTTopComponent extends TopComponent {
|
|||||||
private AccountsBrowser accountsBrowser;
|
private AccountsBrowser accountsBrowser;
|
||||||
private JTabbedPane browseVisualizeTabPane;
|
private JTabbedPane browseVisualizeTabPane;
|
||||||
private FiltersPanel filtersPane;
|
private FiltersPanel filtersPane;
|
||||||
|
private JSplitPane mainSplitPane;
|
||||||
private VisualizationPanel vizPanel;
|
private VisualizationPanel vizPanel;
|
||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
@ -16,77 +16,6 @@
|
|||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JPanel" name="topPane">
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
|
||||||
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="24" weightX="1.0" weightY="0.0"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
|
||||||
<SubComponents>
|
|
||||||
<Component class="javax.swing.JLabel" name="filtersTitleLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/funnel.png"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.filtersTitleLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
|
||||||
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JButton" name="refreshButton">
|
|
||||||
<Properties>
|
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.refreshButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
|
||||||
<GridBagConstraints gridX="2" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="12" weightX="0.0" weightY="0.0"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JButton" name="applyFiltersButton">
|
|
||||||
<Properties>
|
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/tick.png"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.applyFiltersButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
|
||||||
<GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="5" anchor="12" weightX="0.0" weightY="0.0"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="needsRefreshLabel">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.needsRefreshLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
|
||||||
<Color blue="0" green="0" red="ff" type="rgb"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
|
||||||
<GridBagConstraints gridX="0" gridY="1" gridWidth="3" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
</Component>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
<Container class="javax.swing.JScrollPane" name="scrollPane">
|
<Container class="javax.swing.JScrollPane" name="scrollPane">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||||
@ -95,7 +24,7 @@
|
|||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="9" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
|
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="9" insetsLeft="15" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
@ -108,7 +37,7 @@
|
|||||||
<Container class="javax.swing.JPanel" name="limitPane">
|
<Container class="javax.swing.JPanel" name="limitPane">
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="15" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
|
<GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="15" insetsRight="0" anchor="18" weightX="1.0" weightY="1.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
@ -199,7 +128,7 @@
|
|||||||
<Container class="javax.swing.JPanel" name="dateRangePane">
|
<Container class="javax.swing.JPanel" name="dateRangePane">
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
@ -293,7 +222,7 @@
|
|||||||
<Container class="javax.swing.JPanel" name="devicesPane">
|
<Container class="javax.swing.JPanel" name="devicesPane">
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="100" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="100" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
@ -490,6 +419,77 @@
|
|||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
|
<Container class="javax.swing.JPanel" name="topPane">
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
|
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="24" weightX="1.0" weightY="0.0"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="filtersTitleLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/funnel.png"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.filtersTitleLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
|
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="refreshButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.refreshButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
|
<GridBagConstraints gridX="2" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="12" weightX="0.0" weightY="0.0"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="applyFiltersButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/tick.png"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.applyFiltersButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
|
<GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="5" anchor="12" weightX="1.0" weightY="0.0"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="needsRefreshLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="FiltersPanel.needsRefreshLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||||
|
<Color blue="0" green="0" red="ff" type="rgb"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
|
<GridBagConstraints gridX="0" gridY="1" gridWidth="3" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
|
@ -322,11 +322,6 @@ final public class FiltersPanel extends JPanel {
|
|||||||
|
|
||||||
panel.setSelected(initalState);
|
panel.setSelected(initalState);
|
||||||
panel.addItemListener(validationListener);
|
panel.addItemListener(validationListener);
|
||||||
if (type.equals(Account.Type.DEVICE)) {
|
|
||||||
//Deveice type filter is enabled based on whether we are in table or graph view.
|
|
||||||
panel.setEnabled(deviceAccountTypeEnabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
return panel;
|
return panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -474,54 +469,6 @@ final public class FiltersPanel extends JPanel {
|
|||||||
|
|
||||||
setLayout(new java.awt.GridBagLayout());
|
setLayout(new java.awt.GridBagLayout());
|
||||||
|
|
||||||
topPane.setLayout(new java.awt.GridBagLayout());
|
|
||||||
|
|
||||||
filtersTitleLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/funnel.png"))); // NOI18N
|
|
||||||
filtersTitleLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.filtersTitleLabel.text")); // NOI18N
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
||||||
gridBagConstraints.gridx = 0;
|
|
||||||
gridBagConstraints.gridy = 0;
|
|
||||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
|
||||||
gridBagConstraints.weightx = 1.0;
|
|
||||||
topPane.add(filtersTitleLabel, gridBagConstraints);
|
|
||||||
|
|
||||||
refreshButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N
|
|
||||||
refreshButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.refreshButton.text")); // NOI18N
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
||||||
gridBagConstraints.gridx = 2;
|
|
||||||
gridBagConstraints.gridy = 0;
|
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
|
|
||||||
topPane.add(refreshButton, gridBagConstraints);
|
|
||||||
|
|
||||||
applyFiltersButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/tick.png"))); // NOI18N
|
|
||||||
applyFiltersButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.applyFiltersButton.text")); // NOI18N
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
||||||
gridBagConstraints.gridx = 1;
|
|
||||||
gridBagConstraints.gridy = 0;
|
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
|
|
||||||
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
|
|
||||||
topPane.add(applyFiltersButton, gridBagConstraints);
|
|
||||||
|
|
||||||
needsRefreshLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.needsRefreshLabel.text")); // NOI18N
|
|
||||||
needsRefreshLabel.setForeground(new java.awt.Color(255, 0, 0));
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
||||||
gridBagConstraints.gridx = 0;
|
|
||||||
gridBagConstraints.gridy = 1;
|
|
||||||
gridBagConstraints.gridwidth = 3;
|
|
||||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
|
||||||
gridBagConstraints.weightx = 1.0;
|
|
||||||
topPane.add(needsRefreshLabel, gridBagConstraints);
|
|
||||||
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
|
||||||
gridBagConstraints.gridx = 0;
|
|
||||||
gridBagConstraints.gridy = 0;
|
|
||||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END;
|
|
||||||
gridBagConstraints.weightx = 1.0;
|
|
||||||
add(topPane, gridBagConstraints);
|
|
||||||
|
|
||||||
scrollPane.setBorder(null);
|
scrollPane.setBorder(null);
|
||||||
|
|
||||||
mainPanel.setLayout(new java.awt.GridBagLayout());
|
mainPanel.setLayout(new java.awt.GridBagLayout());
|
||||||
@ -581,7 +528,7 @@ final public class FiltersPanel extends JPanel {
|
|||||||
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
gridBagConstraints.gridx = 0;
|
gridBagConstraints.gridx = 0;
|
||||||
gridBagConstraints.gridy = 3;
|
gridBagConstraints.gridy = 4;
|
||||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||||
gridBagConstraints.weightx = 1.0;
|
gridBagConstraints.weightx = 1.0;
|
||||||
@ -649,7 +596,7 @@ final public class FiltersPanel extends JPanel {
|
|||||||
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
gridBagConstraints.gridx = 0;
|
gridBagConstraints.gridx = 0;
|
||||||
gridBagConstraints.gridy = 2;
|
gridBagConstraints.gridy = 3;
|
||||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||||
gridBagConstraints.weightx = 1.0;
|
gridBagConstraints.weightx = 1.0;
|
||||||
@ -726,7 +673,7 @@ final public class FiltersPanel extends JPanel {
|
|||||||
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
gridBagConstraints.gridx = 0;
|
gridBagConstraints.gridx = 0;
|
||||||
gridBagConstraints.gridy = 0;
|
gridBagConstraints.gridy = 2;
|
||||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||||
gridBagConstraints.ipady = 100;
|
gridBagConstraints.ipady = 100;
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||||
@ -808,16 +755,65 @@ final public class FiltersPanel extends JPanel {
|
|||||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
|
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
|
||||||
mainPanel.add(accountTypesPane, gridBagConstraints);
|
mainPanel.add(accountTypesPane, gridBagConstraints);
|
||||||
|
|
||||||
|
topPane.setLayout(new java.awt.GridBagLayout());
|
||||||
|
|
||||||
|
filtersTitleLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/funnel.png"))); // NOI18N
|
||||||
|
filtersTitleLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.filtersTitleLabel.text")); // NOI18N
|
||||||
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
|
gridBagConstraints.gridx = 0;
|
||||||
|
gridBagConstraints.gridy = 0;
|
||||||
|
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||||
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||||
|
gridBagConstraints.weightx = 1.0;
|
||||||
|
topPane.add(filtersTitleLabel, gridBagConstraints);
|
||||||
|
|
||||||
|
refreshButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N
|
||||||
|
refreshButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.refreshButton.text")); // NOI18N
|
||||||
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
|
gridBagConstraints.gridx = 2;
|
||||||
|
gridBagConstraints.gridy = 0;
|
||||||
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
|
||||||
|
topPane.add(refreshButton, gridBagConstraints);
|
||||||
|
|
||||||
|
applyFiltersButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/tick.png"))); // NOI18N
|
||||||
|
applyFiltersButton.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.applyFiltersButton.text")); // NOI18N
|
||||||
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
|
gridBagConstraints.gridx = 1;
|
||||||
|
gridBagConstraints.gridy = 0;
|
||||||
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
|
||||||
|
gridBagConstraints.weightx = 1.0;
|
||||||
|
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5);
|
||||||
|
topPane.add(applyFiltersButton, gridBagConstraints);
|
||||||
|
|
||||||
|
needsRefreshLabel.setText(org.openide.util.NbBundle.getMessage(FiltersPanel.class, "FiltersPanel.needsRefreshLabel.text")); // NOI18N
|
||||||
|
needsRefreshLabel.setForeground(new java.awt.Color(255, 0, 0));
|
||||||
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
|
gridBagConstraints.gridx = 0;
|
||||||
|
gridBagConstraints.gridy = 1;
|
||||||
|
gridBagConstraints.gridwidth = 3;
|
||||||
|
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||||
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||||
|
gridBagConstraints.weightx = 1.0;
|
||||||
|
topPane.add(needsRefreshLabel, gridBagConstraints);
|
||||||
|
|
||||||
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
|
gridBagConstraints.gridx = 0;
|
||||||
|
gridBagConstraints.gridy = 0;
|
||||||
|
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||||
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END;
|
||||||
|
gridBagConstraints.weightx = 1.0;
|
||||||
|
mainPanel.add(topPane, gridBagConstraints);
|
||||||
|
|
||||||
scrollPane.setViewportView(mainPanel);
|
scrollPane.setViewportView(mainPanel);
|
||||||
|
|
||||||
gridBagConstraints = new java.awt.GridBagConstraints();
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
gridBagConstraints.gridx = 0;
|
gridBagConstraints.gridx = 0;
|
||||||
gridBagConstraints.gridy = 1;
|
gridBagConstraints.gridy = 0;
|
||||||
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
|
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||||
gridBagConstraints.weightx = 1.0;
|
gridBagConstraints.weightx = 1.0;
|
||||||
gridBagConstraints.weighty = 1.0;
|
gridBagConstraints.weighty = 1.0;
|
||||||
gridBagConstraints.insets = new java.awt.Insets(9, 0, 0, 0);
|
gridBagConstraints.insets = new java.awt.Insets(9, 15, 0, 0);
|
||||||
add(scrollPane, gridBagConstraints);
|
add(scrollPane, gridBagConstraints);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
@ -913,21 +909,6 @@ final public class FiltersPanel extends JPanel {
|
|||||||
return new DateControlState (endDatePicker.getDate(), endCheckBox.isSelected());
|
return new DateControlState (endDatePicker.getDate(), endCheckBox.isSelected());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Enable or disable the device account type filter. The filter should be
|
|
||||||
* disabled for the browse/table mode and enabled for the visualization.
|
|
||||||
*
|
|
||||||
* @param enable True to enable the device account type filter, False to
|
|
||||||
* disable it.
|
|
||||||
*/
|
|
||||||
void setDeviceAccountTypeEnabled(boolean enable) {
|
|
||||||
deviceAccountTypeEnabled = enable;
|
|
||||||
JCheckBox deviceCheckbox = accountTypeMap.get(Account.Type.DEVICE);
|
|
||||||
if (deviceCheckbox != null) {
|
|
||||||
deviceCheckbox.setEnabled(deviceAccountTypeEnabled);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the selection state of all the account type check boxes
|
* Set the selection state of all the account type check boxes
|
||||||
*
|
*
|
||||||
@ -949,11 +930,11 @@ final public class FiltersPanel extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method that sets all the checkboxes in the given map to the given
|
* Helper method that sets all the check boxes in the given map to the given
|
||||||
* selection state.
|
* selection state.
|
||||||
*
|
*
|
||||||
* @param map A map from anything to JCheckBoxes.
|
* @param map A map from anything to JCheckBoxes.
|
||||||
* @param selected The selection state to set all the checkboxes to.
|
* @param selected The selection state to set all the check boxes to.
|
||||||
*/
|
*/
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
private void setAllSelected(Map<?, JCheckBox> map, boolean selected) {
|
private void setAllSelected(Map<?, JCheckBox> map, boolean selected) {
|
||||||
|
@ -105,10 +105,10 @@
|
|||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jSeparator2" min="-2" pref="10" max="-2" attributes="0"/>
|
<Component id="jSeparator2" min="-2" pref="10" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="zoomLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="zoomLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="zoomPercentLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="zoomOutButton" min="-2" pref="32" max="-2" attributes="0"/>
|
<Component id="zoomOutButton" min="-2" pref="32" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="zoomInButton" min="-2" pref="32" max="-2" attributes="0"/>
|
<Component id="zoomInButton" min="-2" pref="32" max="-2" attributes="0"/>
|
||||||
@ -134,8 +134,8 @@
|
|||||||
<Component id="zoomInButton" alignment="2" max="32767" attributes="0"/>
|
<Component id="zoomInButton" alignment="2" max="32767" attributes="0"/>
|
||||||
<Component id="zoomActualButton" alignment="2" max="32767" attributes="0"/>
|
<Component id="zoomActualButton" alignment="2" max="32767" attributes="0"/>
|
||||||
<Component id="fitZoomButton" alignment="2" max="32767" attributes="0"/>
|
<Component id="fitZoomButton" alignment="2" max="32767" attributes="0"/>
|
||||||
<Component id="jLabel2" alignment="2" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="zoomLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="zoomLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="zoomPercentLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="clearVizButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="clearVizButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jSeparator2" alignment="2" max="32767" attributes="0"/>
|
<Component id="jSeparator2" alignment="2" max="32767" attributes="0"/>
|
||||||
<Component id="backButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="backButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
@ -241,13 +241,6 @@
|
|||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fitZoomButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fitZoomButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</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/communications/Bundle.properties" key="VisualizationPanel.jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="zoomLabel">
|
<Component class="javax.swing.JLabel" name="zoomLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
@ -255,6 +248,13 @@
|
|||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="zoomPercentLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomPercentLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
<Component class="javax.swing.JButton" name="clearVizButton">
|
<Component class="javax.swing.JButton" name="clearVizButton">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
@ -320,6 +320,9 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="snapshotButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="snapshotButtonActionPerformed"/>
|
||||||
|
@ -213,7 +213,7 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
lockedVertexModel.registerhandler(this);
|
lockedVertexModel.registerhandler(this);
|
||||||
|
|
||||||
final mxEventSource.mxIEventListener scaleListener = (Object sender, mxEventObject evt)
|
final mxEventSource.mxIEventListener scaleListener = (Object sender, mxEventObject evt)
|
||||||
-> zoomLabel.setText(DecimalFormat.getPercentInstance().format(graph.getView().getScale()));
|
-> zoomPercentLabel.setText(DecimalFormat.getPercentInstance().format(graph.getView().getScale()));
|
||||||
graph.getView().addListener(mxEvent.SCALE, scaleListener);
|
graph.getView().addListener(mxEvent.SCALE, scaleListener);
|
||||||
graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE, scaleListener);
|
graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE, scaleListener);
|
||||||
|
|
||||||
@ -373,223 +373,220 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
private void initComponents() {
|
private void initComponents() {
|
||||||
|
|
||||||
splitPane = new javax.swing.JSplitPane();
|
splitPane = new JSplitPane();
|
||||||
borderLayoutPanel = new javax.swing.JPanel();
|
borderLayoutPanel = new JPanel();
|
||||||
placeHolderPanel = new javax.swing.JPanel();
|
placeHolderPanel = new JPanel();
|
||||||
jTextArea1 = new javax.swing.JTextArea();
|
jTextArea1 = new JTextArea();
|
||||||
toolbar = new javax.swing.JPanel();
|
toolbar = new JPanel();
|
||||||
fastOrganicLayoutButton = new javax.swing.JButton();
|
fastOrganicLayoutButton = new JButton();
|
||||||
zoomOutButton = new javax.swing.JButton();
|
zoomOutButton = new JButton();
|
||||||
zoomInButton = new javax.swing.JButton();
|
zoomInButton = new JButton();
|
||||||
zoomActualButton = new javax.swing.JButton();
|
zoomActualButton = new JButton();
|
||||||
fitZoomButton = new javax.swing.JButton();
|
fitZoomButton = new JButton();
|
||||||
jLabel2 = new javax.swing.JLabel();
|
zoomLabel = new JLabel();
|
||||||
zoomLabel = new javax.swing.JLabel();
|
zoomPercentLabel = new JLabel();
|
||||||
clearVizButton = new javax.swing.JButton();
|
clearVizButton = new JButton();
|
||||||
jSeparator2 = new javax.swing.JToolBar.Separator();
|
jSeparator2 = new JToolBar.Separator();
|
||||||
backButton = new javax.swing.JButton();
|
backButton = new JButton();
|
||||||
forwardButton = new javax.swing.JButton();
|
forwardButton = new JButton();
|
||||||
snapshotButton = new javax.swing.JButton();
|
snapshotButton = new JButton();
|
||||||
jSeparator3 = new javax.swing.JToolBar.Separator();
|
jSeparator3 = new JToolBar.Separator();
|
||||||
jSeparator4 = new javax.swing.JToolBar.Separator();
|
jSeparator4 = new JToolBar.Separator();
|
||||||
notificationsJFXPanel = new javafx.embed.swing.JFXPanel();
|
notificationsJFXPanel = new JFXPanel();
|
||||||
|
|
||||||
setLayout(new java.awt.BorderLayout());
|
setLayout(new BorderLayout());
|
||||||
|
|
||||||
splitPane.setDividerLocation(800);
|
splitPane.setDividerLocation(800);
|
||||||
splitPane.setResizeWeight(0.5);
|
splitPane.setResizeWeight(0.5);
|
||||||
|
|
||||||
borderLayoutPanel.setLayout(new java.awt.BorderLayout());
|
borderLayoutPanel.setLayout(new BorderLayout());
|
||||||
|
|
||||||
jTextArea1.setBackground(new java.awt.Color(240, 240, 240));
|
jTextArea1.setBackground(new Color(240, 240, 240));
|
||||||
jTextArea1.setColumns(20);
|
jTextArea1.setColumns(20);
|
||||||
jTextArea1.setLineWrap(true);
|
jTextArea1.setLineWrap(true);
|
||||||
jTextArea1.setRows(5);
|
jTextArea1.setRows(5);
|
||||||
jTextArea1.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jTextArea1.text")); // NOI18N
|
jTextArea1.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jTextArea1.text")); // NOI18N
|
||||||
|
|
||||||
org.jdesktop.layout.GroupLayout placeHolderPanelLayout = new org.jdesktop.layout.GroupLayout(placeHolderPanel);
|
GroupLayout placeHolderPanelLayout = new GroupLayout(placeHolderPanel);
|
||||||
placeHolderPanel.setLayout(placeHolderPanelLayout);
|
placeHolderPanel.setLayout(placeHolderPanelLayout);
|
||||||
placeHolderPanelLayout.setHorizontalGroup(
|
placeHolderPanelLayout.setHorizontalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
|
||||||
placeHolderPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
|
|
||||||
.add(placeHolderPanelLayout.createSequentialGroup()
|
.add(placeHolderPanelLayout.createSequentialGroup()
|
||||||
.addContainerGap(250, Short.MAX_VALUE)
|
.addContainerGap(250, Short.MAX_VALUE)
|
||||||
.add(jTextArea1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 424, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
|
.add(jTextArea1, GroupLayout.PREFERRED_SIZE, 424, GroupLayout.PREFERRED_SIZE)
|
||||||
.addContainerGap(423, Short.MAX_VALUE))
|
.addContainerGap(423, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
placeHolderPanelLayout.setVerticalGroup(
|
placeHolderPanelLayout.setVerticalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
|
||||||
placeHolderPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
|
|
||||||
.add(placeHolderPanelLayout.createSequentialGroup()
|
.add(placeHolderPanelLayout.createSequentialGroup()
|
||||||
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.add(jTextArea1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 47, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
|
.add(jTextArea1, GroupLayout.PREFERRED_SIZE, 47, GroupLayout.PREFERRED_SIZE)
|
||||||
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
|
|
||||||
borderLayoutPanel.add(placeHolderPanel, java.awt.BorderLayout.CENTER);
|
borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER);
|
||||||
|
|
||||||
fastOrganicLayoutButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N
|
fastOrganicLayoutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-circle-double-135.png"))); // NOI18N
|
||||||
fastOrganicLayoutButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N
|
fastOrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N
|
||||||
fastOrganicLayoutButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.toolTipText")); // NOI18N
|
fastOrganicLayoutButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.toolTipText")); // NOI18N
|
||||||
fastOrganicLayoutButton.setFocusable(false);
|
fastOrganicLayoutButton.setFocusable(false);
|
||||||
fastOrganicLayoutButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
fastOrganicLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
|
|
||||||
zoomOutButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"))); // NOI18N
|
zoomOutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"))); // NOI18N
|
||||||
zoomOutButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N
|
zoomOutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N
|
||||||
zoomOutButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.toolTipText")); // NOI18N
|
zoomOutButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.toolTipText")); // NOI18N
|
||||||
zoomOutButton.setFocusable(false);
|
zoomOutButton.setFocusable(false);
|
||||||
zoomOutButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
zoomOutButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
zoomOutButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
zoomOutButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
zoomOutButton.addActionListener(new java.awt.event.ActionListener() {
|
zoomOutButton.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
zoomOutButtonActionPerformed(evt);
|
zoomOutButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
zoomInButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N
|
zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N
|
||||||
zoomInButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N
|
zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N
|
||||||
zoomInButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N
|
zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N
|
||||||
zoomInButton.setFocusable(false);
|
zoomInButton.setFocusable(false);
|
||||||
zoomInButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
zoomInButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
zoomInButton.addActionListener(new java.awt.event.ActionListener() {
|
zoomInButton.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
zoomInButtonActionPerformed(evt);
|
zoomInButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
zoomActualButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N
|
zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N
|
||||||
zoomActualButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N
|
zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N
|
||||||
zoomActualButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N
|
zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N
|
||||||
zoomActualButton.setFocusable(false);
|
zoomActualButton.setFocusable(false);
|
||||||
zoomActualButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
zoomActualButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
zoomActualButton.addActionListener(new java.awt.event.ActionListener() {
|
zoomActualButton.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
zoomActualButtonActionPerformed(evt);
|
zoomActualButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
fitZoomButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N
|
fitZoomButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N
|
||||||
fitZoomButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N
|
fitZoomButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N
|
||||||
fitZoomButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.toolTipText")); // NOI18N
|
fitZoomButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.toolTipText")); // NOI18N
|
||||||
fitZoomButton.setFocusable(false);
|
fitZoomButton.setFocusable(false);
|
||||||
fitZoomButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
|
fitZoomButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
fitZoomButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
|
fitZoomButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
fitZoomButton.addActionListener(new java.awt.event.ActionListener() {
|
fitZoomButton.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
fitZoomButtonActionPerformed(evt);
|
fitZoomButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
jLabel2.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jLabel2.text")); // NOI18N
|
zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N
|
||||||
|
|
||||||
zoomLabel.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N
|
zoomPercentLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomPercentLabel.text")); // NOI18N
|
||||||
|
|
||||||
clearVizButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N
|
clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N
|
||||||
clearVizButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N
|
clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N
|
||||||
clearVizButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N
|
clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N
|
||||||
clearVizButton.setActionCommand(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N
|
clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N
|
||||||
clearVizButton.addActionListener(new java.awt.event.ActionListener() {
|
clearVizButton.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
clearVizButtonActionPerformed(evt);
|
clearVizButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);
|
jSeparator2.setOrientation(SwingConstants.VERTICAL);
|
||||||
|
|
||||||
backButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N
|
backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N
|
||||||
backButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N
|
backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N
|
||||||
backButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N
|
backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N
|
||||||
backButton.addActionListener(new java.awt.event.ActionListener() {
|
backButton.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
backButtonActionPerformed(evt);
|
backButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
forwardButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N
|
forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N
|
||||||
forwardButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N
|
forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N
|
||||||
forwardButton.setToolTipText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N
|
forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N
|
||||||
forwardButton.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING);
|
forwardButton.setHorizontalTextPosition(SwingConstants.LEADING);
|
||||||
forwardButton.addActionListener(new java.awt.event.ActionListener() {
|
forwardButton.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
forwardButtonActionPerformed(evt);
|
forwardButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
snapshotButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/report/images/image.png"))); // NOI18N
|
snapshotButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/report/images/image.png"))); // NOI18N
|
||||||
snapshotButton.setText(org.openide.util.NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.text_1")); // NOI18N
|
snapshotButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.text_1")); // NOI18N
|
||||||
snapshotButton.addActionListener(new java.awt.event.ActionListener() {
|
snapshotButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.toolTipText")); // NOI18N
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
snapshotButton.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
snapshotButtonActionPerformed(evt);
|
snapshotButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
jSeparator3.setOrientation(javax.swing.SwingConstants.VERTICAL);
|
jSeparator3.setOrientation(SwingConstants.VERTICAL);
|
||||||
|
|
||||||
jSeparator4.setOrientation(javax.swing.SwingConstants.VERTICAL);
|
jSeparator4.setOrientation(SwingConstants.VERTICAL);
|
||||||
|
|
||||||
org.jdesktop.layout.GroupLayout toolbarLayout = new org.jdesktop.layout.GroupLayout(toolbar);
|
GroupLayout toolbarLayout = new GroupLayout(toolbar);
|
||||||
toolbar.setLayout(toolbarLayout);
|
toolbar.setLayout(toolbarLayout);
|
||||||
toolbarLayout.setHorizontalGroup(
|
toolbarLayout.setHorizontalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
|
||||||
toolbarLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
|
|
||||||
.add(toolbarLayout.createSequentialGroup()
|
.add(toolbarLayout.createSequentialGroup()
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.add(backButton)
|
.add(backButton)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(forwardButton)
|
.add(forwardButton)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(jSeparator4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
|
.add(jSeparator4, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(fastOrganicLayoutButton)
|
.add(fastOrganicLayoutButton)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(clearVizButton)
|
.add(clearVizButton)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(jSeparator2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
|
.add(jSeparator2, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(jLabel2)
|
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
|
||||||
.add(zoomLabel)
|
.add(zoomLabel)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(zoomOutButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 32, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
|
.add(zoomPercentLabel)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(zoomInButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 32, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
|
.add(zoomOutButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(zoomActualButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 33, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
|
.add(zoomInButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(fitZoomButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 32, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
|
.add(zoomActualButton, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(jSeparator3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
|
.add(fitZoomButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
|
.add(jSeparator3, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(LayoutStyle.RELATED)
|
||||||
.add(snapshotButton)
|
.add(snapshotButton)
|
||||||
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
toolbarLayout.setVerticalGroup(
|
toolbarLayout.setVerticalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
|
||||||
toolbarLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
|
|
||||||
.add(toolbarLayout.createSequentialGroup()
|
.add(toolbarLayout.createSequentialGroup()
|
||||||
.add(3, 3, 3)
|
.add(3, 3, 3)
|
||||||
.add(toolbarLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.CENTER)
|
.add(toolbarLayout.createParallelGroup(GroupLayout.CENTER)
|
||||||
.add(fastOrganicLayoutButton)
|
.add(fastOrganicLayoutButton)
|
||||||
.add(zoomOutButton)
|
.add(zoomOutButton)
|
||||||
.add(zoomInButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.add(zoomInButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.add(zoomActualButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.add(zoomActualButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.add(fitZoomButton, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.add(fitZoomButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.add(jLabel2)
|
|
||||||
.add(zoomLabel)
|
.add(zoomLabel)
|
||||||
|
.add(zoomPercentLabel)
|
||||||
.add(clearVizButton)
|
.add(clearVizButton)
|
||||||
.add(jSeparator2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.add(jSeparator2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.add(backButton)
|
.add(backButton)
|
||||||
.add(forwardButton)
|
.add(forwardButton)
|
||||||
.add(snapshotButton)
|
.add(snapshotButton)
|
||||||
.add(jSeparator3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
.add(jSeparator3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.add(jSeparator4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.add(jSeparator4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
.add(3, 3, 3))
|
.add(3, 3, 3))
|
||||||
);
|
);
|
||||||
|
|
||||||
borderLayoutPanel.add(toolbar, java.awt.BorderLayout.PAGE_START);
|
borderLayoutPanel.add(toolbar, BorderLayout.PAGE_START);
|
||||||
borderLayoutPanel.add(notificationsJFXPanel, java.awt.BorderLayout.PAGE_END);
|
borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END);
|
||||||
|
|
||||||
splitPane.setLeftComponent(borderLayoutPanel);
|
splitPane.setLeftComponent(borderLayoutPanel);
|
||||||
|
|
||||||
add(splitPane, java.awt.BorderLayout.CENTER);
|
add(splitPane, BorderLayout.CENTER);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
private void fitZoomButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitZoomButtonActionPerformed
|
private void fitZoomButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitZoomButtonActionPerformed
|
||||||
@ -880,26 +877,26 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private javax.swing.JButton backButton;
|
private JButton backButton;
|
||||||
private javax.swing.JPanel borderLayoutPanel;
|
private JPanel borderLayoutPanel;
|
||||||
private javax.swing.JButton clearVizButton;
|
private JButton clearVizButton;
|
||||||
private javax.swing.JButton fastOrganicLayoutButton;
|
private JButton fastOrganicLayoutButton;
|
||||||
private javax.swing.JButton fitZoomButton;
|
private JButton fitZoomButton;
|
||||||
private javax.swing.JButton forwardButton;
|
private JButton forwardButton;
|
||||||
private javax.swing.JLabel jLabel2;
|
private JToolBar.Separator jSeparator2;
|
||||||
private javax.swing.JToolBar.Separator jSeparator2;
|
private JToolBar.Separator jSeparator3;
|
||||||
private javax.swing.JToolBar.Separator jSeparator3;
|
private JToolBar.Separator jSeparator4;
|
||||||
private javax.swing.JToolBar.Separator jSeparator4;
|
private JTextArea jTextArea1;
|
||||||
private javax.swing.JTextArea jTextArea1;
|
private JFXPanel notificationsJFXPanel;
|
||||||
private javafx.embed.swing.JFXPanel notificationsJFXPanel;
|
private JPanel placeHolderPanel;
|
||||||
private javax.swing.JPanel placeHolderPanel;
|
private JButton snapshotButton;
|
||||||
private javax.swing.JButton snapshotButton;
|
private JSplitPane splitPane;
|
||||||
private javax.swing.JSplitPane splitPane;
|
private JPanel toolbar;
|
||||||
private javax.swing.JPanel toolbar;
|
private JButton zoomActualButton;
|
||||||
private javax.swing.JButton zoomActualButton;
|
private JButton zoomInButton;
|
||||||
private javax.swing.JButton zoomInButton;
|
private JLabel zoomLabel;
|
||||||
private javax.swing.JLabel zoomLabel;
|
private JButton zoomOutButton;
|
||||||
private javax.swing.JButton zoomOutButton;
|
private JLabel zoomPercentLabel;
|
||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
BIN
Core/src/org/sleuthkit/autopsy/communications/images/defaultContact.png
Executable file
BIN
Core/src/org/sleuthkit/autopsy/communications/images/defaultContact.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2019 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obt ain 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.communications.relationships;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A comparator class for comparing BlackboardArtifacts of type
|
||||||
|
* TSK_EMAIL_MSG, TSK_MESSAGE, and TSK_CALLLOG by their respective creation
|
||||||
|
* date-time.
|
||||||
|
*/
|
||||||
|
class BlackboardArtifactDateComparator implements Comparator<BlackboardArtifact> {
|
||||||
|
static final int ACCENDING = 1;
|
||||||
|
static final int DECENDING = -1;
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(BlackboardArtifactDateComparator.class.getName());
|
||||||
|
|
||||||
|
private final int direction;
|
||||||
|
|
||||||
|
BlackboardArtifactDateComparator(int direction) {
|
||||||
|
this.direction = direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(BlackboardArtifact bba1, BlackboardArtifact bba2) {
|
||||||
|
|
||||||
|
BlackboardAttribute attribute1 = getTimeAttributeForArtifact(bba1);
|
||||||
|
BlackboardAttribute attribute2 = getTimeAttributeForArtifact(bba2);
|
||||||
|
// Inializing to Long.MAX_VALUE so that if a BlackboardArtifact of
|
||||||
|
// any unexpected type is passed in, it will bubble to the top of
|
||||||
|
// the list.
|
||||||
|
long dateTime1 = Long.MAX_VALUE;
|
||||||
|
long dateTime2 = Long.MAX_VALUE;
|
||||||
|
|
||||||
|
if (attribute1 != null) {
|
||||||
|
dateTime1 = attribute1.getValueLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attribute2 != null) {
|
||||||
|
dateTime2 = attribute2.getValueLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Long.compare(dateTime1, dateTime2) * direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlackboardAttribute getTimeAttributeForArtifact(BlackboardArtifact artifact) {
|
||||||
|
if(artifact == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlackboardAttribute attribute = null;
|
||||||
|
|
||||||
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
|
||||||
|
if (fromID != null) {
|
||||||
|
try {
|
||||||
|
switch (fromID) {
|
||||||
|
case TSK_EMAIL_MSG:
|
||||||
|
attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT));
|
||||||
|
break;
|
||||||
|
case TSK_MESSAGE:
|
||||||
|
attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME));
|
||||||
|
break;
|
||||||
|
case TSK_CALLLOG:
|
||||||
|
attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
attribute = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, String.format("Unable to compare attributes for artifact %d", artifact.getArtifactID()), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return attribute;
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,8 @@
|
|||||||
|
CallLogViewer_device_label=Device
|
||||||
|
CallLogViewer_duration_label=Duration(seconds)
|
||||||
|
CallLogViewer_noCallLogs=<No call logs found for selected account>
|
||||||
|
CallLogViewer_recipient_label=To/From
|
||||||
|
CallLogViewer_title=Call Logs
|
||||||
ContactDetailsPane.nameLabel.text=Placeholder
|
ContactDetailsPane.nameLabel.text=Placeholder
|
||||||
ContactNode_Email=Email Address
|
ContactNode_Email=Email Address
|
||||||
ContactNode_Home_Number=Home Number
|
ContactNode_Home_Number=Home Number
|
||||||
|
117
Core/src/org/sleuthkit/autopsy/communications/relationships/CallLogNode.java
Executable file
117
Core/src/org/sleuthkit/autopsy/communications/relationships/CallLogNode.java
Executable file
@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2019 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.communications.relationships;
|
||||||
|
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import org.openide.nodes.Sheet;
|
||||||
|
import org.sleuthkit.autopsy.communications.Utils;
|
||||||
|
import static org.sleuthkit.autopsy.communications.relationships.RelationshipsNodeUtilities.getAttributeDisplayString;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode;
|
||||||
|
import org.sleuthkit.autopsy.datamodel.NodeProperty;
|
||||||
|
import org.sleuthkit.datamodel.Account;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_END;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A BlackboardArtifactNode for Calllogs.
|
||||||
|
*/
|
||||||
|
final class CallLogNode extends BlackboardArtifactNode {
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(CallLogNode.class.getName());
|
||||||
|
|
||||||
|
final static String DURATION_PROP = "duration";
|
||||||
|
|
||||||
|
CallLogNode(BlackboardArtifact artifact, String deviceID) {
|
||||||
|
super(artifact, Utils.getIconFilePath(Account.Type.PHONE));
|
||||||
|
setDisplayName(deviceID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Sheet createSheet() {
|
||||||
|
Sheet sheet = super.createSheet();
|
||||||
|
Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
|
||||||
|
if (sheetSet == null) {
|
||||||
|
sheetSet = Sheet.createPropertiesSet();
|
||||||
|
sheet.put(sheetSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
final BlackboardArtifact artifact = getArtifact();
|
||||||
|
|
||||||
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
|
||||||
|
if (null != fromID && fromID != TSK_CALLLOG) {
|
||||||
|
return sheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
String phoneNumber = getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM);
|
||||||
|
if(phoneNumber == null || phoneNumber.isEmpty()) {
|
||||||
|
phoneNumber = getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO);
|
||||||
|
}
|
||||||
|
|
||||||
|
long duration = -1;
|
||||||
|
try{
|
||||||
|
duration = getCallDuration(artifact);
|
||||||
|
} catch(TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, String.format("Unable to get calllog duration for artifact: %d", artifact.getArtifactID()), ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
sheetSet.put(createNode(TSK_DATETIME_START, artifact));
|
||||||
|
sheetSet.put(createNode(TSK_DIRECTION, artifact));
|
||||||
|
sheetSet.put(new NodeProperty<>(TSK_PHONE_NUMBER.getLabel(), TSK_PHONE_NUMBER.getDisplayName(), "", phoneNumber));
|
||||||
|
if(duration != -1) {
|
||||||
|
sheetSet.put(new NodeProperty<>("duration", "Duration", "", Long.toString(duration)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return sheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeProperty<?> createNode(BlackboardAttribute.ATTRIBUTE_TYPE type, BlackboardArtifact artifact) {
|
||||||
|
return new NodeProperty<>(type.getLabel(), type.getDisplayName(), type.getDisplayName(), getAttributeDisplayString(artifact, type));
|
||||||
|
}
|
||||||
|
|
||||||
|
long getCallDuration(BlackboardArtifact artifact) throws TskCoreException {
|
||||||
|
BlackboardAttribute startAttribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(TSK_DATETIME_START.getTypeID())));
|
||||||
|
BlackboardAttribute endAttribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(TSK_DATETIME_END.getTypeID())));
|
||||||
|
|
||||||
|
if(startAttribute == null || endAttribute == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return endAttribute.getValueLong() - startAttribute.getValueLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Circumvent DataResultFilterNode's slightly odd delegation to
|
||||||
|
* BlackboardArtifactNode.getSourceName().
|
||||||
|
*
|
||||||
|
* @return the displayName of this Node, which is the type.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getSourceName() {
|
||||||
|
return getDisplayName();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
<?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.DesignGridBagLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel" name="outlineViewPanel">
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
|
||||||
|
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="15" insetsBottom="15" insetsRight="15" anchor="12" weightX="1.0" weightY="1.0"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
146
Core/src/org/sleuthkit/autopsy/communications/relationships/CallLogViewer.java
Executable file
146
Core/src/org/sleuthkit/autopsy/communications/relationships/CallLogViewer.java
Executable file
@ -0,0 +1,146 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2019 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.sleuthkit.autopsy.communications.relationships;
|
||||||
|
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import org.netbeans.swing.outline.DefaultOutlineModel;
|
||||||
|
import org.netbeans.swing.outline.Outline;
|
||||||
|
import org.openide.nodes.AbstractNode;
|
||||||
|
import org.openide.nodes.Children;
|
||||||
|
import org.openide.nodes.NodeAdapter;
|
||||||
|
import org.openide.nodes.NodeMemberEvent;
|
||||||
|
import org.openide.util.Lookup;
|
||||||
|
import org.openide.util.NbBundle.Messages;
|
||||||
|
import org.sleuthkit.autopsy.corecomponents.TableFilterNode;
|
||||||
|
import org.sleuthkit.autopsy.directorytree.DataResultFilterNode;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* CallLogViewer Panel
|
||||||
|
*/
|
||||||
|
final class CallLogViewer extends javax.swing.JPanel implements RelationshipsViewer {
|
||||||
|
|
||||||
|
private final CallLogsChildNodeFactory nodeFactory;
|
||||||
|
|
||||||
|
@Messages({
|
||||||
|
"CallLogViewer_title=Call Logs",
|
||||||
|
"CallLogViewer_noCallLogs=<No call logs found for selected account>",
|
||||||
|
"CallLogViewer_recipient_label=To/From",
|
||||||
|
"CallLogViewer_duration_label=Duration(seconds)",
|
||||||
|
"CallLogViewer_device_label=Device"
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new form CallLogViewer
|
||||||
|
*/
|
||||||
|
public CallLogViewer() {
|
||||||
|
initComponents();
|
||||||
|
|
||||||
|
nodeFactory = new CallLogsChildNodeFactory(null);
|
||||||
|
outlineViewPanel.hideOutlineView(Bundle.CallLogViewer_noCallLogs());
|
||||||
|
|
||||||
|
outlineViewPanel.getOutlineView().setPropertyColumns(
|
||||||
|
TSK_DIRECTION.getLabel(), TSK_DIRECTION.getDisplayName(),
|
||||||
|
TSK_PHONE_NUMBER.getLabel(), Bundle.CallLogViewer_recipient_label(),
|
||||||
|
TSK_DATETIME_START.getLabel(), TSK_DATETIME_START.getDisplayName(),
|
||||||
|
CallLogNode.DURATION_PROP, Bundle.CallLogViewer_duration_label()
|
||||||
|
);
|
||||||
|
|
||||||
|
Outline outline = outlineViewPanel.getOutlineView().getOutline();
|
||||||
|
outline.setRootVisible(false);
|
||||||
|
((DefaultOutlineModel) outline.getOutlineModel()).setNodesColumnLabel(Bundle.CallLogViewer_device_label());
|
||||||
|
|
||||||
|
outlineViewPanel.getExplorerManager().setRootContext(
|
||||||
|
new TableFilterNode(
|
||||||
|
new DataResultFilterNode(
|
||||||
|
new AbstractNode(Children.create(nodeFactory, true)), outlineViewPanel.getExplorerManager()), true));
|
||||||
|
|
||||||
|
outlineViewPanel.getExplorerManager().getRootContext().addNodeListener(new NodeAdapter(){
|
||||||
|
@Override
|
||||||
|
public void childrenAdded(NodeMemberEvent nme) {
|
||||||
|
updateOutlineViewPanel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void childrenRemoved(NodeMemberEvent nme) {
|
||||||
|
updateOutlineViewPanel();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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() {
|
||||||
|
java.awt.GridBagConstraints gridBagConstraints;
|
||||||
|
|
||||||
|
outlineViewPanel = new org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel();
|
||||||
|
|
||||||
|
setLayout(new java.awt.GridBagLayout());
|
||||||
|
gridBagConstraints = new java.awt.GridBagConstraints();
|
||||||
|
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
|
||||||
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST;
|
||||||
|
gridBagConstraints.weightx = 1.0;
|
||||||
|
gridBagConstraints.weighty = 1.0;
|
||||||
|
gridBagConstraints.insets = new java.awt.Insets(15, 15, 15, 15);
|
||||||
|
add(outlineViewPanel, gridBagConstraints);
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDisplayName() {
|
||||||
|
return Bundle.CallLogViewer_title();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JPanel getPanel() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSelectionInfo(SelectionInfo info) {
|
||||||
|
nodeFactory.refresh(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Lookup getLookup() {
|
||||||
|
return outlineViewPanel.getLookup();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateOutlineViewPanel() {
|
||||||
|
int nodeCount = outlineViewPanel.getExplorerManager().getRootContext().getChildren().getNodesCount();
|
||||||
|
if(nodeCount == 0) {
|
||||||
|
outlineViewPanel.hideOutlineView(Bundle.ContactsViewer_noContacts_message());
|
||||||
|
} else {
|
||||||
|
outlineViewPanel.showOutlineView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private org.sleuthkit.autopsy.communications.relationships.OutlineViewPanel outlineViewPanel;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
}
|
@ -0,0 +1,204 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2019 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obt ain 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.communications.relationships;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import org.openide.nodes.ChildFactory;
|
||||||
|
import org.openide.nodes.Node;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
|
import org.sleuthkit.autopsy.communications.relationships.CallLogsChildNodeFactory.CallLogNodeKey;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.datamodel.Account;
|
||||||
|
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import org.sleuthkit.datamodel.CommunicationsFilter;
|
||||||
|
import org.sleuthkit.datamodel.CommunicationsManager;
|
||||||
|
import org.sleuthkit.datamodel.Content;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*A ChildFactory for CallLog artifacts.
|
||||||
|
*/
|
||||||
|
final class CallLogsChildNodeFactory extends ChildFactory<CallLogNodeKey>{
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(CallLogsChildNodeFactory.class.getName());
|
||||||
|
|
||||||
|
private SelectionInfo selectionInfo;
|
||||||
|
|
||||||
|
private final Map<String, String> deviceIDMap = new HashMap<>();
|
||||||
|
|
||||||
|
CallLogsChildNodeFactory(SelectionInfo selectionInfo) {
|
||||||
|
this.selectionInfo = selectionInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void refresh(SelectionInfo selectionInfo) {
|
||||||
|
this.selectionInfo = selectionInfo;
|
||||||
|
refresh(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean createKeys(List<CallLogNodeKey> list) {
|
||||||
|
|
||||||
|
if(selectionInfo == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Set<Content> relationshipSources;
|
||||||
|
try {
|
||||||
|
relationshipSources = selectionInfo.getRelationshipSources();
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.SEVERE, "Failed to load relationship sources.", ex); //NON-NLS
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for(Content content: relationshipSources) {
|
||||||
|
if( !(content instanceof BlackboardArtifact)){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlackboardArtifact bba = (BlackboardArtifact) content;
|
||||||
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba.getArtifactTypeID());
|
||||||
|
|
||||||
|
if ( fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG) {
|
||||||
|
|
||||||
|
String deviceID = "";
|
||||||
|
try {
|
||||||
|
deviceID = getDeviceIDForDataSource(bba.getDataSource().getName());
|
||||||
|
} catch (NoCurrentCaseException | TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, String.format("Unable to get account for artifact data source: artifactID = %d", bba.getId()), ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
list.add(new CallLogNodeKey(bba, deviceID));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list.sort(new CallLogComparator(BlackboardArtifactDateComparator.ACCENDING));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Node createNodeForKey(CallLogNodeKey key) {
|
||||||
|
|
||||||
|
return new CallLogNode(key.getArtifact(), key.getDeviceID());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the device ID for the given data source.
|
||||||
|
*
|
||||||
|
* To reduce lookup calls to the DB unique dataSourceName\deviceID pairs
|
||||||
|
* are stored in deviceIDMap.
|
||||||
|
*
|
||||||
|
* @param dataSourceName String name of data source
|
||||||
|
*
|
||||||
|
* @return device ID for given dataSourceName or empty string if non is found.
|
||||||
|
*
|
||||||
|
* @throws NoCurrentCaseException
|
||||||
|
* @throws TskCoreException
|
||||||
|
*/
|
||||||
|
private String getDeviceIDForDataSource(String dataSourceName) throws NoCurrentCaseException, TskCoreException{
|
||||||
|
|
||||||
|
String deviceID = deviceIDMap.get(dataSourceName);
|
||||||
|
|
||||||
|
if(deviceID == null) {
|
||||||
|
CommunicationsManager manager = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager();
|
||||||
|
CommunicationsFilter filter = new CommunicationsFilter();
|
||||||
|
|
||||||
|
List<String> list = new ArrayList<>();
|
||||||
|
list.add(dataSourceName);
|
||||||
|
|
||||||
|
List<Account.Type> typeList = new ArrayList<Account.Type>();
|
||||||
|
typeList.add(Account.Type.DEVICE);
|
||||||
|
|
||||||
|
filter.addAndFilter(new CommunicationsFilter.DeviceFilter(list));
|
||||||
|
filter.addAndFilter(new CommunicationsFilter.AccountTypeFilter(typeList));
|
||||||
|
|
||||||
|
|
||||||
|
// This list should just have 1 item in it
|
||||||
|
List<AccountDeviceInstance> adiList = manager.getAccountDeviceInstancesWithRelationships(filter);
|
||||||
|
|
||||||
|
if( adiList != null && !adiList.isEmpty() ) {
|
||||||
|
deviceID = adiList.get(0).getDeviceId();
|
||||||
|
} else {
|
||||||
|
deviceID = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceIDMap.put(dataSourceName, deviceID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (deviceID != null ? deviceID : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ChildFactory key class which contains a BlackboardArtifact and its
|
||||||
|
* data source deviceID
|
||||||
|
*/
|
||||||
|
final class CallLogNodeKey{
|
||||||
|
private final BlackboardArtifact artifact;
|
||||||
|
private final String deviceID;
|
||||||
|
|
||||||
|
private CallLogNodeKey(BlackboardArtifact artifact, String deviceID) {
|
||||||
|
this.artifact = artifact;
|
||||||
|
this.deviceID = deviceID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the BlackboardArtifact for this key
|
||||||
|
*
|
||||||
|
* @return BlackboardArtifact instance
|
||||||
|
*/
|
||||||
|
BlackboardArtifact getArtifact() {
|
||||||
|
return artifact;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the BlackboardArtifact data source device ID.
|
||||||
|
*
|
||||||
|
* @return String device id.
|
||||||
|
*/
|
||||||
|
String getDeviceID() {
|
||||||
|
return deviceID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A comparator for CallLogNodeKey objects
|
||||||
|
*/
|
||||||
|
final class CallLogComparator implements Comparator<CallLogNodeKey>{
|
||||||
|
|
||||||
|
final BlackboardArtifactDateComparator comparator;
|
||||||
|
|
||||||
|
CallLogComparator(int direction) {
|
||||||
|
comparator = new BlackboardArtifactDateComparator(direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(CallLogNodeKey key1, CallLogNodeKey key2) {
|
||||||
|
return comparator.compare(key1.getArtifact(), key2.getArtifact());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
<NonVisualComponents>
|
|
||||||
<Component class="org.sleuthkit.autopsy.contentviewers.MessageContentViewer" name="messageContentViewer1">
|
|
||||||
</Component>
|
|
||||||
</NonVisualComponents>
|
|
||||||
<AuxValues>
|
<AuxValues>
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
@ -15,6 +11,7 @@
|
|||||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
<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>
|
</AuxValues>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
||||||
|
@ -18,24 +18,40 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.communications.relationships;
|
package org.sleuthkit.autopsy.communications.relationships;
|
||||||
|
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.swing.ImageIcon;
|
||||||
import org.openide.explorer.ExplorerManager;
|
import org.openide.explorer.ExplorerManager;
|
||||||
import org.openide.nodes.Node;
|
import org.openide.nodes.Node;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import org.sleuthkit.datamodel.Content;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the propertied of a ContactNode in a PropertySheet.
|
* Displays the propertied of a ContactNode in a PropertySheet.
|
||||||
*/
|
*/
|
||||||
public final class ContactDetailsPane extends javax.swing.JPanel implements ExplorerManager.Provider {
|
public final class ContactDetailsPane extends javax.swing.JPanel implements ExplorerManager.Provider {
|
||||||
|
|
||||||
final private ExplorerManager explorerManager = new ExplorerManager();
|
private static final Logger logger = Logger.getLogger(ContactDetailsPane.class.getName());
|
||||||
|
|
||||||
|
private final static String DEFAULT_IMAGE_PATH = "/org/sleuthkit/autopsy/communications/images/defaultContact.png";
|
||||||
|
|
||||||
|
private final ExplorerManager explorerManager = new ExplorerManager();
|
||||||
|
private final ImageIcon defaultImage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the propertied of a ContactNode in a PropertySheet.
|
* Displays the propertied of a ContactNode in a PropertySheet.
|
||||||
*/
|
*/
|
||||||
public ContactDetailsPane() {
|
public ContactDetailsPane() {
|
||||||
initComponents();
|
initComponents();
|
||||||
this.setEnabled(false);
|
|
||||||
|
|
||||||
nameLabel.setText("");
|
nameLabel.setText("");
|
||||||
|
|
||||||
|
defaultImage = new ImageIcon(ContactDetailsPane.class.getResource(DEFAULT_IMAGE_PATH));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -46,9 +62,16 @@ public final class ContactDetailsPane extends javax.swing.JPanel implements Expl
|
|||||||
public void setNode(Node[] nodes) {
|
public void setNode(Node[] nodes) {
|
||||||
if (nodes != null && nodes.length == 1) {
|
if (nodes != null && nodes.length == 1) {
|
||||||
nameLabel.setText(nodes[0].getDisplayName());
|
nameLabel.setText(nodes[0].getDisplayName());
|
||||||
|
nameLabel.setIcon(null);
|
||||||
propertySheet.setNodes(nodes);
|
propertySheet.setNodes(nodes);
|
||||||
|
|
||||||
|
BlackboardArtifact n = nodes[0].getLookup().lookup(BlackboardArtifact.class);
|
||||||
|
if(n != null) {
|
||||||
|
nameLabel.setIcon(getImageFromArtifact(n));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
nameLabel.setText("");
|
nameLabel.setText("");
|
||||||
|
nameLabel.setIcon(null);
|
||||||
propertySheet.setNodes(null);
|
propertySheet.setNodes(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,12 +80,40 @@ public final class ContactDetailsPane extends javax.swing.JPanel implements Expl
|
|||||||
public ExplorerManager getExplorerManager() {
|
public ExplorerManager getExplorerManager() {
|
||||||
return explorerManager;
|
return explorerManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public ImageIcon getImageFromArtifact(BlackboardArtifact artifact){
|
||||||
public void setEnabled(boolean enabled) {
|
ImageIcon imageIcon = defaultImage;
|
||||||
super.setEnabled(enabled);
|
|
||||||
nameLabel.setEnabled(enabled);
|
if(artifact == null) {
|
||||||
propertySheet.setEnabled(enabled);
|
return imageIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlackboardArtifact.ARTIFACT_TYPE artifactType = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
|
||||||
|
if(artifactType != BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT) {
|
||||||
|
return imageIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
for(Content content: artifact.getChildren()) {
|
||||||
|
if(content instanceof AbstractFile) {
|
||||||
|
AbstractFile file = (AbstractFile)content;
|
||||||
|
|
||||||
|
try {
|
||||||
|
BufferedImage image = ImageIO.read(new File(file.getLocalAbsPath()));
|
||||||
|
imageIcon = new ImageIcon(image);
|
||||||
|
break;
|
||||||
|
} catch (IOException ex) {
|
||||||
|
// ImageIO.read will through an IOException if file is not an image
|
||||||
|
// therefore we don't need to report this exception just try
|
||||||
|
// the next file.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, String.format("Unable to load image for contact: %d", artifact.getId()), ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return imageIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -75,7 +126,6 @@ public final class ContactDetailsPane extends javax.swing.JPanel implements Expl
|
|||||||
private void initComponents() {
|
private void initComponents() {
|
||||||
java.awt.GridBagConstraints gridBagConstraints;
|
java.awt.GridBagConstraints gridBagConstraints;
|
||||||
|
|
||||||
messageContentViewer1 = new org.sleuthkit.autopsy.contentviewers.MessageContentViewer();
|
|
||||||
nameLabel = new javax.swing.JLabel();
|
nameLabel = new javax.swing.JLabel();
|
||||||
propertySheet = new org.openide.explorer.propertysheet.PropertySheet();
|
propertySheet = new org.openide.explorer.propertysheet.PropertySheet();
|
||||||
|
|
||||||
@ -107,7 +157,6 @@ public final class ContactDetailsPane extends javax.swing.JPanel implements Expl
|
|||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private org.sleuthkit.autopsy.contentviewers.MessageContentViewer messageContentViewer1;
|
|
||||||
private javax.swing.JLabel nameLabel;
|
private javax.swing.JLabel nameLabel;
|
||||||
private org.openide.explorer.propertysheet.PropertySheet propertySheet;
|
private org.openide.explorer.propertysheet.PropertySheet propertySheet;
|
||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package org.sleuthkit.autopsy.communications.relationships;
|
package org.sleuthkit.autopsy.communications.relationships;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@ -36,6 +37,8 @@ import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBU
|
|||||||
import org.sleuthkit.datamodel.TimeUtilities;
|
import org.sleuthkit.datamodel.TimeUtilities;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.autopsy.communications.Utils;
|
import org.sleuthkit.autopsy.communications.Utils;
|
||||||
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
import org.sleuthkit.datamodel.Content;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends BlackboardArtifactNode to override createSheet to create a contact
|
* Extends BlackboardArtifactNode to override createSheet to create a contact
|
||||||
@ -112,6 +115,25 @@ final class ContactNode extends BlackboardArtifactNode {
|
|||||||
for (BlackboardAttribute bba : otherMap.values()) {
|
for (BlackboardAttribute bba : otherMap.values()) {
|
||||||
sheetSet.put(new NodeProperty<>(bba.getAttributeType().getTypeName(), bba.getAttributeType().getDisplayName(), "", bba.getDisplayString()));
|
sheetSet.put(new NodeProperty<>(bba.getAttributeType().getTypeName(), bba.getAttributeType().getDisplayName(), "", bba.getDisplayString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Don't need these values to appear in the Contact property sheet.
|
||||||
|
sheetSet.remove("S");
|
||||||
|
sheetSet.remove("C");
|
||||||
|
|
||||||
|
List<Content> children = artifact.getChildren();
|
||||||
|
if(children != null) {
|
||||||
|
int count = 0;
|
||||||
|
String imageLabelPrefix = "Image";
|
||||||
|
for(Content child: children) {
|
||||||
|
if(child instanceof AbstractFile) {
|
||||||
|
String imageLabel = imageLabelPrefix;
|
||||||
|
if(count > 0) {
|
||||||
|
imageLabel = imageLabelPrefix + "-" + count;
|
||||||
|
}
|
||||||
|
sheetSet.put(new NodeProperty<>(imageLabel, imageLabel, imageLabel, child.getName()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
logger.log(Level.WARNING, "Error getting attribute values.", ex); //NON-NLS
|
logger.log(Level.WARNING, "Error getting attribute values.", ex); //NON-NLS
|
||||||
|
@ -142,9 +142,6 @@ public final class ContactsViewer extends JPanel implements RelationshipsViewer{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSelectionInfo(SelectionInfo info) {
|
public void setSelectionInfo(SelectionInfo info) {
|
||||||
contactPane.setNode(new Node[]{new AbstractNode(Children.LEAF)});
|
|
||||||
contactPane.setEnabled(false);
|
|
||||||
|
|
||||||
nodeFactory.refresh(info);
|
nodeFactory.refresh(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.communications.relationships;
|
package org.sleuthkit.autopsy.communications.relationships;
|
||||||
|
|
||||||
import java.util.TimeZone;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.Action;
|
import javax.swing.Action;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@ -27,20 +26,18 @@ import org.openide.util.NbBundle.Messages;
|
|||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.datamodel.NodeProperty;
|
import org.sleuthkit.autopsy.datamodel.NodeProperty;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
|
||||||
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME;
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME;
|
||||||
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT;
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT;
|
||||||
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START;
|
|
||||||
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM;
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM;
|
||||||
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO;
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO;
|
||||||
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM;
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM;
|
||||||
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO;
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO;
|
||||||
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT;
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT;
|
||||||
import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME;
|
|
||||||
import org.sleuthkit.datamodel.TimeUtilities;
|
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.autopsy.communications.Utils;
|
import static org.sleuthkit.autopsy.communications.relationships.RelationshipsNodeUtilities.getAttributeDisplayString;
|
||||||
import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode;
|
import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wraps a BlackboardArtifact as an AbstractNode for use in an OutlookView
|
* Wraps a BlackboardArtifact as an AbstractNode for use in an OutlookView
|
||||||
@ -48,7 +45,6 @@ import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode;
|
|||||||
class MessageNode extends BlackboardArtifactNode {
|
class MessageNode extends BlackboardArtifactNode {
|
||||||
|
|
||||||
public static final String UNTHREADED_ID = "<UNTHREADED>";
|
public static final String UNTHREADED_ID = "<UNTHREADED>";
|
||||||
public static final String CALL_LOG_ID = "<CALLLOG>";
|
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(MessageNode.class.getName());
|
private static final Logger logger = Logger.getLogger(MessageNode.class.getName());
|
||||||
|
|
||||||
@ -87,93 +83,46 @@ class MessageNode extends BlackboardArtifactNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sheetSet.put(new NodeProperty<>("Type", Bundle.MessageNode_Node_Property_Type(), "", getDisplayName())); //NON-NLS
|
sheetSet.put(new NodeProperty<>("Type", Bundle.MessageNode_Node_Property_Type(), "", getDisplayName())); //NON-NLS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final BlackboardArtifact artifact = getArtifact();
|
final BlackboardArtifact artifact = getArtifact();
|
||||||
if (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()) {
|
|
||||||
sheetSet.put(new NodeProperty<>("ThreadID", "ThreadID","",CALL_LOG_ID)); //NON-NLS
|
|
||||||
} else {
|
|
||||||
sheetSet.put(new NodeProperty<>("ThreadID", "ThreadID","",threadID == null ? UNTHREADED_ID : threadID)); //NON-NLS
|
|
||||||
}
|
|
||||||
|
|
||||||
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
|
||||||
if (null != fromID) {
|
|
||||||
//Consider refactoring this to reduce boilerplate
|
if(fromID == null ||
|
||||||
switch (fromID) {
|
(fromID != TSK_EMAIL_MSG &&
|
||||||
case TSK_EMAIL_MSG:
|
fromID != TSK_MESSAGE)) {
|
||||||
sheetSet.put(new NodeProperty<>("From", Bundle.MessageNode_Node_Property_From(), "",
|
return sheet;
|
||||||
StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_FROM), " \t\n;"))); //NON-NLS
|
|
||||||
sheetSet.put(new NodeProperty<>("To", Bundle.MessageNode_Node_Property_To(), "",
|
|
||||||
StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_TO), " \t\n;"))); //NON-NLS
|
|
||||||
sheetSet.put(new NodeProperty<>("Date", Bundle.MessageNode_Node_Property_Date(), "",
|
|
||||||
getAttributeDisplayString(artifact, TSK_DATETIME_SENT))); //NON-NLS
|
|
||||||
sheetSet.put(new NodeProperty<>("Subject", Bundle.MessageNode_Node_Property_Subject(), "",
|
|
||||||
getAttributeDisplayString(artifact, TSK_SUBJECT))); //NON-NLS
|
|
||||||
try {
|
|
||||||
sheetSet.put(new NodeProperty<>("Attms", Bundle.MessageNode_Node_Property_Attms(), "", artifact.getChildrenCount())); //NON-NLS
|
|
||||||
} catch (TskCoreException ex) {
|
|
||||||
logger.log(Level.WARNING, "Error loading attachment count for " + artifact, ex); //NON-NLS
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case TSK_MESSAGE:
|
|
||||||
sheetSet.put(new NodeProperty<>("From", Bundle.MessageNode_Node_Property_From(), "",
|
|
||||||
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM))); //NON-NLS
|
|
||||||
sheetSet.put(new NodeProperty<>("To", Bundle.MessageNode_Node_Property_To(), "",
|
|
||||||
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO))); //NON-NLS
|
|
||||||
sheetSet.put(new NodeProperty<>("Date", Bundle.MessageNode_Node_Property_Date(), "",
|
|
||||||
getAttributeDisplayString(artifact, TSK_DATETIME))); //NON-NLS
|
|
||||||
sheetSet.put(new NodeProperty<>("Subject", Bundle.MessageNode_Node_Property_Subject(), "",
|
|
||||||
getAttributeDisplayString(artifact, TSK_SUBJECT))); //NON-NLS
|
|
||||||
try {
|
|
||||||
sheetSet.put(new NodeProperty<>("Attms", Bundle.MessageNode_Node_Property_Attms(), "", artifact.getChildrenCount())); //NON-NLS
|
|
||||||
} catch (TskCoreException ex) {
|
|
||||||
logger.log(Level.WARNING, "Error loading attachment count for " + artifact, ex); //NON-NLS
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TSK_CALLLOG:
|
|
||||||
sheetSet.put(new NodeProperty<>("From", Bundle.MessageNode_Node_Property_From(), "",
|
|
||||||
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM))); //NON-NLS
|
|
||||||
sheetSet.put(new NodeProperty<>("To", Bundle.MessageNode_Node_Property_To(), "",
|
|
||||||
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO))); //NON-NLS
|
|
||||||
sheetSet.put(new NodeProperty<>("Date", Bundle.MessageNode_Node_Property_Date(), "",
|
|
||||||
getAttributeDisplayString(artifact, TSK_DATETIME_START))); //NON-NLS
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return sheet;
|
sheetSet.put(new NodeProperty<>("ThreadID", "ThreadID","",threadID == null ? UNTHREADED_ID : threadID)); //NON-NLS
|
||||||
}
|
sheetSet.put(new NodeProperty<>("Subject", Bundle.MessageNode_Node_Property_Subject(), "",
|
||||||
|
getAttributeDisplayString(artifact, TSK_SUBJECT))); //NON-NLS
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Get the display string for the attribute of the given type from the given
|
|
||||||
* artifact.
|
|
||||||
*
|
|
||||||
* @param artifact the value of artifact
|
|
||||||
* @param attributeType the value of TSK_SUBJECT1
|
|
||||||
*
|
|
||||||
* @return The display string, or an empty string if there is no such
|
|
||||||
* attribute or an an error.
|
|
||||||
*/
|
|
||||||
private static String getAttributeDisplayString(final BlackboardArtifact artifact, final BlackboardAttribute.ATTRIBUTE_TYPE attributeType) {
|
|
||||||
try {
|
try {
|
||||||
BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attributeType.getTypeID())));
|
sheetSet.put(new NodeProperty<>("Attms", Bundle.MessageNode_Node_Property_Attms(), "", artifact.getChildrenCount())); //NON-NLS
|
||||||
if (attribute == null) {
|
} catch (TskCoreException ex) {
|
||||||
return "";
|
logger.log(Level.WARNING, "Error loading attachment count for " + artifact, ex); //NON-NLS
|
||||||
} else if (attributeType.getValueType() == DATETIME) {
|
|
||||||
return TimeUtilities.epochToTime(attribute.getValueLong(),
|
|
||||||
TimeZone.getTimeZone(Utils.getUserPreferredZoneId()));
|
|
||||||
} else {
|
|
||||||
return attribute.getDisplayString();
|
|
||||||
}
|
|
||||||
} catch (TskCoreException tskCoreException) {
|
|
||||||
logger.log(Level.WARNING, "Error getting attribute value.", tskCoreException); //NON-NLS
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (fromID) {
|
||||||
|
case TSK_EMAIL_MSG:
|
||||||
|
sheetSet.put(new NodeProperty<>("From", Bundle.MessageNode_Node_Property_From(), "",
|
||||||
|
StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_FROM), " \t\n;"))); //NON-NLS
|
||||||
|
sheetSet.put(new NodeProperty<>("To", Bundle.MessageNode_Node_Property_To(), "",
|
||||||
|
StringUtils.strip(getAttributeDisplayString(artifact, TSK_EMAIL_TO), " \t\n;"))); //NON-NLS
|
||||||
|
sheetSet.put(new NodeProperty<>("Date", Bundle.MessageNode_Node_Property_Date(), "",
|
||||||
|
getAttributeDisplayString(artifact, TSK_DATETIME_SENT))); //NON-NLS
|
||||||
|
break;
|
||||||
|
case TSK_MESSAGE:
|
||||||
|
sheetSet.put(new NodeProperty<>("From", Bundle.MessageNode_Node_Property_From(), "",
|
||||||
|
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_FROM))); //NON-NLS
|
||||||
|
sheetSet.put(new NodeProperty<>("To", Bundle.MessageNode_Node_Property_To(), "",
|
||||||
|
getAttributeDisplayString(artifact, TSK_PHONE_NUMBER_TO))); //NON-NLS
|
||||||
|
sheetSet.put(new NodeProperty<>("Date", Bundle.MessageNode_Node_Property_Date(), "",
|
||||||
|
getAttributeDisplayString(artifact, TSK_DATETIME))); //NON-NLS
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return sheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -229,11 +229,7 @@ public class MessageViewer extends JPanel implements RelationshipsViewer {
|
|||||||
if (!subject.isEmpty()) {
|
if (!subject.isEmpty()) {
|
||||||
threadNameLabel.setText(subject);
|
threadNameLabel.setText(subject);
|
||||||
} else {
|
} else {
|
||||||
if (threadIDList.contains(MessageNode.CALL_LOG_ID)) {
|
threadNameLabel.setText(Bundle.MessageViewer_viewMessage_unthreaded());
|
||||||
threadNameLabel.setText(Bundle.MessageViewer_viewMessage_calllogs());
|
|
||||||
} else {
|
|
||||||
threadNameLabel.setText(Bundle.MessageViewer_viewMessage_unthreaded());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
showMessagesPane();
|
showMessagesPane();
|
||||||
|
@ -18,17 +18,15 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.communications.relationships;
|
package org.sleuthkit.autopsy.communications.relationships;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import org.openide.nodes.ChildFactory;
|
import org.openide.nodes.ChildFactory;
|
||||||
import org.openide.nodes.Node;
|
import org.openide.nodes.Node;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
import org.sleuthkit.datamodel.CommunicationsManager;
|
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
@ -92,8 +90,7 @@ public class MessagesChildNodeFactory extends ChildFactory<BlackboardArtifact>{
|
|||||||
BlackboardArtifact bba = (BlackboardArtifact) content;
|
BlackboardArtifact bba = (BlackboardArtifact) content;
|
||||||
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba.getArtifactTypeID());
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba.getArtifactTypeID());
|
||||||
|
|
||||||
if (fromID != BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG
|
if (fromID != BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG
|
||||||
&& fromID != BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG
|
|
||||||
&& fromID != BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE) {
|
&& fromID != BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -102,12 +99,8 @@ public class MessagesChildNodeFactory extends ChildFactory<BlackboardArtifact>{
|
|||||||
// To achive this assign any artifact that does not have a threadID
|
// To achive this assign any artifact that does not have a threadID
|
||||||
// the "UNTHREADED_ID"
|
// the "UNTHREADED_ID"
|
||||||
// All call logs will default to a single call logs thread
|
// All call logs will default to a single call logs thread
|
||||||
String artifactThreadID;
|
String artifactThreadID = MessageNode.UNTHREADED_ID;
|
||||||
if (fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG) {
|
|
||||||
artifactThreadID = MessageNode.CALL_LOG_ID;
|
|
||||||
} else {
|
|
||||||
artifactThreadID = MessageNode.UNTHREADED_ID;
|
|
||||||
}
|
|
||||||
BlackboardAttribute attribute = bba.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_THREAD_ID));
|
BlackboardAttribute attribute = bba.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_THREAD_ID));
|
||||||
|
|
||||||
if(attribute != null) {
|
if(attribute != null) {
|
||||||
@ -116,13 +109,14 @@ public class MessagesChildNodeFactory extends ChildFactory<BlackboardArtifact>{
|
|||||||
|
|
||||||
if(threadIDs == null || threadIDs.contains(artifactThreadID)) {
|
if(threadIDs == null || threadIDs.contains(artifactThreadID)) {
|
||||||
list.add(bba);
|
list.add(bba);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Failed to load artifacts for relationship sources.", ex); //NON-NLS
|
logger.log(Level.SEVERE, "Failed to load artifacts for relationship sources.", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list.sort(new DateComparator());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -132,4 +126,80 @@ public class MessagesChildNodeFactory extends ChildFactory<BlackboardArtifact>{
|
|||||||
return new MessageNode(key, null, null);
|
return new MessageNode(key, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A comparator class for comparing BlackboardArtifacts of type
|
||||||
|
* TSK_EMAIL_MSG, TSK_MESSAGE, and TSK_CALLLOG by their respective creation
|
||||||
|
* date-time.
|
||||||
|
*/
|
||||||
|
class DateComparator implements Comparator<BlackboardArtifact> {
|
||||||
|
@Override
|
||||||
|
public int compare(BlackboardArtifact bba1, BlackboardArtifact bba2) {
|
||||||
|
|
||||||
|
BlackboardAttribute attribute1 = null;
|
||||||
|
BlackboardAttribute attribute2 = null;
|
||||||
|
// Inializing to Long.MAX_VALUE so that if a BlackboardArtifact of
|
||||||
|
// any unexpected type is passed in, it will bubble to the top of
|
||||||
|
// the list.
|
||||||
|
long dateTime1 = Long.MAX_VALUE;
|
||||||
|
long dateTime2 = Long.MAX_VALUE;
|
||||||
|
|
||||||
|
if (bba1 != null) {
|
||||||
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba1.getArtifactTypeID());
|
||||||
|
if (fromID != null) {
|
||||||
|
try {
|
||||||
|
switch (fromID) {
|
||||||
|
case TSK_EMAIL_MSG:
|
||||||
|
attribute1 = bba1.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT));
|
||||||
|
break;
|
||||||
|
case TSK_MESSAGE:
|
||||||
|
attribute1 = bba1.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME));
|
||||||
|
break;
|
||||||
|
case TSK_CALLLOG:
|
||||||
|
attribute1 = bba1.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
attribute1 = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, String.format("Unable to compare attributes for artifact %d", bba1.getArtifactID()), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bba2 != null) {
|
||||||
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba2.getArtifactTypeID());
|
||||||
|
if (fromID != null) {
|
||||||
|
try {
|
||||||
|
switch (fromID) {
|
||||||
|
case TSK_EMAIL_MSG:
|
||||||
|
attribute2 = bba2.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT));
|
||||||
|
break;
|
||||||
|
case TSK_MESSAGE:
|
||||||
|
attribute2 = bba2.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME));
|
||||||
|
break;
|
||||||
|
case TSK_CALLLOG:
|
||||||
|
attribute2 = bba2.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
attribute2 = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, String.format("Unable to compare attributes for artifact %d", bba2.getArtifactID()), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attribute1 != null) {
|
||||||
|
dateTime1 = attribute1.getValueLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attribute2 != null) {
|
||||||
|
dateTime2 = attribute2.getValueLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Long.compare(dateTime1, dateTime2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
<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>
|
</AuxValues>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
|
||||||
|
@ -30,12 +30,6 @@ import org.sleuthkit.autopsy.communications.ModifiableProxyLookup;
|
|||||||
public final class RelationshipBrowser extends JPanel implements Lookup.Provider {
|
public final class RelationshipBrowser extends JPanel implements Lookup.Provider {
|
||||||
|
|
||||||
private SelectionInfo currentSelection;
|
private SelectionInfo currentSelection;
|
||||||
|
|
||||||
private final MessageViewer messagesViewer;
|
|
||||||
private final ContactsViewer contactsViewer;
|
|
||||||
private final SummaryViewer summaryViewer;
|
|
||||||
private final MediaViewer mediaViewer;
|
|
||||||
|
|
||||||
private final ModifiableProxyLookup proxyLookup;
|
private final ModifiableProxyLookup proxyLookup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -43,15 +37,18 @@ public final class RelationshipBrowser extends JPanel implements Lookup.Provider
|
|||||||
*/
|
*/
|
||||||
public RelationshipBrowser() {
|
public RelationshipBrowser() {
|
||||||
initComponents();
|
initComponents();
|
||||||
messagesViewer = new MessageViewer();
|
|
||||||
contactsViewer = new ContactsViewer();
|
MessageViewer messagesViewer = new MessageViewer();
|
||||||
summaryViewer = new SummaryViewer();
|
ContactsViewer contactsViewer = new ContactsViewer();
|
||||||
mediaViewer = new MediaViewer();
|
SummaryViewer summaryViewer = new SummaryViewer();
|
||||||
|
MediaViewer mediaViewer = new MediaViewer();
|
||||||
|
CallLogViewer callLogViewer = new CallLogViewer();
|
||||||
|
|
||||||
proxyLookup = new ModifiableProxyLookup(messagesViewer.getLookup());
|
proxyLookup = new ModifiableProxyLookup(messagesViewer.getLookup());
|
||||||
|
|
||||||
tabPane.add(summaryViewer.getDisplayName(), summaryViewer);
|
tabPane.add(summaryViewer.getDisplayName(), summaryViewer);
|
||||||
tabPane.add(messagesViewer.getDisplayName(), messagesViewer);
|
tabPane.add(messagesViewer.getDisplayName(), messagesViewer);
|
||||||
|
tabPane.add(callLogViewer.getDisplayName(), callLogViewer);
|
||||||
tabPane.add(contactsViewer.getDisplayName(), contactsViewer);
|
tabPane.add(contactsViewer.getDisplayName(), contactsViewer);
|
||||||
tabPane.add(mediaViewer.getDisplayName(), mediaViewer);
|
tabPane.add(mediaViewer.getDisplayName(), mediaViewer);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2019 Basis Technology Corp.
|
||||||
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.sleuthkit.autopsy.communications.relationships;
|
||||||
|
|
||||||
|
import java.util.TimeZone;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import org.sleuthkit.autopsy.communications.Utils;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME;
|
||||||
|
import org.sleuthkit.datamodel.TimeUtilities;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A set of reusable utility functions for the Relationships package.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
final class RelationshipsNodeUtilities {
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(RelationshipsNodeUtilities.class.getName());
|
||||||
|
|
||||||
|
// Here to make codacy happy
|
||||||
|
private RelationshipsNodeUtilities(){
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Get the display string for the attribute of the given type from the given
|
||||||
|
* artifact.
|
||||||
|
*
|
||||||
|
* @param artifact the value of artifact
|
||||||
|
* @param attributeType the value of TSK_SUBJECT1
|
||||||
|
*
|
||||||
|
* @return The display string, or an empty string if there is no such
|
||||||
|
* attribute or an an error.
|
||||||
|
*/
|
||||||
|
static String getAttributeDisplayString(final BlackboardArtifact artifact, final BlackboardAttribute.ATTRIBUTE_TYPE attributeType) {
|
||||||
|
try {
|
||||||
|
BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attributeType.getTypeID())));
|
||||||
|
if (attribute == null) {
|
||||||
|
return "";
|
||||||
|
} else if (attributeType.getValueType() == DATETIME) {
|
||||||
|
return TimeUtilities.epochToTime(attribute.getValueLong(),
|
||||||
|
TimeZone.getTimeZone(Utils.getUserPreferredZoneId()));
|
||||||
|
} else {
|
||||||
|
return attribute.getDisplayString();
|
||||||
|
}
|
||||||
|
} catch (TskCoreException tskCoreException) {
|
||||||
|
logger.log(Level.WARNING, "Error getting attribute value.", tskCoreException); //NON-NLS
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,6 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.communications.relationships;
|
package org.sleuthkit.autopsy.communications.relationships;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -29,13 +30,10 @@ import org.openide.nodes.ChildFactory;
|
|||||||
import org.openide.nodes.Children;
|
import org.openide.nodes.Children;
|
||||||
import org.openide.nodes.Node;
|
import org.openide.nodes.Node;
|
||||||
import org.openide.nodes.Sheet;
|
import org.openide.nodes.Sheet;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.datamodel.NodeProperty;
|
import org.sleuthkit.autopsy.datamodel.NodeProperty;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
import org.sleuthkit.datamodel.CommunicationsManager;
|
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
@ -120,19 +118,13 @@ final class ThreadChildNodeFactory extends ChildFactory<BlackboardArtifact> {
|
|||||||
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba.getArtifactTypeID());
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba.getArtifactTypeID());
|
||||||
|
|
||||||
if (fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG
|
if (fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG
|
||||||
|| fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG
|
|
||||||
|| fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE) {
|
|| fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE) {
|
||||||
|
|
||||||
// We want email and message artifacts that do not have "threadIDs" to appear as one thread in the UI
|
// We want email and message artifacts that do not have "threadIDs" to appear as one thread in the UI
|
||||||
// To achive this assign any artifact that does not have a threadID
|
// To achive this assign any artifact that does not have a threadID
|
||||||
// the "UNTHREADED_ID"
|
// the "UNTHREADED_ID"
|
||||||
// All call logs will default to a single call logs thread
|
String threadID = MessageNode.UNTHREADED_ID;
|
||||||
String threadID;
|
|
||||||
if (fromID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG) {
|
|
||||||
threadID = MessageNode.CALL_LOG_ID;
|
|
||||||
} else {
|
|
||||||
threadID = MessageNode.UNTHREADED_ID;
|
|
||||||
}
|
|
||||||
BlackboardAttribute attribute = bba.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_THREAD_ID));
|
BlackboardAttribute attribute = bba.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_THREAD_ID));
|
||||||
|
|
||||||
if(attribute != null) {
|
if(attribute != null) {
|
||||||
@ -144,15 +136,41 @@ final class ThreadChildNodeFactory extends ChildFactory<BlackboardArtifact> {
|
|||||||
rootMessageMap.put(threadID, bba);
|
rootMessageMap.put(threadID, bba);
|
||||||
} else {
|
} else {
|
||||||
// Get the date of the message
|
// Get the date of the message
|
||||||
BlackboardAttribute tableAttribute = tableArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT));
|
BlackboardAttribute tableAttribute = null;
|
||||||
attribute = bba.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT));
|
switch(fromID) {
|
||||||
|
case TSK_EMAIL_MSG:
|
||||||
// put the earliest message into the table
|
tableAttribute = tableArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT));
|
||||||
if(tableAttribute != null
|
attribute = bba.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT));
|
||||||
&& attribute != null
|
// put the earliest message into the table
|
||||||
&& tableAttribute.getValueLong() > attribute.getValueLong()) {
|
if(tableAttribute != null
|
||||||
rootMessageMap.put(threadID, bba);
|
&& attribute != null
|
||||||
|
&& tableAttribute.getValueLong() > attribute.getValueLong()) {
|
||||||
|
rootMessageMap.put(threadID, bba);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TSK_MESSAGE:
|
||||||
|
tableAttribute = tableArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME));
|
||||||
|
attribute = bba.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME));
|
||||||
|
// put the earliest message into the table
|
||||||
|
if(tableAttribute != null
|
||||||
|
&& attribute != null
|
||||||
|
&& tableAttribute.getValueLong() < attribute.getValueLong()) {
|
||||||
|
rootMessageMap.put(threadID, bba);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TSK_CALLLOG:
|
||||||
|
tableAttribute = tableArtifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START));
|
||||||
|
attribute = bba.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START));
|
||||||
|
// put the earliest message into the table
|
||||||
|
if(tableAttribute != null
|
||||||
|
&& attribute != null
|
||||||
|
&& tableAttribute.getValueLong() > attribute.getValueLong()) {
|
||||||
|
rootMessageMap.put(threadID, bba);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -160,6 +178,8 @@ final class ThreadChildNodeFactory extends ChildFactory<BlackboardArtifact> {
|
|||||||
for(BlackboardArtifact bba: rootMessageMap.values()) {
|
for(BlackboardArtifact bba: rootMessageMap.values()) {
|
||||||
list.add(bba);
|
list.add(bba);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list.sort(new ThreadDateComparator());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -176,44 +196,11 @@ final class ThreadChildNodeFactory extends ChildFactory<BlackboardArtifact> {
|
|||||||
if (attribute != null) {
|
if (attribute != null) {
|
||||||
return new ThreadNode(bba, attribute.getValueString(), preferredAction);
|
return new ThreadNode(bba, attribute.getValueString(), preferredAction);
|
||||||
} else {
|
} else {
|
||||||
if (bba.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()) {
|
// Only one of these should occur.
|
||||||
return new CallLogNode();
|
return new UnthreadedNode();
|
||||||
} else {
|
|
||||||
// Only one of these should occur.
|
|
||||||
return new UnthreadedNode();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This node represents the "call log" thread.
|
|
||||||
*/
|
|
||||||
final class CallLogNode extends AbstractNode {
|
|
||||||
/**
|
|
||||||
* Construct an instance of a CallLogNode.
|
|
||||||
*/
|
|
||||||
CallLogNode() {
|
|
||||||
super(Children.LEAF);
|
|
||||||
setDisplayName("Call Logs");
|
|
||||||
this.setIconBaseWithExtension("org/sleuthkit/autopsy/communications/images/unthreaded.png" );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Sheet createSheet() {
|
|
||||||
Sheet sheet = super.createSheet();
|
|
||||||
Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
|
|
||||||
if (sheetSet == null) {
|
|
||||||
sheetSet = Sheet.createPropertiesSet();
|
|
||||||
sheet.put(sheetSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Give this node a threadID of "CALL_LOG_ID"
|
|
||||||
sheetSet.put(new NodeProperty<>("ThreadID", "ThreadID","",MessageNode.CALL_LOG_ID));
|
|
||||||
|
|
||||||
return sheet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This node represents the "unthreaded" thread.
|
* This node represents the "unthreaded" thread.
|
||||||
*/
|
*/
|
||||||
@ -242,4 +229,80 @@ final class ThreadChildNodeFactory extends ChildFactory<BlackboardArtifact> {
|
|||||||
return sheet;
|
return sheet;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A comparator class for comparing BlackboardArtifacts of type
|
||||||
|
* TSK_EMAIL_MSG, TSK_MESSAGE, and TSK_CALLLOG by their respective creation
|
||||||
|
* date-time.
|
||||||
|
*
|
||||||
|
* Nodes will be sorted newest to oldest.
|
||||||
|
*/
|
||||||
|
class ThreadDateComparator implements Comparator<BlackboardArtifact> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(BlackboardArtifact bba1, BlackboardArtifact bba2) {
|
||||||
|
BlackboardAttribute attribute1 = null;
|
||||||
|
BlackboardAttribute attribute2 = null;
|
||||||
|
// Inializing to Long.MAX_VALUE so that if a BlackboardArtifact of
|
||||||
|
// any unexpected type is passed in, it will bubble to the top of
|
||||||
|
// the list.
|
||||||
|
long dateTime1 = Long.MAX_VALUE;
|
||||||
|
long dateTime2 = Long.MAX_VALUE;
|
||||||
|
|
||||||
|
if (bba1 != null) {
|
||||||
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba1.getArtifactTypeID());
|
||||||
|
if (fromID != null) {
|
||||||
|
try {
|
||||||
|
switch (fromID) {
|
||||||
|
case TSK_EMAIL_MSG:
|
||||||
|
attribute1 = bba1.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case TSK_MESSAGE:
|
||||||
|
attribute1 = bba1.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME));
|
||||||
|
|
||||||
|
break;
|
||||||
|
case TSK_CALLLOG:
|
||||||
|
attribute1 = bba1.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, String.format("Unable to compare attributes for artifact %d", bba1.getArtifactID()), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bba1 != null) {
|
||||||
|
BlackboardArtifact.ARTIFACT_TYPE fromID = BlackboardArtifact.ARTIFACT_TYPE.fromID(bba2.getArtifactTypeID());
|
||||||
|
if (fromID != null) {
|
||||||
|
try {
|
||||||
|
switch (fromID) {
|
||||||
|
case TSK_EMAIL_MSG:
|
||||||
|
attribute2 = bba2.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT));
|
||||||
|
break;
|
||||||
|
case TSK_MESSAGE:
|
||||||
|
attribute2 = bba2.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME));
|
||||||
|
break;
|
||||||
|
case TSK_CALLLOG:
|
||||||
|
attribute2 = bba2.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, String.format("Unable to compare attributes for artifact %d", bba2.getArtifactID()), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attribute1 != null) {
|
||||||
|
dateTime1 = attribute1.getValueLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attribute2 != null) {
|
||||||
|
dateTime2 = attribute2.getValueLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Long.compare(dateTime1, dateTime2) * -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,11 +18,18 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.communications.relationships;
|
package org.sleuthkit.autopsy.communications.relationships;
|
||||||
|
|
||||||
|
import java.util.logging.Level;
|
||||||
import javax.swing.Action;
|
import javax.swing.Action;
|
||||||
import org.openide.nodes.AbstractNode;
|
import org.openide.nodes.AbstractNode;
|
||||||
import org.openide.nodes.Children;
|
import org.openide.nodes.Children;
|
||||||
import org.openide.nodes.Sheet;
|
import org.openide.nodes.Sheet;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.autopsy.datamodel.NodeProperty;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
|
import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An AbstractNode subclass which wraps a MessageNode object. Doing this allows
|
* An AbstractNode subclass which wraps a MessageNode object. Doing this allows
|
||||||
@ -31,6 +38,10 @@ import org.sleuthkit.datamodel.BlackboardArtifact;
|
|||||||
*/
|
*/
|
||||||
final class ThreadNode extends AbstractNode{
|
final class ThreadNode extends AbstractNode{
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(ThreadNode.class.getName());
|
||||||
|
|
||||||
|
private final static int MAX_SUBJECT_LENGTH = 120;
|
||||||
|
|
||||||
final private MessageNode messageNode;
|
final private MessageNode messageNode;
|
||||||
|
|
||||||
ThreadNode(BlackboardArtifact artifact, String threadID, Action preferredAction) {
|
ThreadNode(BlackboardArtifact artifact, String threadID, Action preferredAction) {
|
||||||
@ -41,7 +52,36 @@ final class ThreadNode extends AbstractNode{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Sheet createSheet() {
|
protected Sheet createSheet() {
|
||||||
return messageNode.createSheet();
|
BlackboardArtifact artifact = messageNode.getArtifact();
|
||||||
|
if(artifact == null) {
|
||||||
|
return messageNode.createSheet() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sheet sheet = messageNode.createSheet();
|
||||||
|
BlackboardArtifact.ARTIFACT_TYPE artifactTypeID = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifact.getArtifactTypeID());
|
||||||
|
|
||||||
|
// If its a text message, replace the subject node which is probably
|
||||||
|
// an empty string with the firest 120 characters of the text message
|
||||||
|
if(artifactTypeID != null && artifactTypeID == TSK_MESSAGE) {
|
||||||
|
try {
|
||||||
|
BlackboardAttribute attribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.fromID(TSK_TEXT.getTypeID())));
|
||||||
|
if(attribute != null) {
|
||||||
|
Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
|
||||||
|
sheetSet.remove("Subject");
|
||||||
|
|
||||||
|
String msg = attribute.getDisplayString();
|
||||||
|
if(msg != null && msg.length() > MAX_SUBJECT_LENGTH) {
|
||||||
|
msg = msg.substring(0, MAX_SUBJECT_LENGTH) + "...";
|
||||||
|
}
|
||||||
|
|
||||||
|
sheetSet.put(new NodeProperty<>("Subject", Bundle.MessageNode_Node_Property_Subject(), "", msg)); //NON-NLS
|
||||||
|
}
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, String.format("Unable to get the text message from message artifact %d", artifact.getId()), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getThreadID() {
|
String getThreadID() {
|
||||||
|
@ -143,7 +143,7 @@ public class FileViewer extends javax.swing.JPanel implements DataContentViewer
|
|||||||
viewer.setFile(file);
|
viewer.setFile(file);
|
||||||
this.removeAll();
|
this.removeAll();
|
||||||
this.add(viewer.getComponent());
|
this.add(viewer.getComponent());
|
||||||
this.repaint();
|
this.validate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,8 @@ public final class ImageTag extends Group {
|
|||||||
// Used to tell the 8 edit handles to hide if this tag is no longer selected
|
// Used to tell the 8 edit handles to hide if this tag is no longer selected
|
||||||
private final EventDispatchChainImpl ALL_CHILDREN;
|
private final EventDispatchChainImpl ALL_CHILDREN;
|
||||||
|
|
||||||
|
private final PhysicalTag physicalTag;
|
||||||
|
|
||||||
//Notifies listeners that the user has editted the tag boundaries
|
//Notifies listeners that the user has editted the tag boundaries
|
||||||
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
|
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
|
||||||
|
|
||||||
@ -64,7 +66,7 @@ public final class ImageTag extends Group {
|
|||||||
});
|
});
|
||||||
|
|
||||||
ImageTagRegion details = contentViewerTag.getDetails();
|
ImageTagRegion details = contentViewerTag.getDetails();
|
||||||
PhysicalTag physicalTag = new PhysicalTag(details);
|
physicalTag = new PhysicalTag(details);
|
||||||
|
|
||||||
//Defines the max allowable boundary that a user may drag any given handle.
|
//Defines the max allowable boundary that a user may drag any given handle.
|
||||||
Boundary dragBoundary = (x, y) -> {
|
Boundary dragBoundary = (x, y) -> {
|
||||||
@ -131,6 +133,14 @@ public final class ImageTag extends Group {
|
|||||||
public void subscribeToEditEvents(PropertyChangeListener listener) {
|
public void subscribeToEditEvents(PropertyChangeListener listener) {
|
||||||
pcs.addPropertyChangeListener(listener);
|
pcs.addPropertyChangeListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double getWidth() {
|
||||||
|
return physicalTag.getWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getHeight() {
|
||||||
|
return physicalTag.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the content viewer tag that this class represents.
|
* Get the content viewer tag that this class represents.
|
||||||
|
@ -23,6 +23,7 @@ import java.beans.PropertyChangeEvent;
|
|||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
import java.beans.PropertyChangeSupport;
|
import java.beans.PropertyChangeSupport;
|
||||||
import javafx.event.Event;
|
import javafx.event.Event;
|
||||||
|
import javafx.geometry.Point2D;
|
||||||
import javafx.scene.Group;
|
import javafx.scene.Group;
|
||||||
import javafx.scene.Node;
|
import javafx.scene.Node;
|
||||||
import javafx.scene.input.MouseEvent;
|
import javafx.scene.input.MouseEvent;
|
||||||
@ -65,13 +66,8 @@ public final class ImageTagsGroup extends Group {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Pull out the logical image tag that this node is associated with
|
ImageTag selection = getTagToSelect(new Point2D(e.getX(), e.getY()));
|
||||||
Node topLevelChild = e.getPickResult().getIntersectedNode();
|
requestFocus(selection);
|
||||||
while (!this.getChildren().contains(topLevelChild)) {
|
|
||||||
topLevelChild = topLevelChild.getParent();
|
|
||||||
}
|
|
||||||
|
|
||||||
requestFocus((ImageTag) topLevelChild);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,6 +98,31 @@ public final class ImageTagsGroup extends Group {
|
|||||||
currentFocus = null;
|
currentFocus = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find which tag to select on a user mouse press. If multiple tags are
|
||||||
|
* overlapping, pick the smallest one that is determined by the L + W of
|
||||||
|
* the tag sides.
|
||||||
|
*
|
||||||
|
* @param coordinate User mouse press location
|
||||||
|
* @return The tag to give focus
|
||||||
|
*/
|
||||||
|
private ImageTag getTagToSelect(Point2D coordinate) {
|
||||||
|
ImageTag tagToSelect = null;
|
||||||
|
double minTagSize = Double.MAX_VALUE;
|
||||||
|
|
||||||
|
//Find all intersecting tags, select the absolute min based on L + W.
|
||||||
|
for (Node node : this.getChildren()) {
|
||||||
|
ImageTag tag = (ImageTag) node;
|
||||||
|
double tagSize = tag.getWidth() + tag.getHeight();
|
||||||
|
if (tag.contains(coordinate) && tagSize < minTagSize) {
|
||||||
|
tagToSelect = tag;
|
||||||
|
minTagSize = tagSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tagToSelect;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notifies the logical image tag that it is no longer in focus.
|
* Notifies the logical image tag that it is no longer in focus.
|
||||||
@ -119,7 +140,7 @@ public final class ImageTagsGroup extends Group {
|
|||||||
* @param n
|
* @param n
|
||||||
*/
|
*/
|
||||||
private void requestFocus(ImageTag n) {
|
private void requestFocus(ImageTag n) {
|
||||||
if (n.equals(currentFocus)) {
|
if (n == null || n.equals(currentFocus)) {
|
||||||
return;
|
return;
|
||||||
} else if (currentFocus != null && !currentFocus.equals(n)) {
|
} else if (currentFocus != null && !currentFocus.equals(n)) {
|
||||||
resetFocus(currentFocus);
|
resetFocus(currentFocus);
|
||||||
|
@ -214,7 +214,7 @@ DataResultViewerTable.pageNumLabel.text=
|
|||||||
DataResultViewerTable.pageLabel.text=Page:
|
DataResultViewerTable.pageLabel.text=Page:
|
||||||
ViewPreferencesPanel.maxResultsLabel.text=Maximum number of Results to show in table:
|
ViewPreferencesPanel.maxResultsLabel.text=Maximum number of Results to show in table:
|
||||||
ViewPreferencesPanel.maxResultsLabel.toolTipText=<html>\nSetting this value to 0 will display all results in the results table.\n<br>Note that setting this value to 0 may result in poor UI responsiveness when there are large numbers of results.\n</html>
|
ViewPreferencesPanel.maxResultsLabel.toolTipText=<html>\nSetting this value to 0 will display all results in the results table.\n<br>Note that setting this value to 0 may result in poor UI responsiveness when there are large numbers of results.\n</html>
|
||||||
DataResultViewerTable.exportCSVButton.text=Save table as CSV
|
DataResultViewerTable.exportCSVButton.text=Save Table as CSV
|
||||||
ViewPreferencesPanel.scoColumnsCheckbox.text=S(core), C(omments), and O(ccurrences)
|
ViewPreferencesPanel.scoColumnsCheckbox.text=S(core), C(omments), and O(ccurences)
|
||||||
ViewPreferencesPanel.scoColumnsWrapAroundText.text=to reduce loading times
|
ViewPreferencesPanel.scoColumnsWrapAroundText.text=to reduce loading times
|
||||||
ViewPreferencesPanel.scoColumnsLabel.text=Do not add columns for:
|
ViewPreferencesPanel.scoColumnsLabel.text=Do not add columns for:
|
||||||
|
@ -268,7 +268,7 @@ DataResultViewerTable.pageNumLabel.text=
|
|||||||
DataResultViewerTable.pageLabel.text=Page:
|
DataResultViewerTable.pageLabel.text=Page:
|
||||||
ViewPreferencesPanel.maxResultsLabel.text=Maximum number of Results to show in table:
|
ViewPreferencesPanel.maxResultsLabel.text=Maximum number of Results to show in table:
|
||||||
ViewPreferencesPanel.maxResultsLabel.toolTipText=<html>\nSetting this value to 0 will display all results in the results table.\n<br>Note that setting this value to 0 may result in poor UI responsiveness when there are large numbers of results.\n</html>
|
ViewPreferencesPanel.maxResultsLabel.toolTipText=<html>\nSetting this value to 0 will display all results in the results table.\n<br>Note that setting this value to 0 may result in poor UI responsiveness when there are large numbers of results.\n</html>
|
||||||
DataResultViewerTable.exportCSVButton.text=Save table as CSV
|
DataResultViewerTable.exportCSVButton.text=Save Table as CSV
|
||||||
ViewPreferencesPanel.scoColumnsCheckbox.text=S(core), C(omments), and O(ccurrences)
|
ViewPreferencesPanel.scoColumnsCheckbox.text=S(core), C(omments), and O(ccurences)
|
||||||
ViewPreferencesPanel.scoColumnsWrapAroundText.text=to reduce loading times
|
ViewPreferencesPanel.scoColumnsWrapAroundText.text=to reduce loading times
|
||||||
ViewPreferencesPanel.scoColumnsLabel.text=Do not add columns for:
|
ViewPreferencesPanel.scoColumnsLabel.text=Do not add columns for:
|
||||||
|
@ -33,8 +33,10 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Queue;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@ -149,7 +151,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
|||||||
* OutlineView to the actions global context.
|
* OutlineView to the actions global context.
|
||||||
*
|
*
|
||||||
* @param explorerManager The explorer manager of the ancestor top
|
* @param explorerManager The explorer manager of the ancestor top
|
||||||
* component.
|
* component.
|
||||||
*/
|
*/
|
||||||
public DataResultViewerTable(ExplorerManager explorerManager) {
|
public DataResultViewerTable(ExplorerManager explorerManager) {
|
||||||
this(explorerManager, Bundle.DataResultViewerTable_title());
|
this(explorerManager, Bundle.DataResultViewerTable_title());
|
||||||
@ -162,8 +164,8 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
|||||||
* in the OutlineView to the actions global context.
|
* in the OutlineView to the actions global context.
|
||||||
*
|
*
|
||||||
* @param explorerManager The explorer manager of the ancestor top
|
* @param explorerManager The explorer manager of the ancestor top
|
||||||
* component.
|
* component.
|
||||||
* @param title The title.
|
* @param title The title.
|
||||||
*/
|
*/
|
||||||
public DataResultViewerTable(ExplorerManager explorerManager, String title) {
|
public DataResultViewerTable(ExplorerManager explorerManager, String title) {
|
||||||
super(explorerManager);
|
super(explorerManager);
|
||||||
@ -177,7 +179,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
|||||||
initComponents();
|
initComponents();
|
||||||
|
|
||||||
initializePagingSupport();
|
initializePagingSupport();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable the CSV export button for the common properties results
|
* Disable the CSV export button for the common properties results
|
||||||
*/
|
*/
|
||||||
@ -700,7 +702,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
|||||||
* order.
|
* order.
|
||||||
*
|
*
|
||||||
* @return a List<Node.Property<?>> of the properties in the persisted
|
* @return a List<Node.Property<?>> of the properties in the persisted
|
||||||
* order.
|
* order.
|
||||||
*/
|
*/
|
||||||
private synchronized List<Node.Property<?>> loadColumnOrder() {
|
private synchronized List<Node.Property<?>> loadColumnOrder() {
|
||||||
|
|
||||||
@ -721,7 +723,6 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
|||||||
* property at the end.
|
* property at the end.
|
||||||
*/
|
*/
|
||||||
int offset = props.size();
|
int offset = props.size();
|
||||||
boolean noPreviousSettings = true;
|
|
||||||
|
|
||||||
final Preferences preferences = NbPreferences.forModule(DataResultViewerTable.class);
|
final Preferences preferences = NbPreferences.forModule(DataResultViewerTable.class);
|
||||||
|
|
||||||
@ -729,23 +730,51 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
|||||||
Integer value = preferences.getInt(ResultViewerPersistence.getColumnPositionKey(tfn, prop.getName()), -1);
|
Integer value = preferences.getInt(ResultViewerPersistence.getColumnPositionKey(tfn, prop.getName()), -1);
|
||||||
if (value >= 0 && value < offset && !propertiesMap.containsKey(value)) {
|
if (value >= 0 && value < offset && !propertiesMap.containsKey(value)) {
|
||||||
propertiesMap.put(value, prop);
|
propertiesMap.put(value, prop);
|
||||||
noPreviousSettings = false;
|
|
||||||
} else {
|
} else {
|
||||||
propertiesMap.put(offset, prop);
|
propertiesMap.put(offset, prop);
|
||||||
offset++;
|
offset++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If none of the properties had previous settings, we should decrement
|
/*
|
||||||
// each value by the number of properties to make the values 0-indexed.
|
NOTE: it is possible to have "discontinuities" in the keys (i.e. column numbers)
|
||||||
if (noPreviousSettings) {
|
of the map. This happens when some of the columns had a previous setting, and
|
||||||
ArrayList<Integer> keys = new ArrayList<>(propertiesMap.keySet());
|
other columns did not. We need to make the keys 0-indexed and continuous.
|
||||||
for (int key : keys) {
|
*/
|
||||||
propertiesMap.put(key - props.size(), propertiesMap.remove(key));
|
compactPropertiesMap();
|
||||||
|
|
||||||
|
return new ArrayList<>(propertiesMap.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes properties map 0-indexed and re-arranges elements to make sure the
|
||||||
|
* indexes are continuous.
|
||||||
|
*/
|
||||||
|
private void compactPropertiesMap() {
|
||||||
|
|
||||||
|
// check if there are discontinuities in the map keys.
|
||||||
|
int size = propertiesMap.size();
|
||||||
|
Queue<Integer> availablePositions = new LinkedList<>();
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
if (!propertiesMap.containsKey(i)) {
|
||||||
|
availablePositions.add(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ArrayList<>(propertiesMap.values());
|
// if there are no discontinuities, we are done
|
||||||
|
if (availablePositions.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise, move map elements into the available positions.
|
||||||
|
// we don't want to just move down all elements, as we want to preserve the order
|
||||||
|
// of the ones that had previous setting (i.e. ones that have key < size)
|
||||||
|
ArrayList<Integer> keys = new ArrayList<>(propertiesMap.keySet());
|
||||||
|
for (int key : keys) {
|
||||||
|
if (key >= size) {
|
||||||
|
propertiesMap.put(availablePositions.remove(), propertiesMap.remove(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1420,7 +1449,7 @@ public class DataResultViewerTable extends AbstractDataResultViewer {
|
|||||||
}//GEN-LAST:event_gotoPageTextFieldActionPerformed
|
}//GEN-LAST:event_gotoPageTextFieldActionPerformed
|
||||||
|
|
||||||
@NbBundle.Messages({"DataResultViewerTable.exportCSVButtonActionPerformed.empty=No data to export"
|
@NbBundle.Messages({"DataResultViewerTable.exportCSVButtonActionPerformed.empty=No data to export"
|
||||||
})
|
})
|
||||||
private void exportCSVButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportCSVButtonActionPerformed
|
private void exportCSVButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportCSVButtonActionPerformed
|
||||||
Node currentRoot = this.getExplorerManager().getRootContext();
|
Node currentRoot = this.getExplorerManager().getRootContext();
|
||||||
if (currentRoot != null && currentRoot.getChildren().getNodesCount() > 0) {
|
if (currentRoot != null && currentRoot.getChildren().getNodesCount() > 0) {
|
||||||
|
@ -23,25 +23,34 @@ import java.util.Arrays;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
import javax.swing.Action;
|
import javax.swing.Action;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.util.Utilities;
|
import org.openide.util.Utilities;
|
||||||
import org.sleuthkit.autopsy.actions.AddContentTagAction;
|
import org.sleuthkit.autopsy.actions.AddContentTagAction;
|
||||||
import org.sleuthkit.autopsy.actions.DeleteFileContentTagAction;
|
import org.sleuthkit.autopsy.actions.DeleteFileContentTagAction;
|
||||||
import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint;
|
import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.directorytree.ExportCSVAction;
|
import org.sleuthkit.autopsy.directorytree.ExportCSVAction;
|
||||||
import org.sleuthkit.autopsy.directorytree.ExternalViewerAction;
|
import org.sleuthkit.autopsy.directorytree.ExternalViewerAction;
|
||||||
import org.sleuthkit.autopsy.directorytree.ExternalViewerShortcutAction;
|
import org.sleuthkit.autopsy.directorytree.ExternalViewerShortcutAction;
|
||||||
import org.sleuthkit.autopsy.directorytree.ExtractAction;
|
import org.sleuthkit.autopsy.directorytree.ExtractAction;
|
||||||
import org.sleuthkit.autopsy.directorytree.NewWindowViewAction;
|
import org.sleuthkit.autopsy.directorytree.NewWindowViewAction;
|
||||||
|
import org.sleuthkit.autopsy.directorytree.ViewContextAction;
|
||||||
|
import org.sleuthkit.autopsy.modules.embeddedfileextractor.ExtractArchiveWithPasswordAction;
|
||||||
|
import org.sleuthkit.autopsy.timeline.actions.ViewFileInTimelineAction;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
import org.sleuthkit.datamodel.LayoutFile;
|
import org.sleuthkit.datamodel.LayoutFile;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskData;
|
import org.sleuthkit.datamodel.TskData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Node for layout file
|
* Node for layout file
|
||||||
*/
|
*/
|
||||||
public class LayoutFileNode extends AbstractAbstractFileNode<LayoutFile> {
|
public class LayoutFileNode extends AbstractAbstractFileNode<LayoutFile> {
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(LayoutFileNode.class.getName());
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static enum LayoutContentPropertyType {
|
public static enum LayoutContentPropertyType {
|
||||||
@ -91,9 +100,14 @@ public class LayoutFileNode extends AbstractAbstractFileNode<LayoutFile> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"LayoutFileNode.getActions.viewFileInDir.text=View File in Directory"})
|
||||||
public Action[] getActions(boolean context) {
|
public Action[] getActions(boolean context) {
|
||||||
List<Action> actionsList = new ArrayList<>();
|
List<Action> actionsList = new ArrayList<>();
|
||||||
actionsList.addAll(Arrays.asList(super.getActions(true)));
|
actionsList.addAll(Arrays.asList(super.getActions(true)));
|
||||||
|
actionsList.add(new ViewContextAction(Bundle.LayoutFileNode_getActions_viewFileInDir_text(), this));
|
||||||
|
actionsList.add(null); // Creates an item separator
|
||||||
|
|
||||||
actionsList.add(new NewWindowViewAction(
|
actionsList.add(new NewWindowViewAction(
|
||||||
NbBundle.getMessage(this.getClass(), "LayoutFileNode.getActions.viewInNewWin.text"), this));
|
NbBundle.getMessage(this.getClass(), "LayoutFileNode.getActions.viewInNewWin.text"), this));
|
||||||
final Collection<AbstractFile> selectedFilesList
|
final Collection<AbstractFile> selectedFilesList
|
||||||
@ -104,6 +118,7 @@ public class LayoutFileNode extends AbstractAbstractFileNode<LayoutFile> {
|
|||||||
} else {
|
} else {
|
||||||
actionsList.add(ExternalViewerShortcutAction.getInstance());
|
actionsList.add(ExternalViewerShortcutAction.getInstance());
|
||||||
}
|
}
|
||||||
|
actionsList.add(ViewFileInTimelineAction.createViewFileAction(getContent()));
|
||||||
actionsList.add(null); // creates a menu separator
|
actionsList.add(null); // creates a menu separator
|
||||||
actionsList.add(ExtractAction.getInstance());
|
actionsList.add(ExtractAction.getInstance());
|
||||||
actionsList.add(ExportCSVAction.getInstance());
|
actionsList.add(ExportCSVAction.getInstance());
|
||||||
@ -115,6 +130,15 @@ public class LayoutFileNode extends AbstractAbstractFileNode<LayoutFile> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
actionsList.addAll(ContextMenuExtensionPoint.getActions());
|
actionsList.addAll(ContextMenuExtensionPoint.getActions());
|
||||||
|
if (FileTypeExtensions.getArchiveExtensions().contains("." + this.content.getNameExtension().toLowerCase())) {
|
||||||
|
try {
|
||||||
|
if (this.content.getArtifacts(BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED).size() > 0) {
|
||||||
|
actionsList.add(new ExtractArchiveWithPasswordAction(this.getContent()));
|
||||||
|
}
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.WARNING, "Unable to add unzip with password action to context menus", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
return actionsList.toArray(new Action[actionsList.size()]);
|
return actionsList.toArray(new Action[actionsList.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,9 @@ import java.nio.file.Paths;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
@ -34,8 +36,6 @@ import org.sleuthkit.datamodel.Image;
|
|||||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskFileRange;
|
import org.sleuthkit.datamodel.TskFileRange;
|
||||||
import org.openide.util.NbBundle.Messages;
|
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A runnable that adds a raw data source to a case database.
|
* A runnable that adds a raw data source to a case database.
|
||||||
|
@ -44,7 +44,6 @@ import org.sleuthkit.datamodel.Content;
|
|||||||
import org.sleuthkit.datamodel.Directory;
|
import org.sleuthkit.datamodel.Directory;
|
||||||
import org.sleuthkit.datamodel.LayoutFile;
|
import org.sleuthkit.datamodel.LayoutFile;
|
||||||
import org.sleuthkit.datamodel.TskException;
|
import org.sleuthkit.datamodel.TskException;
|
||||||
import org.sleuthkit.datamodel.VirtualDirectory;
|
|
||||||
import org.sleuthkit.datamodel.Volume;
|
import org.sleuthkit.datamodel.Volume;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -140,8 +139,7 @@ class DirectoryTreeFilterChildren extends FilterNode.Children {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
for (Content c : vol.getChildren()) {
|
for (Content c : vol.getChildren()) {
|
||||||
if (!(c instanceof LayoutFile
|
if (!(c instanceof LayoutFile)) {
|
||||||
|| c instanceof VirtualDirectory)) {
|
|
||||||
ret = false;
|
ret = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@ import org.sleuthkit.autopsy.casemodule.CasePreferences;
|
|||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.core.UserPreferences;
|
import org.sleuthkit.autopsy.core.UserPreferences;
|
||||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||||
|
import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode;
|
||||||
import org.sleuthkit.autopsy.datamodel.AbstractFsContentNode;
|
import org.sleuthkit.autopsy.datamodel.AbstractFsContentNode;
|
||||||
import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode;
|
import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode;
|
||||||
import org.sleuthkit.autopsy.datamodel.ContentNodeSelectionInfo;
|
import org.sleuthkit.autopsy.datamodel.ContentNodeSelectionInfo;
|
||||||
@ -75,7 +76,7 @@ public class ViewContextAction extends AbstractAction {
|
|||||||
* parent of the content, selecting the parent in the tree view, then
|
* parent of the content, selecting the parent in the tree view, then
|
||||||
* selecting the content in the results view.
|
* selecting the content in the results view.
|
||||||
*
|
*
|
||||||
* @param displayName The display name for the action.
|
* @param displayName The display name for the action.
|
||||||
* @param artifactNode The artifact node for the artifact.
|
* @param artifactNode The artifact node for the artifact.
|
||||||
*/
|
*/
|
||||||
public ViewContextAction(String displayName, BlackboardArtifactNode artifactNode) {
|
public ViewContextAction(String displayName, BlackboardArtifactNode artifactNode) {
|
||||||
@ -97,15 +98,30 @@ public class ViewContextAction extends AbstractAction {
|
|||||||
* parent of the content, selecting the parent in the tree view, then
|
* parent of the content, selecting the parent in the tree view, then
|
||||||
* selecting the content in the results view.
|
* selecting the content in the results view.
|
||||||
*
|
*
|
||||||
* @param displayName The display name for the action.
|
* @param displayName The display name for the action.
|
||||||
* @param fileSystemContentNode The file system content node for the
|
* @param fileSystemContentNode The file system content node for the
|
||||||
* content.
|
* content.
|
||||||
*/
|
*/
|
||||||
public ViewContextAction(String displayName, AbstractFsContentNode<? extends AbstractFile> fileSystemContentNode) {
|
public ViewContextAction(String displayName, AbstractFsContentNode<? extends AbstractFile> fileSystemContentNode) {
|
||||||
super(displayName);
|
super(displayName);
|
||||||
this.content = fileSystemContentNode.getLookup().lookup(Content.class);
|
this.content = fileSystemContentNode.getLookup().lookup(Content.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An action that displays the context for abstract file by expanding the
|
||||||
|
* data sources branch of the tree view to the level of the parent of the
|
||||||
|
* content, selecting the parent in the tree view, then selecting the
|
||||||
|
* content in the results view.
|
||||||
|
*
|
||||||
|
* @param displayName The display name for the action.
|
||||||
|
* @param abstractAbstractFileNode The AbstractAbstractFileNode node for the
|
||||||
|
* content.
|
||||||
|
*/
|
||||||
|
public ViewContextAction(String displayName, AbstractAbstractFileNode<? extends AbstractFile> abstractAbstractFileNode) {
|
||||||
|
super(displayName);
|
||||||
|
this.content = abstractAbstractFileNode.getLookup().lookup(Content.class);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An action that displays the context for some content by expanding the
|
* An action that displays the context for some content by expanding the
|
||||||
* data sources branch of the tree view to the level of the parent of the
|
* data sources branch of the tree view to the level of the parent of the
|
||||||
@ -113,7 +129,7 @@ public class ViewContextAction extends AbstractAction {
|
|||||||
* content in the results view.
|
* content in the results view.
|
||||||
*
|
*
|
||||||
* @param displayName The display name for the action.
|
* @param displayName The display name for the action.
|
||||||
* @param content The content.
|
* @param content The content.
|
||||||
*/
|
*/
|
||||||
public ViewContextAction(String displayName, Content content) {
|
public ViewContextAction(String displayName, Content content) {
|
||||||
super(displayName);
|
super(displayName);
|
||||||
@ -136,12 +152,29 @@ public class ViewContextAction extends AbstractAction {
|
|||||||
})
|
})
|
||||||
public void actionPerformed(ActionEvent event) {
|
public void actionPerformed(ActionEvent event) {
|
||||||
EventQueue.invokeLater(() -> {
|
EventQueue.invokeLater(() -> {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the parent content for the content to be selected in the
|
||||||
|
* results view. If the parent content is null, then the specified
|
||||||
|
* content is a data source, and the parent tree view node is the
|
||||||
|
* "Data Sources" node. Otherwise, the tree view needs to be
|
||||||
|
* searched to find the parent treeview node.
|
||||||
|
*/
|
||||||
|
Content parentContent = null;
|
||||||
|
try {
|
||||||
|
parentContent = content.getParent();
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
MessageNotifyUtil.Message.error(Bundle.ViewContextAction_errorMessage_cannotFindDirectory());
|
||||||
|
logger.log(Level.SEVERE, String.format("Could not get parent of Content object: %s", content), ex); //NON-NLS
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the "Data Sources" node from the tree view.
|
* Get the "Data Sources" node from the tree view.
|
||||||
*/
|
*/
|
||||||
DirectoryTreeTopComponent treeViewTopComponent = DirectoryTreeTopComponent.findInstance();
|
DirectoryTreeTopComponent treeViewTopComponent = DirectoryTreeTopComponent.findInstance();
|
||||||
ExplorerManager treeViewExplorerMgr = treeViewTopComponent.getExplorerManager();
|
ExplorerManager treeViewExplorerMgr = treeViewTopComponent.getExplorerManager();
|
||||||
Node parentTreeViewNode;
|
Node parentTreeViewNode = null;
|
||||||
if (Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) { // 'Group by Data Source' view
|
if (Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) { // 'Group by Data Source' view
|
||||||
|
|
||||||
SleuthkitCase skCase;
|
SleuthkitCase skCase;
|
||||||
@ -152,13 +185,44 @@ public class ViewContextAction extends AbstractAction {
|
|||||||
long contentDSObjid = content.getDataSource().getId();
|
long contentDSObjid = content.getDataSource().getId();
|
||||||
DataSource datasource = skCase.getDataSource(contentDSObjid);
|
DataSource datasource = skCase.getDataSource(contentDSObjid);
|
||||||
dsname = datasource.getName();
|
dsname = datasource.getName();
|
||||||
|
|
||||||
Children rootChildren = treeViewExplorerMgr.getRootContext().getChildren();
|
Children rootChildren = treeViewExplorerMgr.getRootContext().getChildren();
|
||||||
Node datasourceGroupingNode = rootChildren.findChild(dsname);
|
|
||||||
if (!Objects.isNull(datasourceGroupingNode)) {
|
if (null != parentContent) {
|
||||||
Children dsChildren = datasourceGroupingNode.getChildren();
|
// the tree view needs to be searched to find the parent treeview node.
|
||||||
parentTreeViewNode = dsChildren.findChild(DataSourcesNode.NAME);
|
/* NOTE: we can't do a lookup by data source name here, becase if there
|
||||||
|
are multiple data sources with the same name, then "getChildren().findChild(dsname)"
|
||||||
|
simply returns the first one that it finds. Instead we have to loop over all
|
||||||
|
data sources with that name, and make sure we find the correct one.
|
||||||
|
*/
|
||||||
|
for (int i = 0; i < rootChildren.getNodesCount(); i++) {
|
||||||
|
// in the root, look for a data source node with the name of interest
|
||||||
|
Node treeNode = rootChildren.getNodeAt(i);
|
||||||
|
if (!(treeNode.getName().equals(dsname))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for this data source, get the "Data Sources" child node
|
||||||
|
Node datasourceGroupingNode = treeNode.getChildren().findChild(DataSourcesNode.NAME);
|
||||||
|
|
||||||
|
// check whether this is the data source we are looking for
|
||||||
|
parentTreeViewNode = findParentNodeInTree(parentContent, datasourceGroupingNode);
|
||||||
|
if (parentTreeViewNode != null) {
|
||||||
|
// found the data source node
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
/* If the parent content is null, then the specified
|
||||||
|
* content is a data source, and the parent tree view node is the
|
||||||
|
* "Data Sources" node. */
|
||||||
|
Node datasourceGroupingNode = rootChildren.findChild(dsname);
|
||||||
|
if (!Objects.isNull(datasourceGroupingNode)) {
|
||||||
|
Children dsChildren = datasourceGroupingNode.getChildren();
|
||||||
|
parentTreeViewNode = dsChildren.findChild(DataSourcesNode.NAME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parentTreeViewNode == null) {
|
||||||
MessageNotifyUtil.Message.error(Bundle.ViewContextAction_errorMessage_cannotFindNode());
|
MessageNotifyUtil.Message.error(Bundle.ViewContextAction_errorMessage_cannotFindNode());
|
||||||
logger.log(Level.SEVERE, "Failed to locate data source node in tree."); //NON-NLS
|
logger.log(Level.SEVERE, "Failed to locate data source node in tree."); //NON-NLS
|
||||||
return;
|
return;
|
||||||
@ -171,65 +235,12 @@ public class ViewContextAction extends AbstractAction {
|
|||||||
} else { // Classic view
|
} else { // Classic view
|
||||||
// Start the search at the DataSourcesNode
|
// Start the search at the DataSourcesNode
|
||||||
parentTreeViewNode = treeViewExplorerMgr.getRootContext().getChildren().findChild(DataSourcesNode.NAME);
|
parentTreeViewNode = treeViewExplorerMgr.getRootContext().getChildren().findChild(DataSourcesNode.NAME);
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
if (null != parentContent) {
|
||||||
* Get the parent content for the content to be selected in the
|
// the tree view needs to be searched to find the parent treeview node.
|
||||||
* results view. If the parent content is null, then the specified
|
Node potentialParentTreeViewNode = findParentNodeInTree(parentContent, parentTreeViewNode);
|
||||||
* content is a data source, and the parent tree view node is the
|
if (potentialParentTreeViewNode != null) {
|
||||||
* "Data Sources" node. Otherwise, the tree view needs to be
|
parentTreeViewNode = potentialParentTreeViewNode;
|
||||||
* searched to find the parent treeview node.
|
|
||||||
*/
|
|
||||||
Content parentContent = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
parentContent = content.getParent();
|
|
||||||
} catch (TskCoreException ex) {
|
|
||||||
MessageNotifyUtil.Message.error(Bundle.ViewContextAction_errorMessage_cannotFindDirectory());
|
|
||||||
logger.log(Level.SEVERE, String.format("Could not get parent of Content object: %s", content), ex); //NON-NLS
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (null != parentContent) {
|
|
||||||
/*
|
|
||||||
* Get an ordered list of the ancestors of the specified
|
|
||||||
* content, starting with its data source.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
AncestorVisitor ancestorVisitor = new AncestorVisitor();
|
|
||||||
List<Content> contentBranch = parentContent.accept(ancestorVisitor);
|
|
||||||
Collections.reverse(contentBranch);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert the list of ancestors into a list of tree nodes.
|
|
||||||
*
|
|
||||||
* IMPORTANT: The "dummy" root node used to create this single
|
|
||||||
* layer of children needs to be wrapped in a
|
|
||||||
* DirectoryTreeFilterNode so that its child nodes will also be
|
|
||||||
* wrapped in DirectoryTreeFilterNodes, via
|
|
||||||
* DirectoryTreeFilterNodeChildren. Otherwise, the display names
|
|
||||||
* of the nodes in the branch will not have child node counts
|
|
||||||
* and will not match the display names of the corresponding
|
|
||||||
* nodes in the actual tree view.
|
|
||||||
*/
|
|
||||||
Node dummyRootNode = new DirectoryTreeFilterNode(new AbstractNode(new RootContentChildren(contentBranch)), true);
|
|
||||||
Children ancestorChildren = dummyRootNode.getChildren();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Search the tree for the parent node. Note that this algorithm
|
|
||||||
* simply discards "extra" ancestor nodes not shown in the tree,
|
|
||||||
* such as the root directory of the file system for file system
|
|
||||||
* content.
|
|
||||||
*/
|
|
||||||
Children treeNodeChildren = parentTreeViewNode.getChildren();
|
|
||||||
for (int i = 0; i < ancestorChildren.getNodesCount(); i++) {
|
|
||||||
Node ancestorNode = ancestorChildren.getNodeAt(i);
|
|
||||||
for (int j = 0; j < treeNodeChildren.getNodesCount(); j++) {
|
|
||||||
Node treeNode = treeNodeChildren.getNodeAt(j);
|
|
||||||
if (ancestorNode.getName().equals(treeNode.getName())) {
|
|
||||||
parentTreeViewNode = treeNode;
|
|
||||||
treeNodeChildren = treeNode.getChildren();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -275,6 +286,60 @@ public class ViewContextAction extends AbstractAction {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches tree for parent node by getting an ordered list of the ancestors
|
||||||
|
* of the specified content.
|
||||||
|
*
|
||||||
|
* @param parentContent parent content for the content to be searched for
|
||||||
|
* @param node Node tree to search
|
||||||
|
* @return Node object of the matching parent, NULL if not found
|
||||||
|
*/
|
||||||
|
private Node findParentNodeInTree(Content parentContent, Node node) {
|
||||||
|
/*
|
||||||
|
* Get an ordered list of the ancestors of the specified
|
||||||
|
* content, starting with its data source.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
AncestorVisitor ancestorVisitor = new AncestorVisitor();
|
||||||
|
List<Content> contentBranch = parentContent.accept(ancestorVisitor);
|
||||||
|
Collections.reverse(contentBranch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert the list of ancestors into a list of tree nodes.
|
||||||
|
*
|
||||||
|
* IMPORTANT: The "dummy" root node used to create this single layer of
|
||||||
|
* children needs to be wrapped in a DirectoryTreeFilterNode so that its
|
||||||
|
* child nodes will also be wrapped in DirectoryTreeFilterNodes, via
|
||||||
|
* DirectoryTreeFilterNodeChildren. Otherwise, the display names of the
|
||||||
|
* nodes in the branch will not have child node counts and will not
|
||||||
|
* match the display names of the corresponding nodes in the actual tree
|
||||||
|
* view.
|
||||||
|
*/
|
||||||
|
Node dummyRootNode = new DirectoryTreeFilterNode(new AbstractNode(new RootContentChildren(contentBranch)), true);
|
||||||
|
Children ancestorChildren = dummyRootNode.getChildren();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Search the tree for the parent node. Note that this algorithm
|
||||||
|
* simply discards "extra" ancestor nodes not shown in the tree,
|
||||||
|
* such as the root directory of the file system for file system
|
||||||
|
* content.
|
||||||
|
*/
|
||||||
|
Children treeNodeChildren = node.getChildren();
|
||||||
|
Node parentTreeViewNode = null;
|
||||||
|
for (int i = 0; i < ancestorChildren.getNodesCount(); i++) {
|
||||||
|
Node ancestorNode = ancestorChildren.getNodeAt(i);
|
||||||
|
for (int j = 0; j < treeNodeChildren.getNodesCount(); j++) {
|
||||||
|
Node treeNode = treeNodeChildren.getNodeAt(j);
|
||||||
|
if (ancestorNode.getName().equals(treeNode.getName())) {
|
||||||
|
parentTreeViewNode = treeNode;
|
||||||
|
treeNodeChildren = treeNode.getChildren();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return parentTreeViewNode;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A ContentVisitor that returns a list of content objects by starting with
|
* A ContentVisitor that returns a list of content objects by starting with
|
||||||
* a given content and following its chain of ancestors to the root content
|
* a given content and following its chain of ancestors to the root content
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="skipKnownFilesCheckBox" min="-2" max="-2" attributes="0"/>
|
<Component id="skipKnownFilesCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace pref="255" max="32767" attributes="0"/>
|
<EmptySpace pref="155" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
|
@ -81,7 +81,7 @@ public class SampleIngestModuleIngestJobSettingsPanel extends IngestModuleIngest
|
|||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.addComponent(skipKnownFilesCheckBox)
|
.addComponent(skipKnownFilesCheckBox)
|
||||||
.addContainerGap(255, Short.MAX_VALUE))
|
.addContainerGap(155, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
@ -491,6 +491,18 @@ public class IngestManager implements IngestProgressSnapshotProvider {
|
|||||||
public void addIngestJobEventListener(final PropertyChangeListener listener) {
|
public void addIngestJobEventListener(final PropertyChangeListener listener) {
|
||||||
jobEventPublisher.addSubscriber(INGEST_JOB_EVENT_NAMES, listener);
|
jobEventPublisher.addSubscriber(INGEST_JOB_EVENT_NAMES, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an ingest job event property change listener for the given event types.
|
||||||
|
*
|
||||||
|
* @param eventTypes The event types to listen for
|
||||||
|
* @param listener The PropertyChangeListener to be added
|
||||||
|
*/
|
||||||
|
public void addIngestJobEventListener(Set<IngestJobEvent> eventTypes, final PropertyChangeListener listener) {
|
||||||
|
eventTypes.forEach((IngestJobEvent event) -> {
|
||||||
|
jobEventPublisher.addSubscriber(event.toString(), listener);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes an ingest job event property change listener.
|
* Removes an ingest job event property change listener.
|
||||||
@ -500,6 +512,18 @@ public class IngestManager implements IngestProgressSnapshotProvider {
|
|||||||
public void removeIngestJobEventListener(final PropertyChangeListener listener) {
|
public void removeIngestJobEventListener(final PropertyChangeListener listener) {
|
||||||
jobEventPublisher.removeSubscriber(INGEST_JOB_EVENT_NAMES, listener);
|
jobEventPublisher.removeSubscriber(INGEST_JOB_EVENT_NAMES, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an ingest job event property change listener.
|
||||||
|
*
|
||||||
|
* @param eventTypes The event types to stop listening for
|
||||||
|
* @param listener The PropertyChangeListener to be removed.
|
||||||
|
*/
|
||||||
|
public void removeIngestJobEventListener(Set<IngestJobEvent> eventTypes, final PropertyChangeListener listener) {
|
||||||
|
eventTypes.forEach((IngestJobEvent event) -> {
|
||||||
|
jobEventPublisher.removeSubscriber(event.toString(), listener);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an ingest module event property change listener.
|
* Adds an ingest module event property change listener.
|
||||||
@ -510,6 +534,18 @@ public class IngestManager implements IngestProgressSnapshotProvider {
|
|||||||
moduleEventPublisher.addSubscriber(INGEST_MODULE_EVENT_NAMES, listener);
|
moduleEventPublisher.addSubscriber(INGEST_MODULE_EVENT_NAMES, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an ingest module event property change listener for given event types.
|
||||||
|
*
|
||||||
|
* @param eventTypes The event types to listen for
|
||||||
|
* @param listener The PropertyChangeListener to be removed.
|
||||||
|
*/
|
||||||
|
public void addIngestModuleEventListener(Set<IngestModuleEvent> eventTypes, final PropertyChangeListener listener) {
|
||||||
|
eventTypes.forEach((IngestModuleEvent event) -> {
|
||||||
|
moduleEventPublisher.addSubscriber(event.toString(), listener);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes an ingest module event property change listener.
|
* Removes an ingest module event property change listener.
|
||||||
*
|
*
|
||||||
@ -518,6 +554,16 @@ public class IngestManager implements IngestProgressSnapshotProvider {
|
|||||||
public void removeIngestModuleEventListener(final PropertyChangeListener listener) {
|
public void removeIngestModuleEventListener(final PropertyChangeListener listener) {
|
||||||
moduleEventPublisher.removeSubscriber(INGEST_MODULE_EVENT_NAMES, listener);
|
moduleEventPublisher.removeSubscriber(INGEST_MODULE_EVENT_NAMES, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an ingest module event property change listener.
|
||||||
|
*
|
||||||
|
* @param eventTypes The event types to stop listening for
|
||||||
|
* @param listener The PropertyChangeListener to be removed.
|
||||||
|
*/
|
||||||
|
public void removeIngestModuleEventListener(Set<IngestModuleEvent> eventTypes, final PropertyChangeListener listener) {
|
||||||
|
moduleEventPublisher.removeSubscriber(INGEST_MODULE_EVENT_NAMES, listener);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Publishes an ingest job event signifying an ingest job started.
|
* Publishes an ingest job event signifying an ingest job started.
|
||||||
|
@ -22,7 +22,8 @@ import javax.swing.JPanel;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract base class for panels that allow users to specify per ingest job
|
* Abstract base class for panels that allow users to specify per ingest job
|
||||||
* settings for ingest modules.
|
* settings for ingest modules. The max recommended dimensions for these panels
|
||||||
|
* is 300 width by 300 height.
|
||||||
*/
|
*/
|
||||||
public abstract class IngestModuleIngestJobSettingsPanel extends JPanel {
|
public abstract class IngestModuleIngestJobSettingsPanel extends JPanel {
|
||||||
|
|
||||||
|
@ -170,8 +170,6 @@ public final class IngestServices {
|
|||||||
* Sets all of the global configuration settings for an ingest module.
|
* Sets all of the global configuration settings for an ingest module.
|
||||||
*
|
*
|
||||||
* @param moduleName A unique identifier for the module.
|
* @param moduleName A unique identifier for the module.
|
||||||
*
|
|
||||||
* @param moduleName moduleName identifier unique to that module
|
|
||||||
* @param settings A mapping of setting names to setting values.
|
* @param settings A mapping of setting names to setting values.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -46,8 +46,8 @@ ConfigVisualPanel1.jRadioButton2.text=Open existing configuration
|
|||||||
ConfigVisualPanel2.modifiedDateLabel.text=Modified Within:
|
ConfigVisualPanel2.modifiedDateLabel.text=Modified Within:
|
||||||
ConfigVisualPanel2.folderNamesLabel.text=Folder names:
|
ConfigVisualPanel2.folderNamesLabel.text=Folder names:
|
||||||
ConfigVisualPanel2.filenamesLabel.text=File names:
|
ConfigVisualPanel2.filenamesLabel.text=File names:
|
||||||
ConfigVisualPanel2.shouldAlertCheckBox.text=Alert in imager console if rule matches
|
ConfigVisualPanel2.shouldAlertCheckBox.text=Alert in imager console
|
||||||
ConfigVisualPanel2.shouldSaveCheckBox.text=Extract file if it matches a rule
|
ConfigVisualPanel2.shouldSaveCheckBox.text=Extract file
|
||||||
ConfigVisualPanel2.deleteRuleButton.text=Delete Rule
|
ConfigVisualPanel2.deleteRuleButton.text=Delete Rule
|
||||||
ConfigVisualPanel2.editRuleButton.text=Edit Rule
|
ConfigVisualPanel2.editRuleButton.text=Edit Rule
|
||||||
ConfigVisualPanel2.newRuleButton.text=New Rule
|
ConfigVisualPanel2.newRuleButton.text=New Rule
|
||||||
@ -77,15 +77,15 @@ EditRulePanel.jTable1.columnModel.title1=Title 2
|
|||||||
EditRulePanel.shouldAlertCheckBox.actionCommand=
|
EditRulePanel.shouldAlertCheckBox.actionCommand=
|
||||||
EditFullPathsRulePanel.ruleNameLabel.text=Rule name:
|
EditFullPathsRulePanel.ruleNameLabel.text=Rule name:
|
||||||
EditFullPathsRulePanel.shouldAlertCheckBox.actionCommand=
|
EditFullPathsRulePanel.shouldAlertCheckBox.actionCommand=
|
||||||
EditFullPathsRulePanel.shouldAlertCheckBox.text=Alert in imager console if a path matches
|
EditFullPathsRulePanel.shouldAlertCheckBox.text=Alert in imager console
|
||||||
EditFullPathsRulePanel.shouldSaveCheckBox.text=Extract file if it matches a path
|
EditFullPathsRulePanel.shouldSaveCheckBox.text=Extract file
|
||||||
EditFullPathsRulePanel.fullPathsLabel.text=Full paths:
|
EditFullPathsRulePanel.fullPathsLabel.text=Full paths:
|
||||||
EditFullPathsRulePanel.fullPathsLabel.toolTipText=
|
EditFullPathsRulePanel.fullPathsLabel.toolTipText=
|
||||||
EditNonFullPathsRulePanel.ruleNameLabel.text=Rule name:
|
EditNonFullPathsRulePanel.ruleNameLabel.text=Rule name:
|
||||||
EditNonFullPathsRulePanel.shouldSaveCheckBox.text=Extract file if it matches a condition
|
EditNonFullPathsRulePanel.shouldSaveCheckBox.text=Extract file
|
||||||
EditNonFullPathsRulePanel.daysIncludedLabel.text=day(s)
|
EditNonFullPathsRulePanel.daysIncludedLabel.text=day(s)
|
||||||
EditNonFullPathsRulePanel.shouldAlertCheckBox.actionCommand=
|
EditNonFullPathsRulePanel.shouldAlertCheckBox.actionCommand=
|
||||||
EditNonFullPathsRulePanel.shouldAlertCheckBox.text=Alert in imager console if a condition matches
|
EditNonFullPathsRulePanel.shouldAlertCheckBox.text=Alert in imager console
|
||||||
ConfigVisualPanel1.browseButton.text=Browse
|
ConfigVisualPanel1.browseButton.text=Browse
|
||||||
ConfigVisualPanel2.fullPathsTable.columnModel.title0=
|
ConfigVisualPanel2.fullPathsTable.columnModel.title0=
|
||||||
ConfigVisualPanel2.folderNamesTable.columnModel.title0=
|
ConfigVisualPanel2.folderNamesTable.columnModel.title0=
|
||||||
@ -120,3 +120,5 @@ ConfigVisualPanel2.flagEncryptionProgramsCheckBox.text=Alert if encryption progr
|
|||||||
ConfigVisualPanel2.finalizeImageWriter.text=Continue imaging after searches are performed
|
ConfigVisualPanel2.finalizeImageWriter.text=Continue imaging after searches are performed
|
||||||
EditNonFullPathsRulePanel.fileNamesInfoLabel.text=File names are case insensitive.
|
EditNonFullPathsRulePanel.fileNamesInfoLabel.text=File names are case insensitive.
|
||||||
EditNonFullPathsRulePanel.extensionsInfoLabel.text=Extensions are case insensitive.
|
EditNonFullPathsRulePanel.extensionsInfoLabel.text=Extensions are case insensitive.
|
||||||
|
ConfigVisualPanel2.promptBeforeExit.text=Prompt before exiting imager
|
||||||
|
ConfigVisualPanel2.promptBeforeExit.actionCommand=
|
||||||
|
@ -37,6 +37,9 @@ ConfigVisualPanel2.editConfiguration=Configure imager
|
|||||||
ConfigVisualPanel2.editRuleError=Edit rule error
|
ConfigVisualPanel2.editRuleError=Edit rule error
|
||||||
ConfigVisualPanel2.editRuleSet=Edit Rule
|
ConfigVisualPanel2.editRuleSet=Edit Rule
|
||||||
ConfigVisualPanel2.newRule.name=New Rule
|
ConfigVisualPanel2.newRule.name=New Rule
|
||||||
|
# {0} - ruleName
|
||||||
|
ConfigVisualPanel2.newRuleError.duplicateName=A rule with name "{0}" already exists. Please enter a different rule name
|
||||||
|
ConfigVisualPanel2.newRuleError.title=New rule error
|
||||||
ConfigVisualPanel2.ok=OK
|
ConfigVisualPanel2.ok=OK
|
||||||
ConfigVisualPanel2.rulesTable.columnModel.title0=Rule Name
|
ConfigVisualPanel2.rulesTable.columnModel.title0=Rule Name
|
||||||
ConfigVisualPanel2.rulesTable.columnModel.title1=Description
|
ConfigVisualPanel2.rulesTable.columnModel.title1=Description
|
||||||
@ -76,7 +79,7 @@ EditNonFullPathsRulePanel.modifiedDaysNotPositiveException=Modified days must be
|
|||||||
EditNonFullPathsRulePanel.units.bytes=Bytes
|
EditNonFullPathsRulePanel.units.bytes=Bytes
|
||||||
EditNonFullPathsRulePanel.units.gigabytes=Gigabytes
|
EditNonFullPathsRulePanel.units.gigabytes=Gigabytes
|
||||||
EditNonFullPathsRulePanel.units.kilobytes=Kilobytes
|
EditNonFullPathsRulePanel.units.kilobytes=Kilobytes
|
||||||
EditNonFullPathsRulePanel.units.megabytes=MegaBytes
|
EditNonFullPathsRulePanel.units.megabytes=Megabytes
|
||||||
# {0} - fieldName
|
# {0} - fieldName
|
||||||
EditRulePanel.blankLineException={0} cannot have a blank line
|
EditRulePanel.blankLineException={0} cannot have a blank line
|
||||||
EditRulePanel.emptyRuleName.message=Rule name cannot be empty
|
EditRulePanel.emptyRuleName.message=Rule name cannot be empty
|
||||||
@ -106,8 +109,8 @@ ConfigVisualPanel1.jRadioButton2.text=Open existing configuration
|
|||||||
ConfigVisualPanel2.modifiedDateLabel.text=Modified Within:
|
ConfigVisualPanel2.modifiedDateLabel.text=Modified Within:
|
||||||
ConfigVisualPanel2.folderNamesLabel.text=Folder names:
|
ConfigVisualPanel2.folderNamesLabel.text=Folder names:
|
||||||
ConfigVisualPanel2.filenamesLabel.text=File names:
|
ConfigVisualPanel2.filenamesLabel.text=File names:
|
||||||
ConfigVisualPanel2.shouldAlertCheckBox.text=Alert in imager console if rule matches
|
ConfigVisualPanel2.shouldAlertCheckBox.text=Alert in imager console
|
||||||
ConfigVisualPanel2.shouldSaveCheckBox.text=Extract file if it matches a rule
|
ConfigVisualPanel2.shouldSaveCheckBox.text=Extract file
|
||||||
ConfigVisualPanel2.deleteRuleButton.text=Delete Rule
|
ConfigVisualPanel2.deleteRuleButton.text=Delete Rule
|
||||||
ConfigVisualPanel2.editRuleButton.text=Edit Rule
|
ConfigVisualPanel2.editRuleButton.text=Edit Rule
|
||||||
ConfigVisualPanel2.newRuleButton.text=New Rule
|
ConfigVisualPanel2.newRuleButton.text=New Rule
|
||||||
@ -137,15 +140,15 @@ EditRulePanel.jTable1.columnModel.title1=Title 2
|
|||||||
EditRulePanel.shouldAlertCheckBox.actionCommand=
|
EditRulePanel.shouldAlertCheckBox.actionCommand=
|
||||||
EditFullPathsRulePanel.ruleNameLabel.text=Rule name:
|
EditFullPathsRulePanel.ruleNameLabel.text=Rule name:
|
||||||
EditFullPathsRulePanel.shouldAlertCheckBox.actionCommand=
|
EditFullPathsRulePanel.shouldAlertCheckBox.actionCommand=
|
||||||
EditFullPathsRulePanel.shouldAlertCheckBox.text=Alert in imager console if a path matches
|
EditFullPathsRulePanel.shouldAlertCheckBox.text=Alert in imager console
|
||||||
EditFullPathsRulePanel.shouldSaveCheckBox.text=Extract file if it matches a path
|
EditFullPathsRulePanel.shouldSaveCheckBox.text=Extract file
|
||||||
EditFullPathsRulePanel.fullPathsLabel.text=Full paths:
|
EditFullPathsRulePanel.fullPathsLabel.text=Full paths:
|
||||||
EditFullPathsRulePanel.fullPathsLabel.toolTipText=
|
EditFullPathsRulePanel.fullPathsLabel.toolTipText=
|
||||||
EditNonFullPathsRulePanel.ruleNameLabel.text=Rule name:
|
EditNonFullPathsRulePanel.ruleNameLabel.text=Rule name:
|
||||||
EditNonFullPathsRulePanel.shouldSaveCheckBox.text=Extract file if it matches a condition
|
EditNonFullPathsRulePanel.shouldSaveCheckBox.text=Extract file
|
||||||
EditNonFullPathsRulePanel.daysIncludedLabel.text=day(s)
|
EditNonFullPathsRulePanel.daysIncludedLabel.text=day(s)
|
||||||
EditNonFullPathsRulePanel.shouldAlertCheckBox.actionCommand=
|
EditNonFullPathsRulePanel.shouldAlertCheckBox.actionCommand=
|
||||||
EditNonFullPathsRulePanel.shouldAlertCheckBox.text=Alert in imager console if a condition matches
|
EditNonFullPathsRulePanel.shouldAlertCheckBox.text=Alert in imager console
|
||||||
ConfigVisualPanel1.browseButton.text=Browse
|
ConfigVisualPanel1.browseButton.text=Browse
|
||||||
ConfigVisualPanel2.fullPathsTable.columnModel.title0=
|
ConfigVisualPanel2.fullPathsTable.columnModel.title0=
|
||||||
ConfigVisualPanel2.folderNamesTable.columnModel.title0=
|
ConfigVisualPanel2.folderNamesTable.columnModel.title0=
|
||||||
@ -186,6 +189,8 @@ ConfigVisualPanel2.flagEncryptionProgramsCheckBox.text=Alert if encryption progr
|
|||||||
ConfigVisualPanel2.finalizeImageWriter.text=Continue imaging after searches are performed
|
ConfigVisualPanel2.finalizeImageWriter.text=Continue imaging after searches are performed
|
||||||
EditNonFullPathsRulePanel.fileNamesInfoLabel.text=File names are case insensitive.
|
EditNonFullPathsRulePanel.fileNamesInfoLabel.text=File names are case insensitive.
|
||||||
EditNonFullPathsRulePanel.extensionsInfoLabel.text=Extensions are case insensitive.
|
EditNonFullPathsRulePanel.extensionsInfoLabel.text=Extensions are case insensitive.
|
||||||
|
ConfigVisualPanel2.promptBeforeExit.text=Prompt before exiting imager
|
||||||
|
ConfigVisualPanel2.promptBeforeExit.actionCommand=
|
||||||
NewRuleSetPanel.attributeRule.description=Search for files based on one or more attributes or metadata fields.
|
NewRuleSetPanel.attributeRule.description=Search for files based on one or more attributes or metadata fields.
|
||||||
NewRuleSetPanel.attributeRule.name=Attribute
|
NewRuleSetPanel.attributeRule.name=Attribute
|
||||||
NewRuleSetPanel.fullPathRule.description=Search for files based on full exact match path.
|
NewRuleSetPanel.fullPathRule.description=Search for files based on full exact match path.
|
||||||
|
@ -36,9 +36,9 @@ import java.util.logging.Level;
|
|||||||
import javax.swing.JFileChooser;
|
import javax.swing.JFileChooser;
|
||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.event.DocumentEvent;
|
import javax.swing.event.DocumentEvent;
|
||||||
import javax.swing.event.DocumentListener;
|
import javax.swing.event.DocumentListener;
|
||||||
import javax.swing.SwingUtilities;
|
|
||||||
import javax.swing.filechooser.FileFilter;
|
import javax.swing.filechooser.FileFilter;
|
||||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||||
import javax.swing.filechooser.FileSystemView;
|
import javax.swing.filechooser.FileSystemView;
|
||||||
@ -251,6 +251,9 @@ final class ConfigVisualPanel1 extends JPanel {
|
|||||||
int firstRemovableDrive = -1;
|
int firstRemovableDrive = -1;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (File root : roots) {
|
for (File root : roots) {
|
||||||
|
if (DriveListUtils.isNetworkDrive(root.toString().replace(":\\", ""))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
String description = FileSystemView.getFileSystemView().getSystemTypeDescription(root);
|
String description = FileSystemView.getFileSystemView().getSystemTypeDescription(root);
|
||||||
long spaceInBytes = root.getTotalSpace();
|
long spaceInBytes = root.getTotalSpace();
|
||||||
String sizeWithUnit = DriveListUtils.humanReadableByteCount(spaceInBytes, false);
|
String sizeWithUnit = DriveListUtils.humanReadableByteCount(spaceInBytes, false);
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" alignment="1" attributes="0">
|
||||||
<Component id="newRuleButton" linkSize="3" min="-2" max="-2" attributes="0"/>
|
<Component id="newRuleButton" linkSize="3" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
<Component id="editRuleButton" linkSize="3" min="-2" max="-2" attributes="0"/>
|
<Component id="editRuleButton" linkSize="3" min="-2" max="-2" attributes="0"/>
|
||||||
@ -41,42 +41,19 @@
|
|||||||
<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">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="flagEncryptionProgramsCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="finalizeImageWriter" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="shouldSaveCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="shouldAlertCheckBox" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="extensionsLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="extensionsLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="filenamesLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="filenamesLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="descriptionLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="descriptionLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="ruleNameLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="ruleNameLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Component id="fullPathsLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Component id="folderNamesLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="modifiedDateLabel" alignment="0" min="-2" pref="79" max="-2" attributes="0"/>
|
|
||||||
<Component id="fileSizeLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="fullPathsLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="folderNamesLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace min="-2" pref="4" max="-2" attributes="0"/>
|
|
||||||
<Component id="minSizeLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="minSizeTextField" min="-2" pref="63" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
|
||||||
<Component id="maxSizeLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="maxSizeTextField" min="-2" pref="63" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace min="-2" pref="107" max="-2" attributes="0"/>
|
<EmptySpace min="369" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace min="-2" pref="129" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Component id="modifiedWithinTextField" min="-2" pref="54" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="129" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
|
||||||
<Component id="daysIncludedLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<Group type="102" alignment="1" attributes="0">
|
|
||||||
<Group type="103" groupAlignment="1" attributes="0">
|
<Group type="103" groupAlignment="1" attributes="0">
|
||||||
<Component id="ruleNameEditTextField" alignment="0" max="32767" attributes="0"/>
|
<Component id="ruleNameEditTextField" alignment="0" max="32767" attributes="0"/>
|
||||||
<Component id="descriptionEditTextField" alignment="0" max="32767" attributes="0"/>
|
<Component id="descriptionEditTextField" alignment="0" max="32767" attributes="0"/>
|
||||||
@ -85,15 +62,52 @@
|
|||||||
<Component id="filenamesScrollPane" alignment="0" pref="0" max="32767" attributes="0"/>
|
<Component id="filenamesScrollPane" alignment="0" pref="0" max="32767" attributes="0"/>
|
||||||
<Component id="folderNamesScrollPane" alignment="0" pref="0" max="32767" attributes="0"/>
|
<Component id="folderNamesScrollPane" alignment="0" pref="0" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
</Group>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="shouldSaveCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="shouldAlertCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="modifiedDateLabel" alignment="0" min="-2" pref="79" max="-2" attributes="0"/>
|
||||||
|
<Component id="fileSizeLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="-2" pref="4" max="-2" attributes="0"/>
|
||||||
|
<Component id="minSizeLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="minSizeTextField" min="-2" pref="63" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="maxSizeLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="maxSizeTextField" min="-2" pref="63" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace min="-2" pref="129" max="-2" attributes="0"/>
|
||||||
|
<Component id="modifiedWithinTextField" min="-2" pref="54" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="daysIncludedLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="jSeparator1" max="32767" attributes="0"/>
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="flagEncryptionProgramsCheckBox" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="finalizeImageWriter" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="promptBeforeExit" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Component id="jSeparator1" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
@ -107,16 +121,17 @@
|
|||||||
<Component id="configFileTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="configFileTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="ruleSetFileLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="ruleSetFileLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Component id="rulesScrollPane" pref="479" max="32767" attributes="0"/>
|
<Component id="rulesScrollPane" pref="478" max="32767" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="newRuleButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="newRuleButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="editRuleButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="editRuleButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="deleteRuleButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="deleteRuleButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
@ -140,30 +155,19 @@
|
|||||||
<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="0" attributes="0">
|
||||||
<Component id="filenamesScrollPane" pref="0" max="32767" attributes="0"/>
|
<Component id="filenamesScrollPane" pref="0" max="32767" attributes="0"/>
|
||||||
<Group type="102" attributes="0">
|
<Component id="filenamesLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="filenamesLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="16" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="folderNamesScrollPane" pref="0" max="32767" attributes="0"/>
|
<Component id="folderNamesScrollPane" pref="0" max="32767" attributes="0"/>
|
||||||
<Group type="102" attributes="0">
|
<Component id="folderNamesLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="folderNamesLabel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" attributes="0">
|
<Component id="fullPathsLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="fullPathsLabel" min="-2" max="-2" attributes="0"/>
|
<Component id="fullPathsScrollPane" alignment="0" pref="0" max="32767" attributes="0"/>
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<Group type="102" alignment="1" attributes="0">
|
|
||||||
<Component id="fullPathsScrollPane" pref="0" max="32767" attributes="0"/>
|
|
||||||
<EmptySpace min="-2" pref="11" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="2" attributes="0">
|
<Group type="103" groupAlignment="2" attributes="0">
|
||||||
<Component id="minSizeLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="minSizeLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="minSizeTextField" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="minSizeTextField" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
@ -171,25 +175,27 @@
|
|||||||
<Component id="maxSizeTextField" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="maxSizeTextField" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="fileSizeLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="fileSizeLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="2" attributes="0">
|
<Group type="103" groupAlignment="2" attributes="0">
|
||||||
<Component id="modifiedDateLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="modifiedDateLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="modifiedWithinTextField" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="modifiedWithinTextField" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="daysIncludedLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
<Component id="daysIncludedLabel" alignment="2" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="shouldSaveCheckBox" min="-2" max="-2" attributes="0"/>
|
<Component id="shouldSaveCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="shouldAlertCheckBox" min="-2" max="-2" attributes="0"/>
|
<Component id="shouldAlertCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
|
||||||
<Component id="jSeparator1" min="-2" pref="2" max="-2" attributes="0"/>
|
<Component id="jSeparator1" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="flagEncryptionProgramsCheckBox" min="-2" max="-2" attributes="0"/>
|
<Component id="flagEncryptionProgramsCheckBox" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="finalizeImageWriter" min="-2" max="-2" attributes="0"/>
|
<Component id="finalizeImageWriter" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="promptBeforeExit" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" pref="21" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -220,7 +226,6 @@
|
|||||||
<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/logicalimager/configuration/Bundle.properties" key="ConfigVisualPanel2.daysIncludedLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/configuration/Bundle.properties" key="ConfigVisualPanel2.daysIncludedLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="enabled" type="boolean" value="false"/>
|
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="fullPathsLabel">
|
<Component class="javax.swing.JLabel" name="fullPathsLabel">
|
||||||
@ -563,5 +568,19 @@
|
|||||||
<Property name="enabled" type="boolean" value="false"/>
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="promptBeforeExit">
|
||||||
|
<Properties>
|
||||||
|
<Property name="selected" type="boolean" value="true"/>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/configuration/Bundle.properties" key="ConfigVisualPanel2.promptBeforeExit.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/configuration/Bundle.properties" key="ConfigVisualPanel2.promptBeforeExit.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="promptBeforeExitActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Form>
|
</Form>
|
||||||
|
@ -110,6 +110,7 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
minSizeTextField = new javax.swing.JFormattedTextField();
|
minSizeTextField = new javax.swing.JFormattedTextField();
|
||||||
maxSizeLabel = new javax.swing.JLabel();
|
maxSizeLabel = new javax.swing.JLabel();
|
||||||
maxSizeTextField = new javax.swing.JFormattedTextField();
|
maxSizeTextField = new javax.swing.JFormattedTextField();
|
||||||
|
promptBeforeExit = new javax.swing.JCheckBox();
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(modifiedDateLabel, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.modifiedDateLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(modifiedDateLabel, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.modifiedDateLabel.text")); // NOI18N
|
||||||
|
|
||||||
@ -120,7 +121,6 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
modifiedWithinTextField.setPreferredSize(new java.awt.Dimension(60, 20));
|
modifiedWithinTextField.setPreferredSize(new java.awt.Dimension(60, 20));
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(daysIncludedLabel, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.daysIncludedLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(daysIncludedLabel, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.daysIncludedLabel.text")); // NOI18N
|
||||||
daysIncludedLabel.setEnabled(false);
|
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(fullPathsLabel, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.fullPathsLabel.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(fullPathsLabel, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.fullPathsLabel.text")); // NOI18N
|
||||||
|
|
||||||
@ -255,6 +255,15 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
maxSizeTextField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#,###; "))));
|
maxSizeTextField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(new java.text.DecimalFormat("#,###; "))));
|
||||||
maxSizeTextField.setEnabled(false);
|
maxSizeTextField.setEnabled(false);
|
||||||
|
|
||||||
|
promptBeforeExit.setSelected(true);
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(promptBeforeExit, org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.promptBeforeExit.text")); // NOI18N
|
||||||
|
promptBeforeExit.setActionCommand(org.openide.util.NbBundle.getMessage(ConfigVisualPanel2.class, "ConfigVisualPanel2.promptBeforeExit.actionCommand")); // NOI18N
|
||||||
|
promptBeforeExit.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
promptBeforeExitActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
this.setLayout(layout);
|
this.setLayout(layout);
|
||||||
layout.setHorizontalGroup(
|
layout.setHorizontalGroup(
|
||||||
@ -268,7 +277,7 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||||
.addComponent(newRuleButton)
|
.addComponent(newRuleButton)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(editRuleButton)
|
.addComponent(editRuleButton)
|
||||||
@ -281,48 +290,57 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(flagEncryptionProgramsCheckBox)
|
|
||||||
.addComponent(finalizeImageWriter)
|
|
||||||
.addComponent(shouldSaveCheckBox)
|
|
||||||
.addComponent(shouldAlertCheckBox)
|
|
||||||
.addComponent(extensionsLabel)
|
.addComponent(extensionsLabel)
|
||||||
.addComponent(filenamesLabel)
|
.addComponent(filenamesLabel)
|
||||||
.addComponent(descriptionLabel)
|
.addComponent(descriptionLabel)
|
||||||
.addComponent(ruleNameLabel)
|
.addComponent(ruleNameLabel)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addComponent(fullPathsLabel)
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addComponent(folderNamesLabel))
|
||||||
.addComponent(modifiedDateLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
.addComponent(fileSizeLabel)
|
|
||||||
.addComponent(fullPathsLabel)
|
|
||||||
.addComponent(folderNamesLabel))
|
|
||||||
.addGap(4, 4, 4)
|
|
||||||
.addComponent(minSizeLabel)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(minSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addGap(18, 18, 18)
|
|
||||||
.addComponent(maxSizeLabel)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(maxSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)))
|
|
||||||
.addGap(107, 107, 107))
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addGap(129, 129, 129)
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addComponent(modifiedWithinTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addGap(129, 129, 129)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
||||||
.addComponent(daysIncludedLabel))
|
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||||
.addComponent(ruleNameEditTextField, javax.swing.GroupLayout.Alignment.LEADING)
|
.addComponent(ruleNameEditTextField, javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(descriptionEditTextField, javax.swing.GroupLayout.Alignment.LEADING)
|
.addComponent(descriptionEditTextField, javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(extensionsTextField, javax.swing.GroupLayout.Alignment.LEADING)
|
.addComponent(extensionsTextField, javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(fullPathsScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
.addComponent(fullPathsScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
||||||
.addComponent(filenamesScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
.addComponent(filenamesScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
||||||
.addComponent(folderNamesScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
|
.addComponent(folderNamesScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))
|
||||||
.addContainerGap())))))
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(shouldSaveCheckBox)
|
||||||
|
.addComponent(shouldAlertCheckBox)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(modifiedDateLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(fileSizeLabel))
|
||||||
|
.addGap(4, 4, 4)
|
||||||
|
.addComponent(minSizeLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(minSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(maxSizeLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(maxSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGap(129, 129, 129)
|
||||||
|
.addComponent(modifiedWithinTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(daysIncludedLabel)))
|
||||||
|
.addGap(0, 0, Short.MAX_VALUE)))
|
||||||
|
.addContainerGap())))
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(jSeparator1))))
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(flagEncryptionProgramsCheckBox)
|
||||||
|
.addComponent(finalizeImageWriter)
|
||||||
|
.addComponent(promptBeforeExit))
|
||||||
|
.addGap(0, 0, Short.MAX_VALUE))
|
||||||
|
.addComponent(jSeparator1)))))
|
||||||
);
|
);
|
||||||
|
|
||||||
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deleteRuleButton, editRuleButton, newRuleButton});
|
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deleteRuleButton, editRuleButton, newRuleButton});
|
||||||
@ -337,12 +355,13 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addComponent(rulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 479, Short.MAX_VALUE)
|
.addComponent(rulesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 478, Short.MAX_VALUE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
.addComponent(newRuleButton)
|
.addComponent(newRuleButton)
|
||||||
.addComponent(editRuleButton)
|
.addComponent(editRuleButton)
|
||||||
.addComponent(deleteRuleButton)))
|
.addComponent(deleteRuleButton))
|
||||||
|
.addContainerGap())
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
@ -360,23 +379,16 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(filenamesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
.addComponent(filenamesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addComponent(filenamesLabel))
|
||||||
.addComponent(filenamesLabel)
|
.addGap(16, 16, 16)
|
||||||
.addGap(0, 0, Short.MAX_VALUE)))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(folderNamesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
.addComponent(folderNamesScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addComponent(folderNamesLabel))
|
||||||
.addComponent(folderNamesLabel)
|
.addGap(18, 18, 18)
|
||||||
.addGap(0, 0, Short.MAX_VALUE)))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addComponent(fullPathsLabel)
|
||||||
.addComponent(fullPathsLabel)
|
.addComponent(fullPathsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
|
||||||
.addComponent(fullPathsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
|
||||||
.addGap(11, 11, 11)))
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
|
||||||
.addComponent(minSizeLabel)
|
.addComponent(minSizeLabel)
|
||||||
.addComponent(minSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(minSizeTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
@ -392,13 +404,15 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
.addComponent(shouldSaveCheckBox)
|
.addComponent(shouldSaveCheckBox)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addComponent(shouldAlertCheckBox)
|
.addComponent(shouldAlertCheckBox)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addGap(18, 18, 18)
|
||||||
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
|
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(flagEncryptionProgramsCheckBox)
|
.addComponent(flagEncryptionProgramsCheckBox)
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(finalizeImageWriter)))
|
.addComponent(finalizeImageWriter)
|
||||||
.addContainerGap())
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(promptBeforeExit)
|
||||||
|
.addGap(21, 21, 21))))
|
||||||
);
|
);
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
@ -426,6 +440,13 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
if (option == JOptionPane.OK_OPTION) {
|
if (option == JOptionPane.OK_OPTION) {
|
||||||
try {
|
try {
|
||||||
ImmutablePair<String, LogicalImagerRule> ruleMap = editPanel.toRule();
|
ImmutablePair<String, LogicalImagerRule> ruleMap = editPanel.toRule();
|
||||||
|
if (!ruleName.equals(ruleMap.getKey()) && ruleExists(ruleMap)) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
Bundle.ConfigVisualPanel2_newRuleError_duplicateName(ruleMap.getKey()),
|
||||||
|
Bundle.ConfigVisualPanel2_editRuleError(),
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
updateRow(row, ruleMap);
|
updateRow(row, ruleMap);
|
||||||
break;
|
break;
|
||||||
} catch (IOException | NumberFormatException ex) {
|
} catch (IOException | NumberFormatException ex) {
|
||||||
@ -442,7 +463,10 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
}
|
}
|
||||||
}//GEN-LAST:event_editRuleButtonActionPerformed
|
}//GEN-LAST:event_editRuleButtonActionPerformed
|
||||||
|
|
||||||
@Messages({"ConfigVisualPanel2.newRule.name=New Rule"})
|
@Messages({"ConfigVisualPanel2.newRule.name=New Rule",
|
||||||
|
"ConfigVisualPanel2.newRuleError.title=New rule error",
|
||||||
|
"# {0} - ruleName",
|
||||||
|
"ConfigVisualPanel2.newRuleError.duplicateName=A rule with name \"{0}\" already exists. Please enter a different rule name"})
|
||||||
private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newRuleButtonActionPerformed
|
private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newRuleButtonActionPerformed
|
||||||
NewRulePanel panel;
|
NewRulePanel panel;
|
||||||
panel = new NewRulePanel(okButton, cancelButton);
|
panel = new NewRulePanel(okButton, cancelButton);
|
||||||
@ -455,14 +479,22 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
null, new Object[]{okButton, cancelButton}, okButton);
|
null, new Object[]{okButton, cancelButton}, okButton);
|
||||||
if (option == JOptionPane.OK_OPTION) {
|
if (option == JOptionPane.OK_OPTION) {
|
||||||
try {
|
try {
|
||||||
// Save the new rule
|
|
||||||
ImmutablePair<String, LogicalImagerRule> ruleMap = panel.toRule();
|
ImmutablePair<String, LogicalImagerRule> ruleMap = panel.toRule();
|
||||||
|
if (ruleExists(ruleMap)) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
Bundle.ConfigVisualPanel2_newRuleError_duplicateName(ruleMap.getKey()),
|
||||||
|
Bundle.ConfigVisualPanel2_newRuleError_title(),
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Save the new rule
|
||||||
appendRow(ruleMap);
|
appendRow(ruleMap);
|
||||||
break;
|
break;
|
||||||
} catch (IOException | NumberFormatException ex) {
|
} catch (IOException | NumberFormatException ex) {
|
||||||
JOptionPane.showMessageDialog(this,
|
JOptionPane.showMessageDialog(this,
|
||||||
ex.getMessage(),
|
ex.getMessage(),
|
||||||
"New rule error",
|
Bundle.ConfigVisualPanel2_newRuleError_title(),
|
||||||
JOptionPane.ERROR_MESSAGE);
|
JOptionPane.ERROR_MESSAGE);
|
||||||
// let user fix the error
|
// let user fix the error
|
||||||
}
|
}
|
||||||
@ -510,6 +542,10 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
config.setFinalizeImageWriter(finalizeImageWriter.isSelected());
|
config.setFinalizeImageWriter(finalizeImageWriter.isSelected());
|
||||||
}//GEN-LAST:event_finalizeImageWriterActionPerformed
|
}//GEN-LAST:event_finalizeImageWriterActionPerformed
|
||||||
|
|
||||||
|
private void promptBeforeExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_promptBeforeExitActionPerformed
|
||||||
|
config.setPromptBeforeExit(promptBeforeExit.isSelected());
|
||||||
|
}//GEN-LAST:event_promptBeforeExitActionPerformed
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the whether the a rule for detecting encryption programs will be
|
* Set the whether the a rule for detecting encryption programs will be
|
||||||
* added to the rules in this config
|
* added to the rules in this config
|
||||||
@ -579,6 +615,7 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
private javax.swing.JLabel modifiedDateLabel;
|
private javax.swing.JLabel modifiedDateLabel;
|
||||||
private javax.swing.JTextField modifiedWithinTextField;
|
private javax.swing.JTextField modifiedWithinTextField;
|
||||||
private javax.swing.JButton newRuleButton;
|
private javax.swing.JButton newRuleButton;
|
||||||
|
private javax.swing.JCheckBox promptBeforeExit;
|
||||||
private javax.swing.JTextField ruleNameEditTextField;
|
private javax.swing.JTextField ruleNameEditTextField;
|
||||||
private javax.swing.JLabel ruleNameLabel;
|
private javax.swing.JLabel ruleNameLabel;
|
||||||
private javax.swing.JLabel ruleSetFileLabel;
|
private javax.swing.JLabel ruleSetFileLabel;
|
||||||
@ -607,6 +644,7 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
private void updatePanel(String configFilePath, LogicalImagerConfig config, String rowSelectionkey) {
|
private void updatePanel(String configFilePath, LogicalImagerConfig config, String rowSelectionkey) {
|
||||||
configFileTextField.setText(configFilePath);
|
configFileTextField.setText(configFilePath);
|
||||||
finalizeImageWriter.setSelected(config.isFinalizeImageWriter());
|
finalizeImageWriter.setSelected(config.isFinalizeImageWriter());
|
||||||
|
promptBeforeExit.setSelected(config.isPromptBeforeExit());
|
||||||
LogicalImagerRuleSet ruleSet = getRuleSetFromCurrentConfig();
|
LogicalImagerRuleSet ruleSet = getRuleSetFromCurrentConfig();
|
||||||
flagEncryptionProgramsCheckBox.setSelected(ruleSet.find(EncryptionProgramsRule.getName()) != null);
|
flagEncryptionProgramsCheckBox.setSelected(ruleSet.find(EncryptionProgramsRule.getName()) != null);
|
||||||
RulesTableModel rulesTableModel = new RulesTableModel();
|
RulesTableModel rulesTableModel = new RulesTableModel();
|
||||||
@ -767,6 +805,22 @@ final class ConfigVisualPanel2 extends JPanel {
|
|||||||
updatePanel(configFilename, config, ruleMap.getKey());
|
updatePanel(configFilename, config, ruleMap.getKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a rule with the same name as this rule already exists
|
||||||
|
*
|
||||||
|
* @param ruleMap the rule to check the name of
|
||||||
|
*
|
||||||
|
* @return true if it exists, false otherwise
|
||||||
|
*/
|
||||||
|
private boolean ruleExists(ImmutablePair<String, LogicalImagerRule> ruleMap) {
|
||||||
|
for (LogicalImagerRule rule : getRuleSetFromCurrentConfig().getRules()) {
|
||||||
|
if (rule.getName().equals(ruleMap.getKey())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private void appendRow(ImmutablePair<String, LogicalImagerRule> ruleMap) {
|
private void appendRow(ImmutablePair<String, LogicalImagerRule> ruleMap) {
|
||||||
getRuleSetFromCurrentConfig().getRules().add(ruleMap.getValue());
|
getRuleSetFromCurrentConfig().getRules().add(ruleMap.getValue());
|
||||||
updatePanel(configFilename, config, ruleMap.getKey());
|
updatePanel(configFilename, config, ruleMap.getKey());
|
||||||
|
@ -54,10 +54,6 @@ final class EditFullPathsRulePanel extends javax.swing.JPanel {
|
|||||||
EditFullPathsRulePanel(JButton okButton, JButton cancelButton, String ruleName, LogicalImagerRule rule, boolean editing) {
|
EditFullPathsRulePanel(JButton okButton, JButton cancelButton, String ruleName, LogicalImagerRule rule, boolean editing) {
|
||||||
initComponents();
|
initComponents();
|
||||||
|
|
||||||
if (editing) {
|
|
||||||
ruleNameTextField.setEnabled(!editing);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setRule(ruleName, rule);
|
this.setRule(ruleName, rule);
|
||||||
this.setButtons(okButton, cancelButton);
|
this.setButtons(okButton, cancelButton);
|
||||||
|
|
||||||
|
@ -66,14 +66,11 @@ final class EditNonFullPathsRulePanel extends javax.swing.JPanel {
|
|||||||
"EditNonFullPathsRulePanel.example=Example: ",
|
"EditNonFullPathsRulePanel.example=Example: ",
|
||||||
"EditNonFullPathsRulePanel.units.bytes=Bytes",
|
"EditNonFullPathsRulePanel.units.bytes=Bytes",
|
||||||
"EditNonFullPathsRulePanel.units.kilobytes=Kilobytes",
|
"EditNonFullPathsRulePanel.units.kilobytes=Kilobytes",
|
||||||
"EditNonFullPathsRulePanel.units.megabytes=MegaBytes",
|
"EditNonFullPathsRulePanel.units.megabytes=Megabytes",
|
||||||
"EditNonFullPathsRulePanel.units.gigabytes=Gigabytes"
|
"EditNonFullPathsRulePanel.units.gigabytes=Gigabytes"
|
||||||
})
|
})
|
||||||
EditNonFullPathsRulePanel(JButton okButton, JButton cancelButton, String ruleName, LogicalImagerRule rule, boolean editing) {
|
EditNonFullPathsRulePanel(JButton okButton, JButton cancelButton, String ruleName, LogicalImagerRule rule, boolean editing) {
|
||||||
initComponents();
|
initComponents();
|
||||||
if (editing) {
|
|
||||||
ruleNameTextField.setEnabled(!editing);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.setRule(ruleName, rule);
|
this.setRule(ruleName, rule);
|
||||||
this.setButtons(okButton, cancelButton);
|
this.setButtons(okButton, cancelButton);
|
||||||
@ -710,9 +707,9 @@ final class EditNonFullPathsRulePanel extends javax.swing.JPanel {
|
|||||||
return (extensionsCheckbox.isSelected() && !StringUtils.isBlank(extensionsTextField.getText()) && !validateExtensions(extensionsTextField).isEmpty())
|
return (extensionsCheckbox.isSelected() && !StringUtils.isBlank(extensionsTextField.getText()) && !validateExtensions(extensionsTextField).isEmpty())
|
||||||
|| (fileNamesCheckbox.isSelected() && !StringUtils.isBlank(fileNamesTextArea.getText()))
|
|| (fileNamesCheckbox.isSelected() && !StringUtils.isBlank(fileNamesTextArea.getText()))
|
||||||
|| (folderNamesCheckbox.isSelected() && !StringUtils.isBlank(folderNamesTextArea.getText()))
|
|| (folderNamesCheckbox.isSelected() && !StringUtils.isBlank(folderNamesTextArea.getText()))
|
||||||
|| (minSizeCheckbox.isSelected() && !StringUtils.isBlank(minSizeTextField.getText()) && isNonZeroLong(minSizeTextField.getText()))
|
|| (minSizeCheckbox.isSelected() && !StringUtils.isBlank(minSizeTextField.getText()) && isNonZeroLong(minSizeTextField.getValue()))
|
||||||
|| (maxSizeCheckbox.isSelected() && !StringUtils.isBlank(maxSizeTextField.getText()) && isNonZeroLong(maxSizeTextField.getText()))
|
|| (maxSizeCheckbox.isSelected() && !StringUtils.isBlank(maxSizeTextField.getText()) && isNonZeroLong(maxSizeTextField.getValue()))
|
||||||
|| (modifiedWithinCheckbox.isSelected() && !StringUtils.isBlank(modifiedWithinTextField.getText()));
|
|| (modifiedWithinCheckbox.isSelected() && !StringUtils.isBlank(modifiedWithinTextField.getText()) && isNonZeroLong(modifiedWithinTextField.getValue()));
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
logger.log(Level.WARNING, "Invalid contents of extensionsTextField", ex);
|
logger.log(Level.WARNING, "Invalid contents of extensionsTextField", ex);
|
||||||
return false;
|
return false;
|
||||||
@ -722,14 +719,16 @@ final class EditNonFullPathsRulePanel extends javax.swing.JPanel {
|
|||||||
/**
|
/**
|
||||||
* Check that value could be a non zero long
|
* Check that value could be a non zero long
|
||||||
*
|
*
|
||||||
* @param numberString the string to check
|
* @param numberObject the object to check
|
||||||
*
|
*
|
||||||
* @return true if the value is a non-zero long
|
* @return true if the value is a non-zero long
|
||||||
*/
|
*/
|
||||||
private boolean isNonZeroLong(String numberString) {
|
private boolean isNonZeroLong(Object numberObject) {
|
||||||
Long value = 0L;
|
Long value = 0L;
|
||||||
try {
|
try {
|
||||||
value = Long.parseLong(numberString);
|
if (numberObject instanceof Number) {
|
||||||
|
value = ((Number) numberObject).longValue();
|
||||||
|
}
|
||||||
} catch (NumberFormatException ignored) {
|
} catch (NumberFormatException ignored) {
|
||||||
//The string was not a number, this method will return false becaue the value is still 0L
|
//The string was not a number, this method will return false becaue the value is still 0L
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,10 @@ class LogicalImagerConfig {
|
|||||||
@Expose(serialize = true)
|
@Expose(serialize = true)
|
||||||
private boolean finalizeImageWriter;
|
private boolean finalizeImageWriter;
|
||||||
|
|
||||||
|
@SerializedName("prompt-before-exit")
|
||||||
|
@Expose(serialize = true)
|
||||||
|
private boolean promptBeforeExit;
|
||||||
|
|
||||||
@SerializedName("rule-sets")
|
@SerializedName("rule-sets")
|
||||||
@Expose(serialize = true)
|
@Expose(serialize = true)
|
||||||
private List<LogicalImagerRuleSet> ruleSets;
|
private List<LogicalImagerRuleSet> ruleSets;
|
||||||
@ -45,6 +49,7 @@ class LogicalImagerConfig {
|
|||||||
LogicalImagerConfig() {
|
LogicalImagerConfig() {
|
||||||
this.version = CURRENT_VERSION;
|
this.version = CURRENT_VERSION;
|
||||||
this.finalizeImageWriter = false;
|
this.finalizeImageWriter = false;
|
||||||
|
this.promptBeforeExit = true;
|
||||||
this.ruleSets = new ArrayList<>();
|
this.ruleSets = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,6 +59,7 @@ class LogicalImagerConfig {
|
|||||||
) {
|
) {
|
||||||
this.version = CURRENT_VERSION;
|
this.version = CURRENT_VERSION;
|
||||||
this.finalizeImageWriter = finalizeImageWriter;
|
this.finalizeImageWriter = finalizeImageWriter;
|
||||||
|
this.promptBeforeExit = true;
|
||||||
this.ruleSets = ruleSets;
|
this.ruleSets = ruleSets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,6 +70,19 @@ class LogicalImagerConfig {
|
|||||||
) {
|
) {
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.finalizeImageWriter = finalizeImageWriter;
|
this.finalizeImageWriter = finalizeImageWriter;
|
||||||
|
this.promptBeforeExit = true;
|
||||||
|
this.ruleSets = ruleSets;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogicalImagerConfig(
|
||||||
|
String version,
|
||||||
|
boolean finalizeImageWriter,
|
||||||
|
boolean promptBeforeExit,
|
||||||
|
List<LogicalImagerRuleSet> ruleSets
|
||||||
|
) {
|
||||||
|
this.version = version;
|
||||||
|
this.finalizeImageWriter = finalizeImageWriter;
|
||||||
|
this.promptBeforeExit = promptBeforeExit;
|
||||||
this.ruleSets = ruleSets;
|
this.ruleSets = ruleSets;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,6 +106,14 @@ class LogicalImagerConfig {
|
|||||||
this.finalizeImageWriter = finalizeImageWriter;
|
this.finalizeImageWriter = finalizeImageWriter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isPromptBeforeExit() {
|
||||||
|
return promptBeforeExit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPromptBeforeExit(boolean promptBeforeExit) {
|
||||||
|
this.promptBeforeExit = promptBeforeExit;
|
||||||
|
}
|
||||||
|
|
||||||
List<LogicalImagerRuleSet> getRuleSets() {
|
List<LogicalImagerRuleSet> getRuleSets() {
|
||||||
return ruleSets;
|
return ruleSets;
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,7 @@ class LogicalImagerConfigDeserializer implements JsonDeserializer<LogicalImagerC
|
|||||||
public LogicalImagerConfig deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException {
|
public LogicalImagerConfig deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException {
|
||||||
String version = LogicalImagerConfig.getCurrentVersion();
|
String version = LogicalImagerConfig.getCurrentVersion();
|
||||||
boolean finalizeImageWriter = false;
|
boolean finalizeImageWriter = false;
|
||||||
|
boolean promptBeforeExit = true;
|
||||||
|
|
||||||
final JsonObject jsonObject = je.getAsJsonObject();
|
final JsonObject jsonObject = je.getAsJsonObject();
|
||||||
final JsonElement jsonVersion = jsonObject.get("version"); // NON-NLS
|
final JsonElement jsonVersion = jsonObject.get("version"); // NON-NLS
|
||||||
@ -57,6 +58,11 @@ class LogicalImagerConfigDeserializer implements JsonDeserializer<LogicalImagerC
|
|||||||
finalizeImageWriter = jsonFinalizeImageWriter.getAsBoolean();
|
finalizeImageWriter = jsonFinalizeImageWriter.getAsBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final JsonElement jsonPromptBeforeExit = jsonObject.get("prompt-before-exit"); // NON-NLS
|
||||||
|
if (jsonPromptBeforeExit != null) {
|
||||||
|
promptBeforeExit = jsonPromptBeforeExit.getAsBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
JsonArray asJsonArray = jsonObject.get("rule-sets").getAsJsonArray(); // NON-NLS
|
JsonArray asJsonArray = jsonObject.get("rule-sets").getAsJsonArray(); // NON-NLS
|
||||||
if (asJsonArray == null) {
|
if (asJsonArray == null) {
|
||||||
throw new JsonParseException(Bundle.LogicalImagerConfigDeserializer_missingRuleSetException());
|
throw new JsonParseException(Bundle.LogicalImagerConfigDeserializer_missingRuleSetException());
|
||||||
@ -74,7 +80,7 @@ class LogicalImagerConfigDeserializer implements JsonDeserializer<LogicalImagerC
|
|||||||
LogicalImagerRuleSet ruleSet = new LogicalImagerRuleSet(setName, rules);
|
LogicalImagerRuleSet ruleSet = new LogicalImagerRuleSet(setName, rules);
|
||||||
ruleSets.add(ruleSet);
|
ruleSets.add(ruleSet);
|
||||||
}
|
}
|
||||||
return new LogicalImagerConfig(version, finalizeImageWriter, ruleSets);
|
return new LogicalImagerConfig(version, finalizeImageWriter, promptBeforeExit, ruleSets);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<LogicalImagerRule> parseRules(JsonArray asJsonArray) {
|
private List<LogicalImagerRule> parseRules(JsonArray asJsonArray) {
|
||||||
|
@ -88,7 +88,7 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
|||||||
// Copy directory failed
|
// Copy directory failed
|
||||||
String msg = Bundle.AddLogicalImageTask_failedToCopyDirectory(src.toString(), dest.toString());
|
String msg = Bundle.AddLogicalImageTask_failedToCopyDirectory(src.toString(), dest.toString());
|
||||||
errorList.add(msg);
|
errorList.add(msg);
|
||||||
logger.log(Level.SEVERE, String.format("Failed to copy directory {0} to {1}", src.toString(), dest.toString()));
|
logger.log(Level.SEVERE, String.format("Failed to copy directory %s to %s", src.toString(), dest.toString()), ex);
|
||||||
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
callback.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errorList, emptyDataSources);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -136,7 +136,7 @@ final class AddLogicalImageTask extends AddMultipleImageTask {
|
|||||||
return null;
|
return null;
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
String msg = Bundle.AddLogicalImageTask_failedToAddReport(reportPath.toString(), ex.getMessage());
|
String msg = Bundle.AddLogicalImageTask_failedToAddReport(reportPath.toString(), ex.getMessage());
|
||||||
logger.log(Level.SEVERE, String.format("Failed to add report {0}. Reason= {1}", reportPath.toString(), ex.getMessage()));
|
logger.log(Level.SEVERE, String.format("Failed to add report %s. Reason= %s", reportPath.toString(), ex.getMessage()), ex);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,26 +18,23 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.logicalimager.dsp;
|
package org.sleuthkit.autopsy.logicalimager.dsp;
|
||||||
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||||
import org.sleuthkit.autopsy.casemodule.services.FileManager;
|
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback;
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback.DataSourceProcessorResult;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorCallback.DataSourceProcessorResult;
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessorProgressMonitor;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.datamodel.Image;
|
import org.sleuthkit.datamodel.Image;
|
||||||
import org.sleuthkit.datamodel.LocalFilesDataSource;
|
|
||||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||||
import org.sleuthkit.datamodel.SleuthkitJNI;
|
import org.sleuthkit.datamodel.SleuthkitJNI;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskDataException;
|
import org.sleuthkit.datamodel.TskDataException;
|
||||||
|
import org.sleuthkit.datamodel.TskFileRange;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -51,12 +48,15 @@ class AddMultipleImageTask implements Runnable {
|
|||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(AddMultipleImageTask.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(AddMultipleImageTask.class.getName());
|
||||||
public static final String TSK_FS_TYPE_UNKNOWN_ERR_MSG = Bundle.AddMultipleImageTask_fsTypeUnknownErr();
|
public static final String TSK_FS_TYPE_UNKNOWN_ERR_MSG = Bundle.AddMultipleImageTask_fsTypeUnknownErr();
|
||||||
|
private static final long TWO_GB = 2000000000L;
|
||||||
private final String deviceId;
|
private final String deviceId;
|
||||||
private final List<String> imageFilePaths;
|
private final List<String> imageFilePaths;
|
||||||
private final String timeZone;
|
private final String timeZone;
|
||||||
|
private final long chunkSize = TWO_GB;
|
||||||
private final DataSourceProcessorProgressMonitor progressMonitor;
|
private final DataSourceProcessorProgressMonitor progressMonitor;
|
||||||
private final DataSourceProcessorCallback callback;
|
private final DataSourceProcessorCallback callback;
|
||||||
private final Case currentCase;
|
private final Case currentCase;
|
||||||
|
|
||||||
private boolean criticalErrorOccurred;
|
private boolean criticalErrorOccurred;
|
||||||
private volatile boolean cancelled;
|
private volatile boolean cancelled;
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ class AddMultipleImageTask implements Runnable {
|
|||||||
* @throws NoCurrentCaseException The exception if there is no open case.
|
* @throws NoCurrentCaseException The exception if there is no open case.
|
||||||
*/
|
*/
|
||||||
@Messages({
|
@Messages({
|
||||||
"# {0} - file", "AddMultipleImageTask.addingFileAsLogicalFile=Adding: {0} as logical file",
|
"# {0} - file", "AddMultipleImageTask.addingFileAsLogicalFile=Adding: {0} as an unallocated space file.",
|
||||||
"# {0} - deviceId", "# {1} - exceptionMessage",
|
"# {0} - deviceId", "# {1} - exceptionMessage",
|
||||||
"AddMultipleImageTask.errorAddingImgWithoutFileSystem=Error adding images without file systems for device %s: %s",})
|
"AddMultipleImageTask.errorAddingImgWithoutFileSystem=Error adding images without file systems for device %s: %s",})
|
||||||
AddMultipleImageTask(String deviceId, List<String> imageFilePaths, String timeZone,
|
AddMultipleImageTask(String deviceId, List<String> imageFilePaths, String timeZone,
|
||||||
@ -98,14 +98,14 @@ class AddMultipleImageTask implements Runnable {
|
|||||||
* Try to add the input image files as images.
|
* Try to add the input image files as images.
|
||||||
*/
|
*/
|
||||||
List<Content> newDataSources = new ArrayList<>();
|
List<Content> newDataSources = new ArrayList<>();
|
||||||
List<String> localFileDataSourcePaths = new ArrayList<>();
|
List<String> corruptedImageFilePaths = new ArrayList<>();
|
||||||
List<String> errorMessages = new ArrayList<>();
|
List<String> errorMessages = new ArrayList<>();
|
||||||
currentCase.getSleuthkitCase().acquireSingleUserCaseWriteLock();
|
currentCase.getSleuthkitCase().acquireSingleUserCaseWriteLock();
|
||||||
try {
|
try {
|
||||||
progressMonitor.setIndeterminate(true);
|
progressMonitor.setIndeterminate(true);
|
||||||
for (String imageFilePath : imageFilePaths) {
|
for (String imageFilePath : imageFilePaths) {
|
||||||
if (!cancelled) {
|
if (!cancelled) {
|
||||||
addImageToCase(imageFilePath, newDataSources, localFileDataSourcePaths, errorMessages);
|
addImageToCase(imageFilePath, newDataSources, corruptedImageFilePaths, errorMessages);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@ -114,20 +114,42 @@ class AddMultipleImageTask implements Runnable {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Try to add any input image files that did not have file systems as a
|
* Try to add any input image files that did not have file systems as a
|
||||||
* single local/logical files set with the device id as the root virtual
|
* single an unallocated space file with the device id as the root virtual
|
||||||
* directory name.
|
* directory name.
|
||||||
*/
|
*/
|
||||||
if (!cancelled && !localFileDataSourcePaths.isEmpty()) {
|
if (!cancelled && !corruptedImageFilePaths.isEmpty()) {
|
||||||
FileManager fileManager = currentCase.getServices().getFileManager();
|
SleuthkitCase caseDatabase;
|
||||||
FileManager.FileAddProgressUpdater progressUpdater = (final AbstractFile newFile) -> {
|
caseDatabase = currentCase.getSleuthkitCase();
|
||||||
progressMonitor.setProgressText(Bundle.AddMultipleImageTask_addingFileAsLogicalFile(Paths.get(newFile.getParentPath(), newFile.getName())));
|
|
||||||
};
|
|
||||||
try {
|
try {
|
||||||
LocalFilesDataSource localFilesDataSource = fileManager.addLocalFilesDataSource(deviceId, "", timeZone, localFileDataSourcePaths, progressUpdater);
|
progressMonitor.setProgressText(Bundle.AddMultipleImageTask_addingFileAsLogicalFile(corruptedImageFilePaths.toString()));
|
||||||
newDataSources.add(localFilesDataSource);
|
|
||||||
} catch (TskCoreException | TskDataException ex) {
|
caseDatabase.acquireSingleUserCaseWriteLock();
|
||||||
|
|
||||||
|
Image dataSource = caseDatabase.addImageInfo(0, corruptedImageFilePaths, timeZone);
|
||||||
|
newDataSources.add(dataSource);
|
||||||
|
List<TskFileRange> fileRanges = new ArrayList<>();
|
||||||
|
|
||||||
|
long imageSize = dataSource.getSize();
|
||||||
|
int sequence = 0;
|
||||||
|
//start byte and end byte
|
||||||
|
long start = 0;
|
||||||
|
if (chunkSize > 0 && imageSize >= TWO_GB) {
|
||||||
|
for (double size = TWO_GB; size < dataSource.getSize(); size += TWO_GB) {
|
||||||
|
fileRanges.add(new TskFileRange(start, TWO_GB, sequence));
|
||||||
|
start += TWO_GB;
|
||||||
|
sequence++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
double leftoverSize = imageSize - sequence * TWO_GB;
|
||||||
|
fileRanges.add(new TskFileRange(start, (long)leftoverSize, sequence));
|
||||||
|
|
||||||
|
caseDatabase.addLayoutFiles(dataSource, fileRanges);
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
errorMessages.add(Bundle.AddMultipleImageTask_errorAddingImgWithoutFileSystem(deviceId, ex.getLocalizedMessage()));
|
errorMessages.add(Bundle.AddMultipleImageTask_errorAddingImgWithoutFileSystem(deviceId, ex.getLocalizedMessage()));
|
||||||
criticalErrorOccurred = true;
|
criticalErrorOccurred = true;
|
||||||
|
} finally {
|
||||||
|
caseDatabase.releaseSingleUserCaseWriteLock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,11 +191,10 @@ class AddMultipleImageTask implements Runnable {
|
|||||||
* @param newDataSources If the image is added, a data source is
|
* @param newDataSources If the image is added, a data source is
|
||||||
* added to this list for eventual return to
|
* added to this list for eventual return to
|
||||||
* the caller via the callback.
|
* the caller via the callback.
|
||||||
* @param localFileDataSourcePaths If the image cannot be added because
|
* @param corruptedImageFilePaths If the image cannot be added because
|
||||||
* Sleuth Kit cannot detect a filesystem,
|
* Sleuth Kit cannot detect a filesystem,
|
||||||
* the image file path is added to this list
|
* the image file path is added to this list
|
||||||
* for later addition as a part of a
|
* for later addition as an unallocated space file.
|
||||||
* local/logical files data source.
|
|
||||||
* @param errorMessages If there are any error messages, the
|
* @param errorMessages If there are any error messages, the
|
||||||
* error messages are added to this list for
|
* error messages are added to this list for
|
||||||
* eventual return to the caller via the
|
* eventual return to the caller via the
|
||||||
@ -184,7 +205,7 @@ class AddMultipleImageTask implements Runnable {
|
|||||||
"# {0} - imageFilePath", "# {1} - deviceId", "# {2} - exceptionMessage", "AddMultipleImageTask.criticalErrorAdding=Critical error adding {0} for device {1}: {2}",
|
"# {0} - imageFilePath", "# {1} - deviceId", "# {2} - exceptionMessage", "AddMultipleImageTask.criticalErrorAdding=Critical error adding {0} for device {1}: {2}",
|
||||||
"# {0} - imageFilePath", "# {1} - deviceId", "# {2} - exceptionMessage", "AddMultipleImageTask.criticalErrorReverting=Critical error reverting add image process for {0} for device {1}: {2}",
|
"# {0} - imageFilePath", "# {1} - deviceId", "# {2} - exceptionMessage", "AddMultipleImageTask.criticalErrorReverting=Critical error reverting add image process for {0} for device {1}: {2}",
|
||||||
"# {0} - imageFilePath", "# {1} - deviceId", "# {2} - exceptionMessage", "AddMultipleImageTask.nonCriticalErrorAdding=Non-critical error adding {0} for device {1}: {2}",})
|
"# {0} - imageFilePath", "# {1} - deviceId", "# {2} - exceptionMessage", "AddMultipleImageTask.nonCriticalErrorAdding=Non-critical error adding {0} for device {1}: {2}",})
|
||||||
private void addImageToCase(String imageFilePath, List<Content> newDataSources, List<String> localFileDataSourcePaths, List<String> errorMessages) {
|
private void addImageToCase(String imageFilePath, List<Content> newDataSources, List<String> corruptedImageFilePaths, List<String> errorMessages) {
|
||||||
/*
|
/*
|
||||||
* Try to add the image to the case database as a data source.
|
* Try to add the image to the case database as a data source.
|
||||||
*/
|
*/
|
||||||
@ -198,10 +219,10 @@ class AddMultipleImageTask implements Runnable {
|
|||||||
/*
|
/*
|
||||||
* If Sleuth Kit failed to add the image because it did not find
|
* If Sleuth Kit failed to add the image because it did not find
|
||||||
* a file system, save the image path so it can be added to the
|
* a file system, save the image path so it can be added to the
|
||||||
* case as part of a local/logical files data source. All other
|
* case as an unallocated space file. All other
|
||||||
* errors are critical.
|
* errors are critical.
|
||||||
*/
|
*/
|
||||||
localFileDataSourcePaths.add(imageFilePath);
|
corruptedImageFilePaths.add(imageFilePath);
|
||||||
} else {
|
} else {
|
||||||
errorMessages.add(Bundle.AddMultipleImageTask_criticalErrorAdding(imageFilePath, deviceId, ex.getLocalizedMessage()));
|
errorMessages.add(Bundle.AddMultipleImageTask_criticalErrorAdding(imageFilePath, deviceId, ex.getLocalizedMessage()));
|
||||||
criticalErrorOccurred = true;
|
criticalErrorOccurred = true;
|
||||||
|
@ -5,10 +5,7 @@
|
|||||||
LogicalImagerPanel.selectFromDriveLabel.text=Select Acquisition From Drive
|
LogicalImagerPanel.selectFromDriveLabel.text=Select Acquisition From Drive
|
||||||
LogicalImagerPanel.selectDriveLabel.text=Select Drive
|
LogicalImagerPanel.selectDriveLabel.text=Select Drive
|
||||||
LogicalImagerPanel.selectFolderLabel.text=Selected Folder:
|
LogicalImagerPanel.selectFolderLabel.text=Selected Folder:
|
||||||
LogicalImagerPanel.messageTextArea.text=
|
|
||||||
LogicalImagerPanel.pathTextField.text=
|
|
||||||
LogicalImagerPanel.manualRadioButton.text=Manually Choose Folder
|
LogicalImagerPanel.manualRadioButton.text=Manually Choose Folder
|
||||||
LogicalImagerPanel.importRadioButton.toolTipText=
|
|
||||||
LogicalImagerPanel.importRadioButton.text=Import From External Drive
|
LogicalImagerPanel.importRadioButton.text=Import From External Drive
|
||||||
LogicalImagerPanel.browseButton.text=Browse
|
LogicalImagerPanel.browseButton.text=Browse
|
||||||
LogicalImagerPanel.refreshButton.text=Refresh
|
LogicalImagerPanel.refreshButton.text=Refresh
|
||||||
|
@ -19,7 +19,7 @@ AddLogicalImageTask.failedToCopyDirectory=Failed to copy directory {0} to {1}
|
|||||||
# {0} - imageFilePath
|
# {0} - imageFilePath
|
||||||
AddMultipleImageTask.adding=Adding: {0}
|
AddMultipleImageTask.adding=Adding: {0}
|
||||||
# {0} - file
|
# {0} - file
|
||||||
AddMultipleImageTask.addingFileAsLogicalFile=Adding: {0} as logical file
|
AddMultipleImageTask.addingFileAsLogicalFile=Adding: {0} as an unallocated space file.
|
||||||
# {0} - imageFilePath
|
# {0} - imageFilePath
|
||||||
# {1} - deviceId
|
# {1} - deviceId
|
||||||
# {2} - exceptionMessage
|
# {2} - exceptionMessage
|
||||||
@ -48,6 +48,7 @@ LogicalImagerDSProcessor.imageDirPathNotFound={0} not found.\nUSB drive has been
|
|||||||
LogicalImagerDSProcessor.noCurrentCase=No current case
|
LogicalImagerDSProcessor.noCurrentCase=No current case
|
||||||
LogicalImagerPanel.imageTable.columnModel.title0=Hostname
|
LogicalImagerPanel.imageTable.columnModel.title0=Hostname
|
||||||
LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date
|
LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date
|
||||||
|
LogicalImagerPanel.imageTable.columnModel.title2=Path
|
||||||
# {0} - sparseImageDirectory
|
# {0} - sparseImageDirectory
|
||||||
LogicalImagerPanel.messageLabel.directoryDoesNotContainSparseImage=Directory {0} does not contain any images
|
LogicalImagerPanel.messageLabel.directoryDoesNotContainSparseImage=Directory {0} does not contain any images
|
||||||
# {0} - invalidFormatDirectory
|
# {0} - invalidFormatDirectory
|
||||||
@ -60,10 +61,7 @@ LogicalImagerPanel.selectAcquisitionFromDriveLabel.text=Select acquisition from
|
|||||||
LogicalImagerPanel.selectFromDriveLabel.text=Select Acquisition From Drive
|
LogicalImagerPanel.selectFromDriveLabel.text=Select Acquisition From Drive
|
||||||
LogicalImagerPanel.selectDriveLabel.text=Select Drive
|
LogicalImagerPanel.selectDriveLabel.text=Select Drive
|
||||||
LogicalImagerPanel.selectFolderLabel.text=Selected Folder:
|
LogicalImagerPanel.selectFolderLabel.text=Selected Folder:
|
||||||
LogicalImagerPanel.messageTextArea.text=
|
|
||||||
LogicalImagerPanel.pathTextField.text=
|
|
||||||
LogicalImagerPanel.manualRadioButton.text=Manually Choose Folder
|
LogicalImagerPanel.manualRadioButton.text=Manually Choose Folder
|
||||||
LogicalImagerPanel.importRadioButton.toolTipText=
|
|
||||||
LogicalImagerPanel.importRadioButton.text=Import From External Drive
|
LogicalImagerPanel.importRadioButton.text=Import From External Drive
|
||||||
LogicalImagerPanel.browseButton.text=Browse
|
LogicalImagerPanel.browseButton.text=Browse
|
||||||
LogicalImagerPanel.refreshButton.text=Refresh
|
LogicalImagerPanel.refreshButton.text=Refresh
|
||||||
|
@ -18,6 +18,12 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.logicalimager.dsp;
|
package org.sleuthkit.autopsy.logicalimager.dsp;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class for displaying a list of drives
|
* Utility class for displaying a list of drives
|
||||||
*/
|
*/
|
||||||
@ -48,4 +54,33 @@ public final class DriveListUtils {
|
|||||||
private DriveListUtils() {
|
private DriveListUtils() {
|
||||||
//empty private constructor for util class
|
//empty private constructor for util class
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Use the command <code>net</code> to determine what this drive is.
|
||||||
|
* <code>net use</code> will return an error for anything which isn't a share.
|
||||||
|
*/
|
||||||
|
public static boolean isNetworkDrive(String driveLetter) {
|
||||||
|
List<String> cmd = Arrays.asList("cmd", "/c", "net", "use", driveLetter + ":");
|
||||||
|
|
||||||
|
try {
|
||||||
|
Process p = new ProcessBuilder(cmd)
|
||||||
|
.redirectErrorStream(true)
|
||||||
|
.start();
|
||||||
|
|
||||||
|
p.getOutputStream().close();
|
||||||
|
|
||||||
|
StringBuilder consoleOutput = new StringBuilder();
|
||||||
|
|
||||||
|
String line;
|
||||||
|
try (BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
|
||||||
|
while ((line = in.readLine()) != null) {
|
||||||
|
consoleOutput.append(line).append("\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int rc = p.waitFor();
|
||||||
|
return rc == 0;
|
||||||
|
} catch(IOException | InterruptedException e) {
|
||||||
|
return false; // assume not a network drive
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,7 @@
|
|||||||
<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="0" attributes="0">
|
||||||
<Component id="imageScrollPane" pref="0" max="32767" attributes="0"/>
|
<Component id="imageScrollPane" pref="0" max="32767" attributes="0"/>
|
||||||
<Component id="driveListScrollPane" pref="106" max="32767" attributes="0"/>
|
<Component id="driveListScrollPane" pref="23" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="refreshButton" min="-2" max="-2" attributes="0"/>
|
<Component id="refreshButton" min="-2" max="-2" attributes="0"/>
|
||||||
@ -133,9 +133,7 @@
|
|||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/dsp/Bundle.properties" key="LogicalImagerPanel.importRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/dsp/Bundle.properties" key="LogicalImagerPanel.importRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
<Property name="toolTipText" type="java.lang.String" value=""/>
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/dsp/Bundle.properties" key="LogicalImagerPanel.importRadioButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="importRadioButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="importRadioButtonActionPerformed"/>
|
||||||
@ -156,9 +154,6 @@
|
|||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="pathTextField">
|
<Component class="javax.swing.JTextField" name="pathTextField">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/dsp/Bundle.properties" key="LogicalImagerPanel.pathTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="disabledTextColor" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
<Property name="disabledTextColor" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||||
<Color blue="0" green="0" id="black" palette="1" red="0" type="palette"/>
|
<Color blue="0" green="0" id="black" palette="1" red="0" type="palette"/>
|
||||||
</Property>
|
</Property>
|
||||||
@ -231,6 +226,7 @@
|
|||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Component class="javax.swing.JTable" name="imageTable">
|
<Component class="javax.swing.JTable" name="imageTable">
|
||||||
<Properties>
|
<Properties>
|
||||||
|
<Property name="autoCreateRowSorter" type="boolean" value="true"/>
|
||||||
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
||||||
<Table columnCount="0" rowCount="0"/>
|
<Table columnCount="0" rowCount="0"/>
|
||||||
</Property>
|
</Property>
|
||||||
@ -246,7 +242,6 @@
|
|||||||
<Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
|
<Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
|
||||||
<TableHeader reorderingAllowed="false" resizingAllowed="true"/>
|
<TableHeader reorderingAllowed="false" resizingAllowed="true"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="updateSelectionOnSort" type="boolean" value="false"/>
|
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="imageTableMouseReleased"/>
|
<EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="imageTableMouseReleased"/>
|
||||||
@ -280,9 +275,6 @@
|
|||||||
</Property>
|
</Property>
|
||||||
<Property name="lineWrap" type="boolean" value="true"/>
|
<Property name="lineWrap" type="boolean" value="true"/>
|
||||||
<Property name="rows" type="int" value="3"/>
|
<Property name="rows" type="int" value="3"/>
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/logicalimager/dsp/Bundle.properties" key="LogicalImagerPanel.messageTextArea.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">
|
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||||
<Border info="null"/>
|
<Border info="null"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
@ -39,8 +39,8 @@ import javax.swing.ListSelectionModel;
|
|||||||
import javax.swing.event.DocumentEvent;
|
import javax.swing.event.DocumentEvent;
|
||||||
import javax.swing.event.DocumentListener;
|
import javax.swing.event.DocumentListener;
|
||||||
import javax.swing.filechooser.FileSystemView;
|
import javax.swing.filechooser.FileSystemView;
|
||||||
import javax.swing.table.AbstractTableModel;
|
import javax.swing.table.DefaultTableModel;
|
||||||
import javax.swing.table.TableModel;
|
import javax.swing.table.TableColumn;
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor;
|
import org.sleuthkit.autopsy.corecomponentinterfaces.DataSourceProcessor;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
@ -60,12 +60,14 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
private static final String NO_IMAGE_SELECTED = Bundle.LogicalImagerPanel_messageLabel_noImageSelected();
|
private static final String NO_IMAGE_SELECTED = Bundle.LogicalImagerPanel_messageLabel_noImageSelected();
|
||||||
private static final String DRIVE_HAS_NO_IMAGES = Bundle.LogicalImagerPanel_messageLabel_driveHasNoImages();
|
private static final String DRIVE_HAS_NO_IMAGES = Bundle.LogicalImagerPanel_messageLabel_driveHasNoImages();
|
||||||
|
private static final int COLUMN_TO_SORT_ON_INDEX = 1;
|
||||||
|
private static final int NUMBER_OF_VISIBLE_COLUMNS = 2;
|
||||||
private static final String[] EMPTY_LIST_DATA = {};
|
private static final String[] EMPTY_LIST_DATA = {};
|
||||||
|
|
||||||
private final JFileChooser fileChooser = new JFileChooser();
|
private final JFileChooser fileChooser = new JFileChooser();
|
||||||
private final Pattern regex = Pattern.compile("Logical_Imager_(.+)_(\\d{4})(\\d{2})(\\d{2})_(\\d{2})_(\\d{2})_(\\d{2})");
|
private final Pattern regex = Pattern.compile("Logical_Imager_(.+)_(\\d{4})(\\d{2})(\\d{2})_(\\d{2})_(\\d{2})_(\\d{2})");
|
||||||
private Path choosenImageDirPath;
|
private Path manualImageDirPath;
|
||||||
private TableModel imageTableModel;
|
private DefaultTableModel imageTableModel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates new form LogicalImagerPanel
|
* Creates new form LogicalImagerPanel
|
||||||
@ -75,10 +77,28 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
*/
|
*/
|
||||||
private LogicalImagerPanel(String context) {
|
private LogicalImagerPanel(String context) {
|
||||||
initComponents();
|
initComponents();
|
||||||
|
configureImageTable();
|
||||||
jScrollPane1.setBorder(null);
|
jScrollPane1.setBorder(null);
|
||||||
clearImageTable();
|
clearImageTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform the Image Table configuration necessary when a new table model is
|
||||||
|
* set.
|
||||||
|
*/
|
||||||
|
private void configureImageTable() {
|
||||||
|
//hide path column while leaving it in model
|
||||||
|
if (imageTable.getColumnCount() > NUMBER_OF_VISIBLE_COLUMNS) {
|
||||||
|
TableColumn columnToHide = imageTable.getColumn(imageTableModel.getColumnName(NUMBER_OF_VISIBLE_COLUMNS));
|
||||||
|
if (columnToHide != null) {
|
||||||
|
imageTable.removeColumn(columnToHide);
|
||||||
|
}
|
||||||
|
//sort on specified column in decending order, the first call will toggle to ascending order, the second to descending order
|
||||||
|
imageTable.getRowSorter().toggleSortOrder(COLUMN_TO_SORT_ON_INDEX);
|
||||||
|
imageTable.getRowSorter().toggleSortOrder(COLUMN_TO_SORT_ON_INDEX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates and returns an instance of a LogicalImagerPanel.
|
* Creates and returns an instance of a LogicalImagerPanel.
|
||||||
*
|
*
|
||||||
@ -133,7 +153,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
buttonGroup1.add(importRadioButton);
|
buttonGroup1.add(importRadioButton);
|
||||||
importRadioButton.setSelected(true);
|
importRadioButton.setSelected(true);
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(importRadioButton, org.openide.util.NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.importRadioButton.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(importRadioButton, org.openide.util.NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.importRadioButton.text")); // NOI18N
|
||||||
importRadioButton.setToolTipText(org.openide.util.NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.importRadioButton.toolTipText")); // NOI18N
|
importRadioButton.setToolTipText("");
|
||||||
importRadioButton.addActionListener(new java.awt.event.ActionListener() {
|
importRadioButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
importRadioButtonActionPerformed(evt);
|
importRadioButtonActionPerformed(evt);
|
||||||
@ -148,7 +168,6 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
pathTextField.setText(org.openide.util.NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.pathTextField.text")); // NOI18N
|
|
||||||
pathTextField.setDisabledTextColor(java.awt.Color.black);
|
pathTextField.setDisabledTextColor(java.awt.Color.black);
|
||||||
pathTextField.setEnabled(false);
|
pathTextField.setEnabled(false);
|
||||||
|
|
||||||
@ -180,6 +199,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
|
|
||||||
imageScrollPane.setPreferredSize(new java.awt.Dimension(346, 402));
|
imageScrollPane.setPreferredSize(new java.awt.Dimension(346, 402));
|
||||||
|
|
||||||
|
imageTable.setAutoCreateRowSorter(true);
|
||||||
imageTable.setModel(new javax.swing.table.DefaultTableModel(
|
imageTable.setModel(new javax.swing.table.DefaultTableModel(
|
||||||
new Object [][] {
|
new Object [][] {
|
||||||
|
|
||||||
@ -193,7 +213,6 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
imageTable.setShowHorizontalLines(false);
|
imageTable.setShowHorizontalLines(false);
|
||||||
imageTable.setShowVerticalLines(false);
|
imageTable.setShowVerticalLines(false);
|
||||||
imageTable.getTableHeader().setReorderingAllowed(false);
|
imageTable.getTableHeader().setReorderingAllowed(false);
|
||||||
imageTable.setUpdateSelectionOnSort(false);
|
|
||||||
imageTable.addMouseListener(new java.awt.event.MouseAdapter() {
|
imageTable.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
public void mouseReleased(java.awt.event.MouseEvent evt) {
|
public void mouseReleased(java.awt.event.MouseEvent evt) {
|
||||||
imageTableMouseReleased(evt);
|
imageTableMouseReleased(evt);
|
||||||
@ -214,7 +233,6 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
messageTextArea.setForeground(java.awt.Color.red);
|
messageTextArea.setForeground(java.awt.Color.red);
|
||||||
messageTextArea.setLineWrap(true);
|
messageTextArea.setLineWrap(true);
|
||||||
messageTextArea.setRows(3);
|
messageTextArea.setRows(3);
|
||||||
messageTextArea.setText(org.openide.util.NbBundle.getMessage(LogicalImagerPanel.class, "LogicalImagerPanel.messageTextArea.text")); // NOI18N
|
|
||||||
messageTextArea.setBorder(null);
|
messageTextArea.setBorder(null);
|
||||||
messageTextArea.setDisabledTextColor(java.awt.Color.red);
|
messageTextArea.setDisabledTextColor(java.awt.Color.red);
|
||||||
messageTextArea.setEnabled(false);
|
messageTextArea.setEnabled(false);
|
||||||
@ -272,7 +290,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(imageScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
.addComponent(imageScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
||||||
.addComponent(driveListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 106, Short.MAX_VALUE))
|
.addComponent(driveListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 23, Short.MAX_VALUE))
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
.addComponent(refreshButton)
|
.addComponent(refreshButton)
|
||||||
.addGap(18, 18, 18)
|
.addGap(18, 18, 18)
|
||||||
@ -299,7 +317,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
})
|
})
|
||||||
private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed
|
private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed
|
||||||
imageTable.clearSelection();
|
imageTable.clearSelection();
|
||||||
choosenImageDirPath = null;
|
manualImageDirPath = null;
|
||||||
setErrorMessage(NO_IMAGE_SELECTED);
|
setErrorMessage(NO_IMAGE_SELECTED);
|
||||||
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
|
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
|
||||||
int retval = fileChooser.showOpenDialog(this);
|
int retval = fileChooser.showOpenDialog(this);
|
||||||
@ -319,7 +337,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), true, false);
|
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), true, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
choosenImageDirPath = Paths.get(path);
|
manualImageDirPath = Paths.get(path);
|
||||||
setNormalMessage(path);
|
setNormalMessage(path);
|
||||||
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
|
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
|
||||||
} else {
|
} else {
|
||||||
@ -334,11 +352,9 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
private void imageTableSelect() {
|
private void imageTableSelect() {
|
||||||
int index = imageTable.getSelectedRow();
|
int index = imageTable.getSelectedRow();
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
choosenImageDirPath = Paths.get((String) imageTableModel.getValueAt(index, 2));
|
setNormalMessage((String) imageTableModel.getValueAt(imageTable.convertRowIndexToModel(index), 2));
|
||||||
setNormalMessage(choosenImageDirPath.toString());
|
|
||||||
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
|
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), false, true);
|
||||||
} else {
|
} else {
|
||||||
choosenImageDirPath = null;
|
|
||||||
setErrorMessage(NO_IMAGE_SELECTED);
|
setErrorMessage(NO_IMAGE_SELECTED);
|
||||||
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), true, false);
|
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), true, false);
|
||||||
}
|
}
|
||||||
@ -365,7 +381,6 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
|
|
||||||
if (fList != null) {
|
if (fList != null) {
|
||||||
imageTableModel = new ImageTableModel();
|
imageTableModel = new ImageTableModel();
|
||||||
int row = 0;
|
|
||||||
// Find all directories with name like Logical_Imager_HOSTNAME_yyyymmdd_HH_MM_SS
|
// Find all directories with name like Logical_Imager_HOSTNAME_yyyymmdd_HH_MM_SS
|
||||||
// and has vhd files in it
|
// and has vhd files in it
|
||||||
for (File file : fList) {
|
for (File file : fList) {
|
||||||
@ -383,10 +398,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
String second = m.group(7);
|
String second = m.group(7);
|
||||||
String extractDate = year + "/" + month + "/" + day
|
String extractDate = year + "/" + month + "/" + day
|
||||||
+ " " + hour + ":" + minute + ":" + second;
|
+ " " + hour + ":" + minute + ":" + second;
|
||||||
imageTableModel.setValueAt(hostname, row, 0);
|
imageTableModel.addRow(new Object[]{hostname, extractDate, imageDirPath});
|
||||||
imageTableModel.setValueAt(extractDate, row, 1);
|
|
||||||
imageTableModel.setValueAt(imageDirPath, row, 2);
|
|
||||||
row++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -394,18 +406,17 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
+ " " + driveLetter);
|
+ " " + driveLetter);
|
||||||
imageTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
|
imageTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
|
||||||
imageTable.setModel(imageTableModel);
|
imageTable.setModel(imageTableModel);
|
||||||
|
configureImageTable();
|
||||||
fixImageTableColumnWidth();
|
fixImageTableColumnWidth();
|
||||||
// If there are any images, select the first one
|
// If there are any images, select the first one
|
||||||
if (imageTable.getRowCount() > 0) {
|
if (imageTable.getRowCount() > 0) {
|
||||||
imageTable.setRowSelectionInterval(0, 0);
|
imageTable.setRowSelectionInterval(0, 0);
|
||||||
imageTableSelect();
|
imageTableSelect();
|
||||||
} else {
|
} else {
|
||||||
choosenImageDirPath = null;
|
|
||||||
setErrorMessage(DRIVE_HAS_NO_IMAGES);
|
setErrorMessage(DRIVE_HAS_NO_IMAGES);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
clearImageTable();
|
clearImageTable();
|
||||||
choosenImageDirPath = null;
|
|
||||||
setErrorMessage(DRIVE_HAS_NO_IMAGES);
|
setErrorMessage(DRIVE_HAS_NO_IMAGES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -430,6 +441,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
private void clearImageTable() {
|
private void clearImageTable() {
|
||||||
imageTableModel = new ImageTableModel();
|
imageTableModel = new ImageTableModel();
|
||||||
imageTable.setModel(imageTableModel);
|
imageTable.setModel(imageTableModel);
|
||||||
|
configureImageTable();
|
||||||
fixImageTableColumnWidth();
|
fixImageTableColumnWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -448,7 +460,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
|
|
||||||
refreshButton.setEnabled(false);
|
refreshButton.setEnabled(false);
|
||||||
|
|
||||||
choosenImageDirPath = null;
|
manualImageDirPath = null;
|
||||||
setNormalMessage("");
|
setNormalMessage("");
|
||||||
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), true, false);
|
firePropertyChange(DataSourceProcessor.DSP_PANEL_EVENT.UPDATE_UI.toString(), true, false);
|
||||||
}//GEN-LAST:event_manualRadioButtonActionPerformed
|
}//GEN-LAST:event_manualRadioButtonActionPerformed
|
||||||
@ -463,7 +475,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
|
|
||||||
refreshButton.setEnabled(true);
|
refreshButton.setEnabled(true);
|
||||||
|
|
||||||
choosenImageDirPath = null;
|
manualImageDirPath = null;
|
||||||
setNormalMessage("");
|
setNormalMessage("");
|
||||||
refreshButton.doClick();
|
refreshButton.doClick();
|
||||||
}//GEN-LAST:event_importRadioButtonActionPerformed
|
}//GEN-LAST:event_importRadioButtonActionPerformed
|
||||||
@ -481,6 +493,9 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
int firstRemovableDrive = -1;
|
int firstRemovableDrive = -1;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (File root : roots) {
|
for (File root : roots) {
|
||||||
|
if (DriveListUtils.isNetworkDrive(root.toString().replace(":\\", ""))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
String description = FileSystemView.getFileSystemView().getSystemTypeDescription(root);
|
String description = FileSystemView.getFileSystemView().getSystemTypeDescription(root);
|
||||||
long spaceInBytes = root.getTotalSpace();
|
long spaceInBytes = root.getTotalSpace();
|
||||||
String sizeWithUnit = DriveListUtils.humanReadableByteCount(spaceInBytes, false);
|
String sizeWithUnit = DriveListUtils.humanReadableByteCount(spaceInBytes, false);
|
||||||
@ -558,7 +573,7 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
//reset the UI elements to default
|
//reset the UI elements to default
|
||||||
choosenImageDirPath = null;
|
manualImageDirPath = null;
|
||||||
setNormalMessage("");
|
setNormalMessage("");
|
||||||
driveList.setListData(EMPTY_LIST_DATA);
|
driveList.setListData(EMPTY_LIST_DATA);
|
||||||
clearImageTable();
|
clearImageTable();
|
||||||
@ -573,11 +588,24 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
* @return true if a proper image has been selected, false otherwise
|
* @return true if a proper image has been selected, false otherwise
|
||||||
*/
|
*/
|
||||||
boolean validatePanel() {
|
boolean validatePanel() {
|
||||||
return choosenImageDirPath != null && choosenImageDirPath.toFile().exists();
|
if (manualRadioButton.isSelected()) {
|
||||||
|
return manualImageDirPath != null && manualImageDirPath.toFile().exists();
|
||||||
|
} else if (imageTable.getSelectedRow() != -1) {
|
||||||
|
Path path = Paths.get((String) imageTableModel.getValueAt(imageTable.convertRowIndexToModel(imageTable.getSelectedRow()), 2));
|
||||||
|
return path != null && path.toFile().exists();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Path getImageDirPath() {
|
Path getImageDirPath() {
|
||||||
return choosenImageDirPath;
|
if (manualRadioButton.isSelected()) {
|
||||||
|
return manualImageDirPath;
|
||||||
|
} else if (imageTable.getSelectedRow() != -1) {
|
||||||
|
return Paths.get((String) imageTableModel.getValueAt(imageTable.convertRowIndexToModel(imageTable.getSelectedRow()), 2));
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -598,25 +626,19 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
/**
|
/**
|
||||||
* Image Table Model
|
* Image Table Model
|
||||||
*/
|
*/
|
||||||
private class ImageTableModel extends AbstractTableModel {
|
private class ImageTableModel extends DefaultTableModel {
|
||||||
|
|
||||||
private final List<String> hostnames = new ArrayList<>();
|
private static final long serialVersionUID = 1L;
|
||||||
private final List<String> extractDates = new ArrayList<>();
|
|
||||||
private final List<String> imageDirPaths = new ArrayList<>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getRowCount() {
|
|
||||||
return hostnames.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getColumnCount() {
|
public int getColumnCount() {
|
||||||
return 2;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Messages({
|
@Messages({
|
||||||
"LogicalImagerPanel.imageTable.columnModel.title0=Hostname",
|
"LogicalImagerPanel.imageTable.columnModel.title0=Hostname",
|
||||||
"LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date"
|
"LogicalImagerPanel.imageTable.columnModel.title1=Extracted Date",
|
||||||
|
"LogicalImagerPanel.imageTable.columnModel.title2=Path"
|
||||||
})
|
})
|
||||||
@Override
|
@Override
|
||||||
public String getColumnName(int column) {
|
public String getColumnName(int column) {
|
||||||
@ -628,55 +650,18 @@ final class LogicalImagerPanel extends JPanel implements DocumentListener {
|
|||||||
case 1:
|
case 1:
|
||||||
colName = Bundle.LogicalImagerPanel_imageTable_columnModel_title1();
|
colName = Bundle.LogicalImagerPanel_imageTable_columnModel_title1();
|
||||||
break;
|
break;
|
||||||
|
case 2:
|
||||||
|
colName = Bundle.LogicalImagerPanel_imageTable_columnModel_title2();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return colName;
|
return colName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
|
||||||
Object ret = null;
|
|
||||||
switch (columnIndex) {
|
|
||||||
case 0:
|
|
||||||
ret = hostnames.get(rowIndex);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
ret = extractDates.get(rowIndex);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
ret = imageDirPaths.get(rowIndex);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new UnsupportedOperationException("Invalid table column index: " + columnIndex); //NON-NLS
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
|
|
||||||
switch (columnIndex) {
|
|
||||||
case 0:
|
|
||||||
hostnames.add((String) aValue);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
extractDates.add((String) aValue);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
imageDirPaths.add((String) aValue);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new UnsupportedOperationException("Invalid table column index: " + columnIndex); //NON-NLS
|
|
||||||
}
|
|
||||||
// Only show the hostname and extractDates column
|
|
||||||
if (columnIndex < 2) {
|
|
||||||
super.setValueAt(aValue, rowIndex, columnIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
|
<Properties>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[300, 155]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
<AuxValues>
|
<AuxValues>
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
@ -24,7 +29,7 @@
|
|||||||
<Component id="computeHashesCheckbox" min="-2" max="-2" attributes="0"/>
|
<Component id="computeHashesCheckbox" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace pref="47" max="32767" attributes="0"/>
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
|
@ -64,6 +64,8 @@ final class DataSourceIntegrityIngestSettingsPanel extends IngestModuleIngestJob
|
|||||||
jLabel3 = new javax.swing.JLabel();
|
jLabel3 = new javax.swing.JLabel();
|
||||||
jLabel1 = new javax.swing.JLabel();
|
jLabel1 = new javax.swing.JLabel();
|
||||||
|
|
||||||
|
setPreferredSize(new java.awt.Dimension(300, 155));
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(computeHashesCheckbox, org.openide.util.NbBundle.getMessage(DataSourceIntegrityIngestSettingsPanel.class, "DataSourceIntegrityIngestSettingsPanel.computeHashesCheckbox.text")); // NOI18N
|
org.openide.awt.Mnemonics.setLocalizedText(computeHashesCheckbox, org.openide.util.NbBundle.getMessage(DataSourceIntegrityIngestSettingsPanel.class, "DataSourceIntegrityIngestSettingsPanel.computeHashesCheckbox.text")); // NOI18N
|
||||||
computeHashesCheckbox.addActionListener(new java.awt.event.ActionListener() {
|
computeHashesCheckbox.addActionListener(new java.awt.event.ActionListener() {
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
@ -89,7 +91,7 @@ final class DataSourceIntegrityIngestSettingsPanel extends IngestModuleIngestJob
|
|||||||
.addComponent(verifyHashesCheckbox)
|
.addComponent(verifyHashesCheckbox)
|
||||||
.addComponent(computeHashesCheckbox)
|
.addComponent(computeHashesCheckbox)
|
||||||
.addComponent(jLabel3))
|
.addComponent(jLabel3))
|
||||||
.addContainerGap(47, Short.MAX_VALUE))
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
@ -185,7 +185,11 @@ class SevenZipExtractor {
|
|||||||
//As a result, many corrupted files have wonky compression ratios and could flood the UI
|
//As a result, many corrupted files have wonky compression ratios and could flood the UI
|
||||||
//with false zip bomb notifications. The decision was made to skip compression ratio checks
|
//with false zip bomb notifications. The decision was made to skip compression ratio checks
|
||||||
//for unallocated zip files. Instead, we let the depth be an indicator of a zip bomb.
|
//for unallocated zip files. Instead, we let the depth be an indicator of a zip bomb.
|
||||||
if (archiveFile.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.UNALLOC)) {
|
//Gzip archives compress a single file. They may have a sparse file,
|
||||||
|
//and that file could be much larger, however it won't be the exponential growth seen with more dangerous zip bombs.
|
||||||
|
//In addition a fair number of browser cache files will be gzip archives,
|
||||||
|
//and their file sizes are frequently retrieved incorrectly so ignoring gzip files is a reasonable decision.
|
||||||
|
if (archiveFile.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.UNALLOC) || archiveFile.getMIMEType().equalsIgnoreCase(SupportedArchiveExtractionFormats.XGZIP.toString())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -983,6 +983,9 @@ class PortableCaseReportModule implements ReportModule {
|
|||||||
enum ChunkSize {
|
enum ChunkSize {
|
||||||
|
|
||||||
NONE("Do not split", ""), // NON-NLS
|
NONE("Do not split", ""), // NON-NLS
|
||||||
|
ONE_HUNDRED_MB("Split into 100 MB chunks", "100m"),
|
||||||
|
CD("Split into 700 MB chunks (CD)", "700m"),
|
||||||
|
ONE_GB("Split into 1 GB chunks", "1000m"),
|
||||||
DVD("Split into 4.5 GB chunks (DVD)", "4500m"); // NON-NLS
|
DVD("Split into 4.5 GB chunks (DVD)", "4500m"); // NON-NLS
|
||||||
|
|
||||||
private final String displayName;
|
private final String displayName;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013-2018 Basis Technology Corp.
|
* Copyright 2013-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -56,7 +56,8 @@ class ReportGenerator {
|
|||||||
private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
|
private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Progress reportGenerationPanel that can be used to check for cancellation.
|
* Progress reportGenerationPanel that can be used to check for
|
||||||
|
* cancellation.
|
||||||
*/
|
*/
|
||||||
private ReportProgressPanel progressPanel;
|
private ReportProgressPanel progressPanel;
|
||||||
|
|
||||||
@ -89,7 +90,6 @@ class ReportGenerator {
|
|||||||
this.errorList = new ArrayList<>();
|
this.errorList = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display the progress panels to the user, and add actions to close the
|
* Display the progress panels to the user, and add actions to close the
|
||||||
* parent dialog.
|
* parent dialog.
|
||||||
@ -138,9 +138,9 @@ class ReportGenerator {
|
|||||||
* Run the TableReportModules using a SwingWorker.
|
* Run the TableReportModules using a SwingWorker.
|
||||||
*
|
*
|
||||||
* @param artifactTypeSelections the enabled/disabled state of the artifact
|
* @param artifactTypeSelections the enabled/disabled state of the artifact
|
||||||
* types to be included in the report
|
* types to be included in the report
|
||||||
* @param tagSelections the enabled/disabled state of the tag names
|
* @param tagSelections the enabled/disabled state of the tag names to be
|
||||||
* to be included in the report
|
* included in the report
|
||||||
*/
|
*/
|
||||||
void generateTableReport(TableReportModule tableReport, Map<BlackboardArtifact.Type, Boolean> artifactTypeSelections, Map<String, Boolean> tagNameSelections) throws IOException {
|
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) {
|
||||||
@ -164,7 +164,7 @@ class ReportGenerator {
|
|||||||
* Run the FileReportModules using a SwingWorker.
|
* Run the FileReportModules using a SwingWorker.
|
||||||
*
|
*
|
||||||
* @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) throws IOException {
|
void generateFileListReport(FileReportModule fileReportModule, Map<FileReportDataTypes, Boolean> enabledInfo) throws IOException {
|
||||||
if (fileReportModule != null && null != enabledInfo) {
|
if (fileReportModule != null && null != enabledInfo) {
|
||||||
@ -219,7 +219,7 @@ class ReportGenerator {
|
|||||||
displayProgressPanel();
|
displayProgressPanel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run the Portable Case Report Module
|
* Run the Portable Case Report Module
|
||||||
*/
|
*/
|
||||||
@ -258,10 +258,12 @@ class ReportGenerator {
|
|||||||
|
|
||||||
private void setupProgressPanel(ReportModule module, String reportDir) {
|
private void setupProgressPanel(ReportModule module, String reportDir) {
|
||||||
String reportFilePath = module.getRelativeFilePath();
|
String reportFilePath = module.getRelativeFilePath();
|
||||||
if (!reportFilePath.isEmpty()) {
|
if (reportFilePath == null) {
|
||||||
this.progressPanel = reportGenerationPanel.addReport(module.getName(), reportDir + reportFilePath);
|
|
||||||
} else {
|
|
||||||
this.progressPanel = reportGenerationPanel.addReport(module.getName(), null);
|
this.progressPanel = reportGenerationPanel.addReport(module.getName(), null);
|
||||||
|
} else if (reportFilePath.isEmpty()) {
|
||||||
|
this.progressPanel = reportGenerationPanel.addReport(module.getName(), reportDir);
|
||||||
|
} else {
|
||||||
|
this.progressPanel = reportGenerationPanel.addReport(module.getName(), reportDir + reportFilePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,9 +285,9 @@ class ReportGenerator {
|
|||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
throw new IOException("Failed to make report folder, unable to generate reports.", ex);
|
throw new IOException("Failed to make report folder, unable to generate reports.", ex);
|
||||||
}
|
}
|
||||||
return reportPath;
|
return reportPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ReportWorker extends SwingWorker<Void, Void> {
|
private class ReportWorker extends SwingWorker<Void, Void> {
|
||||||
|
|
||||||
private final Runnable doInBackground;
|
private final Runnable doInBackground;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2012-2018 Basis Technology Corp.
|
* Copyright 2012-2019 Basis Technology Corp.
|
||||||
*
|
*
|
||||||
* Copyright 2012 42six Solutions.
|
* Copyright 2012 42six Solutions.
|
||||||
* Contact: aebadirad <at> 42six <dot> com
|
* Contact: aebadirad <at> 42six <dot> com
|
||||||
@ -45,8 +45,9 @@ interface ReportModule {
|
|||||||
* module. The path should be relative to the location that gets passed in
|
* module. The path should be relative to the location that gets passed in
|
||||||
* to generateReport() (or similar).
|
* to generateReport() (or similar).
|
||||||
*
|
*
|
||||||
* @return Relative path to where report will be stored. May be null if the
|
* @return Relative path to where report will be stored. Return an empty
|
||||||
* module does not produce a report file.
|
* string if the location passed to generateReport() is the output location.
|
||||||
|
* Return null to indicate that there is no report file.
|
||||||
*/
|
*/
|
||||||
public String getRelativeFilePath();
|
public String getRelativeFilePath();
|
||||||
|
|
||||||
@ -55,7 +56,7 @@ interface ReportModule {
|
|||||||
* report configuration step of the report wizard.
|
* report configuration step of the report wizard.
|
||||||
*
|
*
|
||||||
* @return Configuration panel or null if the module does not need
|
* @return Configuration panel or null if the module does not need
|
||||||
* configuration.
|
* configuration.
|
||||||
*/
|
*/
|
||||||
public default JPanel getConfigurationPanel() {
|
public default JPanel getConfigurationPanel() {
|
||||||
return new DefaultReportConfigurationPanel();
|
return new DefaultReportConfigurationPanel();
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2012-2018 Basis Technology Corp.
|
* Copyright 2012-2019 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -147,8 +147,7 @@ final class ReportVisualPanel1 extends JPanel implements ListSelectionListener {
|
|||||||
|
|
||||||
// Make sure that the report module has a valid non-null name.
|
// Make sure that the report module has a valid non-null name.
|
||||||
private boolean moduleIsValid(ReportModule module) {
|
private boolean moduleIsValid(ReportModule module) {
|
||||||
return module.getName() != null && !module.getName().isEmpty()
|
return module.getName() != null && !module.getName().isEmpty();
|
||||||
&& module.getRelativeFilePath() != null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void popupWarning(ReportModule module) {
|
private void popupWarning(ReportModule module) {
|
||||||
|
@ -65,7 +65,7 @@ public class AddTaggedHashesToHashDb implements GeneralReportModule {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getRelativeFilePath() {
|
public String getRelativeFilePath() {
|
||||||
return "";
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Messages({
|
@Messages({
|
||||||
|
@ -73,8 +73,7 @@ public class TextExtractorFactory {
|
|||||||
|
|
||||||
throw new NoTextExtractorFound(
|
throw new NoTextExtractorFound(
|
||||||
String.format("Could not find a suitable reader for "
|
String.format("Could not find a suitable reader for "
|
||||||
+ "content with name [%s] and id=[%d]. Try using "
|
+ "content with name [%s] and id=[%d].",
|
||||||
+ "the strings extractor instead.",
|
|
||||||
content.getName(), content.getId())
|
content.getName(), content.getId())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ import com.squareup.okhttp.RequestBody;
|
|||||||
import com.squareup.okhttp.Response;
|
import com.squareup.okhttp.Response;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import javax.swing.event.DocumentEvent;
|
import javax.swing.event.DocumentEvent;
|
||||||
import javax.swing.event.DocumentListener;
|
import javax.swing.event.DocumentListener;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
@ -31,7 +31,7 @@ import java.io.InputStream;
|
|||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.openide.util.NbBundle.Messages;
|
import org.openide.util.NbBundle.Messages;
|
||||||
import org.openide.util.lookup.ServiceProvider;
|
import org.openide.util.lookup.ServiceProvider;
|
||||||
|
@ -33,7 +33,7 @@ import java.io.InputStream;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import javax.swing.JFileChooser;
|
import javax.swing.JFileChooser;
|
||||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
@ -53,7 +53,7 @@ import org.sleuthkit.autopsy.texttranslation.TranslationException;
|
|||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
import org.sleuthkit.autopsy.coreutils.PlatformUtil;
|
||||||
import org.sleuthkit.autopsy.texttranslation.ui.TranslationContentPanel.DisplayDropdownOptions;
|
import org.sleuthkit.autopsy.texttranslation.ui.TranslationContentPanel.DisplayDropdownOptions;
|
||||||
|
|
||||||
|
@ -22,57 +22,73 @@ import java.util.logging.Level;
|
|||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import org.opencv.core.Core;
|
import org.opencv.core.Core;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A utility class that loads the core OpenCV library and allows clients to
|
||||||
|
* verify that the library was loaded.
|
||||||
|
*/
|
||||||
public final class OpenCvLoader {
|
public final class OpenCvLoader {
|
||||||
|
|
||||||
private static final Logger LOGGER = Logger.getLogger(OpenCvLoader.class.getName());
|
private static final Logger logger = Logger.getLogger(OpenCvLoader.class.getName());
|
||||||
private static boolean openCvLoaded;
|
private static boolean openCvLoaded;
|
||||||
private static UnsatisfiedLinkError exception = null;
|
private static UnsatisfiedLinkError exception = null; // Deprecated
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
openCvLoaded = false;
|
||||||
try {
|
try {
|
||||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
|
||||||
openCvLoaded = true;
|
openCvLoaded = true;
|
||||||
} catch (UnsatisfiedLinkError ex) {
|
} catch (UnsatisfiedLinkError ex) {
|
||||||
LOGGER.log(Level.WARNING, "Unable to load OpenCV", ex);
|
logger.log(Level.WARNING, "Failed to load core OpenCV library", ex);
|
||||||
exception = ex; //save relevant error for throwing at appropriate time
|
/*
|
||||||
openCvLoaded = false;
|
* Save exception to rethrow later (deprecated).
|
||||||
} catch (SecurityException ex) {
|
*/
|
||||||
LOGGER.log(Level.WARNING, "Unable to load OpenCV", ex);
|
exception = ex;
|
||||||
openCvLoaded = false;
|
} catch (Exception ex) {
|
||||||
|
/*
|
||||||
|
* Exception firewall to ensure that runtime exceptions do not cause
|
||||||
|
* the loading of this class by the Java class loader to fail.
|
||||||
|
*/
|
||||||
|
logger.log(Level.WARNING, "Failed to load core OpenCV library", ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return whether or not the OpenCV library has been loaded.
|
* Indicates whether or not the core OpenCV library has been loaded.
|
||||||
*
|
*
|
||||||
* @return - true if the opencv library is loaded or false if it is not
|
* @return True or false.
|
||||||
* @throws UnsatisfiedLinkError - A COPY of the exception that prevented
|
*/
|
||||||
* OpenCV from loading. Note that the stack trace in the exception can be
|
public static boolean hasOpenCvLoaded() {
|
||||||
* confusing because it refers to a past invocation.
|
return openCvLoaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private constructor to prevent instantiation of this utility class.
|
||||||
|
*/
|
||||||
|
private OpenCvLoader() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether or not the core OpenCV library has been loaded.
|
||||||
|
*
|
||||||
|
* @return True or false.
|
||||||
|
*
|
||||||
|
* @throws UnsatisfiedLinkError if this error was thrown during the loading
|
||||||
|
* of the core OpenCV library during static
|
||||||
|
* initialization of this class.
|
||||||
*
|
*
|
||||||
* @deprecated Use hasOpenCvLoaded instead.
|
* @deprecated Use hasOpenCvLoaded instead.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static boolean isOpenCvLoaded() throws UnsatisfiedLinkError {
|
public static boolean isOpenCvLoaded() throws UnsatisfiedLinkError {
|
||||||
if (!openCvLoaded) {
|
if (!openCvLoaded) {
|
||||||
//exception should never be null if the open cv isn't loaded but just in case
|
|
||||||
if (exception != null) {
|
if (exception != null) {
|
||||||
throw exception;
|
throw exception;
|
||||||
} else {
|
} else {
|
||||||
throw new UnsatisfiedLinkError("OpenCV native library failed to load");
|
throw new UnsatisfiedLinkError("OpenCV native library failed to load");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return openCvLoaded;
|
return openCvLoaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Return whether OpenCV library has been loaded.
|
|
||||||
*
|
|
||||||
* @return true if OpenCV library was loaded, false if not.
|
|
||||||
*/
|
|
||||||
public static boolean hasOpenCvLoaded() {
|
|
||||||
return openCvLoaded;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -189,7 +189,7 @@ class GroupCellFactory {
|
|||||||
@Override
|
@Override
|
||||||
public String getGroupName() {
|
public String getGroupName() {
|
||||||
return Optional.ofNullable(getItem())
|
return Optional.ofNullable(getItem())
|
||||||
.map(treeNode -> StringUtils.defaultIfBlank(treeNode.getPath(), DrawableGroup.getBlankGroupName()))
|
.map(treeNode -> StringUtils.defaultIfBlank(treeNode.getDisplayName(), DrawableGroup.getBlankGroupName()))
|
||||||
.orElse("");
|
.orElse("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,6 +158,11 @@ final public class GroupTree extends NavPanel<TreeItem<GroupTreeNode>> {
|
|||||||
String path = g.getGroupByValueDislpayName();
|
String path = g.getGroupByValueDislpayName();
|
||||||
if (g.getGroupByAttribute() == DrawableAttribute.PATH) {
|
if (g.getGroupByAttribute() == DrawableAttribute.PATH) {
|
||||||
String[] cleanPathTokens = StringUtils.stripStart(path, "/").split("/");
|
String[] cleanPathTokens = StringUtils.stripStart(path, "/").split("/");
|
||||||
|
|
||||||
|
// Append obj id to the top level data source name to allow for duplicate data source names
|
||||||
|
if (g.getGroupKey().getDataSourceObjId() > 0) {
|
||||||
|
cleanPathTokens[0] = cleanPathTokens[0].concat(String.format("(Id: %d)", g.getGroupKey().getDataSourceObjId()));
|
||||||
|
}
|
||||||
return Arrays.asList(cleanPathTokens);
|
return Arrays.asList(cleanPathTokens);
|
||||||
} else {
|
} else {
|
||||||
String stripStart = StringUtils.strip(path, "/");
|
String stripStart = StringUtils.strip(path, "/");
|
||||||
|
@ -27,6 +27,7 @@ class GroupTreeNode {
|
|||||||
|
|
||||||
private final String path;
|
private final String path;
|
||||||
private DrawableGroup group;
|
private DrawableGroup group;
|
||||||
|
private final String dispName;
|
||||||
|
|
||||||
public String getPath() {
|
public String getPath() {
|
||||||
return path;
|
return path;
|
||||||
@ -36,9 +37,20 @@ class GroupTreeNode {
|
|||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupTreeNode(String path, DrawableGroup group) {
|
public String getDisplayName() {
|
||||||
|
return dispName;
|
||||||
|
}
|
||||||
|
|
||||||
|
GroupTreeNode(String path, DrawableGroup group) {
|
||||||
this.path = path;
|
this.path = path;
|
||||||
this.group = group;
|
this.group = group;
|
||||||
|
|
||||||
|
// If the path has a obj id, strip it for display purpose.
|
||||||
|
if (path.toLowerCase().contains(("(Id: ").toLowerCase())) {
|
||||||
|
dispName = path.substring(0, path.indexOf("(Id: "));
|
||||||
|
} else {
|
||||||
|
dispName = path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setGroup(DrawableGroup g) {
|
void setGroup(DrawableGroup g) {
|
||||||
|
@ -29,6 +29,7 @@ from java.sql import SQLException
|
|||||||
from java.sql import Statement
|
from java.sql import Statement
|
||||||
from java.util.logging import Level
|
from java.util.logging import Level
|
||||||
from java.util import ArrayList
|
from java.util import ArrayList
|
||||||
|
from java.util import UUID
|
||||||
from org.sleuthkit.autopsy.casemodule import Case
|
from org.sleuthkit.autopsy.casemodule import Case
|
||||||
from org.sleuthkit.autopsy.casemodule.services import Blackboard
|
from org.sleuthkit.autopsy.casemodule.services import Blackboard
|
||||||
from org.sleuthkit.autopsy.casemodule.services import FileManager
|
from org.sleuthkit.autopsy.casemodule.services import FileManager
|
||||||
@ -95,6 +96,7 @@ class TextMessageAnalyzer(general.AndroidComponentAnalyzer):
|
|||||||
ds = Case.getCurrentCase().getSleuthkitCase().getDataSource(datasourceObjId)
|
ds = Case.getCurrentCase().getSleuthkitCase().getDataSource(datasourceObjId)
|
||||||
deviceID = ds.getDeviceId()
|
deviceID = ds.getDeviceId()
|
||||||
deviceAccountInstance = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.DEVICE, deviceID, general.MODULE_NAME, abstractFile)
|
deviceAccountInstance = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.DEVICE, deviceID, general.MODULE_NAME, abstractFile)
|
||||||
|
uuid = UUID.randomUUID().toString()
|
||||||
|
|
||||||
resultSet = None
|
resultSet = None
|
||||||
try:
|
try:
|
||||||
@ -106,7 +108,7 @@ class TextMessageAnalyzer(general.AndroidComponentAnalyzer):
|
|||||||
read = resultSet.getInt("read") # may be unread = 0, read = 1
|
read = resultSet.getInt("read") # may be unread = 0, read = 1
|
||||||
subject = resultSet.getString("subject") # message subject
|
subject = resultSet.getString("subject") # message subject
|
||||||
body = resultSet.getString("body") # message body
|
body = resultSet.getString("body") # message body
|
||||||
thread_id = "{0}_{1}".format(abstractFile.getId(), resultSet.getInt("thread_id"))
|
thread_id = "{0}-{1}".format(uuid, resultSet.getInt("thread_id"))
|
||||||
attributes = ArrayList()
|
attributes = ArrayList()
|
||||||
artifact = abstractFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE); #create Message artifact and then add attributes from result set.
|
artifact = abstractFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE); #create Message artifact and then add attributes from result set.
|
||||||
if resultSet.getString("type") == "1":
|
if resultSet.getString("type") == "1":
|
||||||
|
@ -27,6 +27,7 @@ from java.sql import SQLException
|
|||||||
from java.sql import Statement
|
from java.sql import Statement
|
||||||
from java.util.logging import Level
|
from java.util.logging import Level
|
||||||
from java.util import ArrayList
|
from java.util import ArrayList
|
||||||
|
from java.util import UUID
|
||||||
from org.sleuthkit.autopsy.casemodule import Case
|
from org.sleuthkit.autopsy.casemodule import Case
|
||||||
from org.sleuthkit.autopsy.casemodule.services import Blackboard
|
from org.sleuthkit.autopsy.casemodule.services import Blackboard
|
||||||
from org.sleuthkit.autopsy.casemodule.services import FileManager
|
from org.sleuthkit.autopsy.casemodule.services import FileManager
|
||||||
@ -99,6 +100,7 @@ class WWFMessageAnalyzer(general.AndroidComponentAnalyzer):
|
|||||||
ds = Case.getCurrentCase().getSleuthkitCase().getDataSource(datasourceObjId)
|
ds = Case.getCurrentCase().getSleuthkitCase().getDataSource(datasourceObjId)
|
||||||
deviceID = ds.getDeviceId()
|
deviceID = ds.getDeviceId()
|
||||||
deviceAccountInstance = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.DEVICE, deviceID, general.MODULE_NAME, abstractFile)
|
deviceAccountInstance = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager().createAccountFileInstance(Account.Type.DEVICE, deviceID, general.MODULE_NAME, abstractFile)
|
||||||
|
uuid = UUID.randomUUID().toString()
|
||||||
|
|
||||||
resultSet = None
|
resultSet = None
|
||||||
try:
|
try:
|
||||||
@ -110,6 +112,7 @@ class WWFMessageAnalyzer(general.AndroidComponentAnalyzer):
|
|||||||
created_at = resultSet.getLong("datetime")
|
created_at = resultSet.getLong("datetime")
|
||||||
user_id = resultSet.getString("user_id") # the ID of the user who sent the message.
|
user_id = resultSet.getString("user_id") # the ID of the user who sent the message.
|
||||||
game_id = resultSet.getString("game_id") # ID of the game which the the message was sent.
|
game_id = resultSet.getString("game_id") # ID of the game which the the message was sent.
|
||||||
|
thread_id = "{0}-{1}".format(uuid, user_id)
|
||||||
|
|
||||||
attributes = ArrayList()
|
attributes = ArrayList()
|
||||||
artifact = abstractFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE) # create a call log and then add attributes from result set.
|
artifact = abstractFile.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE) # create a call log and then add attributes from result set.
|
||||||
@ -118,7 +121,7 @@ class WWFMessageAnalyzer(general.AndroidComponentAnalyzer):
|
|||||||
attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MSG_ID, general.MODULE_NAME, game_id))
|
attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MSG_ID, general.MODULE_NAME, game_id))
|
||||||
attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT, general.MODULE_NAME, message))
|
attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT, general.MODULE_NAME, message))
|
||||||
attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MESSAGE_TYPE, general.MODULE_NAME, "Words With Friends Message"))
|
attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MESSAGE_TYPE, general.MODULE_NAME, "Words With Friends Message"))
|
||||||
attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_THREAD_ID, general.MODULE_NAME, user_id))
|
attributes.add(BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_THREAD_ID, general.MODULE_NAME, thread_id))
|
||||||
|
|
||||||
artifact.addAttributes(attributes)
|
artifact.addAttributes(attributes)
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found
|
|||||||
KeywordSearchResultFactory.query.exception.msg=Could not perform the query
|
KeywordSearchResultFactory.query.exception.msg=Could not perform the query
|
||||||
OpenIDE-Module-Display-Category=Ingest Module
|
OpenIDE-Module-Display-Category=Ingest Module
|
||||||
|
|
||||||
OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found.
|
OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found.
|
||||||
OpenIDE-Module-Name=KeywordSearch
|
OpenIDE-Module-Name=KeywordSearch
|
||||||
OptionsCategory_Name_KeywordSearchOptions=Keyword Search
|
OptionsCategory_Name_KeywordSearchOptions=Keyword Search
|
||||||
OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search
|
OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search
|
||||||
@ -303,6 +303,7 @@ KeywordSearchModuleFactory.createFileIngestModule.exception.msg=Expected setting
|
|||||||
SearchRunner.Searcher.done.err.msg=Error performing keyword search
|
SearchRunner.Searcher.done.err.msg=Error performing keyword search
|
||||||
KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.toolTipText=Fastest overall, but no results until the end
|
KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.toolTipText=Fastest overall, but no results until the end
|
||||||
KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.text=No periodic searches
|
KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.text=No periodic searches
|
||||||
|
Server.status.failed.msg=Local Solr server did not respond to status request. This may be because the server failed to start or is taking too long to initialize.
|
||||||
SolrConnectionCheck.HostnameOrPort=Invalid hostname and/or port number.
|
SolrConnectionCheck.HostnameOrPort=Invalid hostname and/or port number.
|
||||||
SolrConnectionCheck.Hostname=Invalid hostname.
|
SolrConnectionCheck.Hostname=Invalid hostname.
|
||||||
SolrConnectionCheck.MissingHostname=Missing hostname.
|
SolrConnectionCheck.MissingHostname=Missing hostname.
|
||||||
|
@ -356,6 +356,13 @@ final class RegexQuery implements KeywordSearchQuery {
|
|||||||
|
|
||||||
String hit = hitMatcher.group();
|
String hit = hitMatcher.group();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No need to continue on if the the string is "" nothing to find or do.
|
||||||
|
*/
|
||||||
|
if ("".equals(hit)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
offset = hitMatcher.end();
|
offset = hitMatcher.end();
|
||||||
final ATTRIBUTE_TYPE artifactAttributeType = originalKeyword.getArtifactAttributeType();
|
final ATTRIBUTE_TYPE artifactAttributeType = originalKeyword.getArtifactAttributeType();
|
||||||
|
|
||||||
|
@ -42,6 +42,7 @@ import java.util.Collection;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.AbstractAction;
|
import javax.swing.AbstractAction;
|
||||||
@ -428,6 +429,8 @@ public class Server {
|
|||||||
* immediately (probably before the server is ready) and doesn't check
|
* immediately (probably before the server is ready) and doesn't check
|
||||||
* whether it was successful.
|
* whether it was successful.
|
||||||
*/
|
*/
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"Server.status.failed.msg=Local Solr server did not respond to status request. This may be because the server failed to start or is taking too long to initialize.",})
|
||||||
void start() throws KeywordSearchModuleException, SolrServerNoPortException {
|
void start() throws KeywordSearchModuleException, SolrServerNoPortException {
|
||||||
if (isRunning()) {
|
if (isRunning()) {
|
||||||
// If a Solr server is running we stop it.
|
// If a Solr server is running we stop it.
|
||||||
@ -469,16 +472,27 @@ public class Server {
|
|||||||
Arrays.asList("-Dbootstrap_confdir=../solr/configsets/AutopsyConfig/conf", //NON-NLS
|
Arrays.asList("-Dbootstrap_confdir=../solr/configsets/AutopsyConfig/conf", //NON-NLS
|
||||||
"-Dcollection.configName=AutopsyConfig"))); //NON-NLS
|
"-Dcollection.configName=AutopsyConfig"))); //NON-NLS
|
||||||
|
|
||||||
try {
|
// Wait for the Solr server to start and respond to a status request.
|
||||||
//block for 10 seconds, give time to fully start the process
|
for (int numRetries = 0; numRetries < 6; numRetries++) {
|
||||||
//so if it's restarted solr operations can be resumed seamlessly
|
if (isRunning()) {
|
||||||
Thread.sleep(10 * 1000);
|
final List<Long> pids = this.getSolrPIDs();
|
||||||
} catch (InterruptedException ex) {
|
logger.log(Level.INFO, "New Solr process PID: {0}", pids); //NON-NLS
|
||||||
logger.log(Level.WARNING, "Timer interrupted"); //NON-NLS
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local Solr server did not respond so we sleep for
|
||||||
|
// 5 seconds before trying again.
|
||||||
|
try {
|
||||||
|
TimeUnit.SECONDS.sleep(5);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
logger.log(Level.WARNING, "Timer interrupted"); //NON-NLS
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<Long> pids = this.getSolrPIDs();
|
// If we get here the Solr server has not responded to connection
|
||||||
logger.log(Level.INFO, "New Solr process PID: {0}", pids); //NON-NLS
|
// attempts in a timely fashion.
|
||||||
|
logger.log(Level.WARNING, "Local Solr server failed to respond to status requests.");
|
||||||
|
throw new KeywordSearchModuleException(Bundle.Server_status_failed_msg());
|
||||||
} catch (SecurityException ex) {
|
} catch (SecurityException ex) {
|
||||||
logger.log(Level.SEVERE, "Could not start Solr process!", ex); //NON-NLS
|
logger.log(Level.SEVERE, "Could not start Solr process!", ex); //NON-NLS
|
||||||
throw new KeywordSearchModuleException(
|
throw new KeywordSearchModuleException(
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user