mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-15 09:17:42 +00:00
Merge branch 'release-4.13.0' of https://github.com/sleuthkit/autopsy into 5560-fbmessenger-calllogs
This commit is contained in:
commit
583ef12eaf
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -1,7 +1,7 @@
|
|||||||
*.java text diff=java
|
*.java text diff=java
|
||||||
|
|
||||||
*.txt text
|
*.txt text
|
||||||
*.sh text
|
*.sh eol=lf
|
||||||
*.mf text
|
*.mf text
|
||||||
*.xml text
|
*.xml text
|
||||||
*.form text
|
*.form text
|
||||||
|
@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
|||||||
OpenIDE-Module: org.sleuthkit.autopsy.core/10
|
OpenIDE-Module: org.sleuthkit.autopsy.core/10
|
||||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/core/Bundle.properties
|
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/core/Bundle.properties
|
||||||
OpenIDE-Module-Layer: org/sleuthkit/autopsy/core/layer.xml
|
OpenIDE-Module-Layer: org/sleuthkit/autopsy/core/layer.xml
|
||||||
OpenIDE-Module-Implementation-Version: 28
|
OpenIDE-Module-Implementation-Version: 29
|
||||||
OpenIDE-Module-Requires: org.openide.windows.WindowManager
|
OpenIDE-Module-Requires: org.openide.windows.WindowManager
|
||||||
AutoUpdate-Show-In-Client: true
|
AutoUpdate-Show-In-Client: true
|
||||||
AutoUpdate-Essential-Module: true
|
AutoUpdate-Essential-Module: true
|
||||||
|
@ -122,5 +122,5 @@ nbm.homepage=http://www.sleuthkit.org/
|
|||||||
nbm.module.author=Brian Carrier
|
nbm.module.author=Brian Carrier
|
||||||
nbm.needs.restart=true
|
nbm.needs.restart=true
|
||||||
source.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0-sources.jar
|
source.reference.curator-recipes-2.8.0.jar=release/modules/ext/curator-recipes-2.8.0-sources.jar
|
||||||
spec.version.base=10.16
|
spec.version.base=10.17
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>3</release-version>
|
<release-version>3</release-version>
|
||||||
<specification-version>1.2</specification-version>
|
<specification-version>1.3</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
</module-dependencies>
|
</module-dependencies>
|
||||||
|
@ -62,15 +62,16 @@ import org.sleuthkit.autopsy.ingest.IngestModuleError;
|
|||||||
import org.sleuthkit.autopsy.ingest.IngestProfiles;
|
import org.sleuthkit.autopsy.ingest.IngestProfiles;
|
||||||
import org.sleuthkit.autopsy.modules.interestingitems.FilesSet;
|
import org.sleuthkit.autopsy.modules.interestingitems.FilesSet;
|
||||||
import org.sleuthkit.autopsy.modules.interestingitems.FilesSetsManager;
|
import org.sleuthkit.autopsy.modules.interestingitems.FilesSetsManager;
|
||||||
import org.sleuthkit.autopsy.report.infrastructure.ReportProgressLogger;
|
import org.sleuthkit.autopsy.progress.LoggingProgressIndicator;
|
||||||
import org.sleuthkit.autopsy.report.infrastructure.ReportGenerator;
|
import org.sleuthkit.autopsy.report.infrastructure.ReportGenerator;
|
||||||
|
import org.sleuthkit.autopsy.report.infrastructure.ReportProgressIndicator;
|
||||||
import org.sleuthkit.datamodel.Content;
|
import org.sleuthkit.datamodel.Content;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows Autopsy to be invoked with a command line arguments. Causes Autopsy to
|
* Allows Autopsy to be invoked with command line arguments. Arguments exist to
|
||||||
* create a case, add a specified data source, run ingest on that data source,
|
* cause Autopsy to create a case, add a specified data source, run ingest on
|
||||||
* list all data source in a case, generate reports.
|
* that data source, list all data sources in the case, and generate reports.
|
||||||
*/
|
*/
|
||||||
public class CommandLineIngestManager {
|
public class CommandLineIngestManager {
|
||||||
|
|
||||||
@ -285,7 +286,8 @@ public class CommandLineIngestManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// generate reports
|
// generate reports
|
||||||
ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), new ReportProgressLogger()); //NON-NLS
|
ReportProgressIndicator progressIndicator = new ReportProgressIndicator(new LoggingProgressIndicator());
|
||||||
|
ReportGenerator generator = new ReportGenerator(CommandLineIngestSettingsPanel.getReportingConfigName(), progressIndicator);
|
||||||
generator.generateReports();
|
generator.generateReports();
|
||||||
} catch (CaseActionException ex) {
|
} catch (CaseActionException ex) {
|
||||||
String caseDirPath = command.getInputs().get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
|
String caseDirPath = command.getInputs().get(CommandLineCommand.InputType.CASE_FOLDER_PATH.name());
|
||||||
@ -335,6 +337,7 @@ public class CommandLineIngestManager {
|
|||||||
* @param baseCaseName Case name
|
* @param baseCaseName Case name
|
||||||
* @param rootOutputDirectory Full path to directory in which case
|
* @param rootOutputDirectory Full path to directory in which case
|
||||||
* output folder will be created
|
* output folder will be created
|
||||||
|
*
|
||||||
* @throws CaseActionException
|
* @throws CaseActionException
|
||||||
*/
|
*/
|
||||||
private void openCase(String baseCaseName, String rootOutputDirectory) throws CaseActionException {
|
private void openCase(String baseCaseName, String rootOutputDirectory) throws CaseActionException {
|
||||||
@ -363,6 +366,7 @@ public class CommandLineIngestManager {
|
|||||||
* Opens existing case.
|
* Opens existing case.
|
||||||
*
|
*
|
||||||
* @param caseFolderPath full path to case directory
|
* @param caseFolderPath full path to case directory
|
||||||
|
*
|
||||||
* @throws CaseActionException
|
* @throws CaseActionException
|
||||||
*/
|
*/
|
||||||
private void openCase(String caseFolderPath) throws CaseActionException {
|
private void openCase(String caseFolderPath) throws CaseActionException {
|
||||||
@ -415,11 +419,16 @@ public class CommandLineIngestManager {
|
|||||||
* @param dataSource The data source.
|
* @param dataSource The data source.
|
||||||
*
|
*
|
||||||
* @throws
|
* @throws
|
||||||
* AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException if
|
* AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorExceptioif
|
||||||
* there was a DSP processing error
|
* there
|
||||||
|
* was
|
||||||
|
* a
|
||||||
|
* DSP
|
||||||
|
* processing
|
||||||
|
* error
|
||||||
*
|
*
|
||||||
* @throws InterruptedException if the thread running the job processing
|
* @throws ead running the job processing task is interrupted while
|
||||||
* task is interrupted while blocked, i.e., if auto ingest is shutting down.
|
* blocked, i.e., if auto ingest is shutting down.
|
||||||
*/
|
*/
|
||||||
private void runDataSourceProcessor(Case caseForJob, AutoIngestDataSource dataSource) throws InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException {
|
private void runDataSourceProcessor(Case caseForJob, AutoIngestDataSource dataSource) throws InterruptedException, AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException {
|
||||||
|
|
||||||
@ -525,9 +534,10 @@ public class CommandLineIngestManager {
|
|||||||
*
|
*
|
||||||
* @throws AnalysisStartupException if there is an error analyzing the
|
* @throws AnalysisStartupException if there is an error analyzing the
|
||||||
* data source.
|
* data source.
|
||||||
* @throws InterruptedException if the thread running the job processing
|
* @throws InterruptedException if the thread running the job
|
||||||
* task is interrupted while blocked, i.e., if auto ingest is shutting
|
* processing task is interrupted while
|
||||||
* down.
|
* blocked, i.e., if auto ingest is
|
||||||
|
* shutting down.
|
||||||
*/
|
*/
|
||||||
private void analyze(AutoIngestDataSource dataSource, String ingestProfileName) throws AnalysisStartupException, InterruptedException {
|
private void analyze(AutoIngestDataSource dataSource, String ingestProfileName) throws AnalysisStartupException, InterruptedException {
|
||||||
|
|
||||||
@ -628,6 +638,7 @@ public class CommandLineIngestManager {
|
|||||||
* ingest profiles.
|
* ingest profiles.
|
||||||
*
|
*
|
||||||
* @param ingestProfileName Ingest profile name
|
* @param ingestProfileName Ingest profile name
|
||||||
|
*
|
||||||
* @return IngestProfile object, or NULL if the profile doesn't exist
|
* @return IngestProfile object, or NULL if the profile doesn't exist
|
||||||
*/
|
*/
|
||||||
private IngestProfiles.IngestProfile getSelectedProfile(String ingestProfileName) {
|
private IngestProfiles.IngestProfile getSelectedProfile(String ingestProfileName) {
|
||||||
@ -649,6 +660,7 @@ public class CommandLineIngestManager {
|
|||||||
* filters (custom and standard).
|
* filters (custom and standard).
|
||||||
*
|
*
|
||||||
* @param filterName Name of the file filter
|
* @param filterName Name of the file filter
|
||||||
|
*
|
||||||
* @return FilesSet object, or NULL if the filter doesn't exist
|
* @return FilesSet object, or NULL if the filter doesn't exist
|
||||||
*/
|
*/
|
||||||
private FilesSet getSelectedFilter(String filterName) {
|
private FilesSet getSelectedFilter(String filterName) {
|
||||||
@ -711,6 +723,7 @@ public class CommandLineIngestManager {
|
|||||||
* Returns full path to directory where command outputs should be saved.
|
* Returns full path to directory where command outputs should be saved.
|
||||||
*
|
*
|
||||||
* @param caseForJob Case object
|
* @param caseForJob Case object
|
||||||
|
*
|
||||||
* @return Full path to directory where command outputs should be saved
|
* @return Full path to directory where command outputs should be saved
|
||||||
*/
|
*/
|
||||||
private String getOutputDirPath(Case caseForJob) {
|
private String getOutputDirPath(Case caseForJob) {
|
||||||
|
@ -16,28 +16,14 @@
|
|||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JSplitPane" name="jSplitPane1">
|
<Container class="org.openide.explorer.view.OutlineView" name="outlineView">
|
||||||
<Properties>
|
|
||||||
<Property name="dividerLocation" type="int" value="500"/>
|
|
||||||
</Properties>
|
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||||
<BorderConstraints direction="Center"/>
|
<BorderConstraints direction="Center"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
|
||||||
<SubComponents>
|
|
||||||
<Container class="org.openide.explorer.view.OutlineView" name="outlineView">
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
|
||||||
<JSplitPaneConstraints position="left"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
</Container>
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
|
||||||
</SubComponents>
|
|
||||||
</Form>
|
</Form>
|
||||||
|
@ -65,20 +65,15 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
|
|||||||
|
|
||||||
private final ExplorerManager accountsTableEM = new ExplorerManager();
|
private final ExplorerManager accountsTableEM = new ExplorerManager();
|
||||||
|
|
||||||
final RelationshipBrowser relationshipBrowser;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This lookup proxies the selection lookup of both he accounts table and
|
* This lookup proxies the selection lookup of both he accounts table and
|
||||||
* the messages table.
|
* the messages table.
|
||||||
*/
|
*/
|
||||||
private final ProxyLookup proxyLookup;
|
private final ProxyLookup proxyLookup;
|
||||||
|
|
||||||
public AccountsBrowser() {
|
public AccountsBrowser(RelationshipBrowser relationshipBrowser) {
|
||||||
initComponents();
|
initComponents();
|
||||||
|
|
||||||
jSplitPane1.setResizeWeight(0.5);
|
|
||||||
jSplitPane1.setDividerLocation(0.75);
|
|
||||||
|
|
||||||
outline = outlineView.getOutline();
|
outline = outlineView.getOutline();
|
||||||
outlineView.setPropertyColumns(
|
outlineView.setPropertyColumns(
|
||||||
"device", Bundle.AccountNode_device(),
|
"device", Bundle.AccountNode_device(),
|
||||||
@ -91,9 +86,6 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
|
|||||||
outline.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
outline.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
||||||
outline.setColumnSorted(3, false, 1); //it would be nice if the column index wasn't hardcoded
|
outline.setColumnSorted(3, false, 1); //it would be nice if the column index wasn't hardcoded
|
||||||
|
|
||||||
relationshipBrowser = new RelationshipBrowser();
|
|
||||||
jSplitPane1.setRightComponent(relationshipBrowser);
|
|
||||||
|
|
||||||
accountsTableEM.addPropertyChangeListener(evt -> {
|
accountsTableEM.addPropertyChangeListener(evt -> {
|
||||||
if (ExplorerManager.PROP_ROOT_CONTEXT.equals(evt.getPropertyName())) {
|
if (ExplorerManager.PROP_ROOT_CONTEXT.equals(evt.getPropertyName())) {
|
||||||
SwingUtilities.invokeLater(this::setColumnWidths);
|
SwingUtilities.invokeLater(this::setColumnWidths);
|
||||||
@ -174,20 +166,14 @@ public final class AccountsBrowser extends JPanel implements ExplorerManager.Pro
|
|||||||
// <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() {
|
||||||
|
|
||||||
jSplitPane1 = new javax.swing.JSplitPane();
|
|
||||||
outlineView = new org.openide.explorer.view.OutlineView();
|
outlineView = new org.openide.explorer.view.OutlineView();
|
||||||
|
|
||||||
setLayout(new java.awt.BorderLayout());
|
setLayout(new java.awt.BorderLayout());
|
||||||
|
add(outlineView, java.awt.BorderLayout.CENTER);
|
||||||
jSplitPane1.setDividerLocation(500);
|
|
||||||
jSplitPane1.setLeftComponent(outlineView);
|
|
||||||
|
|
||||||
add(jSplitPane1, java.awt.BorderLayout.CENTER);
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private javax.swing.JSplitPane jSplitPane1;
|
|
||||||
private org.openide.explorer.view.OutlineView outlineView;
|
private org.openide.explorer.view.OutlineView outlineView;
|
||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
@ -49,3 +49,5 @@ VisualizationPanel.forwardButton.text=
|
|||||||
VisualizationPanel.zoomPercentLabel.text=100%
|
VisualizationPanel.zoomPercentLabel.text=100%
|
||||||
VisualizationPanel.zoomLabel.text=Zoom:
|
VisualizationPanel.zoomLabel.text=Zoom:
|
||||||
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report.
|
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report.
|
||||||
|
CVTTopComponent.filtersPane.TabConstraints.tabTitle=Filters
|
||||||
|
CVTTopComponent.filterTabPanel.TabConstraints.tabTitle=Filters
|
||||||
|
@ -92,6 +92,8 @@ VisualizationPanel.forwardButton.text=
|
|||||||
VisualizationPanel.zoomPercentLabel.text=100%
|
VisualizationPanel.zoomPercentLabel.text=100%
|
||||||
VisualizationPanel.zoomLabel.text=Zoom:
|
VisualizationPanel.zoomLabel.text=Zoom:
|
||||||
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report.
|
VisualizationPanel.snapshotButton.toolTipText=Generate Snapshot report.
|
||||||
|
CVTTopComponent.filtersPane.TabConstraints.tabTitle=Filters
|
||||||
|
CVTTopComponent.filterTabPanel.TabConstraints.tabTitle=Filters
|
||||||
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
|
||||||
|
@ -14,24 +14,52 @@
|
|||||||
<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"/>
|
<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.DesignBorderLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JSplitPane" name="mainSplitPane">
|
<Container class="javax.swing.JTabbedPane" name="filterTabPane">
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="filterTabPaneMouseClicked"/>
|
||||||
|
</Events>
|
||||||
<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.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||||
<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"/>
|
<BorderConstraints direction="West"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JPanel" name="filterTabPanel">
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
|
<JTabbedPaneConstraints tabName="Filters">
|
||||||
|
<Property name="tabTitle" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="CVTTopComponent.filterTabPanel.TabConstraints.tabTitle" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</JTabbedPaneConstraints>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane">
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JSplitPane" name="splitPane">
|
||||||
|
<Properties>
|
||||||
|
<Property name="dividerLocation" type="int" value="1"/>
|
||||||
|
<Property name="resizeWeight" type="double" value="0.25"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||||
|
<BorderConstraints direction="Center"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Component class="org.sleuthkit.autopsy.communications.FiltersPanel" name="filtersPane">
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
|
||||||
<JSplitPaneConstraints position="left"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
</Component>
|
|
||||||
<Container class="javax.swing.JTabbedPane" name="browseVisualizeTabPane">
|
<Container class="javax.swing.JTabbedPane" name="browseVisualizeTabPane">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||||
@ -45,13 +73,16 @@
|
|||||||
</AccessibilityProperties>
|
</AccessibilityProperties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||||
<JSplitPaneConstraints position="right"/>
|
<JSplitPaneConstraints position="left"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Component class="org.sleuthkit.autopsy.communications.AccountsBrowser" name="accountsBrowser">
|
<Component class="org.sleuthkit.autopsy.communications.AccountsBrowser" name="accountsBrowser">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new org.sleuthkit.autopsy.communications.AccountsBrowser(relationshipBrowser)"/>
|
||||||
|
</AuxValues>
|
||||||
<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.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Browse">
|
<JTabbedPaneConstraints tabName="Browse">
|
||||||
@ -66,6 +97,9 @@
|
|||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="org.sleuthkit.autopsy.communications.VisualizationPanel" name="vizPanel">
|
<Component class="org.sleuthkit.autopsy.communications.VisualizationPanel" name="vizPanel">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new org.sleuthkit.autopsy.communications.VisualizationPanel(relationshipBrowser)"/>
|
||||||
|
</AuxValues>
|
||||||
<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.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Visualize">
|
<JTabbedPaneConstraints tabName="Visualize">
|
||||||
|
@ -19,14 +19,16 @@
|
|||||||
package org.sleuthkit.autopsy.communications;
|
package org.sleuthkit.autopsy.communications;
|
||||||
|
|
||||||
import com.google.common.eventbus.Subscribe;
|
import com.google.common.eventbus.Subscribe;
|
||||||
|
import java.awt.BorderLayout;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.GridBagConstraints;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.GridBagLayout;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.Insets;
|
import java.util.HashSet;
|
||||||
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.JPanel;
|
||||||
import javax.swing.JSplitPane;
|
import javax.swing.JSplitPane;
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JTabbedPane;
|
||||||
import org.openide.util.Lookup;
|
import org.openide.util.Lookup;
|
||||||
@ -35,7 +37,10 @@ import org.openide.windows.Mode;
|
|||||||
import org.openide.windows.RetainLocation;
|
import org.openide.windows.RetainLocation;
|
||||||
import org.openide.windows.TopComponent;
|
import org.openide.windows.TopComponent;
|
||||||
import org.openide.windows.WindowManager;
|
import org.openide.windows.WindowManager;
|
||||||
|
import org.sleuthkit.autopsy.communications.relationships.RelationshipBrowser;
|
||||||
|
import org.sleuthkit.autopsy.communications.relationships.SelectionInfo;
|
||||||
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
||||||
|
import org.sleuthkit.datamodel.CommunicationsFilter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Top component which displays the Communications Visualization Tool.
|
* Top component which displays the Communications Visualization Tool.
|
||||||
@ -48,10 +53,17 @@ import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
|||||||
public final class CVTTopComponent extends TopComponent {
|
public final class CVTTopComponent extends TopComponent {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
private boolean filtersVisible = true;
|
||||||
|
private final RelationshipBrowser relationshipBrowser = new RelationshipBrowser();
|
||||||
|
private CommunicationsFilter currentFilter;
|
||||||
|
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
public CVTTopComponent() {
|
public CVTTopComponent() {
|
||||||
initComponents();
|
initComponents();
|
||||||
|
|
||||||
|
splitPane.setRightComponent(relationshipBrowser);
|
||||||
|
splitPane.setDividerLocation(0.25);
|
||||||
|
|
||||||
setName(Bundle.CVTTopComponent_name());
|
setName(Bundle.CVTTopComponent_name());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -68,6 +80,8 @@ public final class CVTTopComponent extends TopComponent {
|
|||||||
Lookup lookup = ((Lookup.Provider)selectedComponent).getLookup();
|
Lookup lookup = ((Lookup.Provider)selectedComponent).getLookup();
|
||||||
proxyLookup.setNewLookups(lookup);
|
proxyLookup.setNewLookups(lookup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
relationshipBrowser.setSelectionInfo(new SelectionInfo(new HashSet<>(), new HashSet<>(), currentFilter));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@ -80,8 +94,8 @@ public final class CVTTopComponent extends TopComponent {
|
|||||||
CVTEvents.getCVTEventBus().register(accountsBrowser);
|
CVTEvents.getCVTEventBus().register(accountsBrowser);
|
||||||
CVTEvents.getCVTEventBus().register(filtersPane);
|
CVTEvents.getCVTEventBus().register(filtersPane);
|
||||||
|
|
||||||
mainSplitPane.setResizeWeight(0.5);
|
filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-left.png")));
|
||||||
mainSplitPane.setDividerLocation(0.25);
|
filterTabbedPane.setTitleAt(0, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
@ -89,6 +103,11 @@ public final class CVTTopComponent extends TopComponent {
|
|||||||
browseVisualizeTabPane.setSelectedIndex(1);
|
browseVisualizeTabPane.setSelectedIndex(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
void handle(final CVTEvents.FilterChangeEvent filterChangeEvent) {
|
||||||
|
currentFilter = filterChangeEvent.getNewFilter();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is called from within the constructor to initialize the form.
|
* 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
|
* WARNING: Do NOT modify this code. The content of this method is always
|
||||||
@ -96,38 +115,68 @@ public final class CVTTopComponent extends TopComponent {
|
|||||||
*/
|
*/
|
||||||
// <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() {
|
||||||
GridBagConstraints gridBagConstraints;
|
|
||||||
|
|
||||||
mainSplitPane = new JSplitPane();
|
filterTabbedPane = new JTabbedPane();
|
||||||
|
filterTabPanel = new JPanel();
|
||||||
filtersPane = new FiltersPanel();
|
filtersPane = new FiltersPanel();
|
||||||
|
splitPane = new JSplitPane();
|
||||||
browseVisualizeTabPane = new JTabbedPane();
|
browseVisualizeTabPane = new JTabbedPane();
|
||||||
accountsBrowser = new AccountsBrowser();
|
accountsBrowser = new AccountsBrowser(relationshipBrowser);
|
||||||
vizPanel = new VisualizationPanel();
|
vizPanel = new VisualizationPanel(relationshipBrowser);
|
||||||
|
|
||||||
setLayout(new GridBagLayout());
|
setLayout(new BorderLayout());
|
||||||
|
|
||||||
mainSplitPane.setLeftComponent(filtersPane);
|
filterTabbedPane.addMouseListener(new MouseAdapter() {
|
||||||
|
public void mouseClicked(MouseEvent evt) {
|
||||||
|
filterTabbedPaneMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
filterTabPanel.setLayout(new BorderLayout());
|
||||||
|
filterTabPanel.add(filtersPane, BorderLayout.CENTER);
|
||||||
|
|
||||||
|
filterTabbedPane.addTab(NbBundle.getMessage(CVTTopComponent.class, "CVTTopComponent.filterTabPanel.TabConstraints.tabTitle"), filterTabPanel); // NOI18N
|
||||||
|
|
||||||
|
add(filterTabbedPane, BorderLayout.WEST);
|
||||||
|
|
||||||
|
splitPane.setDividerLocation(1);
|
||||||
|
splitPane.setResizeWeight(0.25);
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
mainSplitPane.setRightComponent(browseVisualizeTabPane);
|
splitPane.setLeftComponent(browseVisualizeTabPane);
|
||||||
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();
|
add(splitPane, BorderLayout.CENTER);
|
||||||
gridBagConstraints.fill = GridBagConstraints.BOTH;
|
|
||||||
gridBagConstraints.weightx = 1.0;
|
|
||||||
gridBagConstraints.weighty = 1.0;
|
|
||||||
add(mainSplitPane, gridBagConstraints);
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void filterTabbedPaneMouseClicked(MouseEvent evt) {//GEN-FIRST:event_filterTabPaneMouseClicked
|
||||||
|
int index = filterTabbedPane.indexAtLocation(evt.getX(), evt.getY());
|
||||||
|
if(index != -1) {
|
||||||
|
if(filtersVisible) {
|
||||||
|
filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-right.png")));
|
||||||
|
filterTabPanel.removeAll();
|
||||||
|
filterTabPanel.revalidate();
|
||||||
|
filtersVisible = false;
|
||||||
|
} else {
|
||||||
|
filterTabbedPane.setIconAt(0, new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/arrow-left.png")));
|
||||||
|
filterTabPanel.add(filtersPane, BorderLayout.CENTER);
|
||||||
|
filterTabPanel.revalidate();
|
||||||
|
filtersVisible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_filterTabPaneMouseClicked
|
||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
private AccountsBrowser accountsBrowser;
|
private AccountsBrowser accountsBrowser;
|
||||||
private JTabbedPane browseVisualizeTabPane;
|
private JTabbedPane browseVisualizeTabPane;
|
||||||
|
private JTabbedPane filterTabbedPane;
|
||||||
|
private JPanel filterTabPanel;
|
||||||
private FiltersPanel filtersPane;
|
private FiltersPanel filtersPane;
|
||||||
private JSplitPane mainSplitPane;
|
private JSplitPane splitPane;
|
||||||
private VisualizationPanel vizPanel;
|
private VisualizationPanel vizPanel;
|
||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JScrollPane" name="scrollPane">
|
<Container class="javax.swing.JScrollPane" name="scrollPane">
|
||||||
<Properties>
|
<Properties>
|
||||||
|
<Property name="autoscrolls" type="boolean" value="true"/>
|
||||||
<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>
|
||||||
@ -37,7 +38,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="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"/>
|
<GridBagConstraints gridX="0" gridY="4" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="15" insetsRight="25" anchor="18" weightX="1.0" weightY="1.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
@ -128,7 +129,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="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"/>
|
<GridBagConstraints gridX="0" gridY="3" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
@ -222,7 +223,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="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"/>
|
<GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="100" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
@ -325,7 +326,7 @@
|
|||||||
<Container class="javax.swing.JPanel" name="accountTypesPane">
|
<Container class="javax.swing.JPanel" name="accountTypesPane">
|
||||||
<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="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="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="15" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="18" weightX="1.0" weightY="0.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
@ -422,7 +423,7 @@
|
|||||||
<Container class="javax.swing.JPanel" name="topPane">
|
<Container class="javax.swing.JPanel" name="topPane">
|
||||||
<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="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="24" weightX="1.0" weightY="0.0"/>
|
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="25" anchor="24" weightX="1.0" weightY="0.0"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
|
@ -477,6 +477,7 @@ final public class FiltersPanel extends JPanel {
|
|||||||
|
|
||||||
setLayout(new java.awt.GridBagLayout());
|
setLayout(new java.awt.GridBagLayout());
|
||||||
|
|
||||||
|
scrollPane.setAutoscrolls(true);
|
||||||
scrollPane.setBorder(null);
|
scrollPane.setBorder(null);
|
||||||
|
|
||||||
mainPanel.setLayout(new java.awt.GridBagLayout());
|
mainPanel.setLayout(new java.awt.GridBagLayout());
|
||||||
@ -541,7 +542,7 @@ final public class FiltersPanel extends JPanel {
|
|||||||
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(15, 0, 15, 0);
|
gridBagConstraints.insets = new java.awt.Insets(15, 0, 15, 25);
|
||||||
mainPanel.add(limitPane, gridBagConstraints);
|
mainPanel.add(limitPane, gridBagConstraints);
|
||||||
|
|
||||||
startDatePicker.setEnabled(false);
|
startDatePicker.setEnabled(false);
|
||||||
@ -608,7 +609,7 @@ final public class FiltersPanel extends JPanel {
|
|||||||
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;
|
||||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
|
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25);
|
||||||
mainPanel.add(dateRangePane, gridBagConstraints);
|
mainPanel.add(dateRangePane, gridBagConstraints);
|
||||||
|
|
||||||
devicesPane.setLayout(new java.awt.GridBagLayout());
|
devicesPane.setLayout(new java.awt.GridBagLayout());
|
||||||
@ -686,7 +687,7 @@ final public class FiltersPanel extends JPanel {
|
|||||||
gridBagConstraints.ipady = 100;
|
gridBagConstraints.ipady = 100;
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
|
||||||
gridBagConstraints.weightx = 1.0;
|
gridBagConstraints.weightx = 1.0;
|
||||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
|
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25);
|
||||||
mainPanel.add(devicesPane, gridBagConstraints);
|
mainPanel.add(devicesPane, gridBagConstraints);
|
||||||
|
|
||||||
accountTypesPane.setLayout(new java.awt.GridBagLayout());
|
accountTypesPane.setLayout(new java.awt.GridBagLayout());
|
||||||
@ -760,7 +761,7 @@ final public class FiltersPanel extends JPanel {
|
|||||||
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;
|
||||||
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 0);
|
gridBagConstraints.insets = new java.awt.Insets(15, 0, 0, 25);
|
||||||
mainPanel.add(accountTypesPane, gridBagConstraints);
|
mainPanel.add(accountTypesPane, gridBagConstraints);
|
||||||
|
|
||||||
topPane.setLayout(new java.awt.GridBagLayout());
|
topPane.setLayout(new java.awt.GridBagLayout());
|
||||||
@ -810,6 +811,7 @@ final public class FiltersPanel extends JPanel {
|
|||||||
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
|
||||||
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END;
|
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END;
|
||||||
gridBagConstraints.weightx = 1.0;
|
gridBagConstraints.weightx = 1.0;
|
||||||
|
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 25);
|
||||||
mainPanel.add(topPane, gridBagConstraints);
|
mainPanel.add(topPane, gridBagConstraints);
|
||||||
|
|
||||||
scrollPane.setViewportView(mainPanel);
|
scrollPane.setViewportView(mainPanel);
|
||||||
|
@ -11,31 +11,18 @@
|
|||||||
<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,0,121,0,0,4,-59"/>
|
<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,63,0,0,4,-59"/>
|
||||||
</AuxValues>
|
</AuxValues>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JSplitPane" name="splitPane">
|
<Container class="javax.swing.JPanel" name="borderLayoutPanel">
|
||||||
<Properties>
|
|
||||||
<Property name="dividerLocation" type="int" value="800"/>
|
|
||||||
<Property name="resizeWeight" type="double" value="0.5"/>
|
|
||||||
</Properties>
|
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||||
<BorderConstraints direction="Center"/>
|
<BorderConstraints direction="Center"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
|
||||||
<SubComponents>
|
|
||||||
<Container class="javax.swing.JPanel" name="borderLayoutPanel">
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
|
||||||
<JSplitPaneConstraints position="left"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JPanel" name="placeHolderPanel">
|
<Container class="javax.swing.JPanel" name="placeHolderPanel">
|
||||||
@ -49,9 +36,9 @@
|
|||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace pref="250" max="32767" attributes="0"/>
|
<EmptySpace pref="316" max="32767" attributes="0"/>
|
||||||
<Component id="jTextArea1" min="-2" pref="424" max="-2" attributes="0"/>
|
<Component id="jTextArea1" min="-2" pref="424" max="-2" attributes="0"/>
|
||||||
<EmptySpace pref="423" max="32767" attributes="0"/>
|
<EmptySpace pref="481" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
@ -81,75 +68,93 @@
|
|||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Container class="javax.swing.JPanel" name="toolbar">
|
<Container class="javafx.embed.swing.JFXPanel" name="notificationsJFXPanel">
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||||
<BorderConstraints direction="First"/>
|
<BorderConstraints direction="Last"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
|
|
||||||
<Layout>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||||
<DimensionLayout dim="0">
|
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="backButton" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="forwardButton" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="jSeparator4" min="-2" pref="10" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="fastOrganicLayoutButton" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="clearVizButton" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="jSeparator2" min="-2" pref="10" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="zoomLabel" 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"/>
|
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="zoomInButton" min="-2" pref="32" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="zoomActualButton" min="-2" pref="33" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="fitZoomButton" min="-2" pref="32" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="jSeparator3" min="-2" pref="10" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="snapshotButton" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
<DimensionLayout dim="1">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Group type="102" attributes="0">
|
|
||||||
<EmptySpace min="-2" pref="3" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="2" attributes="0">
|
|
||||||
<Component id="fastOrganicLayoutButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="zoomOutButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="zoomInButton" 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="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="jSeparator2" alignment="2" max="32767" attributes="0"/>
|
|
||||||
<Component id="backButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="forwardButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="snapshotButton" alignment="2" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="jSeparator3" alignment="2" max="32767" attributes="0"/>
|
|
||||||
<Component id="jSeparator4" alignment="2" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace min="-2" pref="3" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
</Layout>
|
</Layout>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JToolBar" name="toolbar">
|
||||||
|
<Properties>
|
||||||
|
<Property name="rollover" type="boolean" value="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||||
|
<BorderConstraints direction="North"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JButton" name="backButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_previous.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="VisualizationPanel.backButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</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.backButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="focusable" type="boolean" value="false"/>
|
||||||
|
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||||
|
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="backButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="forwardButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_next.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="VisualizationPanel.forwardButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</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.forwardButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="focusable" type="boolean" value="false"/>
|
||||||
|
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||||
|
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="forwardButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JToolBar$Separator" name="jSeparator3">
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="clearVizButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
||||||
|
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/broom.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="VisualizationPanel.clearVizButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</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.clearVizButton.toolTipText" 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/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="focusable" type="boolean" value="false"/>
|
||||||
|
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||||
|
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clearVizButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
<Component class="javax.swing.JButton" name="fastOrganicLayoutButton">
|
<Component class="javax.swing.JButton" name="fastOrganicLayoutButton">
|
||||||
<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">
|
||||||
@ -162,8 +167,28 @@
|
|||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fastOrganicLayoutButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fastOrganicLayoutButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="focusable" type="boolean" value="false"/>
|
<Property name="focusable" type="boolean" value="false"/>
|
||||||
|
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fastOrganicLayoutButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JToolBar$Separator" name="jSeparator2">
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="zoomLabel">
|
||||||
|
<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.zoomLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</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>
|
||||||
<Component class="javax.swing.JButton" name="zoomOutButton">
|
<Component class="javax.swing.JButton" name="zoomOutButton">
|
||||||
<Properties>
|
<Properties>
|
||||||
@ -184,23 +209,23 @@
|
|||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomOutButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomOutButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JButton" name="zoomInButton">
|
<Component class="javax.swing.JButton" name="fitZoomButton">
|
||||||
<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">
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"/>
|
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"/>
|
||||||
</Property>
|
</Property>
|
||||||
<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.zoomInButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.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" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="focusable" type="boolean" value="false"/>
|
<Property name="focusable" type="boolean" value="false"/>
|
||||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomInButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fitZoomButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JButton" name="zoomActualButton">
|
<Component class="javax.swing.JButton" name="zoomActualButton">
|
||||||
@ -222,95 +247,26 @@
|
|||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomActualButtonActionPerformed"/>
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="zoomActualButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JButton" name="fitZoomButton">
|
<Component class="javax.swing.JButton" name="zoomInButton">
|
||||||
<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">
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"/>
|
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"/>
|
||||||
</Property>
|
</Property>
|
||||||
<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.fitZoomButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.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" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="focusable" type="boolean" value="false"/>
|
<Property name="focusable" type="boolean" value="false"/>
|
||||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Events>
|
<Events>
|
||||||
<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="zoomInButtonActionPerformed"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="zoomLabel">
|
<Component class="javax.swing.JToolBar$Separator" name="jSeparator1">
|
||||||
<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.zoomLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</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">
|
|
||||||
<Properties>
|
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/communications/images/broom.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="VisualizationPanel.clearVizButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</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.clearVizButton.toolTipText" 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/communications/Bundle.properties" key="VisualizationPanel.clearVizButton.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="clearVizButtonActionPerformed"/>
|
|
||||||
</Events>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JToolBar$Separator" name="jSeparator2">
|
|
||||||
<Properties>
|
|
||||||
<Property name="orientation" type="int" value="1"/>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JButton" name="backButton">
|
|
||||||
<Properties>
|
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_previous.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="VisualizationPanel.backButton.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</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.backButton.toolTipText" 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="backButtonActionPerformed"/>
|
|
||||||
</Events>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JButton" name="forwardButton">
|
|
||||||
<Properties>
|
|
||||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
|
|
||||||
<Image iconType="3" name="/org/sleuthkit/autopsy/images/resultset_next.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="VisualizationPanel.forwardButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</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.forwardButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="horizontalTextPosition" type="int" value="10"/>
|
|
||||||
</Properties>
|
|
||||||
<Events>
|
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="forwardButtonActionPerformed"/>
|
|
||||||
</Events>
|
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JButton" name="snapshotButton">
|
<Component class="javax.swing.JButton" name="snapshotButton">
|
||||||
<Properties>
|
<Properties>
|
||||||
@ -323,36 +279,14 @@
|
|||||||
<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/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.snapshotButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
|
<Property name="focusable" type="boolean" value="false"/>
|
||||||
|
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||||
|
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||||
</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"/>
|
||||||
</Events>
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JToolBar$Separator" name="jSeparator3">
|
|
||||||
<Properties>
|
|
||||||
<Property name="orientation" type="int" value="1"/>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JToolBar$Separator" name="jSeparator4">
|
|
||||||
<Properties>
|
|
||||||
<Property name="orientation" type="int" value="1"/>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
<Container class="javafx.embed.swing.JFXPanel" name="notificationsJFXPanel">
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
|
||||||
<BorderConstraints direction="Last"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
|
||||||
<Property name="useNullLayout" type="boolean" value="true"/>
|
|
||||||
</Layout>
|
|
||||||
</Container>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
|
@ -43,6 +43,7 @@ import java.awt.BorderLayout;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Desktop;
|
import java.awt.Desktop;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
|
import java.awt.FlowLayout;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.Frame;
|
import java.awt.Frame;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
@ -61,7 +62,6 @@ import java.nio.file.Paths;
|
|||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -86,7 +86,6 @@ import javax.swing.JMenuItem;
|
|||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.JPopupMenu;
|
import javax.swing.JPopupMenu;
|
||||||
import javax.swing.JSplitPane;
|
|
||||||
import javax.swing.JTextArea;
|
import javax.swing.JTextArea;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import javax.swing.JToolBar;
|
import javax.swing.JToolBar;
|
||||||
@ -96,7 +95,6 @@ import javax.swing.SwingWorker;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.controlsfx.control.Notifications;
|
import org.controlsfx.control.Notifications;
|
||||||
import org.jdesktop.layout.GroupLayout;
|
import org.jdesktop.layout.GroupLayout;
|
||||||
import org.jdesktop.layout.LayoutStyle;
|
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.windows.WindowManager;
|
import org.openide.windows.WindowManager;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
@ -112,6 +110,7 @@ import org.sleuthkit.datamodel.AccountDeviceInstance;
|
|||||||
import org.sleuthkit.datamodel.CommunicationsFilter;
|
import org.sleuthkit.datamodel.CommunicationsFilter;
|
||||||
import org.sleuthkit.datamodel.CommunicationsManager;
|
import org.sleuthkit.datamodel.CommunicationsManager;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
import org.sleuthkit.autopsy.uicomponents.WrapLayout;
|
||||||
/**
|
/**
|
||||||
* A panel that goes in the Visualize tab of the Communications Visualization
|
* A panel that goes in the Visualize tab of the Communications Visualization
|
||||||
* Tool. Hosts an JGraphX mxGraphComponent that implements the communications
|
* Tool. Hosts an JGraphX mxGraphComponent that implements the communications
|
||||||
@ -160,7 +159,8 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
private final StateManager stateManager;
|
private final StateManager stateManager;
|
||||||
|
|
||||||
@NbBundle.Messages("VisalizationPanel.paintingError=Problem painting visualization.")
|
@NbBundle.Messages("VisalizationPanel.paintingError=Problem painting visualization.")
|
||||||
public VisualizationPanel() {
|
public VisualizationPanel(RelationshipBrowser relationshipBrowser) {
|
||||||
|
this.relationshipBrowser = relationshipBrowser;
|
||||||
initComponents();
|
initComponents();
|
||||||
//initialize invisible JFXPanel that is used to show JFXNotifications over this window.
|
//initialize invisible JFXPanel that is used to show JFXNotifications over this window.
|
||||||
notificationsJFXPanel.setScene(new Scene(new Pane()));
|
notificationsJFXPanel.setScene(new Scene(new Pane()));
|
||||||
@ -221,9 +221,6 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
graphComponent.getGraphControl().addMouseWheelListener(graphMouseListener);
|
graphComponent.getGraphControl().addMouseWheelListener(graphMouseListener);
|
||||||
graphComponent.getGraphControl().addMouseListener(graphMouseListener);
|
graphComponent.getGraphControl().addMouseListener(graphMouseListener);
|
||||||
|
|
||||||
relationshipBrowser = new RelationshipBrowser();
|
|
||||||
splitPane.setRightComponent(relationshipBrowser);
|
|
||||||
|
|
||||||
//feed selection to explorermanager
|
//feed selection to explorermanager
|
||||||
graph.getSelectionModel().addListener(mxEvent.CHANGE, new SelectionListener());
|
graph.getSelectionModel().addListener(mxEvent.CHANGE, new SelectionListener());
|
||||||
final mxEventSource.mxIEventListener undoListener = (Object sender, mxEventObject evt)
|
final mxEventSource.mxIEventListener undoListener = (Object sender, mxEventObject evt)
|
||||||
@ -247,6 +244,8 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
stateManager = new StateManager(pinnedAccountModel);
|
stateManager = new StateManager(pinnedAccountModel);
|
||||||
|
|
||||||
setStateButtonsEnabled();
|
setStateButtonsEnabled();
|
||||||
|
|
||||||
|
toolbar.setLayout(new WrapLayout(FlowLayout.LEFT));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
@ -373,32 +372,28 @@ 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 JSplitPane();
|
|
||||||
borderLayoutPanel = new JPanel();
|
borderLayoutPanel = new JPanel();
|
||||||
placeHolderPanel = new JPanel();
|
placeHolderPanel = new JPanel();
|
||||||
jTextArea1 = new JTextArea();
|
jTextArea1 = new JTextArea();
|
||||||
toolbar = new JPanel();
|
notificationsJFXPanel = new JFXPanel();
|
||||||
fastOrganicLayoutButton = new JButton();
|
toolbar = new JToolBar();
|
||||||
zoomOutButton = new JButton();
|
|
||||||
zoomInButton = new JButton();
|
|
||||||
zoomActualButton = new JButton();
|
|
||||||
fitZoomButton = new JButton();
|
|
||||||
zoomLabel = new JLabel();
|
|
||||||
zoomPercentLabel = new JLabel();
|
|
||||||
clearVizButton = new JButton();
|
|
||||||
jSeparator2 = new JToolBar.Separator();
|
|
||||||
backButton = new JButton();
|
backButton = new JButton();
|
||||||
forwardButton = new JButton();
|
forwardButton = new JButton();
|
||||||
snapshotButton = new JButton();
|
|
||||||
jSeparator3 = new JToolBar.Separator();
|
jSeparator3 = new JToolBar.Separator();
|
||||||
jSeparator4 = new JToolBar.Separator();
|
clearVizButton = new JButton();
|
||||||
notificationsJFXPanel = new JFXPanel();
|
fastOrganicLayoutButton = new JButton();
|
||||||
|
jSeparator2 = new JToolBar.Separator();
|
||||||
|
zoomLabel = new JLabel();
|
||||||
|
zoomPercentLabel = new JLabel();
|
||||||
|
zoomOutButton = new JButton();
|
||||||
|
fitZoomButton = new JButton();
|
||||||
|
zoomActualButton = new JButton();
|
||||||
|
zoomInButton = new JButton();
|
||||||
|
jSeparator1 = new JToolBar.Separator();
|
||||||
|
snapshotButton = new JButton();
|
||||||
|
|
||||||
setLayout(new BorderLayout());
|
setLayout(new BorderLayout());
|
||||||
|
|
||||||
splitPane.setDividerLocation(800);
|
|
||||||
splitPane.setResizeWeight(0.5);
|
|
||||||
|
|
||||||
borderLayoutPanel.setLayout(new BorderLayout());
|
borderLayoutPanel.setLayout(new BorderLayout());
|
||||||
|
|
||||||
jTextArea1.setBackground(new Color(240, 240, 240));
|
jTextArea1.setBackground(new Color(240, 240, 240));
|
||||||
@ -411,9 +406,9 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
placeHolderPanel.setLayout(placeHolderPanelLayout);
|
placeHolderPanel.setLayout(placeHolderPanelLayout);
|
||||||
placeHolderPanelLayout.setHorizontalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
|
placeHolderPanelLayout.setHorizontalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
|
||||||
.add(placeHolderPanelLayout.createSequentialGroup()
|
.add(placeHolderPanelLayout.createSequentialGroup()
|
||||||
.addContainerGap(250, Short.MAX_VALUE)
|
.addContainerGap(316, Short.MAX_VALUE)
|
||||||
.add(jTextArea1, GroupLayout.PREFERRED_SIZE, 424, GroupLayout.PREFERRED_SIZE)
|
.add(jTextArea1, GroupLayout.PREFERRED_SIZE, 424, GroupLayout.PREFERRED_SIZE)
|
||||||
.addContainerGap(423, Short.MAX_VALUE))
|
.addContainerGap(481, Short.MAX_VALUE))
|
||||||
);
|
);
|
||||||
placeHolderPanelLayout.setVerticalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
|
placeHolderPanelLayout.setVerticalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
|
||||||
.add(placeHolderPanelLayout.createSequentialGroup()
|
.add(placeHolderPanelLayout.createSequentialGroup()
|
||||||
@ -423,12 +418,72 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
);
|
);
|
||||||
|
|
||||||
borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER);
|
borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER);
|
||||||
|
borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END);
|
||||||
|
|
||||||
|
add(borderLayoutPanel, BorderLayout.CENTER);
|
||||||
|
|
||||||
|
toolbar.setRollover(true);
|
||||||
|
|
||||||
|
backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N
|
||||||
|
backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N
|
||||||
|
backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N
|
||||||
|
backButton.setFocusable(false);
|
||||||
|
backButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
|
backButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
|
backButton.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
backButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
toolbar.add(backButton);
|
||||||
|
|
||||||
|
forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N
|
||||||
|
forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N
|
||||||
|
forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N
|
||||||
|
forwardButton.setFocusable(false);
|
||||||
|
forwardButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
|
forwardButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
|
forwardButton.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
forwardButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
toolbar.add(forwardButton);
|
||||||
|
toolbar.add(jSeparator3);
|
||||||
|
|
||||||
|
clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N
|
||||||
|
clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N
|
||||||
|
clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N
|
||||||
|
clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N
|
||||||
|
clearVizButton.setFocusable(false);
|
||||||
|
clearVizButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
|
clearVizButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
|
clearVizButton.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
clearVizButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
toolbar.add(clearVizButton);
|
||||||
|
|
||||||
fastOrganicLayoutButton.setIcon(new 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(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N
|
fastOrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N
|
||||||
fastOrganicLayoutButton.setToolTipText(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.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
fastOrganicLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
fastOrganicLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
|
fastOrganicLayoutButton.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent evt) {
|
||||||
|
fastOrganicLayoutButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
toolbar.add(fastOrganicLayoutButton);
|
||||||
|
toolbar.add(jSeparator2);
|
||||||
|
|
||||||
|
zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N
|
||||||
|
toolbar.add(zoomLabel);
|
||||||
|
|
||||||
|
zoomPercentLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomPercentLabel.text")); // NOI18N
|
||||||
|
toolbar.add(zoomPercentLabel);
|
||||||
|
|
||||||
zoomOutButton.setIcon(new 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(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N
|
zoomOutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N
|
||||||
@ -441,30 +496,7 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
zoomOutButtonActionPerformed(evt);
|
zoomOutButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
toolbar.add(zoomOutButton);
|
||||||
zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N
|
|
||||||
zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N
|
|
||||||
zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N
|
|
||||||
zoomInButton.setFocusable(false);
|
|
||||||
zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
|
||||||
zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
|
||||||
zoomInButton.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent evt) {
|
|
||||||
zoomInButtonActionPerformed(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N
|
|
||||||
zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N
|
|
||||||
zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N
|
|
||||||
zoomActualButton.setFocusable(false);
|
|
||||||
zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
|
||||||
zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
|
||||||
zoomActualButton.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent evt) {
|
|
||||||
zoomActualButtonActionPerformed(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
fitZoomButton.setIcon(new 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(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N
|
fitZoomButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N
|
||||||
@ -477,116 +509,49 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
fitZoomButtonActionPerformed(evt);
|
fitZoomButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
toolbar.add(fitZoomButton);
|
||||||
|
|
||||||
zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N
|
zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N
|
||||||
|
zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N
|
||||||
zoomPercentLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomPercentLabel.text")); // NOI18N
|
zoomActualButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N
|
||||||
|
zoomActualButton.setFocusable(false);
|
||||||
clearVizButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/broom.png"))); // NOI18N
|
zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
clearVizButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.text_1")); // NOI18N
|
zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
clearVizButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.toolTipText")); // NOI18N
|
zoomActualButton.addActionListener(new ActionListener() {
|
||||||
clearVizButton.setActionCommand(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.clearVizButton.actionCommand")); // NOI18N
|
|
||||||
clearVizButton.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
clearVizButtonActionPerformed(evt);
|
zoomActualButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
toolbar.add(zoomActualButton);
|
||||||
|
|
||||||
jSeparator2.setOrientation(SwingConstants.VERTICAL);
|
zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N
|
||||||
|
zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N
|
||||||
backButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_previous.png"))); // NOI18N
|
zoomInButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N
|
||||||
backButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.text_1")); // NOI18N
|
zoomInButton.setFocusable(false);
|
||||||
backButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.backButton.toolTipText")); // NOI18N
|
zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
backButton.addActionListener(new ActionListener() {
|
zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
|
zoomInButton.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
backButtonActionPerformed(evt);
|
zoomInButtonActionPerformed(evt);
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
forwardButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/resultset_next.png"))); // NOI18N
|
|
||||||
forwardButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.text")); // NOI18N
|
|
||||||
forwardButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.forwardButton.toolTipText")); // NOI18N
|
|
||||||
forwardButton.setHorizontalTextPosition(SwingConstants.LEADING);
|
|
||||||
forwardButton.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent evt) {
|
|
||||||
forwardButtonActionPerformed(evt);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
toolbar.add(zoomInButton);
|
||||||
|
toolbar.add(jSeparator1);
|
||||||
|
|
||||||
snapshotButton.setIcon(new 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(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.text_1")); // NOI18N
|
snapshotButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.text_1")); // NOI18N
|
||||||
snapshotButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.toolTipText")); // NOI18N
|
snapshotButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.snapshotButton.toolTipText")); // NOI18N
|
||||||
|
snapshotButton.setFocusable(false);
|
||||||
|
snapshotButton.setHorizontalTextPosition(SwingConstants.CENTER);
|
||||||
|
snapshotButton.setVerticalTextPosition(SwingConstants.BOTTOM);
|
||||||
snapshotButton.addActionListener(new ActionListener() {
|
snapshotButton.addActionListener(new ActionListener() {
|
||||||
public void actionPerformed(ActionEvent evt) {
|
public void actionPerformed(ActionEvent evt) {
|
||||||
snapshotButtonActionPerformed(evt);
|
snapshotButtonActionPerformed(evt);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
toolbar.add(snapshotButton);
|
||||||
|
|
||||||
jSeparator3.setOrientation(SwingConstants.VERTICAL);
|
add(toolbar, BorderLayout.NORTH);
|
||||||
|
|
||||||
jSeparator4.setOrientation(SwingConstants.VERTICAL);
|
|
||||||
|
|
||||||
GroupLayout toolbarLayout = new GroupLayout(toolbar);
|
|
||||||
toolbar.setLayout(toolbarLayout);
|
|
||||||
toolbarLayout.setHorizontalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
|
|
||||||
.add(toolbarLayout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.add(backButton)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(forwardButton)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(jSeparator4, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(fastOrganicLayoutButton)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(clearVizButton)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(jSeparator2, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(zoomLabel)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(zoomPercentLabel)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(zoomOutButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(zoomInButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(zoomActualButton, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(fitZoomButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(jSeparator3, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(LayoutStyle.RELATED)
|
|
||||||
.add(snapshotButton)
|
|
||||||
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
||||||
);
|
|
||||||
toolbarLayout.setVerticalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
|
|
||||||
.add(toolbarLayout.createSequentialGroup()
|
|
||||||
.add(3, 3, 3)
|
|
||||||
.add(toolbarLayout.createParallelGroup(GroupLayout.CENTER)
|
|
||||||
.add(fastOrganicLayoutButton)
|
|
||||||
.add(zoomOutButton)
|
|
||||||
.add(zoomInButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.add(zoomActualButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.add(fitZoomButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.add(zoomLabel)
|
|
||||||
.add(zoomPercentLabel)
|
|
||||||
.add(clearVizButton)
|
|
||||||
.add(jSeparator2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.add(backButton)
|
|
||||||
.add(forwardButton)
|
|
||||||
.add(snapshotButton)
|
|
||||||
.add(jSeparator3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.add(jSeparator4, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
||||||
.add(3, 3, 3))
|
|
||||||
);
|
|
||||||
|
|
||||||
borderLayoutPanel.add(toolbar, BorderLayout.PAGE_START);
|
|
||||||
borderLayoutPanel.add(notificationsJFXPanel, BorderLayout.PAGE_END);
|
|
||||||
|
|
||||||
splitPane.setLeftComponent(borderLayoutPanel);
|
|
||||||
|
|
||||||
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
|
||||||
@ -726,6 +691,10 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
}
|
}
|
||||||
}//GEN-LAST:event_snapshotButtonActionPerformed
|
}//GEN-LAST:event_snapshotButtonActionPerformed
|
||||||
|
|
||||||
|
private void fastOrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fastOrganicLayoutButtonActionPerformed
|
||||||
|
// TODO add your handling code here:
|
||||||
|
}//GEN-LAST:event_fastOrganicLayoutButtonActionPerformed
|
||||||
|
|
||||||
private void fitGraph() {
|
private void fitGraph() {
|
||||||
graphComponent.zoomTo(1, true);
|
graphComponent.zoomTo(1, true);
|
||||||
mxPoint translate = graph.getView().getTranslate();
|
mxPoint translate = graph.getView().getTranslate();
|
||||||
@ -883,15 +852,14 @@ final public class VisualizationPanel extends JPanel {
|
|||||||
private JButton fastOrganicLayoutButton;
|
private JButton fastOrganicLayoutButton;
|
||||||
private JButton fitZoomButton;
|
private JButton fitZoomButton;
|
||||||
private JButton forwardButton;
|
private JButton forwardButton;
|
||||||
|
private JToolBar.Separator jSeparator1;
|
||||||
private JToolBar.Separator jSeparator2;
|
private JToolBar.Separator jSeparator2;
|
||||||
private JToolBar.Separator jSeparator3;
|
private JToolBar.Separator jSeparator3;
|
||||||
private JToolBar.Separator jSeparator4;
|
|
||||||
private JTextArea jTextArea1;
|
private JTextArea jTextArea1;
|
||||||
private JFXPanel notificationsJFXPanel;
|
private JFXPanel notificationsJFXPanel;
|
||||||
private JPanel placeHolderPanel;
|
private JPanel placeHolderPanel;
|
||||||
private JButton snapshotButton;
|
private JButton snapshotButton;
|
||||||
private JSplitPane splitPane;
|
private JToolBar toolbar;
|
||||||
private JPanel toolbar;
|
|
||||||
private JButton zoomActualButton;
|
private JButton zoomActualButton;
|
||||||
private JButton zoomInButton;
|
private JButton zoomInButton;
|
||||||
private JLabel zoomLabel;
|
private JLabel zoomLabel;
|
||||||
|
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-180.png
Executable file
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-180.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1022 B |
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-left.png
Executable file
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-left.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-right.png
Executable file
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow-right.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow.png
Executable file
BIN
Core/src/org/sleuthkit/autopsy/communications/images/arrow.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
@ -199,7 +199,7 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan
|
|||||||
imageTaggingOptions.setPopupSize(300, 150);
|
imageTaggingOptions.setPopupSize(300, 150);
|
||||||
|
|
||||||
//Disable image tagging for non-windows users or upon failure to load OpenCV.
|
//Disable image tagging for non-windows users or upon failure to load OpenCV.
|
||||||
if (!PlatformUtil.isWindowsOS() || !OpenCvLoader.hasOpenCvLoaded()) {
|
if (!PlatformUtil.isWindowsOS() || !OpenCvLoader.openCvIsLoaded()) {
|
||||||
tagsMenu.setEnabled(false);
|
tagsMenu.setEnabled(false);
|
||||||
imageTaggingOptions.setEnabled(false);
|
imageTaggingOptions.setEnabled(false);
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,7 @@ import static org.sleuthkit.autopsy.corecomponents.Bundle.*;
|
|||||||
import org.sleuthkit.autopsy.corecomponents.ResultViewerPersistence.SortCriterion;
|
import org.sleuthkit.autopsy.corecomponents.ResultViewerPersistence.SortCriterion;
|
||||||
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
import org.sleuthkit.autopsy.coreutils.ImageUtils;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
import org.sleuthkit.autopsy.uicomponents.WrapLayout;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
|
@ -16,10 +16,8 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.sleuthkit.autopsy.coreutils;
|
package org.sleuthkit.autopsy.coreutils;
|
||||||
|
|
||||||
import java.io.Closeable;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
@ -43,11 +41,12 @@ import org.sleuthkit.datamodel.SleuthkitCase;
|
|||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An abstraction around an SQLite app DB found in a data source.
|
* An abstraction around an SQLite app DB found in a data source. This class
|
||||||
* This class makes a copy of it, along with any meta files (WAL, SHM),
|
* makes a copy of it, along with any meta files (WAL, SHM), opens a SQLite
|
||||||
* opens a SQLite connection to it, and runs queries on it.
|
* connection to it, and runs queries on it.
|
||||||
*/
|
*/
|
||||||
public final class AppSQLiteDB {
|
public final class AppSQLiteDB {
|
||||||
|
|
||||||
private final Logger logger = Logger.getLogger(AppSQLiteDB.class.getName());
|
private final Logger logger = Logger.getLogger(AppSQLiteDB.class.getName());
|
||||||
|
|
||||||
private final AbstractFile dbAbstractFile; // AbstractFile for the DB file
|
private final AbstractFile dbAbstractFile; // AbstractFile for the DB file
|
||||||
@ -55,12 +54,12 @@ public final class AppSQLiteDB {
|
|||||||
private final Connection connection;
|
private final Connection connection;
|
||||||
private final Statement statement;
|
private final Statement statement;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to abstract the abstract file for a DB file and its on disk copy
|
* Class to abstract the abstract file for a DB file and its on disk copy
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private static final class AppSQLiteDBFileBundle {
|
private static final class AppSQLiteDBFileBundle {
|
||||||
|
|
||||||
private final AbstractFile dbAbstractFile;
|
private final AbstractFile dbAbstractFile;
|
||||||
private final File dbFileCopy;
|
private final File dbFileCopy;
|
||||||
|
|
||||||
@ -87,30 +86,31 @@ public final class AppSQLiteDB {
|
|||||||
statement = connection.createStatement();
|
statement = connection.createStatement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Looks for the given SQLIte database filename, with matching path substring.
|
* Looks for application SQLite database files with a given name or name
|
||||||
* It looks for exact name or a pattern match based on a input parameter.
|
* substring and a given parent path or parent path substring. For each
|
||||||
* It makes a copy of each matching file, and creates an instance of
|
* database file found, a temporary copy is made and an open connection to
|
||||||
* AppSQLiteDB to help query the DB.
|
* the database in the form of an AppSQLiteDB object is created and
|
||||||
|
* returned.
|
||||||
*
|
*
|
||||||
* A list of AppSQLiteDB instances is returned, one for each
|
* @param dataSource The data source to be searched for the database
|
||||||
* match found.
|
* files.
|
||||||
|
* @param dbFileName The database file name or file name substring for
|
||||||
|
* which to search.
|
||||||
|
* @param matchExactName Whether or not the database file name argument is
|
||||||
|
* the full database file name or a substring.
|
||||||
|
* @param parentPathSubstr The parent path substring, may pass the empty
|
||||||
|
* string to match any parent path.
|
||||||
*
|
*
|
||||||
* @param dataSource data source to search in
|
* @return A list, possibly empty, of AppSQLiteDB objects for the files that
|
||||||
* @param dbName db file name to search
|
* were found, copied, and connected to.
|
||||||
* @param matchExactName whether to look for exact file name or a pattern match
|
|
||||||
* @param parentPathSubstr path substring to match
|
|
||||||
*
|
|
||||||
* @return A list of abstract files matching the specified name and path.
|
|
||||||
* Returns an empty list if no matching database is found.
|
|
||||||
*/
|
*/
|
||||||
public static Collection<AppSQLiteDB> findAppDatabases(DataSource dataSource,
|
public static Collection<AppSQLiteDB> findAppDatabases(DataSource dataSource,
|
||||||
String dbName, boolean matchExactName, String parentPathSubstr) {
|
String dbFileName, boolean matchExactName, String parentPathSubstr) {
|
||||||
|
|
||||||
List<AppSQLiteDB> appDbs = new ArrayList<> ();
|
List<AppSQLiteDB> appDbs = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
Collection<AppSQLiteDBFileBundle> dbFileBundles = findAndCopySQLiteDB( dataSource, dbName, matchExactName, parentPathSubstr, false);
|
Collection<AppSQLiteDBFileBundle> dbFileBundles = findAndCopySQLiteDB(dataSource, dbFileName, matchExactName, parentPathSubstr, false);
|
||||||
dbFileBundles.forEach((dbFileBundle) -> {
|
dbFileBundles.forEach((dbFileBundle) -> {
|
||||||
try {
|
try {
|
||||||
AppSQLiteDB appSQLiteDB = new AppSQLiteDB(dbFileBundle);
|
AppSQLiteDB appSQLiteDB = new AppSQLiteDB(dbFileBundle);
|
||||||
@ -120,7 +120,7 @@ public final class AppSQLiteDB {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (TskCoreException ex) {
|
} catch (TskCoreException ex) {
|
||||||
Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error finding App database files with name = '%s' and path = '%s'.", dbName, parentPathSubstr), ex); //NON-NLS
|
Logger.getLogger(AppSQLiteDB.class.getName()).log(Level.SEVERE, String.format("Error finding App database files with name = '%s' and path = '%s'.", dbFileName, parentPathSubstr), ex); //NON-NLS
|
||||||
}
|
}
|
||||||
|
|
||||||
return appDbs;
|
return appDbs;
|
||||||
@ -133,17 +133,17 @@ public final class AppSQLiteDB {
|
|||||||
/**
|
/**
|
||||||
* Attaches a database to the current connection.
|
* Attaches a database to the current connection.
|
||||||
*
|
*
|
||||||
* Finds the specified database file in the specified folder.
|
* Finds the specified database file in the specified folder. If found,
|
||||||
* If found, makes copy of the database in the case folder and
|
* makes copy of the database in the case folder and run ATTACH DATABASE
|
||||||
* run ATTACH DATABASE sql.
|
* sql.
|
||||||
*
|
*
|
||||||
* @param dataSource data source in which to look file the db file
|
* @param dataSource data source in which to look file the db file
|
||||||
* @param dbName name of db file to look for
|
* @param dbName name of db file to look for
|
||||||
* @param dbPath path in which to look for the db file
|
* @param dbPath path in which to look for the db file
|
||||||
* @param dbAlias alias name to attach the database as
|
* @param dbAlias alias name to attach the database as
|
||||||
*
|
*
|
||||||
* @return abstract file for the matching db file.
|
* @return abstract file for the matching db file. null if no match is
|
||||||
* null if no match is found.
|
* found.
|
||||||
*
|
*
|
||||||
* @throws SQLException in case of an SQL error
|
* @throws SQLException in case of an SQL error
|
||||||
*/
|
*/
|
||||||
@ -167,14 +167,17 @@ public final class AppSQLiteDB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds database file with the specified name, makes a copy of the file in the case directory,
|
* Finds database file with the specified name, makes a copy of the file in
|
||||||
* and returns the AbstractFile as well as the file copy.
|
* the case directory, and returns the AbstractFile as well as the file
|
||||||
|
* copy.
|
||||||
*
|
*
|
||||||
* @param dataSource data source to search in
|
* @param dataSource data source to search in
|
||||||
* @param dbName db file name to search
|
* @param dbName db file name to search
|
||||||
* @param matchExactName whether to look for exact file name or a pattern match
|
* @param matchExactName whether to look for exact file name or a pattern
|
||||||
|
* match
|
||||||
* @param dbPath path to match
|
* @param dbPath path to match
|
||||||
* @param matchExactPath whether to look for exact path name or a substring match
|
* @param matchExactPath whether to look for exact path name or a substring
|
||||||
|
* match
|
||||||
*
|
*
|
||||||
* @return a collection of AppSQLiteDBFileBundle
|
* @return a collection of AppSQLiteDBFileBundle
|
||||||
*
|
*
|
||||||
@ -190,7 +193,7 @@ public final class AppSQLiteDB {
|
|||||||
throw new TskCoreException("Failed to get current case.", ex);
|
throw new TskCoreException("Failed to get current case.", ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<AppSQLiteDBFileBundle> dbFileBundles = new ArrayList<> ();
|
List<AppSQLiteDBFileBundle> dbFileBundles = new ArrayList<>();
|
||||||
long fileId = 0;
|
long fileId = 0;
|
||||||
String localDiskPath = "";
|
String localDiskPath = "";
|
||||||
|
|
||||||
@ -202,12 +205,12 @@ public final class AppSQLiteDB {
|
|||||||
if (matchExactName) {
|
if (matchExactName) {
|
||||||
whereClause = String.format("LOWER(name) = LOWER('%s')", dbName);
|
whereClause = String.format("LOWER(name) = LOWER('%s')", dbName);
|
||||||
} else {
|
} else {
|
||||||
whereClause = String.format("LOWER(name) LIKE LOWER('%%%s%%') AND LOWER(name) NOT LIKE LOWER('%%journal%%')", dbName );
|
whereClause = String.format("LOWER(name) LIKE LOWER('%%%s%%') AND LOWER(name) NOT LIKE LOWER('%%journal%%')", dbName);
|
||||||
}
|
}
|
||||||
if (matchExactPath) {
|
if (matchExactPath) {
|
||||||
whereClause += String.format(" AND LOWER(parent_path) = LOWER('%s')", parentPath );
|
whereClause += String.format(" AND LOWER(parent_path) = LOWER('%s')", parentPath);
|
||||||
} else {
|
} else {
|
||||||
whereClause += String.format(" AND LOWER(parent_path) LIKE LOWER('%%%s%%')", parentPath );
|
whereClause += String.format(" AND LOWER(parent_path) LIKE LOWER('%%%s%%')", parentPath);
|
||||||
}
|
}
|
||||||
whereClause += String.format(" AND data_source_obj_id = %s", dataSource.getId());
|
whereClause += String.format(" AND data_source_obj_id = %s", dataSource.getId());
|
||||||
|
|
||||||
@ -249,10 +252,9 @@ public final class AppSQLiteDB {
|
|||||||
statement.executeUpdate(detachDbSql); //NON-NLS
|
statement.executeUpdate(detachDbSql); //NON-NLS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs the given query on the database and returns result set.
|
* Runs the given query on the database and returns result set.
|
||||||
|
*
|
||||||
* @param queryStr SQL string for the query to run
|
* @param queryStr SQL string for the query to run
|
||||||
*
|
*
|
||||||
* @return ResultSet from running the query.
|
* @return ResultSet from running the query.
|
||||||
@ -284,8 +286,6 @@ public final class AppSQLiteDB {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches for a meta file associated with the give SQLite database. If
|
* Searches for a meta file associated with the give SQLite database. If
|
||||||
* found, it copies this file into the temp directory of the current case.
|
* found, it copies this file into the temp directory of the current case.
|
||||||
|
@ -121,7 +121,7 @@ public class ImageUtils {
|
|||||||
}
|
}
|
||||||
DEFAULT_THUMBNAIL = tempImage;
|
DEFAULT_THUMBNAIL = tempImage;
|
||||||
boolean tempFfmpegLoaded = false;
|
boolean tempFfmpegLoaded = false;
|
||||||
if (OpenCvLoader.hasOpenCvLoaded()) {
|
if (OpenCvLoader.openCvIsLoaded()) {
|
||||||
try {
|
try {
|
||||||
if (System.getProperty("os.arch").equals("amd64") || System.getProperty("os.arch").equals("x86_64")) { //NON-NLS
|
if (System.getProperty("os.arch").equals("amd64") || System.getProperty("os.arch").equals("x86_64")) { //NON-NLS
|
||||||
System.loadLibrary("opencv_ffmpeg248_64"); //NON-NLS
|
System.loadLibrary("opencv_ffmpeg248_64"); //NON-NLS
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
*
|
*
|
||||||
* 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
|
||||||
@ -30,108 +30,211 @@ import java.sql.Statement;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database connection class & utilities.
|
* An abstraction that loads a given SQLite driver, establishes a connection to
|
||||||
|
* a given database, and creates a statement for the connection to support basic
|
||||||
|
* SQL operations on the database.
|
||||||
*/
|
*/
|
||||||
public class SQLiteDBConnect implements AutoCloseable {
|
public class SQLiteDBConnect implements AutoCloseable {
|
||||||
|
|
||||||
public String sDriver = "";
|
|
||||||
public String sUrl = null;
|
|
||||||
public int iTimeout = 30;
|
|
||||||
public Connection conn = null;
|
|
||||||
public Statement statement = null;
|
|
||||||
private static final Logger logger = Logger.getLogger(SQLiteDBConnect.class.getName());
|
private static final Logger logger = Logger.getLogger(SQLiteDBConnect.class.getName());
|
||||||
|
private static final int STMT_EXEC_TIMEOUT_SECS = 30;
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Stub constructor for quick instantiation o/t fly for using some of the
|
* Constructs an abstraction that loads a given SQLite driver, establishes a
|
||||||
* ancillary stuff
|
* connection to a given database, and creates a statement for the
|
||||||
|
* connection to support basic SQL operations on the database.
|
||||||
|
*
|
||||||
|
* @param driver The SQLite driver class name.
|
||||||
|
* @param url The SQLite database URL to which to connect.
|
||||||
|
*
|
||||||
|
* @throws SQLException If there is an error loading the driver,
|
||||||
|
* establishing the connection, or creating a statement
|
||||||
|
* for the connection.
|
||||||
*/
|
*/
|
||||||
public SQLiteDBConnect() {
|
public SQLiteDBConnect(String driver, String url) throws SQLException {
|
||||||
}
|
sDriver = driver;
|
||||||
|
sUrl = url;
|
||||||
/*
|
|
||||||
* quick and dirty constructor to test the database passing the
|
|
||||||
* DriverManager name and the fully loaded url to handle
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* NB this will typically be available if you make this class concrete and
|
|
||||||
* not abstract
|
|
||||||
*/
|
|
||||||
public SQLiteDBConnect(String sDriverToLoad, String sUrlToLoad) throws SQLException {
|
|
||||||
init(sDriverToLoad, sUrlToLoad);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void init(String sDriverVar, String sUrlVar) throws SQLException {
|
|
||||||
setDriver(sDriverVar);
|
|
||||||
setUrl(sUrlVar);
|
|
||||||
setConnection();
|
|
||||||
setStatement();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setDriver(String sDriverVar) {
|
|
||||||
sDriver = sDriverVar;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUrl(String sUrlVar) {
|
|
||||||
sUrl = sUrlVar;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setConnection() throws SQLException {
|
|
||||||
try {
|
try {
|
||||||
Class.forName(sDriver);
|
Class.forName(sDriver);
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException ex) {
|
||||||
|
throw new SQLException(ex);
|
||||||
}
|
}
|
||||||
conn = DriverManager.getConnection(sUrl);
|
conn = DriverManager.getConnection(sUrl);
|
||||||
}
|
|
||||||
|
|
||||||
public Connection getConnection() {
|
|
||||||
return conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStatement() throws SQLException {
|
|
||||||
if (conn == null) {
|
|
||||||
setConnection();
|
|
||||||
}
|
|
||||||
statement = conn.createStatement();
|
statement = conn.createStatement();
|
||||||
statement.setQueryTimeout(iTimeout); // set timeout to 30 sec.
|
statement.setQueryTimeout(STMT_EXEC_TIMEOUT_SECS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Statement getStatement() {
|
/**
|
||||||
return statement;
|
* Executes an SQL statement. For use with statements that do not return
|
||||||
}
|
* result sets.
|
||||||
|
|
||||||
public void executeStmt(String instruction) throws SQLException {
|
|
||||||
statement.executeUpdate(instruction);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** processes an array of instructions e.g. a set of SQL command strings
|
|
||||||
* passed from a file
|
|
||||||
*
|
*
|
||||||
* NB you should ensure you either handle empty lines in files by either
|
* @param sqlStatement The SQL statement to execute.
|
||||||
* removing them or parsing them out since they will generate spurious
|
*
|
||||||
* SQLExceptions when they are encountered during the iteration....
|
* @throws SQLException If there is an error executing the statement.
|
||||||
*/
|
*/
|
||||||
public void executeStmt(String[] instructionSet) throws SQLException {
|
public void executeStmt(String sqlStatement) throws SQLException {
|
||||||
for (int i = 0; i < instructionSet.length; i++) {
|
statement.executeUpdate(sqlStatement);
|
||||||
executeStmt(instructionSet[i]);
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes one or more SQL statements in sequence. For use with statements
|
||||||
|
* that do not return result sets.
|
||||||
|
*
|
||||||
|
* @param sqlStatements The SQL statements to execute.
|
||||||
|
*
|
||||||
|
* @throws SQLException If there is an error executing the statements.
|
||||||
|
*/
|
||||||
|
public void executeStmt(String[] sqlStatements) throws SQLException {
|
||||||
|
for (String stmt : sqlStatements) {
|
||||||
|
executeStmt(stmt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultSet executeQry(String instruction) throws SQLException {
|
/**
|
||||||
return statement.executeQuery(instruction);
|
* Executes an SQL query and returns a result set. The caller should close
|
||||||
|
* the result set when finished with it, and should not make any other calls
|
||||||
|
* on this object until finished with the result set.
|
||||||
|
*
|
||||||
|
* @param sqlStatement The SQL query to execute.
|
||||||
|
*
|
||||||
|
* @return The result set.
|
||||||
|
*
|
||||||
|
* @throws SQLException If there is an error executing the query.
|
||||||
|
*/
|
||||||
|
public ResultSet executeQry(String sqlStatement) throws SQLException {
|
||||||
|
return statement.executeQuery(sqlStatement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the connection to the database. Should be called when the use of
|
||||||
|
* this object is completed, unless the object was constructed in a try with
|
||||||
|
* resources statement, in which case the closing is automatic when the
|
||||||
|
* object goes out of scope.
|
||||||
|
*/
|
||||||
public void closeConnection() {
|
public void closeConnection() {
|
||||||
|
if (conn == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
conn.close();
|
conn.close();
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
logger.log(Level.WARNING, "Unable to close connection to SQLite DB at " + sUrl, ex);
|
logger.log(Level.WARNING, "Unable to close connection to SQLite DB at " + sUrl, ex);
|
||||||
}
|
}
|
||||||
//Implementing Autoclosable.close() allows this class to be used in try-with-resources.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
closeConnection();
|
closeConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Partially constructs a utility object for doing basic operations on a
|
||||||
|
* SQLite database. The object is not in a usable state. Further
|
||||||
|
* initialization is required. See methods below.
|
||||||
|
*
|
||||||
|
* @deprecated Do not use.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public SQLiteDBConnect() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a given SQLite driver, establishes a connection to a given
|
||||||
|
* database, and creates a statement for the connection.
|
||||||
|
*
|
||||||
|
* @param driver The SQLite driver class name.
|
||||||
|
* @param url The SQLite database URL to which to connect.
|
||||||
|
*
|
||||||
|
* @throws SQLException If there is an error establishing the connection or
|
||||||
|
* creating a statement for the connection.
|
||||||
|
*
|
||||||
|
* @deprecated Do not use.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public final void init(String driver, String url) throws SQLException {
|
||||||
|
sDriver = driver;
|
||||||
|
sUrl = url;
|
||||||
|
closeConnection();
|
||||||
|
setConnection();
|
||||||
|
setStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets or resets the connection to the SQLite database, if the SQLite
|
||||||
|
* driver and the database URL have been set.
|
||||||
|
*
|
||||||
|
* @throws SQLException If there is an error loading the driver or
|
||||||
|
* establishing the connection.
|
||||||
|
*
|
||||||
|
* @deprecated Do not use.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public void setConnection() throws SQLException {
|
||||||
|
if (sDriver == null || sDriver.isEmpty() || sUrl == null || sUrl.isEmpty()) {
|
||||||
|
throw new SQLException("Driver and or databse URl not initialized");
|
||||||
|
}
|
||||||
|
closeConnection();
|
||||||
|
try {
|
||||||
|
Class.forName(sDriver);
|
||||||
|
} catch (ClassNotFoundException ex) {
|
||||||
|
throw new SQLException(ex);
|
||||||
|
}
|
||||||
|
conn = DriverManager.getConnection(sUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the connection, if any, to the database.
|
||||||
|
*
|
||||||
|
* @return The connection to the database, may be null.
|
||||||
|
*
|
||||||
|
* @deprecated Do not use.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public Connection getConnection() {
|
||||||
|
return conn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a connection to the database if there is none, and creates a
|
||||||
|
* statement using the connection.
|
||||||
|
*
|
||||||
|
* @throws SQLException If there is an error creating the connection or the
|
||||||
|
* staement.
|
||||||
|
*
|
||||||
|
* @deprecated Do not use.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public void setStatement() throws SQLException {
|
||||||
|
if (conn == null) {
|
||||||
|
setConnection();
|
||||||
|
}
|
||||||
|
statement = conn.createStatement();
|
||||||
|
statement.setQueryTimeout(iTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the statement, if any, associated with the connection to the
|
||||||
|
* database, if any.
|
||||||
|
*
|
||||||
|
* @return The statement, may be null.
|
||||||
|
*
|
||||||
|
* @deprecated Do not use.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public Statement getStatement() {
|
||||||
|
return statement;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The lack of encapsulation of these fields is an error. Access to them
|
||||||
|
* outside of instances of this class is deprecated.
|
||||||
|
*
|
||||||
|
* @deprecated Do not access.
|
||||||
|
*/
|
||||||
|
public String sDriver = "";
|
||||||
|
public String sUrl = null;
|
||||||
|
public int iTimeout = STMT_EXEC_TIMEOUT_SECS;
|
||||||
|
public Connection conn = null;
|
||||||
|
public Statement statement = null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,8 +70,8 @@ final class ConfigVisualPanel1 extends JPanel {
|
|||||||
ConfigVisualPanel1() {
|
ConfigVisualPanel1() {
|
||||||
initComponents();
|
initComponents();
|
||||||
configFileTextField.getDocument().addDocumentListener(new MyDocumentListener(this));
|
configFileTextField.getDocument().addDocumentListener(new MyDocumentListener(this));
|
||||||
refreshDriveList();
|
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
refreshDriveList();
|
||||||
updateControls();
|
updateControls();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -2,3 +2,15 @@ OpenIDE-Module-Name=Report
|
|||||||
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
||||||
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
||||||
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
||||||
|
ReportProgressPanel.pathLabel.text=pathLabel
|
||||||
|
ReportProgressPanel.reportLabel.text=reportLabel
|
||||||
|
ReportProgressPanel.statusMessageLabel.text=processingLabel
|
||||||
|
ReportProgressPanel.separationLabel.text=:
|
||||||
|
ReportProgressPanel.initPathLabel.noFile=<html><u>No report file</u></html>
|
||||||
|
ReportProgressPanel.start.cancelButton.text=Cancel
|
||||||
|
ReportProgressPanel.start.progress.text=Starting report...
|
||||||
|
ReportProgressPanel.complete.processLbl.text=Complete
|
||||||
|
ReportProgressPanel.complete.processLb2.text=Completed with error
|
||||||
|
ReportProgressPanel.complete.cancelButton.text=Complete
|
||||||
|
ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
|
||||||
|
ReportProgressPanel.cancel.procLbl.text=Canceled
|
||||||
|
@ -2,3 +2,20 @@ OpenIDE-Module-Name=Report
|
|||||||
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
DefaultReportConfigurationPanel.infoLabel.text=This report will be configured on the next screen.
|
||||||
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
ReportBranding.defaultReportTitle.text=Autopsy Forensic Report
|
||||||
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
ReportBranding.defaultReportFooter.text=Powered by Autopsy Open Source Digital Forensics Platform - www.sleuthkit.org
|
||||||
|
ReportProgressPanel.pathLabel.text=pathLabel
|
||||||
|
ReportProgressPanel.progress.canceled=Canceled
|
||||||
|
ReportProgressPanel.progress.complete=Complete
|
||||||
|
ReportProgressPanel.progress.error=Error
|
||||||
|
ReportProgressPanel.progress.queuing=Queuing...
|
||||||
|
ReportProgressPanel.progress.running=Running...
|
||||||
|
ReportProgressPanel.reportLabel.text=reportLabel
|
||||||
|
ReportProgressPanel.statusMessageLabel.text=processingLabel
|
||||||
|
ReportProgressPanel.separationLabel.text=:
|
||||||
|
ReportProgressPanel.initPathLabel.noFile=<html><u>No report file</u></html>
|
||||||
|
ReportProgressPanel.start.cancelButton.text=Cancel
|
||||||
|
ReportProgressPanel.start.progress.text=Starting report...
|
||||||
|
ReportProgressPanel.complete.processLbl.text=Complete
|
||||||
|
ReportProgressPanel.complete.processLb2.text=Completed with error
|
||||||
|
ReportProgressPanel.complete.cancelButton.text=Complete
|
||||||
|
ReportProgressPanel.cancel.cancelButton.toolTipText=Canceled
|
||||||
|
ReportProgressPanel.cancel.procLbl.text=Canceled
|
||||||
|
@ -2,3 +2,7 @@ OpenIDE-Module-Name=\u30ec\u30dd\u30fc\u30c8
|
|||||||
DefaultReportConfigurationPanel.infoLabel.text=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u3067\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002
|
DefaultReportConfigurationPanel.infoLabel.text=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u3067\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002
|
||||||
ReportBranding.defaultReportTitle.text=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30ec\u30dd\u30fc\u30c8
|
ReportBranding.defaultReportTitle.text=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30ec\u30dd\u30fc\u30c8
|
||||||
ReportBranding.defaultReportFooter.text=Autopsy\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30fb\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306b\u3088\u308a\u63d0\u4f9b - www.sleuthkit.org
|
ReportBranding.defaultReportFooter.text=Autopsy\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30fb\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306b\u3088\u308a\u63d0\u4f9b - www.sleuthkit.org
|
||||||
|
ReportProgressPanel.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
|
||||||
|
ReportProgressPanel.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
|
||||||
|
ReportProgressPanel.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
|
||||||
|
ReportProgressPanel.separationLabel.text=:
|
||||||
|
@ -63,7 +63,7 @@ public final class ReportBranding implements ReportBrandingProviderI {
|
|||||||
//initialize with extracting of resource files if needed, ensure 1 writer at a time
|
//initialize with extracting of resource files if needed, ensure 1 writer at a time
|
||||||
synchronized (ReportBranding.class) {
|
synchronized (ReportBranding.class) {
|
||||||
|
|
||||||
reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.REPORTS_DIR + File.separator
|
reportsBrandingDir = PlatformUtil.getUserConfigDirectory() + File.separator + ReportGenerator.getReportsDirectory() + File.separator
|
||||||
+ "branding"; //NON-NLS
|
+ "branding"; //NON-NLS
|
||||||
File brandingDir = new File(reportsBrandingDir);
|
File brandingDir = new File(reportsBrandingDir);
|
||||||
if (!brandingDir.exists()) {
|
if (!brandingDir.exists()) {
|
||||||
|
@ -79,7 +79,7 @@
|
|||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
<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/report/infrastructure/Bundle.properties" key="ReportProgressDialog.reportLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.reportLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
@ -91,7 +91,7 @@
|
|||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
<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/report/infrastructure/Bundle.properties" key="ReportProgressDialog.pathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.pathLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="verticalAlignment" type="int" value="1"/>
|
<Property name="verticalAlignment" type="int" value="1"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
@ -104,14 +104,14 @@
|
|||||||
</FontInfo>
|
</FontInfo>
|
||||||
</Property>
|
</Property>
|
||||||
<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/report/infrastructure/Bundle.properties" key="ReportProgressDialog.separationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.separationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="statusMessageLabel">
|
<Component class="javax.swing.JLabel" name="statusMessageLabel">
|
||||||
<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/report/infrastructure/Bundle.properties" key="ReportProgressDialog.statusMessageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
<ResourceString bundle="org/sleuthkit/autopsy/report/Bundle.properties" key="ReportProgressPanel.statusMessageLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
</Property>
|
</Property>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
381
Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
Executable file → Normal file
381
Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java
Executable file → Normal file
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2019 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");
|
||||||
@ -18,23 +18,137 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.report;
|
package org.sleuthkit.autopsy.report;
|
||||||
|
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Cursor;
|
||||||
|
import java.awt.Desktop;
|
||||||
|
import java.awt.EventQueue;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.event.MouseListener;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This interface is necessary in order to not break backwards compatibility of
|
* A panel used by a report generation module to show progress.
|
||||||
* GeneralReportModule interface. See JIRA-5354.
|
|
||||||
*/
|
*/
|
||||||
public interface ReportProgressPanel {
|
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||||
|
public class ReportProgressPanel extends javax.swing.JPanel {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private static final Logger logger = Logger.getLogger(ReportProgressPanel.class.getName());
|
||||||
|
private static final Color GREEN = new Color(50, 205, 50);
|
||||||
|
private static final Color RED = new Color(178, 34, 34);
|
||||||
|
private volatile ReportStatus status;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used by a report generation module to communicate report generation
|
* Used by a report generation module to communicate report generation
|
||||||
* status to this panel and its listeners.
|
* status to this panel and its listeners.
|
||||||
*/
|
*/
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressPanel.progress.queuing=Queuing...",
|
||||||
|
"ReportProgressPanel.progress.running=Running...",
|
||||||
|
"ReportProgressPanel.progress.complete=Complete",
|
||||||
|
"ReportProgressPanel.progress.canceled=Canceled",
|
||||||
|
"ReportProgressPanel.progress.error=Error",})
|
||||||
public enum ReportStatus {
|
public enum ReportStatus {
|
||||||
|
|
||||||
QUEUING,
|
QUEUING(Bundle.ReportProgressPanel_progress_queuing()),
|
||||||
RUNNING,
|
RUNNING(Bundle.ReportProgressPanel_progress_running()),
|
||||||
COMPLETE,
|
COMPLETE(Bundle.ReportProgressPanel_progress_complete()),
|
||||||
CANCELED,
|
CANCELED(Bundle.ReportProgressPanel_progress_canceled()),
|
||||||
ERROR
|
ERROR(Bundle.ReportProgressPanel_progress_error());
|
||||||
|
|
||||||
|
private final String displayName;
|
||||||
|
|
||||||
|
ReportStatus(String displayName) {
|
||||||
|
this.displayName = displayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the display name of the report status.
|
||||||
|
*
|
||||||
|
* @return The display name.
|
||||||
|
*/
|
||||||
|
public String getDisplayName() {
|
||||||
|
return displayName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a panel used by report generation module to show progress.
|
||||||
|
*/
|
||||||
|
public ReportProgressPanel() {
|
||||||
|
initComponents();
|
||||||
|
reportProgressBar.setIndeterminate(true);
|
||||||
|
reportProgressBar.setMaximum(100);
|
||||||
|
statusMessageLabel.setText(Bundle.ReportProgressPanel_progress_queuing());
|
||||||
|
status = ReportStatus.QUEUING;
|
||||||
|
reportLabel.setText("");
|
||||||
|
pathLabel.setText(""); //NON-NLS
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets label text.
|
||||||
|
*
|
||||||
|
* @param reportName The name of the report being generated.
|
||||||
|
* @param reportPath The path to the report file.
|
||||||
|
*/
|
||||||
|
public final void setLabels(String reportName, String reportPath) {
|
||||||
|
reportLabel.setText(reportName);
|
||||||
|
if (null != reportPath) {
|
||||||
|
pathLabel.setText("<html><u>" + shortenPath(reportPath) + "</u></html>"); //NON-NLS
|
||||||
|
pathLabel.setToolTipText(reportPath);
|
||||||
|
String linkPath = reportPath;
|
||||||
|
pathLabel.addMouseListener(new MouseListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseClicked(MouseEvent mouseEvent) {
|
||||||
|
/*
|
||||||
|
* Do nothing for this event.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mousePressed(MouseEvent mouseEvent) {
|
||||||
|
/*
|
||||||
|
* Do nothing for this event.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent mouseEvent) {
|
||||||
|
File file = new File(linkPath);
|
||||||
|
try {
|
||||||
|
Desktop.getDesktop().open(file);
|
||||||
|
} catch (IOException ioex) {
|
||||||
|
logger.log(Level.SEVERE, "Error opening report file", ioex);
|
||||||
|
} catch (IllegalArgumentException iaEx) {
|
||||||
|
logger.log(Level.SEVERE, "Error opening report file", iaEx);
|
||||||
|
try {
|
||||||
|
Desktop.getDesktop().open(file.getParentFile());
|
||||||
|
} catch (IOException ioEx2) {
|
||||||
|
logger.log(Level.SEVERE, "Error opening report file parent", ioEx2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseEntered(MouseEvent e3) {
|
||||||
|
pathLabel.setForeground(Color.DARK_GRAY);
|
||||||
|
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseExited(MouseEvent e4) {
|
||||||
|
pathLabel.setForeground(Color.BLACK);
|
||||||
|
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
pathLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.initPathLabel.noFile"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,32 +156,66 @@ public interface ReportProgressPanel {
|
|||||||
*
|
*
|
||||||
* @return The report generation status as a ReportStatus enum.
|
* @return The report generation status as a ReportStatus enum.
|
||||||
*/
|
*/
|
||||||
public ReportStatus getStatus();
|
public ReportStatus getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the current status of the generation of the report.
|
||||||
|
*
|
||||||
|
* @param status The current status.
|
||||||
|
*/
|
||||||
|
protected void setStatus(ReportStatus status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts the progress bar component of this panel.
|
* Starts the progress bar component of this panel.
|
||||||
*/
|
*/
|
||||||
public void start();
|
public void start() {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.start.progress.text"));
|
||||||
|
status = ReportStatus.RUNNING;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the maximum value of the progress bar component of this panel.
|
* Sets the maximum value of the progress bar component of this panel.
|
||||||
*
|
*
|
||||||
* @param max The maximum value.
|
* @param max The maximum value.
|
||||||
*/
|
*/
|
||||||
public void setMaximumProgress(int max);
|
public void setMaximumProgress(int max) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
reportProgressBar.setMaximum(max);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Increments the current value of the progress bar component of this panel
|
* Increments the current value of the progress bar component of this panel
|
||||||
* by one unit.
|
* by one unit.
|
||||||
*/
|
*/
|
||||||
public void increment();
|
public void increment() {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
reportProgressBar.setValue(reportProgressBar.getValue() + 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the current value of the progress bar component of this panel.
|
* Sets the current value of the progress bar component of this panel.
|
||||||
*
|
*
|
||||||
* @param value The value to be set.
|
* @param value The value to be set.
|
||||||
*/
|
*/
|
||||||
public void setProgress(int value);
|
public void setProgress(int value) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
reportProgressBar.setValue(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes the the progress bar component of this panel to be determinate or
|
* Changes the the progress bar component of this panel to be determinate or
|
||||||
@ -76,7 +224,13 @@ public interface ReportProgressPanel {
|
|||||||
* @param indeterminate True if the progress bar should be set to
|
* @param indeterminate True if the progress bar should be set to
|
||||||
* indeterminate.
|
* indeterminate.
|
||||||
*/
|
*/
|
||||||
public void setIndeterminate(boolean indeterminate);
|
public void setIndeterminate(boolean indeterminate) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
reportProgressBar.setIndeterminate(indeterminate);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes the status message label component of this panel to show a given
|
* Changes the status message label component of this panel to show a given
|
||||||
@ -85,7 +239,13 @@ public interface ReportProgressPanel {
|
|||||||
*
|
*
|
||||||
* @param statusMessage String to use as label text.
|
* @param statusMessage String to use as label text.
|
||||||
*/
|
*/
|
||||||
public void updateStatusLabel(String statusMessage);
|
public void updateStatusLabel(String statusMessage) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
statusMessageLabel.setText(statusMessage);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes the components of this panel indicate the final status of
|
* Makes the components of this panel indicate the final status of
|
||||||
@ -93,7 +253,20 @@ public interface ReportProgressPanel {
|
|||||||
*
|
*
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||||
*/
|
*/
|
||||||
public void complete(ReportStatus reportStatus);
|
public void complete(ReportStatus reportStatus) {
|
||||||
|
|
||||||
|
switch (reportStatus) {
|
||||||
|
case COMPLETE:
|
||||||
|
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLbl.text"));
|
||||||
|
break;
|
||||||
|
case ERROR:
|
||||||
|
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressPanel.complete.processLb2.text"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
complete(reportStatus, "");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes the components of this panel indicate the final status of
|
* Makes the components of this panel indicate the final status of
|
||||||
@ -102,7 +275,174 @@ public interface ReportProgressPanel {
|
|||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
||||||
* @param statusMessage String to use as label or error text.
|
* @param statusMessage String to use as label or error text.
|
||||||
*/
|
*/
|
||||||
public void complete(ReportStatus reportStatus, String statusMessage);
|
public void complete(ReportStatus reportStatus, String statusMessage) {
|
||||||
|
EventQueue.invokeLater(() -> {
|
||||||
|
reportProgressBar.setIndeterminate(false);
|
||||||
|
if (status != ReportStatus.CANCELED) {
|
||||||
|
switch (reportStatus) {
|
||||||
|
case COMPLETE: {
|
||||||
|
ReportStatus oldValue = status;
|
||||||
|
status = ReportStatus.COMPLETE;
|
||||||
|
statusMessageLabel.setForeground(Color.BLACK);
|
||||||
|
statusMessageLabel.setText(statusMessage);
|
||||||
|
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
||||||
|
reportProgressBar.setStringPainted(true);
|
||||||
|
reportProgressBar.setForeground(GREEN);
|
||||||
|
reportProgressBar.setString(ReportStatus.COMPLETE.getDisplayName());
|
||||||
|
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ERROR: {
|
||||||
|
ReportStatus oldValue = status;
|
||||||
|
status = ReportStatus.ERROR;
|
||||||
|
statusMessageLabel.setForeground(RED);
|
||||||
|
statusMessageLabel.setText(statusMessage);
|
||||||
|
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
||||||
|
reportProgressBar.setStringPainted(true);
|
||||||
|
reportProgressBar.setForeground(RED);
|
||||||
|
reportProgressBar.setString(ReportStatus.ERROR.getDisplayName());
|
||||||
|
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes the components of this panel indicate generation of the report was
|
||||||
|
* cancelled.
|
||||||
|
*/
|
||||||
|
public void cancel() {
|
||||||
|
switch (status) {
|
||||||
|
case COMPLETE:
|
||||||
|
break;
|
||||||
|
case CANCELED:
|
||||||
|
break;
|
||||||
|
case ERROR:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ReportStatus oldValue = status;
|
||||||
|
status = ReportStatus.CANCELED;
|
||||||
|
reportProgressBar.setIndeterminate(false);
|
||||||
|
reportProgressBar.setValue(0);
|
||||||
|
reportProgressBar.setStringPainted(true);
|
||||||
|
reportProgressBar.setForeground(RED); // Red
|
||||||
|
reportProgressBar.setString(ReportStatus.CANCELED.getDisplayName());
|
||||||
|
firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
|
||||||
|
statusMessageLabel.setForeground(RED);
|
||||||
|
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.cancel.procLbl.text"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a shortened version of a file path.
|
||||||
|
*
|
||||||
|
* @param path The path to shorten.
|
||||||
|
*
|
||||||
|
* @return The shortened path.
|
||||||
|
*/
|
||||||
|
private String shortenPath(String path) {
|
||||||
|
if (path.length() > 100) {
|
||||||
|
return path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) + "..."
|
||||||
|
+ path.substring((path.length() - 70) + path.substring(path.length() - 70).indexOf(File.separator));
|
||||||
|
} else {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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() {
|
||||||
|
|
||||||
|
reportProgressBar = new javax.swing.JProgressBar();
|
||||||
|
reportLabel = new javax.swing.JLabel();
|
||||||
|
pathLabel = new javax.swing.JLabel();
|
||||||
|
separationLabel = new javax.swing.JLabel();
|
||||||
|
statusMessageLabel = new javax.swing.JLabel();
|
||||||
|
|
||||||
|
setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
setMinimumSize(new java.awt.Dimension(486, 68));
|
||||||
|
|
||||||
|
reportProgressBar.setFont(reportProgressBar.getFont().deriveFont(reportProgressBar.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
|
||||||
|
reportLabel.setFont(reportLabel.getFont().deriveFont(reportLabel.getFont().getStyle() | java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(reportLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.reportLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
pathLabel.setFont(pathLabel.getFont().deriveFont(pathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.pathLabel.text")); // NOI18N
|
||||||
|
pathLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
|
||||||
|
|
||||||
|
separationLabel.setFont(separationLabel.getFont().deriveFont(separationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(separationLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.separationLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(statusMessageLabel, org.openide.util.NbBundle.getMessage(ReportProgressPanel.class, "ReportProgressPanel.statusMessageLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
|
this.setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(statusMessageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(reportProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(reportLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(separationLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addComponent(reportProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(reportLabel)
|
||||||
|
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(separationLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(statusMessageLabel)
|
||||||
|
.addGap(13, 13, 13))
|
||||||
|
);
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JLabel pathLabel;
|
||||||
|
private javax.swing.JLabel reportLabel;
|
||||||
|
private javax.swing.JProgressBar reportProgressBar;
|
||||||
|
private javax.swing.JLabel separationLabel;
|
||||||
|
private javax.swing.JLabel statusMessageLabel;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a panel used by a report generation module to show progress.
|
||||||
|
*
|
||||||
|
* @param reportName The report name.
|
||||||
|
* @param reportPath The report path.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link #ReportProgressPanel()} and {@link #setLabels()}
|
||||||
|
* instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public ReportProgressPanel(String reportName, String reportPath) {
|
||||||
|
this();
|
||||||
|
setLabels(reportName, reportPath);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes the components of this panel indicate the generation of the report
|
* Makes the components of this panel indicate the generation of the report
|
||||||
@ -111,5 +451,8 @@ public interface ReportProgressPanel {
|
|||||||
* @deprecated Use {@link #complete(ReportStatus)}
|
* @deprecated Use {@link #complete(ReportStatus)}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void complete();
|
public void complete() {
|
||||||
|
complete(ReportStatus.COMPLETE);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,10 +6,6 @@ ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
|
|||||||
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
||||||
ReportProgressDialog.reportLabel.text=reportLabel
|
|
||||||
ReportProgressDialog.statusMessageLabel.text=processingLabel
|
|
||||||
ReportProgressDialog.separationLabel.text=:
|
|
||||||
ReportProgressDialog.pathLabel.text=pathLabel
|
|
||||||
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
||||||
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
||||||
PortableCaseTagsListPanel.selectButton.text=Select All
|
PortableCaseTagsListPanel.selectButton.text=Select All
|
||||||
@ -151,15 +147,6 @@ ReportGenerator.artTableColHdr.localPath=Local path
|
|||||||
ReportGenerator.artTableColHdr.remotePath=Remote path
|
ReportGenerator.artTableColHdr.remotePath=Remote path
|
||||||
ReportGenerator.errors.reportErrorTitle=Error generating report
|
ReportGenerator.errors.reportErrorTitle=Error generating report
|
||||||
ReportGenerator.errors.reportErrorText=Error generating report:
|
ReportGenerator.errors.reportErrorText=Error generating report:
|
||||||
ReportProgressDialog.progress.queuing=Queuing...
|
|
||||||
ReportProgressDialog.initPathLabel.noFile=<html><u>No report file</u></html>
|
|
||||||
ReportProgressDialog.start.cancelButton.text=Cancel
|
|
||||||
ReportProgressDialog.start.progress.text=Starting report...
|
|
||||||
ReportProgressDialog.complete.processLbl.text=Complete
|
|
||||||
ReportProgressDialog.complete.processLb2.text=Completed with error
|
|
||||||
ReportProgressDialog.complete.cancelButton.text=Complete
|
|
||||||
ReportProgressDialog.cancel.cancelButton.toolTipText=Canceled
|
|
||||||
ReportProgressDialog.cancel.procLbl.text=Canceled
|
|
||||||
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
||||||
ReportVisualPanel2.getName.text=Configure Report
|
ReportVisualPanel2.getName.text=Configure Report
|
||||||
ReportWizardAction.actionName.text=Generate Report
|
ReportWizardAction.actionName.text=Generate Report
|
||||||
|
@ -9,16 +9,18 @@ PortableCaseTagsListPanel.error.noOpenCase=There is no case open
|
|||||||
ReportGenerator.artTableColHdr.comment=Comment
|
ReportGenerator.artTableColHdr.comment=Comment
|
||||||
ReportGenerator.errList.noOpenCase=No open case available.
|
ReportGenerator.errList.noOpenCase=No open case available.
|
||||||
ReportGenerator.tagTable.header.userName=User Name
|
ReportGenerator.tagTable.header.userName=User Name
|
||||||
|
ReportProgressIndicator.cancelledMessage=Report generation cancelled
|
||||||
|
ReportProgressIndicator.completedMessage=Report generation completed
|
||||||
|
ReportProgressIndicator.completedWithErrorsMessage=Report generation completed with errors
|
||||||
|
ReportProgressIndicator.startMessage=Report generation started
|
||||||
|
ReportProgressIndicator.switchToDeterminateMessage=Report generation progress switched to determinate
|
||||||
|
ReportProgressIndicator.switchToIndeterminateMessage=Report generation progress switched to indeterminate
|
||||||
ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
|
ReportWizardFileOptionsVisualPanel.jLabel1.text=Select items to include in File Report:
|
||||||
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
|
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=Deselect All
|
||||||
ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
|
ReportWizardFileOptionsVisualPanel.selectAllButton.text=Select All
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows only
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
|
||||||
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=Package case into an archive:
|
||||||
ReportProgressDialog.reportLabel.text=reportLabel
|
|
||||||
ReportProgressDialog.statusMessageLabel.text=processingLabel
|
|
||||||
ReportProgressDialog.separationLabel.text=:
|
|
||||||
ReportProgressDialog.pathLabel.text=pathLabel
|
|
||||||
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
PortableCaseTagsListPanel.jAllTagsCheckBox.text=All Tagged Results
|
||||||
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
PortableCaseTagsListPanel.deselectButton.text=Deselect All
|
||||||
PortableCaseTagsListPanel.selectButton.text=Select All
|
PortableCaseTagsListPanel.selectButton.text=Select All
|
||||||
@ -160,15 +162,6 @@ ReportGenerator.artTableColHdr.localPath=Local path
|
|||||||
ReportGenerator.artTableColHdr.remotePath=Remote path
|
ReportGenerator.artTableColHdr.remotePath=Remote path
|
||||||
ReportGenerator.errors.reportErrorTitle=Error generating report
|
ReportGenerator.errors.reportErrorTitle=Error generating report
|
||||||
ReportGenerator.errors.reportErrorText=Error generating report:
|
ReportGenerator.errors.reportErrorText=Error generating report:
|
||||||
ReportProgressDialog.progress.queuing=Queuing...
|
|
||||||
ReportProgressDialog.initPathLabel.noFile=<html><u>No report file</u></html>
|
|
||||||
ReportProgressDialog.start.cancelButton.text=Cancel
|
|
||||||
ReportProgressDialog.start.progress.text=Starting report...
|
|
||||||
ReportProgressDialog.complete.processLbl.text=Complete
|
|
||||||
ReportProgressDialog.complete.processLb2.text=Completed with error
|
|
||||||
ReportProgressDialog.complete.cancelButton.text=Complete
|
|
||||||
ReportProgressDialog.cancel.cancelButton.toolTipText=Canceled
|
|
||||||
ReportProgressDialog.cancel.procLbl.text=Canceled
|
|
||||||
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
ReportVisualPanel1.getName.text=Select and Configure Report Modules
|
||||||
ReportVisualPanel2.getName.text=Configure Report
|
ReportVisualPanel2.getName.text=Configure Report
|
||||||
ReportWizardAction.actionName.text=Generate Report
|
ReportWizardAction.actionName.text=Generate Report
|
||||||
|
@ -2,10 +2,6 @@ CTL_ReportWizardAction=\u30ec\u30dd\u30fc\u30c8\u3092\u5b9f\u884c
|
|||||||
ReportWizardFileOptionsVisualPanel.selectAllButton.text=\u5168\u3066\u9078\u629e
|
ReportWizardFileOptionsVisualPanel.selectAllButton.text=\u5168\u3066\u9078\u629e
|
||||||
ReportWizardFileOptionsVisualPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u306b\u542b\u3081\u308b\u30a2\u30a4\u30c6\u30e0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
|
ReportWizardFileOptionsVisualPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u306b\u542b\u3081\u308b\u30a2\u30a4\u30c6\u30e0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\uff1a
|
||||||
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
|
ReportWizardFileOptionsVisualPanel.deselectAllButton.text=\u5168\u3066\u9078\u629e\u89e3\u9664
|
||||||
ReportProgressDialog.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
|
|
||||||
ReportProgressDialog.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
|
|
||||||
ReportProgressDialog.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
|
|
||||||
ReportProgressDialog.separationLabel.text=:
|
|
||||||
ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b
|
ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b
|
||||||
ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
|
ReportGenerationPanel.cancelButton.actionCommand=\u30ad\u30e3\u30f3\u30bb\u30eb
|
||||||
ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
|
ReportGenerationPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2018 Basis Technology Corp.
|
* Copyright 2012-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -25,21 +25,21 @@ import javax.swing.Box;
|
|||||||
import javax.swing.JOptionPane;
|
import javax.swing.JOptionPane;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
|
import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A panel that displays a panel used by a report generation module to show
|
* A panel that displays a panel used by a report generation module to show
|
||||||
* progress. It provides OK and Cancel buttons.
|
* progress. It provides OK and Cancel buttons.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||||
class ReportGenerationPanel extends javax.swing.JPanel {
|
final class ReportGenerationPanel extends javax.swing.JPanel {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
private final GridBagConstraints constraints;
|
private final GridBagConstraints constraints;
|
||||||
private final Component glue;
|
private final Component glue;
|
||||||
private ActionListener actionListener;
|
private ActionListener actionListener;
|
||||||
ReportProgressDialog progressPanel;
|
private final ReportProgressPanel progressPanel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a panel that displays a panel used by a report generation
|
* Constructs a panel that displays a panel used by a report generation
|
||||||
@ -54,10 +54,10 @@ class ReportGenerationPanel extends javax.swing.JPanel {
|
|||||||
constraints.gridy = 0;
|
constraints.gridy = 0;
|
||||||
constraints.weightx = 1.0;
|
constraints.weightx = 1.0;
|
||||||
glue = Box.createVerticalGlue();
|
glue = Box.createVerticalGlue();
|
||||||
progressPanel = new ReportProgressDialog();
|
progressPanel = new ReportProgressPanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
ReportProgressDialog getProgressPanel() {
|
ReportProgressPanel getProgressPanel() {
|
||||||
return progressPanel;
|
return progressPanel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ import java.util.Map;
|
|||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.JDialog;
|
import javax.swing.JDialog;
|
||||||
import javax.swing.JFrame;
|
|
||||||
import org.openide.filesystems.FileUtil;
|
import org.openide.filesystems.FileUtil;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.windows.WindowManager;
|
import org.openide.windows.WindowManager;
|
||||||
@ -55,24 +54,33 @@ import org.sleuthkit.datamodel.SleuthkitCase;
|
|||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskData;
|
import org.sleuthkit.datamodel.TskData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A report generator that generates one or more reports by running
|
||||||
|
* user-selected report modules.
|
||||||
|
*/
|
||||||
public class ReportGenerator {
|
public class ReportGenerator {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
|
private static final Logger logger = Logger.getLogger(ReportGenerator.class.getName());
|
||||||
|
private final ReportProgressPanel progressIndicator;
|
||||||
private ReportProgressPanel progressPanel = null;
|
private final ReportGenerationPanel reportGenerationPanel;
|
||||||
private ReportGenerationPanel reportGenerationPanel = null;
|
|
||||||
|
|
||||||
private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
|
private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
|
||||||
|
|
||||||
private final String configName;
|
private final String configName;
|
||||||
|
private static final String REPORTS_DIR = "Reports"; //NON-NLS
|
||||||
public static final String REPORTS_DIR = "Reports"; //NON-NLS
|
private List<String> errorList = new ArrayList<>();
|
||||||
|
|
||||||
private List<String> errorList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the list of errors during report generation in user-friendly
|
* Gets the name of the reports directory within the case direcotry
|
||||||
* way.
|
* hierarchy.
|
||||||
|
*
|
||||||
|
* @return The directory name.
|
||||||
|
*/
|
||||||
|
public static String getReportsDirectory() {
|
||||||
|
return REPORTS_DIR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a list of errors emitted by report modules during report
|
||||||
|
* generation using this report generator's report progress indicator.
|
||||||
*/
|
*/
|
||||||
private void displayReportErrors() {
|
private void displayReportErrors() {
|
||||||
if (!errorList.isEmpty()) {
|
if (!errorList.isEmpty()) {
|
||||||
@ -80,41 +88,41 @@ public class ReportGenerator {
|
|||||||
for (String error : errorList) {
|
for (String error : errorList) {
|
||||||
errorString += error + "\n";
|
errorString += error + "\n";
|
||||||
}
|
}
|
||||||
progressPanel.updateStatusLabel(errorString);
|
progressIndicator.updateStatusLabel(errorString);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a report generator. This constructor uses a logger instead of UI
|
* Constructs a report generator that generates one or more reports by
|
||||||
* panel.
|
* running user-selected report modules and uses a report progress indicator
|
||||||
|
* to display progress.
|
||||||
*
|
*
|
||||||
* @param configName Name of the reporting configuration to use
|
* @param configName The name of the reporting configuration to use.
|
||||||
* @param progress Fully instantiated progress logger
|
* @param progressIndicator The report progress indicator.
|
||||||
*/
|
*/
|
||||||
public ReportGenerator(String configName, ReportProgressLogger progress) {
|
public ReportGenerator(String configName, ReportProgressIndicator progressIndicator) {
|
||||||
this.errorList = new ArrayList<>();
|
this.progressIndicator = progressIndicator;
|
||||||
this.progressPanel = progress;
|
|
||||||
this.reportGenerationPanel = null;
|
this.reportGenerationPanel = null;
|
||||||
this.configName = configName;
|
this.configName = configName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a report generator. This constructor uses UI panel to display
|
* Constructs a report generator that generates one or more reports by
|
||||||
* progress.
|
* running user-selected report modules and uses a report generation panel
|
||||||
|
* to display progress.
|
||||||
*
|
*
|
||||||
* @param configName Name of the reporting configuration to use
|
* @param configName The name of the reporting configuration to use.
|
||||||
* @param panel Fully instantiated progress panel
|
* @param panel The report generation panel.
|
||||||
*/
|
*/
|
||||||
public ReportGenerator(String configName, ReportGenerationPanel panel) {
|
ReportGenerator(String configName, ReportGenerationPanel panel) {
|
||||||
this.errorList = new ArrayList<>();
|
|
||||||
this.reportGenerationPanel = panel;
|
this.reportGenerationPanel = panel;
|
||||||
this.progressPanel = panel.getProgressPanel();
|
this.progressIndicator = panel.getProgressPanel();
|
||||||
this.configName = configName;
|
this.configName = configName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate reports according to previously specified reporting
|
* Generates the reports specified by the reporting configuration passed in
|
||||||
* configuration.
|
* via the constructor.
|
||||||
*/
|
*/
|
||||||
public void generateReports() {
|
public void generateReports() {
|
||||||
ReportingConfig config = null;
|
ReportingConfig config = null;
|
||||||
@ -122,13 +130,13 @@ public class ReportGenerator {
|
|||||||
config = ReportingConfigLoader.loadConfig(configName);
|
config = ReportingConfigLoader.loadConfig(configName);
|
||||||
} catch (ReportConfigException ex) {
|
} catch (ReportConfigException ex) {
|
||||||
logger.log(Level.SEVERE, "Unable to load reporting configuration " + configName + ". Exiting", ex);
|
logger.log(Level.SEVERE, "Unable to load reporting configuration " + configName + ". Exiting", ex);
|
||||||
progressPanel.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
progressIndicator.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
logger.log(Level.SEVERE, "Unable to load reporting configuration {0}. Exiting", configName);
|
logger.log(Level.SEVERE, "Unable to load reporting configuration {0}. Exiting", configName);
|
||||||
progressPanel.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
progressIndicator.updateStatusLabel("Unable to load reporting configuration " + configName + ". Exiting");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +170,7 @@ public class ReportGenerator {
|
|||||||
ReportModule module = modules.get(moduleName);
|
ReportModule module = modules.get(moduleName);
|
||||||
if (module == null) {
|
if (module == null) {
|
||||||
logger.log(Level.SEVERE, "Report module {0} not found", moduleName);
|
logger.log(Level.SEVERE, "Report module {0} not found", moduleName);
|
||||||
progressPanel.updateStatusLabel("Report module " + moduleName + " not found");
|
progressIndicator.updateStatusLabel("Report module " + moduleName + " not found");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,7 +197,7 @@ public class ReportGenerator {
|
|||||||
TableReportSettings tableSettings = config.getTableReportSettings();
|
TableReportSettings tableSettings = config.getTableReportSettings();
|
||||||
if (tableSettings == null) {
|
if (tableSettings == null) {
|
||||||
logger.log(Level.SEVERE, "No table report settings for report module {0}", moduleName);
|
logger.log(Level.SEVERE, "No table report settings for report module {0}", moduleName);
|
||||||
progressPanel.updateStatusLabel("No table report settings for report module " + moduleName);
|
progressIndicator.updateStatusLabel("No table report settings for report module " + moduleName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +209,7 @@ public class ReportGenerator {
|
|||||||
FileReportSettings fileSettings = config.getFileReportSettings();
|
FileReportSettings fileSettings = config.getFileReportSettings();
|
||||||
if (fileSettings == null) {
|
if (fileSettings == null) {
|
||||||
logger.log(Level.SEVERE, "No file report settings for report module {0}", moduleName);
|
logger.log(Level.SEVERE, "No file report settings for report module {0}", moduleName);
|
||||||
progressPanel.updateStatusLabel("No file report settings for report module " + moduleName);
|
progressIndicator.updateStatusLabel("No file report settings for report module " + moduleName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +221,7 @@ public class ReportGenerator {
|
|||||||
settings = new PortableCaseReportModuleSettings();
|
settings = new PortableCaseReportModuleSettings();
|
||||||
} else if (!(settings instanceof PortableCaseReportModuleSettings)) {
|
} else if (!(settings instanceof PortableCaseReportModuleSettings)) {
|
||||||
logger.log(Level.SEVERE, "Invalid settings for report module {0}", moduleName);
|
logger.log(Level.SEVERE, "Invalid settings for report module {0}", moduleName);
|
||||||
progressPanel.updateStatusLabel("Invalid settings for report module " + moduleName);
|
progressIndicator.updateStatusLabel("Invalid settings for report module " + moduleName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,12 +229,11 @@ public class ReportGenerator {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
logger.log(Level.SEVERE, "Report module {0} has unsupported report module type", moduleName);
|
logger.log(Level.SEVERE, "Report module {0} has unsupported report module type", moduleName);
|
||||||
progressPanel.updateStatusLabel("Report module " + moduleName + " has unsupported report module type");
|
progressIndicator.updateStatusLabel("Report module " + moduleName + " has unsupported report module type");
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logger.log(Level.SEVERE, "Exception while running report module {0}: {1}", new Object[]{moduleName, e.getMessage()});
|
logger.log(Level.SEVERE, "Exception while running report module {0}: {1}", new Object[]{moduleName, e.getMessage()});
|
||||||
progressPanel.updateStatusLabel("Exception while running report module " + moduleName);
|
progressIndicator.updateStatusLabel("Exception while running report module " + moduleName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@ -244,7 +251,7 @@ public class ReportGenerator {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final JDialog dialog = new JDialog((JFrame) WindowManager.getDefault().getMainWindow(), true);
|
final JDialog dialog = new JDialog(WindowManager.getDefault().getMainWindow(), true);
|
||||||
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
|
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
|
||||||
dialog.setTitle(NbBundle.getMessage(this.getClass(), "ReportGenerator.displayProgress.title.text"));
|
dialog.setTitle(NbBundle.getMessage(this.getClass(), "ReportGenerator.displayProgress.title.text"));
|
||||||
dialog.add(this.reportGenerationPanel);
|
dialog.add(this.reportGenerationPanel);
|
||||||
@ -275,7 +282,7 @@ public class ReportGenerator {
|
|||||||
if (generalReportModule != null) {
|
if (generalReportModule != null) {
|
||||||
String reportDir = createReportDirectory(generalReportModule);
|
String reportDir = createReportDirectory(generalReportModule);
|
||||||
setupProgressPanel(generalReportModule, reportDir);
|
setupProgressPanel(generalReportModule, reportDir);
|
||||||
generalReportModule.generateReport(reportDir, progressPanel);
|
generalReportModule.generateReport(reportDir, progressIndicator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,11 +297,11 @@ public class ReportGenerator {
|
|||||||
String reportDir = createReportDirectory(tableReport);
|
String reportDir = createReportDirectory(tableReport);
|
||||||
setupProgressPanel(tableReport, reportDir);
|
setupProgressPanel(tableReport, reportDir);
|
||||||
tableReport.startReport(reportDir);
|
tableReport.startReport(reportDir);
|
||||||
TableReportGenerator generator = new TableReportGenerator(tableReportSettings, progressPanel, tableReport);
|
TableReportGenerator generator = new TableReportGenerator(tableReportSettings, progressIndicator, tableReport);
|
||||||
generator.execute();
|
generator.execute();
|
||||||
tableReport.endReport();
|
tableReport.endReport();
|
||||||
// finish progress, wrap up
|
// finish progress, wrap up
|
||||||
progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE);
|
progressIndicator.complete(ReportProgressPanel.ReportStatus.COMPLETE);
|
||||||
errorList = generator.getErrorList();
|
errorList = generator.getErrorList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -315,34 +322,34 @@ public class ReportGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
setupProgressPanel(fileReportModule, reportDir);
|
setupProgressPanel(fileReportModule, reportDir);
|
||||||
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
if (progressIndicator.getStatus() != ReportStatus.CANCELED) {
|
||||||
progressPanel.start();
|
progressIndicator.start();
|
||||||
progressPanel.updateStatusLabel(
|
progressIndicator.updateStatusLabel(
|
||||||
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.queryingDb.text"));
|
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.queryingDb.text"));
|
||||||
}
|
}
|
||||||
|
|
||||||
List<AbstractFile> files = getFiles();
|
List<AbstractFile> files = getFiles();
|
||||||
int numFiles = files.size();
|
int numFiles = files.size();
|
||||||
if (progressPanel.getStatus() != ReportStatus.CANCELED) {
|
if (progressIndicator.getStatus() != ReportStatus.CANCELED) {
|
||||||
fileReportModule.startReport(reportDir);
|
fileReportModule.startReport(reportDir);
|
||||||
fileReportModule.startTable(enabled);
|
fileReportModule.startTable(enabled);
|
||||||
}
|
}
|
||||||
progressPanel.setIndeterminate(false);
|
progressIndicator.setIndeterminate(false);
|
||||||
progressPanel.setMaximumProgress(numFiles);
|
progressIndicator.setMaximumProgress(numFiles);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
// Add files to report.
|
// Add files to report.
|
||||||
for (AbstractFile file : files) {
|
for (AbstractFile file : files) {
|
||||||
// Check to see if any reports have been cancelled.
|
// Check to see if any reports have been cancelled.
|
||||||
if (progressPanel.getStatus() == ReportStatus.CANCELED) {
|
if (progressIndicator.getStatus() == ReportStatus.CANCELED) {
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
fileReportModule.addRow(file, enabled);
|
fileReportModule.addRow(file, enabled);
|
||||||
progressPanel.increment();
|
progressIndicator.increment();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((i % 100) == 0) {
|
if ((i % 100) == 0) {
|
||||||
progressPanel.updateStatusLabel(
|
progressIndicator.updateStatusLabel(
|
||||||
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.processingFile.text",
|
NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.processingFile.text",
|
||||||
file.getName()));
|
file.getName()));
|
||||||
}
|
}
|
||||||
@ -351,7 +358,7 @@ public class ReportGenerator {
|
|||||||
|
|
||||||
fileReportModule.endTable();
|
fileReportModule.endTable();
|
||||||
fileReportModule.endReport();
|
fileReportModule.endReport();
|
||||||
progressPanel.complete(ReportStatus.COMPLETE);
|
progressIndicator.complete(ReportStatus.COMPLETE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -362,7 +369,7 @@ public class ReportGenerator {
|
|||||||
if (portableCaseReportModule != null) {
|
if (portableCaseReportModule != null) {
|
||||||
String reportDir = createReportDirectory(portableCaseReportModule);
|
String reportDir = createReportDirectory(portableCaseReportModule);
|
||||||
setupProgressPanel(portableCaseReportModule, reportDir);
|
setupProgressPanel(portableCaseReportModule, reportDir);
|
||||||
portableCaseReportModule.generateReport(reportDir, settings, progressPanel);
|
portableCaseReportModule.generateReport(reportDir, settings, progressIndicator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -378,7 +385,7 @@ public class ReportGenerator {
|
|||||||
absFiles = skCase.findAllFilesWhere("meta_type != " + TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue()); //NON-NLS
|
absFiles = skCase.findAllFilesWhere("meta_type != " + TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue()); //NON-NLS
|
||||||
return absFiles;
|
return absFiles;
|
||||||
} catch (TskCoreException | NoCurrentCaseException ex) {
|
} catch (TskCoreException | NoCurrentCaseException ex) {
|
||||||
progressPanel.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
|
progressIndicator.updateStatusLabel(NbBundle.getMessage(this.getClass(), "ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
|
||||||
logger.log(Level.SEVERE, "failed to generate reports. Unable to get all files in the image.", ex); //NON-NLS
|
logger.log(Level.SEVERE, "failed to generate reports. Unable to get all files in the image.", ex); //NON-NLS
|
||||||
return Collections.<AbstractFile>emptyList();
|
return Collections.<AbstractFile>emptyList();
|
||||||
}
|
}
|
||||||
|
@ -1,405 +0,0 @@
|
|||||||
/*
|
|
||||||
* Autopsy Forensic Browser
|
|
||||||
*
|
|
||||||
* Copyright 2011-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.report.infrastructure;
|
|
||||||
|
|
||||||
import org.openide.util.NbBundle;
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Cursor;
|
|
||||||
import java.awt.Desktop;
|
|
||||||
import java.awt.EventQueue;
|
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
import java.awt.event.MouseListener;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A panel used by a report generation module to show progress.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
|
||||||
class ReportProgressDialog extends javax.swing.JPanel implements ReportProgressPanel {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
private static final Logger logger = Logger.getLogger(ReportProgressDialog.class.getName());
|
|
||||||
private static final Color GREEN = new Color(50, 205, 50);
|
|
||||||
private static final Color RED = new Color(178, 34, 34);
|
|
||||||
private volatile ReportProgressPanel.ReportStatus status;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a panel used by report generation module to show progress.
|
|
||||||
*/
|
|
||||||
ReportProgressDialog() {
|
|
||||||
initComponents();
|
|
||||||
reportProgressBar.setIndeterminate(true);
|
|
||||||
reportProgressBar.setMaximum(100);
|
|
||||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.progress.queuing"));
|
|
||||||
status = ReportStatus.QUEUING;
|
|
||||||
reportLabel.setText("");
|
|
||||||
pathLabel.setText(""); //NON-NLS
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets label text.
|
|
||||||
*
|
|
||||||
* @param reportName The name of the report being generated.
|
|
||||||
* @param reportPath The path to the report file.
|
|
||||||
*/
|
|
||||||
void setLabels(String reportName, String reportPath) {
|
|
||||||
reportLabel.setText(reportName);
|
|
||||||
if (null != reportPath) {
|
|
||||||
pathLabel.setText("<html><u>" + shortenPath(reportPath) + "</u></html>"); //NON-NLS
|
|
||||||
pathLabel.setToolTipText(reportPath);
|
|
||||||
String linkPath = reportPath;
|
|
||||||
pathLabel.addMouseListener(new MouseListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseClicked(MouseEvent mouseEvent) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mousePressed(MouseEvent mouseEvent) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseReleased(MouseEvent mouseEvent) {
|
|
||||||
File file = new File(linkPath);
|
|
||||||
try {
|
|
||||||
Desktop.getDesktop().open(file);
|
|
||||||
} catch (IOException ioex) {
|
|
||||||
logger.log(Level.SEVERE, "Error opening report file", ioex);
|
|
||||||
} catch (IllegalArgumentException iaEx) {
|
|
||||||
logger.log(Level.SEVERE, "Error opening report file", iaEx);
|
|
||||||
try {
|
|
||||||
Desktop.getDesktop().open(file.getParentFile());
|
|
||||||
} catch (IOException ioEx2) {
|
|
||||||
logger.log(Level.SEVERE, "Error opening report file parent", ioEx2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseEntered(MouseEvent e3) {
|
|
||||||
pathLabel.setForeground(Color.DARK_GRAY);
|
|
||||||
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void mouseExited(MouseEvent e4) {
|
|
||||||
pathLabel.setForeground(Color.BLACK);
|
|
||||||
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
pathLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.initPathLabel.noFile"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the current status of the generation of the report.
|
|
||||||
*
|
|
||||||
* @return The report generation status as a ReportStatus enum.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public ReportStatus getStatus() {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Starts the progress bar component of this panel.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void start() {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.start.progress.text"));
|
|
||||||
status = ReportStatus.RUNNING;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the maximum value of the progress bar component of this panel.
|
|
||||||
*
|
|
||||||
* @param max The maximum value.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setMaximumProgress(int max) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
reportProgressBar.setMaximum(max);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Increments the current value of the progress bar component of this panel
|
|
||||||
* by one unit.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void increment() {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
reportProgressBar.setValue(reportProgressBar.getValue() + 1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the current value of the progress bar component of this panel.
|
|
||||||
*
|
|
||||||
* @param value The value to be set.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setProgress(int value) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
reportProgressBar.setValue(value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the the progress bar component of this panel to be determinate or
|
|
||||||
* indeterminate.
|
|
||||||
*
|
|
||||||
* @param indeterminate True if the progress bar should be set to
|
|
||||||
* indeterminate.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setIndeterminate(boolean indeterminate) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
reportProgressBar.setIndeterminate(indeterminate);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the status message label component of this panel to show a given
|
|
||||||
* processing status message. For example, updateStatusLabel("Now processing
|
|
||||||
* files...") sets the label text to "Now processing files..."
|
|
||||||
*
|
|
||||||
* @param statusMessage String to use as label text.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void updateStatusLabel(String statusMessage) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
statusMessageLabel.setText(statusMessage);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the components of this panel indicate the final status of
|
|
||||||
* generation of the report.
|
|
||||||
*
|
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void complete(ReportStatus reportStatus) {
|
|
||||||
|
|
||||||
switch (reportStatus) {
|
|
||||||
case COMPLETE:
|
|
||||||
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressDialog.complete.processLbl.text"));
|
|
||||||
break;
|
|
||||||
case ERROR:
|
|
||||||
complete(reportStatus, NbBundle.getMessage(this.getClass(), "ReportProgressDialog.complete.processLb2.text"));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
complete(reportStatus, "");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the components of this panel indicate the final status of
|
|
||||||
* generation of the report.
|
|
||||||
*
|
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
|
||||||
* @param statusMessage String to use as label or error text.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void complete(ReportStatus reportStatus, String statusMessage) {
|
|
||||||
EventQueue.invokeLater(() -> {
|
|
||||||
reportProgressBar.setIndeterminate(false);
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
switch (reportStatus) {
|
|
||||||
case COMPLETE: {
|
|
||||||
ReportStatus oldValue = status;
|
|
||||||
status = ReportStatus.COMPLETE;
|
|
||||||
statusMessageLabel.setForeground(Color.BLACK);
|
|
||||||
statusMessageLabel.setText(statusMessage);
|
|
||||||
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
|
||||||
reportProgressBar.setStringPainted(true);
|
|
||||||
reportProgressBar.setForeground(GREEN);
|
|
||||||
reportProgressBar.setString("Complete"); //NON-NLS
|
|
||||||
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ERROR: {
|
|
||||||
ReportStatus oldValue = status;
|
|
||||||
status = ReportStatus.ERROR;
|
|
||||||
statusMessageLabel.setForeground(RED);
|
|
||||||
statusMessageLabel.setText(statusMessage);
|
|
||||||
reportProgressBar.setValue(reportProgressBar.getMaximum());
|
|
||||||
reportProgressBar.setStringPainted(true);
|
|
||||||
reportProgressBar.setForeground(RED);
|
|
||||||
reportProgressBar.setString("Error"); //NON-NLS
|
|
||||||
firePropertyChange(ReportStatus.COMPLETE.toString(), oldValue, status);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the components of this panel indicate generation of the report was
|
|
||||||
* cancelled.
|
|
||||||
*/
|
|
||||||
void cancel() {
|
|
||||||
switch (status) {
|
|
||||||
case COMPLETE:
|
|
||||||
break;
|
|
||||||
case CANCELED:
|
|
||||||
break;
|
|
||||||
case ERROR:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ReportStatus oldValue = status;
|
|
||||||
status = ReportStatus.CANCELED;
|
|
||||||
reportProgressBar.setIndeterminate(false);
|
|
||||||
reportProgressBar.setValue(0);
|
|
||||||
reportProgressBar.setStringPainted(true);
|
|
||||||
reportProgressBar.setForeground(RED); // Red
|
|
||||||
reportProgressBar.setString("Cancelled"); //NON-NLS
|
|
||||||
firePropertyChange(ReportStatus.CANCELED.toString(), oldValue, status);
|
|
||||||
statusMessageLabel.setForeground(RED);
|
|
||||||
statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressDialog.cancel.procLbl.text"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a shortened version of a file path.
|
|
||||||
*
|
|
||||||
* @param path The path to shorten.
|
|
||||||
*
|
|
||||||
* @return The shortened path.
|
|
||||||
*/
|
|
||||||
private String shortenPath(String path) {
|
|
||||||
if (path.length() > 100) {
|
|
||||||
return path.substring(0, 10 + path.substring(10).indexOf(File.separator) + 1) + "..."
|
|
||||||
+ path.substring((path.length() - 70) + path.substring(path.length() - 70).indexOf(File.separator));
|
|
||||||
} else {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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() {
|
|
||||||
|
|
||||||
reportProgressBar = new javax.swing.JProgressBar();
|
|
||||||
reportLabel = new javax.swing.JLabel();
|
|
||||||
pathLabel = new javax.swing.JLabel();
|
|
||||||
separationLabel = new javax.swing.JLabel();
|
|
||||||
statusMessageLabel = new javax.swing.JLabel();
|
|
||||||
|
|
||||||
setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
setMinimumSize(new java.awt.Dimension(486, 68));
|
|
||||||
|
|
||||||
reportProgressBar.setFont(reportProgressBar.getFont().deriveFont(reportProgressBar.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
|
|
||||||
reportLabel.setFont(reportLabel.getFont().deriveFont(reportLabel.getFont().getStyle() | java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(reportLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.reportLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
pathLabel.setFont(pathLabel.getFont().deriveFont(pathLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(pathLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.pathLabel.text")); // NOI18N
|
|
||||||
pathLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
|
|
||||||
|
|
||||||
separationLabel.setFont(separationLabel.getFont().deriveFont(separationLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11));
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(separationLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.separationLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(statusMessageLabel, org.openide.util.NbBundle.getMessage(ReportProgressDialog.class, "ReportProgressDialog.statusMessageLabel.text")); // NOI18N
|
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
|
||||||
this.setLayout(layout);
|
|
||||||
layout.setHorizontalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(statusMessageLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(reportProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
|
||||||
.addComponent(reportLabel)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(separationLabel)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)))
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
layout.setVerticalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addComponent(reportProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(reportLabel)
|
|
||||||
.addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(separationLabel))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(statusMessageLabel)
|
|
||||||
.addGap(13, 13, 13))
|
|
||||||
);
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
|
||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
||||||
private javax.swing.JLabel pathLabel;
|
|
||||||
private javax.swing.JLabel reportLabel;
|
|
||||||
private javax.swing.JProgressBar reportProgressBar;
|
|
||||||
private javax.swing.JLabel separationLabel;
|
|
||||||
private javax.swing.JLabel statusMessageLabel;
|
|
||||||
// End of variables declaration//GEN-END:variables
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes the components of this panel indicate the generation of the report
|
|
||||||
* is completed.
|
|
||||||
*
|
|
||||||
* @deprecated Use {@link #complete(ReportStatus)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@Override
|
|
||||||
public void complete() {
|
|
||||||
complete(ReportStatus.COMPLETE);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,141 @@
|
|||||||
|
/*
|
||||||
|
* 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.report.infrastructure;
|
||||||
|
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
import org.sleuthkit.autopsy.progress.ProgressIndicator;
|
||||||
|
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An adapter that adapts the ReportProgressPanel interface to the
|
||||||
|
* ProgressIndicator interface so that a given progress indicator can be used
|
||||||
|
* where a ReportProgressPanel is expected.
|
||||||
|
*/
|
||||||
|
public class ReportProgressIndicator extends ReportProgressPanel {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private final ProgressIndicator progressIndicator;
|
||||||
|
private int workUnitsCompleted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs an adapter that adapts the ReportProgressPanel interface to
|
||||||
|
* the ProgressIndicator interface so that a given progress indicator can be
|
||||||
|
* used where a ReportProgressPanel is expected.
|
||||||
|
*
|
||||||
|
* @param progressIndicator The progress indicator to be adapted.
|
||||||
|
*/
|
||||||
|
public ReportProgressIndicator(ProgressIndicator progressIndicator) {
|
||||||
|
this.progressIndicator = progressIndicator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.startMessage=Report generation started"
|
||||||
|
})
|
||||||
|
public void start() {
|
||||||
|
workUnitsCompleted = 0;
|
||||||
|
setStatus(ReportStatus.RUNNING);
|
||||||
|
progressIndicator.start(Bundle.ReportProgressIndicator_startMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.switchToDeterminateMessage=Report generation progress switched to determinate"
|
||||||
|
})
|
||||||
|
public void setMaximumProgress(int max) {
|
||||||
|
progressIndicator.switchToDeterminate(Bundle.ReportProgressIndicator_switchToDeterminateMessage(), 0, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void increment() {
|
||||||
|
++workUnitsCompleted;
|
||||||
|
progressIndicator.progress(workUnitsCompleted);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setProgress(int value) {
|
||||||
|
workUnitsCompleted = value;
|
||||||
|
progressIndicator.progress(workUnitsCompleted);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.switchToIndeterminateMessage=Report generation progress switched to indeterminate"
|
||||||
|
})
|
||||||
|
public void setIndeterminate(boolean indeterminate) {
|
||||||
|
progressIndicator.switchToIndeterminate(Bundle.ReportProgressIndicator_switchToIndeterminateMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateStatusLabel(String statusMessage) {
|
||||||
|
if (getStatus() != ReportStatus.CANCELED) {
|
||||||
|
progressIndicator.progress(statusMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.completedMessage=Report generation completed",
|
||||||
|
"ReportProgressIndicator.completedWithErrorsMessage=Report generation completed with errors",})
|
||||||
|
public void complete(ReportStatus reportStatus) {
|
||||||
|
if (getStatus() != ReportStatus.CANCELED) {
|
||||||
|
switch (reportStatus) {
|
||||||
|
case COMPLETE: {
|
||||||
|
progressIndicator.progress(Bundle.ReportProgressIndicator_completedMessage());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ERROR: {
|
||||||
|
progressIndicator.progress(Bundle.ReportProgressIndicator_completedWithErrorsMessage());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
progressIndicator.finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void complete(ReportStatus reportStatus, String statusMessage) {
|
||||||
|
if (getStatus() != ReportStatus.CANCELED) {
|
||||||
|
progressIndicator.progress(statusMessage);
|
||||||
|
}
|
||||||
|
complete(reportStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"ReportProgressIndicator.cancelledMessage=Report generation cancelled",})
|
||||||
|
public void cancel() {
|
||||||
|
switch (getStatus()) {
|
||||||
|
case COMPLETE:
|
||||||
|
break;
|
||||||
|
case CANCELED:
|
||||||
|
break;
|
||||||
|
case ERROR:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
setStatus(ReportStatus.CANCELED);
|
||||||
|
progressIndicator.progress(Bundle.ReportProgressIndicator_cancelledMessage());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,172 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.report.infrastructure;
|
|
||||||
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
|
||||||
import org.sleuthkit.autopsy.report.ReportProgressPanel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes progress and status messages to the application log.
|
|
||||||
*/
|
|
||||||
public class ReportProgressLogger implements ReportProgressPanel {
|
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(ReportProgressLogger.class.getName());
|
|
||||||
private volatile ReportProgressPanel.ReportStatus status;
|
|
||||||
|
|
||||||
public ReportProgressLogger() {
|
|
||||||
status = ReportStatus.QUEUING;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the current status of the generation of the report.
|
|
||||||
*
|
|
||||||
* @return The report generation status as a ReportStatus enum.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public ReportStatus getStatus() {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs that the report has been started.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void start() {
|
|
||||||
status = ReportStatus.RUNNING;
|
|
||||||
logger.log(Level.INFO, "Report started");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NO-OP.
|
|
||||||
*
|
|
||||||
* @param max The maximum value.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setMaximumProgress(int max) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NO-OP.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void increment() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NO-OP.
|
|
||||||
*
|
|
||||||
* @param value The value to be set.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setProgress(int value) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* NO-OP.
|
|
||||||
*
|
|
||||||
* @param indeterminate True if the progress bar should be set to
|
|
||||||
* indeterminate.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void setIndeterminate(boolean indeterminate) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs the status message.
|
|
||||||
*
|
|
||||||
* @param statusMessage String to use as label text.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void updateStatusLabel(String statusMessage) {
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
logger.log(Level.INFO, statusMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs the final status of the report generation.
|
|
||||||
*
|
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
|
||||||
* @param statusMessage String to use as label or error text.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void complete(ReportStatus reportStatus, String statusMessage) {
|
|
||||||
if (!statusMessage.isEmpty()) {
|
|
||||||
logger.log(Level.INFO, statusMessage);
|
|
||||||
}
|
|
||||||
if (status != ReportStatus.CANCELED) {
|
|
||||||
switch (reportStatus) {
|
|
||||||
case COMPLETE: {
|
|
||||||
status = ReportStatus.COMPLETE;
|
|
||||||
logger.log(Level.INFO, "Report completed");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ERROR: {
|
|
||||||
status = ReportStatus.ERROR;
|
|
||||||
logger.log(Level.INFO, "Report completed with errors");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs the final status of the report generation.
|
|
||||||
*
|
|
||||||
* @param reportStatus The final status, must be COMPLETE or ERROR.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void complete(ReportStatus reportStatus) {
|
|
||||||
complete(reportStatus, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs that the generation of the report was cancelled.
|
|
||||||
*/
|
|
||||||
void cancel() {
|
|
||||||
switch (status) {
|
|
||||||
case COMPLETE:
|
|
||||||
break;
|
|
||||||
case CANCELED:
|
|
||||||
break;
|
|
||||||
case ERROR:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
status = ReportStatus.CANCELED;
|
|
||||||
logger.log(Level.INFO, "Report cancelled");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs the final status of the report generation.
|
|
||||||
*
|
|
||||||
* @deprecated Use {@link #complete(ReportStatus)}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@Override
|
|
||||||
public void complete() {
|
|
||||||
complete(ReportStatus.COMPLETE);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -2,7 +2,7 @@
|
|||||||
*
|
*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013-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
|
||||||
@ -76,7 +76,8 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
|
|||||||
*
|
*
|
||||||
* @param configName Name of the reporting configuration to use
|
* @param configName Name of the reporting configuration to use
|
||||||
* @param displayCaseSpecificData Flag whether to use case specific data in
|
* @param displayCaseSpecificData Flag whether to use case specific data in
|
||||||
* UI panels or to use all possible result types
|
* UI panels or to use all possible result
|
||||||
|
* types
|
||||||
* @param runReports Flag whether to produce report(s)
|
* @param runReports Flag whether to produce report(s)
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@ -110,6 +111,7 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings(value = "unchecked")
|
||||||
private static void saveReportingConfiguration(String configName, WizardDescriptor wiz) throws ReportConfigException {
|
private static void saveReportingConfiguration(String configName, WizardDescriptor wiz) throws ReportConfigException {
|
||||||
|
|
||||||
ReportingConfig reportingConfig = new ReportingConfig(configName);
|
ReportingConfig reportingConfig = new ReportingConfig(configName);
|
||||||
|
@ -55,11 +55,14 @@ final class ReportingConfigLoader {
|
|||||||
* an atomic, thread safe way.
|
* an atomic, thread safe way.
|
||||||
*
|
*
|
||||||
* @param configName Name of the reporting configuration
|
* @param configName Name of the reporting configuration
|
||||||
|
*
|
||||||
* @return ReportingConfig object if a persisted configuration exists, null
|
* @return ReportingConfig object if a persisted configuration exists, null
|
||||||
* otherwise
|
* otherwise
|
||||||
|
*
|
||||||
* @throws ReportConfigException if an error occurred while reading the
|
* @throws ReportConfigException if an error occurred while reading the
|
||||||
* configuration
|
* configuration
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
static synchronized ReportingConfig loadConfig(String configName) throws ReportConfigException {
|
static synchronized ReportingConfig loadConfig(String configName) throws ReportConfigException {
|
||||||
|
|
||||||
// construct the configuration directory path
|
// construct the configuration directory path
|
||||||
@ -114,9 +117,12 @@ final class ReportingConfigLoader {
|
|||||||
try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
|
try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) {
|
||||||
moduleConfig.setModuleSettings((ReportModuleSettings) in.readObject());
|
moduleConfig.setModuleSettings((ReportModuleSettings) in.readObject());
|
||||||
} catch (IOException | ClassNotFoundException ex) {
|
} catch (IOException | ClassNotFoundException ex) {
|
||||||
/* NOTE: we do not want to re-throw the exception because we do not
|
/*
|
||||||
want a single error while reading in a (3rd party) report module
|
* NOTE: we do not want to re-throw the exception because we do
|
||||||
to prevent us from reading the entire reporting configuration.*/
|
* not want a single error while reading in a (3rd party) report
|
||||||
|
* module to prevent us from reading the entire reporting
|
||||||
|
* configuration.
|
||||||
|
*/
|
||||||
logger.log(Level.SEVERE, "Unable to read module settings " + filePath, ex);
|
logger.log(Level.SEVERE, "Unable to read module settings " + filePath, ex);
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
}
|
}
|
||||||
@ -132,6 +138,7 @@ final class ReportingConfigLoader {
|
|||||||
* an atomic, thread safe way.
|
* an atomic, thread safe way.
|
||||||
*
|
*
|
||||||
* @param reportConfig ReportingConfig object to serialize to disk
|
* @param reportConfig ReportingConfig object to serialize to disk
|
||||||
|
*
|
||||||
* @throws ReportConfigException if an error occurred while saving the
|
* @throws ReportConfigException if an error occurred while saving the
|
||||||
* configuration
|
* configuration
|
||||||
*/
|
*/
|
||||||
@ -176,10 +183,13 @@ final class ReportingConfigLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// save each ReportModuleSettings object individually
|
// save each ReportModuleSettings object individually
|
||||||
/* NOTE: This is done to protect us from errors in reading/writing 3rd
|
/*
|
||||||
party report module settings. If we were to serialize the entire ReportingConfig
|
* NOTE: This is done to protect us from errors in reading/writing 3rd
|
||||||
object, then a single error while reading in a 3rd party report module
|
* party report module settings. If we were to serialize the entire
|
||||||
would prevent us from reading the entire reporting configuration.*/
|
* ReportingConfig object, then a single error while reading in a 3rd
|
||||||
|
* party report module would prevent us from reading the entire
|
||||||
|
* reporting configuration.
|
||||||
|
*/
|
||||||
if (reportConfig.getModuleConfigs() == null) {
|
if (reportConfig.getModuleConfigs() == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -98,6 +98,7 @@ class TableReportGenerator {
|
|||||||
tagNamesFilter = new HashSet<>(tagNames);
|
tagNamesFilter = new HashSet<>(tagNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
private void getAllExistingArtiactTypes() throws NoCurrentCaseException, TskCoreException {
|
private void getAllExistingArtiactTypes() throws NoCurrentCaseException, TskCoreException {
|
||||||
// get all possible artifact types
|
// get all possible artifact types
|
||||||
ArrayList<BlackboardArtifact.Type> doNotReport = new ArrayList<>();
|
ArrayList<BlackboardArtifact.Type> doNotReport = new ArrayList<>();
|
||||||
|
@ -38,8 +38,10 @@ SaveSnapShotAsReport.ReportSavedAt=Report saved at [{0}]
|
|||||||
SaveSnapShotAsReport.Success=Success
|
SaveSnapShotAsReport.Success=Success
|
||||||
SaveSnapShotAsReport_OK_Button=OK
|
SaveSnapShotAsReport_OK_Button=OK
|
||||||
SaveSnapShotAsReport_Open_Button=Open Report
|
SaveSnapShotAsReport_Open_Button=Open Report
|
||||||
|
# {0} - supplied report name
|
||||||
SaveSnapShotAsReport_Path_Failure_Report=Failed to create report. Supplied report name has invalid characters: {0}
|
SaveSnapShotAsReport_Path_Failure_Report=Failed to create report. Supplied report name has invalid characters: {0}
|
||||||
SaveSnapShotAsReport_Report_Failed=Report failed
|
SaveSnapShotAsReport_Report_Failed=Report failed
|
||||||
|
# {0} - report location
|
||||||
SaveSnapShotAsReport_success_message=Snapshot report successfully created at location: \n\n {0}
|
SaveSnapShotAsReport_success_message=Snapshot report successfully created at location: \n\n {0}
|
||||||
Timeline.ModuleName=Timeline
|
Timeline.ModuleName=Timeline
|
||||||
ViewArtifactInTimelineAction.displayName=View Result in Timeline...
|
ViewArtifactInTimelineAction.displayName=View Result in Timeline...
|
||||||
|
@ -84,7 +84,9 @@ public class SaveSnapshotAsReport extends Action {
|
|||||||
"SaveSnapShotAsReport.reportName.header=Enter a report name for the Timeline Snapshot Report.",
|
"SaveSnapShotAsReport.reportName.header=Enter a report name for the Timeline Snapshot Report.",
|
||||||
"SaveSnapShotAsReport.duplicateReportNameError.text=A report with that name already exists.",
|
"SaveSnapShotAsReport.duplicateReportNameError.text=A report with that name already exists.",
|
||||||
"SaveSnapShotAsReport_Report_Failed=Report failed",
|
"SaveSnapShotAsReport_Report_Failed=Report failed",
|
||||||
|
"# {0} - supplied report name",
|
||||||
"SaveSnapShotAsReport_Path_Failure_Report=Failed to create report. Supplied report name has invalid characters: {0}",
|
"SaveSnapShotAsReport_Path_Failure_Report=Failed to create report. Supplied report name has invalid characters: {0}",
|
||||||
|
"# {0} - report location",
|
||||||
"SaveSnapShotAsReport_success_message=Snapshot report successfully created at location: \n\n {0}",
|
"SaveSnapShotAsReport_success_message=Snapshot report successfully created at location: \n\n {0}",
|
||||||
"SaveSnapShotAsReport_Open_Button=Open Report",
|
"SaveSnapShotAsReport_Open_Button=Open Report",
|
||||||
"SaveSnapShotAsReport_OK_Button=OK"
|
"SaveSnapShotAsReport_OK_Button=OK"
|
||||||
|
5
Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java → Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java
Normal file → Executable file
5
Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java → Core/src/org/sleuthkit/autopsy/uicomponents/WrapLayout.java
Normal file → Executable file
@ -16,7 +16,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.corecomponents;
|
package org.sleuthkit.autopsy.uicomponents;
|
||||||
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Container;
|
import java.awt.Container;
|
||||||
@ -32,8 +32,9 @@ import javax.swing.SwingUtilities;
|
|||||||
* Originally written by Rob Camick
|
* Originally written by Rob Camick
|
||||||
* https://tips4java.wordpress.com/2008/11/06/wrap-layout/
|
* https://tips4java.wordpress.com/2008/11/06/wrap-layout/
|
||||||
*/
|
*/
|
||||||
class WrapLayout extends FlowLayout {
|
public class WrapLayout extends FlowLayout {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
/**
|
/**
|
||||||
* Constructs a new <code>WrapLayout</code> with a left alignment and a
|
* Constructs a new <code>WrapLayout</code> with a left alignment and a
|
||||||
* default 5-unit horizontal and vertical gap.
|
* default 5-unit horizontal and vertical gap.
|
@ -1,8 +1,8 @@
|
|||||||
Manifest-Version: 1.0
|
Manifest-Version: 1.0
|
||||||
OpenIDE-Module: org.sleuthkit.autopsy.corelibs/3
|
OpenIDE-Module: org.sleuthkit.autopsy.corelibs/3
|
||||||
OpenIDE-Module-Implementation-Version: 5
|
OpenIDE-Module-Implementation-Version: 6
|
||||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/corelibs/Bundle.properties
|
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/corelibs/Bundle.properties
|
||||||
OpenIDE-Module-Specification-Version: 1.2
|
OpenIDE-Module-Specification-Version: 1.3
|
||||||
AutoUpdate-Show-In-Client: true
|
AutoUpdate-Show-In-Client: true
|
||||||
AutoUpdate-Essential-Module: true
|
AutoUpdate-Essential-Module: true
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ public final class OpenCvLoader {
|
|||||||
*
|
*
|
||||||
* @return True or false.
|
* @return True or false.
|
||||||
*/
|
*/
|
||||||
public static boolean hasOpenCvLoaded() {
|
public static boolean openCvIsLoaded() {
|
||||||
return openCvLoaded;
|
return openCvLoaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ public final class OpenCvLoader {
|
|||||||
* of the core OpenCV library during static
|
* of the core OpenCV library during static
|
||||||
* initialization of this class.
|
* initialization of this class.
|
||||||
*
|
*
|
||||||
* @deprecated Use hasOpenCvLoaded instead.
|
* @deprecated Use openCvIsLoaded instead.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static boolean isOpenCvLoaded() throws UnsatisfiedLinkError {
|
public static boolean isOpenCvLoaded() throws UnsatisfiedLinkError {
|
||||||
|
@ -135,7 +135,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.16</specification-version>
|
<specification-version>10.17</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -144,7 +144,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>3</release-version>
|
<release-version>3</release-version>
|
||||||
<specification-version>1.2</specification-version>
|
<specification-version>1.3</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -84,7 +84,7 @@ public class ObjectDetectectionFileIngestModule extends FileIngestModuleAdapter
|
|||||||
throw new IngestModule.IngestModuleException(errorMsg);
|
throw new IngestModule.IngestModuleException(errorMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!OpenCvLoader.hasOpenCvLoaded()) {
|
if(!OpenCvLoader.openCvIsLoaded()) {
|
||||||
String errorMsg = Bundle.ObjectDetectionFileIngestModule_openCVNotLoaded();
|
String errorMsg = Bundle.ObjectDetectionFileIngestModule_openCVNotLoaded();
|
||||||
logger.log(Level.SEVERE, errorMsg);
|
logger.log(Level.SEVERE, errorMsg);
|
||||||
throw new IngestModule.IngestModuleException(errorMsg);
|
throw new IngestModule.IngestModuleException(errorMsg);
|
||||||
|
@ -127,7 +127,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.16</specification-version>
|
<specification-version>10.17</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -136,7 +136,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>3</release-version>
|
<release-version>3</release-version>
|
||||||
<specification-version>1.2</specification-version>
|
<specification-version>1.3</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
</module-dependencies>
|
</module-dependencies>
|
||||||
|
@ -119,7 +119,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.16</specification-version>
|
<specification-version>10.17</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -128,7 +128,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>3</release-version>
|
<release-version>3</release-version>
|
||||||
<specification-version>1.2</specification-version>
|
<specification-version>1.3</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
</module-dependencies>
|
</module-dependencies>
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.16</specification-version>
|
<specification-version>10.17</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -69,7 +69,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>3</release-version>
|
<release-version>3</release-version>
|
||||||
<specification-version>1.2</specification-version>
|
<specification-version>1.3</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
</module-dependencies>
|
</module-dependencies>
|
||||||
|
@ -2,9 +2,14 @@ cannotBuildXmlParser=Unable to build XML parser:
|
|||||||
cannotLoadSEUQA=Unable to load Search Engine URL Query Analyzer settings file, SEUQAMappings.xml:
|
cannotLoadSEUQA=Unable to load Search Engine URL Query Analyzer settings file, SEUQAMappings.xml:
|
||||||
cannotParseXml=Unable to parse XML file:
|
cannotParseXml=Unable to parse XML file:
|
||||||
ChromeCacheExtractor.moduleName=ChromeCacheExtractor
|
ChromeCacheExtractor.moduleName=ChromeCacheExtractor
|
||||||
|
# {0} - module name
|
||||||
|
# {1} - row number
|
||||||
|
# {2} - table length
|
||||||
|
# {3} - cache path
|
||||||
ChromeCacheExtractor.progressMsg={0}: Extracting cache entry {1} of {2} entries from {3}
|
ChromeCacheExtractor.progressMsg={0}: Extracting cache entry {1} of {2} entries from {3}
|
||||||
DataSourceUsage_AndroidMedia=Android Media Card
|
DataSourceUsage_AndroidMedia=Android Media Card
|
||||||
DataSourceUsage_FlashDrive=Flash Drive
|
DataSourceUsage_FlashDrive=Flash Drive
|
||||||
|
# {0} - OS name
|
||||||
DataSourceUsageAnalyzer.customVolume.label=OS Drive ({0})
|
DataSourceUsageAnalyzer.customVolume.label=OS Drive ({0})
|
||||||
DataSourceUsageAnalyzer.parentModuleName=Recent Activity
|
DataSourceUsageAnalyzer.parentModuleName=Recent Activity
|
||||||
Extract.indexError.message=Failed to index artifact for keyword search.
|
Extract.indexError.message=Failed to index artifact for keyword search.
|
||||||
@ -183,6 +188,7 @@ RecentDocumentsByLnk.parentModuleName.noSpace=RecentActivity
|
|||||||
RecentDocumentsByLnk.parentModuleName=Recent Activity
|
RecentDocumentsByLnk.parentModuleName=Recent Activity
|
||||||
RegRipperFullNotFound=Full version RegRipper executable not found.
|
RegRipperFullNotFound=Full version RegRipper executable not found.
|
||||||
RegRipperNotFound=Autopsy RegRipper executable not found.
|
RegRipperNotFound=Autopsy RegRipper executable not found.
|
||||||
|
# {0} - file name
|
||||||
SearchEngineURLQueryAnalyzer.init.exception.msg=Unable to find {0}.
|
SearchEngineURLQueryAnalyzer.init.exception.msg=Unable to find {0}.
|
||||||
SearchEngineURLQueryAnalyzer.moduleName.text=Search Engine
|
SearchEngineURLQueryAnalyzer.moduleName.text=Search Engine
|
||||||
SearchEngineURLQueryAnalyzer.engineName.none=NONE
|
SearchEngineURLQueryAnalyzer.engineName.none=NONE
|
||||||
|
@ -258,7 +258,7 @@ final class ExtractRecycleBin extends Extract {
|
|||||||
addFileSystemFile(skCase, fsContent, parentFolder, fsContent.getName(), deletedTimeStamp);
|
addFileSystemFile(skCase, fsContent, parentFolder, fsContent.getName(), deletedTimeStamp);
|
||||||
} else if (fsContent.isDir()) {
|
} else if (fsContent.isDir()) {
|
||||||
String newPath = parentPath + "\\" + fsContent.getName();
|
String newPath = parentPath + "\\" + fsContent.getName();
|
||||||
AbstractFile childFolder = getOrMakeFolder(skCase, (FsContent) fsContent, parentPath);
|
AbstractFile childFolder = getOrMakeFolder(skCase, fsContent, parentPath);
|
||||||
popuplateDeletedDirectory(skCase, childFolder, fsContent.getChildren(), newPath, deletedTimeStamp);
|
popuplateDeletedDirectory(skCase, childFolder, fsContent.getChildren(), newPath, deletedTimeStamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.15</specification-version>
|
<specification-version>10.17</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#Updated by build script
|
#Updated by build script
|
||||||
#Wed, 02 Oct 2019 12:06:32 -0400
|
#Fri, 04 Oct 2019 14:30:10 -0400
|
||||||
LBL_splash_window_title=Starting Autopsy
|
LBL_splash_window_title=Starting Autopsy
|
||||||
SPLASH_HEIGHT=314
|
SPLASH_HEIGHT=314
|
||||||
SPLASH_WIDTH=538
|
SPLASH_WIDTH=538
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#Updated by build script
|
#Updated by build script
|
||||||
#Wed, 02 Oct 2019 12:06:32 -0400
|
#Fri, 04 Oct 2019 14:30:10 -0400
|
||||||
CTL_MainWindow_Title=Autopsy 4.13.0
|
CTL_MainWindow_Title=Autopsy 4.13.0
|
||||||
CTL_MainWindow_Title_No_Project=Autopsy 4.13.0
|
CTL_MainWindow_Title_No_Project=Autopsy 4.13.0
|
||||||
|
@ -14,7 +14,7 @@ The Communications Visualization Tool is loaded through the Tools->Communication
|
|||||||
|
|
||||||
\image html cvt_main.png
|
\image html cvt_main.png
|
||||||
|
|
||||||
From the left hand column, you can choose which devices to display, which types of data to display, and optionally select a time range. You can also choose to limit the display to only the most recent communications. After any changes to the filters, use the Apply button to update the tables.
|
From the left hand column, you can choose which devices to display, which types of data to display, and optionally select a time range. You can also choose to limit the display to only the most recent communications. After any changes to the filters, use the Apply button to update the tables. You can hide this column by clicking the left arrow at the top of the column.
|
||||||
|
|
||||||
The middle column displays each account, its device and type, and the number of associated messages (emails, call logs, etc.). By default it will be sorted in descending order of frequency. The middle column and the right hand column both have a \ref ui_quick_search feature which can be used to quickly find a visible item in their section's table.
|
The middle column displays each account, its device and type, and the number of associated messages (emails, call logs, etc.). By default it will be sorted in descending order of frequency. The middle column and the right hand column both have a \ref ui_quick_search feature which can be used to quickly find a visible item in their section's table.
|
||||||
|
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 97 KiB |
@ -6,8 +6,8 @@ app.name=${branding.token}
|
|||||||
### if left unset, version will default to today's date
|
### if left unset, version will default to today's date
|
||||||
app.version=4.13.0
|
app.version=4.13.0
|
||||||
### build.type must be one of: DEVELOPMENT, RELEASE
|
### build.type must be one of: DEVELOPMENT, RELEASE
|
||||||
#build.type=RELEASE
|
build.type=RELEASE
|
||||||
build.type=DEVELOPMENT
|
#build.type=DEVELOPMENT
|
||||||
|
|
||||||
project.org.netbeans.progress=org-netbeans-api-progress
|
project.org.netbeans.progress=org-netbeans-api-progress
|
||||||
project.org.sleuthkit.autopsy.experimental=Experimental
|
project.org.sleuthkit.autopsy.experimental=Experimental
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
<compile-dependency/>
|
<compile-dependency/>
|
||||||
<run-dependency>
|
<run-dependency>
|
||||||
<release-version>10</release-version>
|
<release-version>10</release-version>
|
||||||
<specification-version>10.16</specification-version>
|
<specification-version>10.17</specification-version>
|
||||||
</run-dependency>
|
</run-dependency>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user