From 21d73bf628a3b4d90ef3b547495dbab6f9728373 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Fri, 25 Jun 2021 16:35:29 -0400 Subject: [PATCH] 7751 modify status message to support multi-line status --- .../autopsy/report/Bundle.properties | 1 - .../autopsy/report/Bundle.properties-MERGED | 1 - .../autopsy/report/Bundle_ja.properties | 1 - .../autopsy/report/ReportProgressPanel.form | 34 ++++++++-- .../autopsy/report/ReportProgressPanel.java | 41 +++++++----- .../modules/html/Bundle.properties-MERGED | 6 +- .../SaveTaggedHashesToHashDb.java | 66 ++++++++++--------- 7 files changed, 89 insertions(+), 61 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties index c293136c40..609b49799f 100644 --- a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties @@ -4,7 +4,6 @@ ReportBranding.defaultReportTitle.text=Autopsy Forensic Report 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=No report file ReportProgressPanel.start.cancelButton.text=Cancel diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED index 148df03fa2..5857743948 100755 --- a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties-MERGED @@ -9,7 +9,6 @@ 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=No report file ReportProgressPanel.start.cancelButton.text=Cancel diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties index 8dc01dddb4..231d6d87ef 100644 --- a/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties @@ -75,7 +75,6 @@ ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b ReportProgressPanel.reportLabel.text=reportLabel ReportProgressPanel.pathLabel.text=pathLabel ReportProgressPanel.separationLabel.text=: -ReportProgressPanel.statusMessageLabel.text=processingLabel ReportGenerationPanel.titleLabel.text=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u9032\u6357\u72b6\u6cc1 ReportVisualPanel2.taggedResultsRadioButton.text=\u30bf\u30b0\u4ed8\u304d\u7d50\u679c ReportVisualPanel2.allResultsRadioButton.text=\u3059\u3079\u3066\u306e\u7d50\u679c diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form index 2bd8001b1a..af321546e9 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form +++ b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.form @@ -21,10 +21,9 @@ - + - @@ -33,6 +32,7 @@ + @@ -50,7 +50,7 @@ - + @@ -86,12 +86,32 @@ - + - - + + - + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java index be1533cb7e..5413cb9a0f 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportProgressPanel.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2012-2019 Basis Technology Corp. + * Copyright 2012-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -83,7 +83,7 @@ public class ReportProgressPanel extends javax.swing.JPanel { initComponents(); reportProgressBar.setIndeterminate(true); reportProgressBar.setMaximum(100); - statusMessageLabel.setText(Bundle.ReportProgressPanel_progress_queuing()); + statusMessageTextArea.setText(Bundle.ReportProgressPanel_progress_queuing()); status = ReportStatus.QUEUING; reportLabel.setText(""); pathLabel.setText(""); //NON-NLS @@ -174,7 +174,7 @@ public class ReportProgressPanel extends javax.swing.JPanel { */ public void start() { EventQueue.invokeLater(() -> { - statusMessageLabel.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.start.progress.text")); + statusMessageTextArea.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.start.progress.text")); status = ReportStatus.RUNNING; }); } @@ -242,7 +242,7 @@ public class ReportProgressPanel extends javax.swing.JPanel { public void updateStatusLabel(String statusMessage) { EventQueue.invokeLater(() -> { if (status != ReportStatus.CANCELED) { - statusMessageLabel.setText(statusMessage); + statusMessageTextArea.setText(statusMessage); } }); } @@ -283,8 +283,8 @@ public class ReportProgressPanel extends javax.swing.JPanel { case COMPLETE: { ReportStatus oldValue = status; status = ReportStatus.COMPLETE; - statusMessageLabel.setForeground(Color.BLACK); - statusMessageLabel.setText(statusMessage); + statusMessageTextArea.setForeground(Color.BLACK); + statusMessageTextArea.setText(statusMessage); reportProgressBar.setValue(reportProgressBar.getMaximum()); reportProgressBar.setStringPainted(true); reportProgressBar.setForeground(GREEN); @@ -295,8 +295,8 @@ public class ReportProgressPanel extends javax.swing.JPanel { case ERROR: { ReportStatus oldValue = status; status = ReportStatus.ERROR; - statusMessageLabel.setForeground(RED); - statusMessageLabel.setText(statusMessage); + statusMessageTextArea.setForeground(RED); + statusMessageTextArea.setText(statusMessage); reportProgressBar.setValue(reportProgressBar.getMaximum()); reportProgressBar.setStringPainted(true); reportProgressBar.setForeground(RED); @@ -333,8 +333,8 @@ public class ReportProgressPanel extends javax.swing.JPanel { 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")); + statusMessageTextArea.setForeground(RED); + statusMessageTextArea.setText(NbBundle.getMessage(this.getClass(), "ReportProgressPanel.cancel.procLbl.text")); break; } } @@ -368,7 +368,8 @@ public class ReportProgressPanel extends javax.swing.JPanel { reportLabel = new javax.swing.JLabel(); pathLabel = new javax.swing.JLabel(); separationLabel = new javax.swing.JLabel(); - statusMessageLabel = new javax.swing.JLabel(); + javax.swing.JScrollPane statusScrollPane = new javax.swing.JScrollPane(); + statusMessageTextArea = new javax.swing.JTextArea(); setMinimumSize(new java.awt.Dimension(486, 68)); @@ -380,7 +381,15 @@ public class ReportProgressPanel extends javax.swing.JPanel { 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 + statusScrollPane.setBorder(null); + + statusMessageTextArea.setEditable(false); + statusMessageTextArea.setBackground(java.awt.SystemColor.menu); + statusMessageTextArea.setColumns(20); + statusMessageTextArea.setLineWrap(true); + statusMessageTextArea.setRows(5); + statusMessageTextArea.setWrapStyleWord(true); + statusScrollPane.setViewportView(statusMessageTextArea); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); @@ -389,14 +398,14 @@ public class ReportProgressPanel extends javax.swing.JPanel { .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))) + .addComponent(pathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)) + .addComponent(statusScrollPane)) .addContainerGap()) ); layout.setVerticalGroup( @@ -410,7 +419,7 @@ public class ReportProgressPanel extends javax.swing.JPanel { .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) + .addComponent(statusScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 26, Short.MAX_VALUE) .addGap(13, 13, 13)) ); }// //GEN-END:initComponents @@ -421,7 +430,7 @@ public class ReportProgressPanel extends javax.swing.JPanel { private javax.swing.JLabel reportLabel; private javax.swing.JProgressBar reportProgressBar; private javax.swing.JLabel separationLabel; - private javax.swing.JLabel statusMessageLabel; + private javax.swing.JTextArea statusMessageTextArea; // End of variables declaration//GEN-END:variables /** diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle.properties-MERGED index fce93671b3..3db1b822ea 100755 --- a/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle.properties-MERGED @@ -5,8 +5,8 @@ ReportHTML.getName.text=HTML Report ReportHTML.getDesc.text=A report about results and tagged items in HTML format. ReportHTML.writeIndex.title=for case {0} ReportHTML.writeIndex.noFrames.msg=Your browser is not compatible with our frame setup. -ReportHTML.writeIndex.noFrames.seeNav=Please see the navigation page for artifact links, -ReportHTML.writeIndex.seeSum=and the summary page for a case summary. +ReportHTML.writeIndex.noFrames.seeNav=Please see the navigation page for artifact links, +ReportHTML.writeIndex.seeSum=and the summary page for a case summary. ReportHTML.writeNav.title=Report Navigation ReportHTML.writeNav.h1=Report Navigation ReportHTML.writeNav.summary=Case Summary @@ -16,7 +16,7 @@ ReportHTML.writeSum.caseNumber=Case Number: ReportHTML.writeSum.caseNumImages=Number of data sources in case: ReportHTML.writeSum.examiner=Examiner: ReportHTML.writeSum.title=Case Summary -ReportHTML.writeSum.warningMsg=Warning, this report was run before ingest services completed! +ReportHTML.writeSum.warningMsg=Warning, this report was run before ingest services completed\! # # autopsy/test/scripts/regression.py._html_report_diff() uses reportGenOn.text, caseName, caseNum, # examiner as a regex signature to skip report.html and summary.html diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java index 269350b288..9c12d1c6ef 100644 --- a/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java +++ b/Core/src/org/sleuthkit/autopsy/report/modules/taggedhashes/SaveTaggedHashesToHashDb.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2020 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ import java.util.List; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.JPanel; +import org.apache.commons.lang3.StringUtils; import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.ServiceProvider; import org.sleuthkit.autopsy.casemodule.Case; @@ -67,7 +68,7 @@ public class SaveTaggedHashesToHashDb implements GeneralReportModule { public String getRelativeFilePath() { return null; } - + /** * Get default configuration for this report module. * @@ -101,14 +102,14 @@ public class SaveTaggedHashesToHashDb implements GeneralReportModule { configPanel.setConfiguration((HashesReportModuleSettings) getDefaultConfiguration()); return; } - + if (settings instanceof HashesReportModuleSettings) { configPanel.setConfiguration((HashesReportModuleSettings) settings); return; } throw new IllegalArgumentException("Expected settings argument to be an instance of HashesReportModuleSettings"); - } + } @Messages({ "AddTaggedHashesToHashDb.error.noHashSetsSelected=No hash set selected for export.", @@ -136,7 +137,7 @@ public class SaveTaggedHashesToHashDb implements GeneralReportModule { progressPanel.complete(ReportProgressPanel.ReportStatus.ERROR, Bundle.AddTaggedHashesToHashDb_error_noHashSetsSelected()); return; } - + progressPanel.updateStatusLabel("Adding hashes to " + hashSet.getHashSetName() + " hash set..."); TagsManager tagsManager = openCase.getServices().getTagsManager(); @@ -147,7 +148,7 @@ public class SaveTaggedHashesToHashDb implements GeneralReportModule { progressPanel.complete(ReportProgressPanel.ReportStatus.ERROR, Bundle.AddTaggedHashesToHashDb_error_noTagsSelected()); return; } - + ArrayList failedExports = new ArrayList<>(); for (TagName tagName : tagNames) { if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) { @@ -155,46 +156,47 @@ public class SaveTaggedHashesToHashDb implements GeneralReportModule { } progressPanel.updateStatusLabel("Adding " + tagName.getDisplayName() + " hashes to " + hashSet.getHashSetName() + " hash set..."); + List tags = new ArrayList<>(); try { - List tags = tagsManager.getContentTagsByTagName(tagName); - for (ContentTag tag : tags) { - // TODO: Currently only AbstractFiles have md5 hashes. Here only files matter. - Content content = tag.getContent(); - if (content instanceof AbstractFile) { - if (null != ((AbstractFile) content).getMd5Hash()) { - try { - hashSet.addHashes(tag.getContent(), openCase.getDisplayName()); - } catch (TskCoreException ex) { - Logger.getLogger(SaveTaggedHashesToHashDb.class.getName()).log(Level.SEVERE, "Error adding hash for obj_id = " + tag.getContent().getId() + " to hash set " + hashSet.getHashSetName(), ex); - failedExports.add(tag.getContent().getName()); - } - } else { - progressPanel.updateStatusLabel("Unable to add the " + (tags.size() > 1 ? "files" : "file") + " to the hash set. Hashes have not been calculated. Please configure and run an appropriate ingest module."); - break; - } - } - } + tags.addAll(tagsManager.getContentTagsByTagName(tagName)); } catch (TskCoreException ex) { Logger.getLogger(SaveTaggedHashesToHashDb.class.getName()).log(Level.SEVERE, "Error adding to hash set", ex); progressPanel.updateStatusLabel("Error getting selected tags for case."); } + for (ContentTag tag : tags) { + // TODO: Currently only AbstractFiles have md5 hashes. Here only files matter. + Content content = tag.getContent(); + if (content instanceof AbstractFile) { + if (!StringUtils.isBlank(((AbstractFile) content).getMd5Hash())) { + try { + hashSet.addHashes(tag.getContent(), openCase.getDisplayName()); + } catch (TskCoreException ex) { + Logger.getLogger(SaveTaggedHashesToHashDb.class.getName()).log(Level.SEVERE, "Error adding hash for obj_id = " + tag.getContent().getId() + " to hash set " + hashSet.getHashSetName(), ex); + failedExports.add(tag.getContent().getName()); + } + } else { + progressPanel.updateStatusLabel("Unable to add the " + (tags.size() > 1 ? "files" : "file") + " to the hash set. Hashes have not been calculated. Please configure and run an appropriate ingest module."); + failedExports.add(tag.getContent().getName()); + } + } + } } + progressPanel.setIndeterminate(false); if (!failedExports.isEmpty()) { - StringBuilder errorMessage = new StringBuilder("Failed to export hashes for the following files: "); + StringBuilder errorMessage = new StringBuilder("Failed to export hashes for the following files: "); for (int i = 0; i < failedExports.size(); ++i) { errorMessage.append(failedExports.get(i)); if (failedExports.size() > 1 && i < failedExports.size() - 1) { - errorMessage.append(","); + errorMessage.append(",
"); } if (i == failedExports.size() - 1) { - errorMessage.append("."); + errorMessage.append("."); } } - progressPanel.updateStatusLabel(errorMessage.toString()); + progressPanel.complete(ReportProgressPanel.ReportStatus.ERROR, errorMessage.toString()); + } else { + progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE); } - - progressPanel.setIndeterminate(false); - progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE); } @Override @@ -202,7 +204,7 @@ public class SaveTaggedHashesToHashDb implements GeneralReportModule { initializePanel(); return configPanel; } - + private void initializePanel() { if (configPanel == null) { configPanel = new SaveTaggedHashesToHashDbConfigPanel();