From 50c7a80e79f9c86df5cedd760514821bd91994ea Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Thu, 14 May 2020 09:05:20 -0400 Subject: [PATCH 01/21] Read error logs and update plugins for errors Read error logs and update pluginks for errors. --- .../recentactivity/ExtractRegistry.java | 25 +++++++++++++++++-- thirdparty/rr-full/plugins/ie_zones.pl | 6 ++++- thirdparty/rr-full/plugins/searchscopes.pl | 6 +++-- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java index 365f71c81a..a0c0e75a48 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java @@ -418,10 +418,31 @@ class ExtractRegistry extends Extract { String errFilePath = outFilePathBase + "-full.err.txt"; //NON-NLS logger.log(Level.INFO, "Writing Full RegRipper results to: {0}", regOutputFiles.fullPlugins); //NON-NLS executeRegRipper(rrFullCmd, rrFullHome, regFilePath, fullType, regOutputFiles.fullPlugins, errFilePath); + try { + scanErrorLogs(errFilePath); + } catch (IOException ex) { + logger.log(Level.SEVERE, "Unable to run RegRipper", ex); //NON-NLS + this.addErrorMessage(NbBundle.getMessage(this.getClass(), "ExtractRegistry.execRegRip.errMsg.failedAnalyzeRegFile", this.getName())); + } } return regOutputFiles; } + private void scanErrorLogs(String errFilePath) throws IOException { + File regfile = new File(errFilePath); + try (BufferedReader reader = new BufferedReader(new FileReader(regfile))) { + String line = reader.readLine(); + while (line != null) { + line = line.trim(); + if (line.contains("Error")) { + logger.log(Level.WARNING, "Regripper file {0} contains errors from run", errFilePath); //NON-NLS + + } + line = reader.readLine(); + } + } + } + private void executeRegRipper(List regRipperPath, Path regRipperHomeDir, String hiveFilePath, String hiveFileType, String outputFile, String errFile) { try { List commandLine = new ArrayList<>(); @@ -1497,11 +1518,11 @@ class ExtractRegistry extends Extract { line = line.trim(); // Reading to the SECTION DIVIDER to get next section of records to process. Dates appear to have // multiple spaces in them that makes it harder to parse so next section will be easier to parse - while (!line.contains(SECTION_DIVIDER) && !line.contains("MSOffice version not found.")) { + while (!line.contains(SECTION_DIVIDER) && !line.contains("not found") && !line.contains("version 2010 located")) { line = reader.readLine(); } line = reader.readLine(); - while (!line.contains(SECTION_DIVIDER) && !line.contains("MSOffice version not found.")) { + while (!line.contains(SECTION_DIVIDER) && !line.contains("not found")) { // record has the following format // 1294283922|REG|||OfficeDocs2010 - F:\Windows_time_Rules_xp.doc String tokens[] = line.split("\\|"); diff --git a/thirdparty/rr-full/plugins/ie_zones.pl b/thirdparty/rr-full/plugins/ie_zones.pl index 935b3fb537..fb99552f1c 100644 --- a/thirdparty/rr-full/plugins/ie_zones.pl +++ b/thirdparty/rr-full/plugins/ie_zones.pl @@ -61,7 +61,11 @@ sub pluginmain { # Get Zones and various security settings foreach my $n (0..4) { $zone = $key->get_subkey('Zones\\'.$n); - ::rptMsg("Zone ".$n.": ".$zone->get_value("PMDisplayName")->get_data()." - ".$zone->get_value("Description")->get_data()); + if (defined($zone->get_value("PMDisplayName"))) { + ::rptMsg("Zone ".$n.": ".$zone->get_value("PMDisplayName")->get_data()." - ".$zone->get_value("Description")->get_data()); + } else { + ::rptMsg("Zone ".$n.": ".$zone->get_value("DisplayName")->get_data()." - ".$zone->get_value("Description")->get_data()); + } ::rptMsg("LastWrite: ".gmtime($zone->get_timestamp()." UTC")); my @vals = $zone->get_list_of_values(); diff --git a/thirdparty/rr-full/plugins/searchscopes.pl b/thirdparty/rr-full/plugins/searchscopes.pl index 8b8eecc9c0..299293f94f 100644 --- a/thirdparty/rr-full/plugins/searchscopes.pl +++ b/thirdparty/rr-full/plugins/searchscopes.pl @@ -47,8 +47,10 @@ sub pluginmain { if ($key = $root_key->get_subkey($key_path)) { ::rptMsg("SearchScopes"); ::rptMsg($key_path); - ::rptMsg("DefaultScope: ".$key->get_value("DefaultScope")->get_data()); - ::rptMsg(""); + if (defined($key->get_value("DefaultScope"))) { + ::rptMsg("DefaultScope: ".$key->get_value("DefaultScope")->get_data()); + ::rptMsg(""); + } # ::rptMsg("LastWrite Time ".gmtime($key->get_timestamp())." (UTC)"); my @subkeys = $key->get_list_of_subkeys(); if (scalar(@subkeys) > 0) { From 1612b219c1552cd2146744ff0ddf3ec92c0ac4a0 Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Tue, 19 May 2020 10:11:30 -0400 Subject: [PATCH 02/21] Error checking for regripper plugins Error checking for regripper plugins --- .../recentactivity/ExtractRegistry.java | 6 +- thirdparty/rr-full/plugins/eventlogs.pl | 20 ++++-- thirdparty/rr-full/plugins/ie_zones.pl | 72 ++++++++++--------- thirdparty/rr-full/shellitems.pl | 5 +- 4 files changed, 58 insertions(+), 45 deletions(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java index a0c0e75a48..7846a3ea1b 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java @@ -434,7 +434,7 @@ class ExtractRegistry extends Extract { String line = reader.readLine(); while (line != null) { line = line.trim(); - if (line.contains("Error")) { + if (line.contains("Error") || line.contains("@INC")) { logger.log(Level.WARNING, "Regripper file {0} contains errors from run", errFilePath); //NON-NLS } @@ -1518,11 +1518,11 @@ class ExtractRegistry extends Extract { line = line.trim(); // Reading to the SECTION DIVIDER to get next section of records to process. Dates appear to have // multiple spaces in them that makes it harder to parse so next section will be easier to parse - while (!line.contains(SECTION_DIVIDER) && !line.contains("not found") && !line.contains("version 2010 located")) { + while (!line.contains(SECTION_DIVIDER)) { line = reader.readLine(); } line = reader.readLine(); - while (!line.contains(SECTION_DIVIDER) && !line.contains("not found")) { + while (!line.contains(SECTION_DIVIDER)) { // record has the following format // 1294283922|REG|||OfficeDocs2010 - F:\Windows_time_Rules_xp.doc String tokens[] = line.split("\\|"); diff --git a/thirdparty/rr-full/plugins/eventlogs.pl b/thirdparty/rr-full/plugins/eventlogs.pl index 200bb07d7f..f95ebbc888 100644 --- a/thirdparty/rr-full/plugins/eventlogs.pl +++ b/thirdparty/rr-full/plugins/eventlogs.pl @@ -57,9 +57,11 @@ sub pluginmain { ::rptMsg($win_path); ::rptMsg("LastWrite Time ".gmtime($win->get_timestamp())." (UTC)"); my $cn; - if ($cn = $win->get_value("ComputerName")->get_data()) { - ::rptMsg("ComputerName = ".$cn); - } + if (defined($win->get_value("ComputerName"))) { + if ($cn = $win->get_value("ComputerName")->get_data()) { + ::rptMsg("ComputerName = ".$cn); + } + } else { ::rptMsg("ComputerName value not found."); } @@ -81,9 +83,15 @@ sub pluginmain { ::rptMsg(" ".$evpath); ::rptMsg(" LastWrite Time ".gmtime($evlog->get_timestamp())." (UTC)"); ::rptMsg(" Configuration Settings"); - ::rptMsg(" Log location: ".$evlog->get_value('File')->get_data()); - ::rptMsg(" Log Size: ".$evlog->get_value('MaxSize')->get_data()." Bytes"); - ($evlog->get_value('AutoBackupLogFiles') == 0x0) ? ::rptMsg(" AutoBackupLogFiles is Disabled") : ::rptMsg(" AutoBackupLogFiles is Enabled") + if (defined($evlog->get_value('File'))) { + ::rptMsg(" Log location: ".$evlog->get_value('File')->get_data()); + } + if (defined($evlog->get_value('MaxSize'))) { + ::rptMsg(" Log Size: ".$evlog->get_value('MaxSize')->get_data()." Bytes"); + } + if (defined($evlog->get_value('AutoBackupLogFiles'))) { + ($evlog->get_value('AutoBackupLogFiles') == 0x0) ? ::rptMsg(" AutoBackupLogFiles is Disabled") : ::rptMsg(" AutoBackupLogFiles is Enabled") + } } else { ::rptMsg($logname->get_name()." Event Log not found."); diff --git a/thirdparty/rr-full/plugins/ie_zones.pl b/thirdparty/rr-full/plugins/ie_zones.pl index fb99552f1c..a78831049f 100644 --- a/thirdparty/rr-full/plugins/ie_zones.pl +++ b/thirdparty/rr-full/plugins/ie_zones.pl @@ -60,44 +60,48 @@ sub pluginmain { ::rptMsg(""); # Get Zones and various security settings foreach my $n (0..4) { - $zone = $key->get_subkey('Zones\\'.$n); - if (defined($zone->get_value("PMDisplayName"))) { - ::rptMsg("Zone ".$n.": ".$zone->get_value("PMDisplayName")->get_data()." - ".$zone->get_value("Description")->get_data()); - } else { - ::rptMsg("Zone ".$n.": ".$zone->get_value("DisplayName")->get_data()." - ".$zone->get_value("Description")->get_data()); + if (defined($key->get_subkey('Zones\\'.$n))) { + $zone = $key->get_subkey('Zones\\'.$n); + if (defined($zone->get_value("PMDisplayName"))) { + ::rptMsg("Zone ".$n.": ".$zone->get_value("PMDisplayName")->get_data()." - ".$zone->get_value("Description")->get_data()); + } else { + ::rptMsg("Zone ".$n.": ".$zone->get_value("DisplayName")->get_data()." - ".$zone->get_value("Description")->get_data()); + } + ::rptMsg("LastWrite: ".gmtime($zone->get_timestamp()." UTC")); + + my @vals = $zone->get_list_of_values(); + if (scalar(@vals) > 0) { + foreach my $v (@vals) { + my $name = $v->get_name(); + next unless (length($name) == 4 && $name ne "Icon"); + my $data = $v->get_data(); + $name = "**".$name if ($name eq "1609" && $data == 0); + my $str = sprintf "%6s 0x%08x",$name,$data; + # ::rptMsg(" ".$name." ".$data." ".$zones{$data}); + ::rptMsg($str." ".$zones{$data}); + } + } + ::rptMsg(""); } - ::rptMsg("LastWrite: ".gmtime($zone->get_timestamp()." UTC")); - - my @vals = $zone->get_list_of_values(); - if (scalar(@vals) > 0) { - foreach my $v (@vals) { - my $name = $v->get_name(); - next unless (length($name) == 4 && $name ne "Icon"); - my $data = $v->get_data(); - $name = "**".$name if ($name eq "1609" && $data == 0); - my $str = sprintf "%6s 0x%08x",$name,$data; -# ::rptMsg(" ".$name." ".$data." ".$zones{$data}); - ::rptMsg($str." ".$zones{$data}); - } - } - ::rptMsg(""); } # Now, get ZoneMap settings - my $zonemap = $key->get_subkey('ZoneMap\\Domains'); - my @domains = $zonemap->get_list_of_subkeys(); - if (scalar(@domains) > 0) { - foreach my $d (@domains) { - ::rptMsg("Domain: ".$d->get_name()); + if (defined($key->get_subkey('ZoneMap\\Domains'))) { + my $zonemap = $key->get_subkey('ZoneMap\\Domains'); + my @domains = $zonemap->get_list_of_subkeys(); + if (scalar(@domains) > 0) { + foreach my $d (@domains) { + ::rptMsg("Domain: ".$d->get_name()); - my @vals = $d->get_list_of_values(); - if (scalar(@vals) > 0) { - foreach my $v (@vals) { - ::rptMsg(" ".$v->get_name()." ".$v->get_data()); - } - } - ::rptMsg(""); - } - } + my @vals = $d->get_list_of_values(); + if (scalar(@vals) > 0) { + foreach my $v (@vals) { + ::rptMsg(" ".$v->get_name()." ".$v->get_data()); + } + } + ::rptMsg(""); + } + } + } } else { # ::rptMsg($key_path." not found."); diff --git a/thirdparty/rr-full/shellitems.pl b/thirdparty/rr-full/shellitems.pl index ec39234690..34b9174c9d 100644 --- a/thirdparty/rr-full/shellitems.pl +++ b/thirdparty/rr-full/shellitems.pl @@ -480,10 +480,11 @@ sub parseDeviceEntry { # Version 3 = XP if ($ver == 3) { - my $guid1 = parseGUID(substr($data,$ofs + 6,16)); + if (length($data) > ($ofs + 6)) { + my $guid1 = parseGUID(substr($data,$ofs + 6,16)); my $guid2 = parseGUID(substr($data,$ofs + 6 + 16,16)); $item{name} = $guid1."\\".$guid2 - + } } # Version 8 = Win7 elsif ($ver == 8) { From 003d0c5e8b3fd3ded44c8f5e71855fa648e7b4a3 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 1 Jun 2020 13:02:38 -0400 Subject: [PATCH 03/21] added gpx module to pipeline config and place autopsy modules before third party modules --- .../autopsy/ingest/DataSourceIngestJob.java | 38 +++++++++++++++---- .../autopsy/ingest/PipelineConfig.xml | 3 +- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java index b6647c4dbb..88f005dd9a 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java @@ -33,6 +33,7 @@ import javax.swing.JOptionPane; import org.netbeans.api.progress.ProgressHandle; import org.openide.util.Cancellable; import org.openide.util.NbBundle; +import org.openide.util.Pair; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; @@ -57,7 +58,8 @@ import org.sleuthkit.autopsy.python.FactoryClassNameNormalizer; * it. */ public final class DataSourceIngestJob { - + private static String AUTOPSY_MODULE_PREFIX = "org.sleuthkit.autopsy"; + private static final Logger logger = Logger.getLogger(DataSourceIngestJob.class.getName()); /** @@ -215,6 +217,30 @@ public final class DataSourceIngestJob { this.createTime = new Date().getTime(); this.createIngestPipelines(); } + + + + /** + * Adds ingest modules to a list with autopsy modules first and third party modules next. + * @param dest The destination for the modules to be added. + * @param src A map of fully qualified class name mapped to the IngestModuleTemplate. + */ + private static void addOrdered(final List dest, final Map src) { + final List autopsyModules = new ArrayList<>(); + final List thirdPartyModules = new ArrayList<>(); + + src.entrySet().stream().forEach((templateEntry) -> { + if (templateEntry.getKey().startsWith(AUTOPSY_MODULE_PREFIX)) { + autopsyModules.add(templateEntry.getValue()); + } + else { + thirdPartyModules.add(templateEntry.getValue()); + } + }); + + dest.addAll(autopsyModules); + dest.addAll(thirdPartyModules); + } /** * Creates the file and data source ingest pipelines. @@ -250,13 +276,9 @@ public final class DataSourceIngestJob { * configuration to an appropriate pipeline - either the first stage * data source ingest pipeline or the file ingest pipeline. */ - for (IngestModuleTemplate template : dataSourceModuleTemplates.values()) { - firstStageDataSourceModuleTemplates.add(template); - } - for (IngestModuleTemplate template : fileModuleTemplates.values()) { - fileIngestModuleTemplates.add(template); - } - + addOrdered(firstStageDataSourceModuleTemplates, dataSourceModuleTemplates); + addOrdered(fileIngestModuleTemplates, fileModuleTemplates); + /** * Construct the data source ingest pipelines. */ diff --git a/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml b/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml index 362987c289..f80fbe0a4e 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml +++ b/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml @@ -16,7 +16,8 @@ Contains only the core ingest modules that ship with Autopsy --> org.sleuthkit.autopsy.thunderbirdparser.EmailParserModuleFactory org.sleuthkit.autopsy.modules.fileextmismatch.FileExtMismatchDetectorModuleFactory org.sleuthkit.autopsy.modules.interestingitems.InterestingItemsIngestModuleFactory - org.sleuthkit.autopsy.modules.photoreccarver.PhotoRecCarverIngestModuleFactory + org.sleuthkit.autopsy.modules.photoreccarver.PhotoRecCarverIngestModuleFactory + org.sleuthkit.autopsy.modules.GPX_Module.GPXParserFileIngestModuleFactory From 2752dccac950fbbe72d31b59b09cb4d84878de40 Mon Sep 17 00:00:00 2001 From: apriestman Date: Mon, 1 Jun 2020 14:51:29 -0400 Subject: [PATCH 04/21] Updated links on About page. Open URLs in browser instead of Autopsy. --- .../corecomponents/AboutWindowPanel.java | 39 +++++++++++++++++-- .../autopsy/corecomponents/Bundle.properties | 2 +- .../corecomponents/Bundle.properties-MERGED | 17 +++----- .../corecomponents/Bundle_ja.properties | 2 +- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java index a7f8d2c095..cc352394fe 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java @@ -19,12 +19,17 @@ package org.sleuthkit.autopsy.corecomponents; import java.awt.Cursor; +import java.awt.Desktop; import java.awt.Window; import java.io.File; +import java.io.IOException; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.text.MessageFormat; import java.util.Locale; +import java.util.logging.Level; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JPanel; @@ -32,10 +37,10 @@ import javax.swing.SwingUtilities; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import org.netbeans.core.actions.HTMLViewAction; -import org.openide.awt.HtmlBrowser; import org.openide.modules.Places; import org.openide.util.ImageUtilities; import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.coreutils.Version; import org.sleuthkit.datamodel.SleuthkitJNI; @@ -47,6 +52,7 @@ import org.sleuthkit.datamodel.SleuthkitJNI; public final class AboutWindowPanel extends JPanel implements HyperlinkListener { private static final long serialVersionUID = 1L; + private static final Logger logger = Logger.getLogger(AboutWindowPanel.class.getName()); private URL url = null; private final Icon about; private boolean verboseLogging; @@ -67,12 +73,30 @@ public final class AboutWindowPanel extends JPanel implements HyperlinkListener description.setText(org.openide.util.NbBundle.getMessage(AboutWindowPanel.class, "LBL_Description", new Object[]{getProductVersionValue(), getJavaValue(), getVMValue(), getOperatingSystemValue(), getEncodingValue(), getSystemLocaleValue(), getUserDirValue(), getSleuthKitVersionValue(), Version.getNetbeansBuild(), Version.getBuildType().toString()})); - description.addHyperlinkListener(this); - copyright.addHyperlinkListener(this); copyright.setBackground(getBackground()); if (verboseLoggingIsSet()) { disableVerboseLoggingButton(); } + + AboutPanelHyperlinkListener hyperlinkListener = new AboutPanelHyperlinkListener(); + copyright.addHyperlinkListener(hyperlinkListener); + description.addHyperlinkListener(hyperlinkListener); + } + + private class AboutPanelHyperlinkListener implements HyperlinkListener { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + // Try to display the URL in the user's browswer. + if(Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(e.getURL().toURI()); + } catch (IOException | URISyntaxException ex) { + logger.log(Level.WARNING, "Failed to display URL in external viewer", ex); + } + } + } + } } // //GEN-BEGIN:initComponents @@ -212,7 +236,14 @@ private void logoLabelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:e if (url != null) { org.openide.awt.StatusDisplayer.getDefault().setStatusText( NbBundle.getMessage(HTMLViewAction.class, "CTL_OpeningBrowser")); //NON-NLS - HtmlBrowser.URLDisplayer.getDefault().showURL(url); + // Try to display the URL in the user's browswer. + if(Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(url.toURI()); + } catch (IOException | URISyntaxException ex) { + logger.log(Level.WARNING, "Failed to display URL in external viewer", ex); + } + } } } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties index 8834b0f5d7..3c4dd31f76 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties @@ -17,7 +17,7 @@ DataContentViewerHex.pageLabel2.text=Page # Product Information panel LBL_Description=
\n Product Version: {0} ({9})
Sleuth Kit Version: {7}
Netbeans RCP Build: {8}
Java: {1}; {2}
System: {3}; {4}; {5}
Userdir: {6}
Format_OperatingSystem_Value={0} version {1} running on {2} -LBL_Copyright=
Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools.
Copyright © 2003-2018.
+LBL_Copyright=
Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools.
Copyright © 2003-2020.
URL_ON_IMG=http://www.sleuthkit.org/ FILE_FOR_LOCAL_HELP=file:/// INDEX_FOR_LOCAL_HELP=/docs/index.html diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED index f252420726..f9f63659b6 100755 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED @@ -17,9 +17,6 @@ CTL_DataContentTopComponent=Data Content CTL_CustomAboutAction=About CTL_OfflineHelpAction=Offline Autopsy Documentation CTL_OnlineHelpAction=Online Autopsy Documentation -DataContentViewerArtifact.attrsTableHeader.sources=Source(s) -DataContentViewerArtifact.attrsTableHeader.type=Type -DataContentViewerArtifact.attrsTableHeader.value=Value DataContentViewerArtifact.failedToGetAttributes.message=Failed to get some or all attributes from case database DataContentViewerArtifact.failedToGetSourcePath.message=Failed to get source file path from case database DataContentViewerHex.copyingFile=Copying file to open in HxD... @@ -63,9 +60,9 @@ DataContentViewerHex.totalPageLabel.text_1=100 DataContentViewerHex.pageLabel2.text=Page # Product Information panel -LBL_Description=
\n Product Version: {0} ({9})
Sleuth Kit Version: {7}
Netbeans RCP Build: {8}
Java: {1}; {2}
System: {3}; {4}; {5}
Userdir: {6}
+LBL_Description=
\n Product Version: {0} ({9})
Sleuth Kit Version: {7}
Netbeans RCP Build: {8}
Java: {1}; {2}
System: {3}; {4}; {5}
Userdir: {6}
Format_OperatingSystem_Value={0} version {1} running on {2} -LBL_Copyright=
Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools.
Copyright © 2003-2018.
+LBL_Copyright=
Autopsy™ is a digital forensics platform based on The Sleuth Kit™ and other tools.
Copyright © 2003-2020.
SortChooser.dialogTitle=Choose Sort Criteria ThumbnailViewChildren.progress.cancelling=(Cancelling) # {0} - file name @@ -82,8 +79,6 @@ DataContentViewerArtifact.pageLabel2.text=Result DataContentViewerArtifact.nextPageButton.text= DataContentViewerArtifact.currentPageLabel.text=1 DataContentViewerArtifact.ofLabel.text=of -DataContentViewerArtifact.copyMenuItem.text=Copy -DataContentViewerArtifact.selectAllMenuItem.text=Select All DataContentViewerArtifact.pageLabel.text=Result: AdvancedConfigurationDialog.applyButton.text=OK DataContentViewerHex.goToPageTextField.text= @@ -95,7 +90,7 @@ DataResultViewerThumbnail.pageNextButton.text= DataResultViewerThumbnail.imagesLabel.text=Images: DataResultViewerThumbnail.imagesRangeLabel.text=- DataResultViewerThumbnail.pageNumLabel.text=- -DataResultViewerThumbnail.filePathLabel.text=\ +DataResultViewerThumbnail.filePathLabel.text=\ \ \ DataResultViewerThumbnail.goToPageLabel.text=Go to Page: DataResultViewerThumbnail.goToPageField.text= AdvancedConfigurationDialog.cancelButton.text=Cancel @@ -129,9 +124,9 @@ DataResultViewerThumbnail.switchPage.done.errMsg=Error making thumbnails: {0} AboutWindowPanel.actVerboseLogging.text=Activate verbose logging OptionsCategory_Name_Multi_User_Settings=Multi-User OptionsCategory_Keywords_Multi_User_Options=Multi-User Settings -MultiUserSettingsPanel.lbSolrSettings.text=Solr Settings +MultiUserSettingsPanel.lbSolrSettings.text=Solr Server Settings MultiUserSettingsPanel.cbEnableMultiUser.text=Enable multi-user cases -MultiUserSettingsPanel.lbDatabaseSettings.text=Database Settings +MultiUserSettingsPanel.lbDatabaseSettings.text=Database Server Settings MultiUserSettingsPanel.validationErrMsg.incomplete=Fill in all values MultiUserSettingsPanel.nonWindowsOs.msg=Multi-user cases are only available on Windows platforms MultiUserSettingsPanel.validationErrMsg.invalidDatabasePort=Invalid database port number @@ -159,7 +154,7 @@ MultiUserSettingsPanel.tbSolrHostname.toolTipText=Hostname or IP Address MultiUserSettingsPanel.tbSolrPort.toolTipText=Port Number MultiUserSettingsPanel.lbTestMessageService.text= MultiUserSettingsPanel.bnTestMessageService.text=Test -MultiUserSettingsPanel.lbMessageServiceSettings.text=ActiveMQ Message Service Settings +MultiUserSettingsPanel.lbMessageServiceSettings.text=ActiveMQ Message Server Settings MultiUserSettingsPanel.tbMsgPort.toolTipText=Port Number MultiUserSettingsPanel.tbMsgPort.text= MultiUserSettingsPanel.tbMsgUsername.toolTipText=User Name (optional) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties index ec91946e79..5e684d205c 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties @@ -65,7 +65,7 @@ DataContentViewerHex.pageLabel2.text=\u30da\u30fc\u30b8 # \u88fd\u54c1\u60c5\u5831\u30d1\u30cd\u30eb LBL_Description=
\n \u88fd\u54c1\u30d0\u30fc\u30b8\u30e7\u30f3: {0} ({9})
Sleuth Kit\u30d0\u30fc\u30b8\u30e7\u30f3: {7}
Netbeans RCP\u30d3\u30eb\u30c9: {8}
Java: {1}; {2}
\u30b7\u30b9\u30c6\u30e0: {3}; {4}; {5}
Userdir: {6}
Format_OperatingSystem_Value={2} \u4e0a\u3067 {0} \u30d0\u30fc\u30b8\u30e7\u30f3 {1} \u304c\u5b9f\u884c\u4e2d\u3067\u3059 -LBL_Copyright=
Autopsy™ \u306fSleuth Kit&trade\u3068\u305d\u306e\u4ed6\u30c4\u30fc\u30eb\u3092\u30d9\u30fc\u30b9\u3068\u3057\u305f\u30c7\u30b8\u30bf\u30eb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3059\u3002
\u8457\u4f5c\u6a29 © 2003-2018.
+LBL_Copyright=
Autopsy™ \u306fSleuth Kit&trade\u3068\u305d\u306e\u4ed6\u30c4\u30fc\u30eb\u3092\u30d9\u30fc\u30b9\u3068\u3057\u305f\u30c7\u30b8\u30bf\u30eb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3059\u3002
\u8457\u4f5c\u6a29 © 2003-2020.
SortChooser.dialogTitle=\u30bd\u30fc\u30c8\u6761\u4ef6\u3092\u9078\u629e ThumbnailViewChildren.progress.cancelling=(\u53d6\u308a\u6d88\u3057\u4e2d) # {0} - \u30d5\u30a1\u30a4\u30eb\u540d From 888279ef679572e670b953c1507d2f25f9be37a9 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Wed, 3 Jun 2020 12:07:16 -0400 Subject: [PATCH 05/21] formatting --- Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java index 88f005dd9a..74fcf0301b 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java @@ -33,7 +33,6 @@ import javax.swing.JOptionPane; import org.netbeans.api.progress.ProgressHandle; import org.openide.util.Cancellable; import org.openide.util.NbBundle; -import org.openide.util.Pair; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; From ea3b677d5e16510c7f33665f6493ddc9c90f428c Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Wed, 3 Jun 2020 16:14:46 -0400 Subject: [PATCH 06/21] fix for searching for jython classes --- .../autopsy/ingest/DataSourceIngestJob.java | 122 ++++++++++++++---- .../autopsy/ingest/PipelineConfig.xml | 4 +- 2 files changed, 98 insertions(+), 28 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java index 74fcf0301b..970f94c9fc 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java @@ -29,6 +29,9 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; import javax.swing.JOptionPane; import org.netbeans.api.progress.ProgressHandle; import org.openide.util.Cancellable; @@ -57,10 +60,14 @@ import org.sleuthkit.autopsy.python.FactoryClassNameNormalizer; * it. */ public final class DataSourceIngestJob { + private static String AUTOPSY_MODULE_PREFIX = "org.sleuthkit.autopsy"; - + private static final Logger logger = Logger.getLogger(DataSourceIngestJob.class.getName()); + // to match something like: "org.python.proxies.GPX_Parser_Module$GPXParserFileIngestModuleFactory$14" + private static final Pattern JYTHON_REGEX = Pattern.compile("org\\.python\\.proxies\\.(.+?)\\$(.+?)(\\$[0-9]*)?$"); + /** * These fields define a data source ingest job: the parent ingest job, an * ID, the user's ingest job settings, and the data source to be analyzed. @@ -216,31 +223,75 @@ public final class DataSourceIngestJob { this.createTime = new Date().getTime(); this.createIngestPipelines(); } - - - + /** - * Adds ingest modules to a list with autopsy modules first and third party modules next. - * @param dest The destination for the modules to be added. - * @param src A map of fully qualified class name mapped to the IngestModuleTemplate. + * Adds ingest modules to a list with autopsy modules first and third party + * modules next. + * + * @param dest The destination for the modules to be added. + * @param src A map of fully qualified class name mapped to the + * IngestModuleTemplate. + * @param jythonSrc A map of fully qualified class name mapped to the + * IngestModuleTemplate for jython modules. */ - private static void addOrdered(final List dest, final Map src) { + private static void addOrdered(final List dest, + final Map src, final Map jythonSrc) { + final List autopsyModules = new ArrayList<>(); final List thirdPartyModules = new ArrayList<>(); - - src.entrySet().stream().forEach((templateEntry) -> { + + Stream.concat(src.entrySet().stream(), jythonSrc.entrySet().stream()).forEach((templateEntry) -> { if (templateEntry.getKey().startsWith(AUTOPSY_MODULE_PREFIX)) { autopsyModules.add(templateEntry.getValue()); - } - else { + } else { thirdPartyModules.add(templateEntry.getValue()); } }); - + dest.addAll(autopsyModules); dest.addAll(thirdPartyModules); } + /** + * Takes a classname like + * "org.python.proxies.GPX_Parser_Module$GPXParserFileIngestModuleFactory$14" + * and provides "GPX_Parser_Module.GPXParserFileIngestModuleFactory" or null + * if not in jython package. + * + * @param canonicalName The canonical name. + * + * @return The jython name or null if not in jython package. + */ + private static String getJythonName(String canonicalName) { + Matcher m = JYTHON_REGEX.matcher(canonicalName); + if (m.find()) { + return String.format("%s.%s", m.group(1), m.group(2)); + } else { + return null; + } + } + + /** + * Adds a template to the appropriate map. If the class is a jython class, + * then it is added to the jython map. Otherwise, it is added to the + * mapping. + * + * @param mapping Mapping for non-jython objects. + * @param jythonMapping Mapping for jython objects. + * @param template The template to add. + */ + private static void addModule(Map mapping, + Map jythonMapping, IngestModuleTemplate template) { + + String className = template.getModuleFactory().getClass().getCanonicalName(); + String jythonName = getJythonName(className); + if (jythonName != null) { + jythonMapping.put(jythonName, template); + } else { + mapping.put(className, template); + } + } + /** * Creates the file and data source ingest pipelines. */ @@ -252,12 +303,18 @@ public final class DataSourceIngestJob { */ Map dataSourceModuleTemplates = new LinkedHashMap<>(); Map fileModuleTemplates = new LinkedHashMap<>(); + + // mappings for jython modules. These mappings are only used to determine modules in the pipelineconfig.xml. + + Map jythonDataSourceModuleTemplates = new LinkedHashMap<>(); + Map jythonFileModuleTemplates = new LinkedHashMap<>(); + for (IngestModuleTemplate template : ingestModuleTemplates) { if (template.isDataSourceIngestModuleTemplate()) { - dataSourceModuleTemplates.put(template.getModuleFactory().getClass().getCanonicalName(), template); + addModule(dataSourceModuleTemplates, jythonDataSourceModuleTemplates, template); } if (template.isFileIngestModuleTemplate()) { - fileModuleTemplates.put(template.getModuleFactory().getClass().getCanonicalName(), template); + addModule(fileModuleTemplates, jythonFileModuleTemplates, template); } } @@ -266,18 +323,23 @@ public final class DataSourceIngestJob { * ordered lists of ingest module templates for each ingest pipeline. */ IngestPipelinesConfiguration pipelineConfigs = IngestPipelinesConfiguration.getInstance(); - List firstStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(dataSourceModuleTemplates, pipelineConfigs.getStageOneDataSourceIngestPipelineConfig()); - List fileIngestModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(fileModuleTemplates, pipelineConfigs.getFileIngestPipelineConfig()); - List secondStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates(dataSourceModuleTemplates, pipelineConfigs.getStageTwoDataSourceIngestPipelineConfig()); + List firstStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates( + dataSourceModuleTemplates, jythonDataSourceModuleTemplates, pipelineConfigs.getStageOneDataSourceIngestPipelineConfig()); + + List fileIngestModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates( + fileModuleTemplates, jythonFileModuleTemplates, pipelineConfigs.getFileIngestPipelineConfig()); + + List secondStageDataSourceModuleTemplates = DataSourceIngestJob.getConfiguredIngestModuleTemplates( + dataSourceModuleTemplates, null, pipelineConfigs.getStageTwoDataSourceIngestPipelineConfig()); /** * Add any module templates that were not specified in the pipelines * configuration to an appropriate pipeline - either the first stage * data source ingest pipeline or the file ingest pipeline. */ - addOrdered(firstStageDataSourceModuleTemplates, dataSourceModuleTemplates); - addOrdered(fileIngestModuleTemplates, fileModuleTemplates); - + addOrdered(firstStageDataSourceModuleTemplates, dataSourceModuleTemplates, jythonDataSourceModuleTemplates); + addOrdered(fileIngestModuleTemplates, fileModuleTemplates, jythonFileModuleTemplates); + /** * Construct the data source ingest pipelines. */ @@ -325,19 +387,27 @@ public final class DataSourceIngestJob { * ingest pipeline. The ingest module templates are removed from the input * collection as they are added to the output collection. * - * @param ingestModuleTemplates A mapping of ingest module factory class - * names to ingest module templates. - * @param pipelineConfig An ordered list of ingest module factory - * class names representing an ingest pipeline. + * @param ingestModuleTemplates A mapping of ingest module factory + * class names to ingest module + * templates. + * @param jythonIngestModuleTemplates A mapping of jython processed class + * names to jython ingest module + * templates. + * @param pipelineConfig An ordered list of ingest module + * factory class names representing an + * ingest pipeline. * * @return An ordered list of ingest module templates, i.e., an * uninstantiated pipeline. */ - private static List getConfiguredIngestModuleTemplates(Map ingestModuleTemplates, List pipelineConfig) { + private static List getConfiguredIngestModuleTemplates( + Map ingestModuleTemplates, Map jythonIngestModuleTemplates, List pipelineConfig) { List templates = new ArrayList<>(); for (String moduleClassName : pipelineConfig) { if (ingestModuleTemplates.containsKey(moduleClassName)) { templates.add(ingestModuleTemplates.remove(moduleClassName)); + } else if (jythonIngestModuleTemplates.containsKey(moduleClassName)) { + templates.add(jythonIngestModuleTemplates.remove(moduleClassName)); } } return templates; diff --git a/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml b/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml index f80fbe0a4e..22576ac33e 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml +++ b/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml @@ -17,9 +17,9 @@ Contains only the core ingest modules that ship with Autopsy --> org.sleuthkit.autopsy.modules.fileextmismatch.FileExtMismatchDetectorModuleFactory org.sleuthkit.autopsy.modules.interestingitems.InterestingItemsIngestModuleFactory org.sleuthkit.autopsy.modules.photoreccarver.PhotoRecCarverIngestModuleFactory - org.sleuthkit.autopsy.modules.GPX_Module.GPXParserFileIngestModuleFactory + GPX_Parser_Module.GPXParserFileIngestModuleFactory
- + org.sleuthkit.autopsy.modules.dataSourceIntegrity.DataSourceIntegrityModuleFactory From 5dfbae62a5383f81781fc80d97e45a077035b6a5 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Thu, 4 Jun 2020 07:44:59 -0400 Subject: [PATCH 07/21] android entry update --- Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml b/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml index 22576ac33e..6e6cb9d83f 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml +++ b/Core/src/org/sleuthkit/autopsy/ingest/PipelineConfig.xml @@ -4,7 +4,7 @@ Contains only the core ingest modules that ship with Autopsy --> org.sleuthkit.autopsy.recentactivity.RecentActivityExtracterModuleFactory - org.sleuthkit.autopsy.modules.android.AndroidModuleFactory + module.AndroidModuleFactory From 9b9bf661306e76326197c364844b1ac82eb183eb Mon Sep 17 00:00:00 2001 From: apriestman Date: Mon, 8 Jun 2020 13:54:41 -0400 Subject: [PATCH 08/21] Codacy --- .../corecomponents/AboutWindowPanel.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java index cc352394fe..200b04a6bb 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AboutWindowPanel.java @@ -24,7 +24,6 @@ import java.awt.Window; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.text.MessageFormat; @@ -83,18 +82,20 @@ public final class AboutWindowPanel extends JPanel implements HyperlinkListener description.addHyperlinkListener(hyperlinkListener); } + /** + * Listener to display hyperlinks in an external viewer. + */ private class AboutPanelHyperlinkListener implements HyperlinkListener { @Override public void hyperlinkUpdate(HyperlinkEvent e) { - if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED + && Desktop.isDesktopSupported()) { // Try to display the URL in the user's browswer. - if(Desktop.isDesktopSupported()) { - try { - Desktop.getDesktop().browse(e.getURL().toURI()); - } catch (IOException | URISyntaxException ex) { - logger.log(Level.WARNING, "Failed to display URL in external viewer", ex); - } - } + try { + Desktop.getDesktop().browse(e.getURL().toURI()); + } catch (IOException | URISyntaxException ex) { + logger.log(Level.WARNING, "Failed to display URL in external viewer", ex); + } } } } From 1e3e62304cadd16c60c9950481fc7cf0845abe4b Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Tue, 9 Jun 2020 13:57:43 -0400 Subject: [PATCH 09/21] Additional fields in the Persona Details Panel --- .../centralrepository/datamodel/Persona.java | 12 ++ .../persona/Bundle.properties | 32 ++-- .../persona/PersonaDetailsPanel.form | 124 +++++++++----- .../persona/PersonaDetailsPanel.java | 151 ++++++++++++------ 4 files changed, 215 insertions(+), 104 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java index b0184e2991..654dfc5562 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java @@ -254,6 +254,18 @@ public class Persona { return getPersonaByUUID(uuidStr); } + /** + * Sets the comment of this persona + * + * @param name The new comment. + * + * @throws CentralRepoException If there is an error. + */ + public void setComment(String comment) throws CentralRepoException { + String updateClause = "UPDATE personas SET comment = \"" + comment + "\" WHERE id = " + id; + CentralRepository.getInstance().executeUpdateSQL(updateClause); + } + /** * Sets the name of this persona * diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties index 24fdf1c0ff..5f96c698a2 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties @@ -14,20 +14,6 @@ AddAccountDialog.okBtn.text=OK PersonaManagerTopComponent.editBtn.text=Edit Persona PersonaDetailsDialog.cancelBtn.text=Cancel PersonaDetailsDialog.okBtn.text=OK -PersonaDetailsPanel.deleteCaseBtn.text=Delete -PersonaDetailsPanel.addCaseBtn.text=Add -PersonaDetailsPanel.casesLbl.text=Cases found in: -PersonaDetailsPanel.deleteAliasBtn.text=Delete -PersonaDetailsPanel.addAliasBtn.text=Add -PersonaDetailsPanel.aliasesLabel.text=Aliases: -PersonaDetailsPanel.deleteMetadataBtn.text=Delete -PersonaDetailsPanel.addMetadataBtn.text=Add -PersonaDetailsPanel.metadataLabel.text=Metadata: -PersonaDetailsPanel.deleteAccountBtn.text=Delete -PersonaDetailsPanel.addAccountBtn.text=Add -PersonaDetailsPanel.accountsLbl.text=Accounts: -PersonaDetailsPanel.nameField.text= -PersonaDetailsPanel.nameLbl.text=Name: AddAliasDialog.accountsLbl.text=Account: AddAliasDialog.okBtn.text=OK AddAliasDialog.cancelBtn.text=Cancel @@ -54,3 +40,21 @@ AddAccountDialog.typeLbl.text=Type: AddAccountDialog.identiferLbl.text=Identifier: AddAccountDialog.identifierTextField.text= PersonaManagerTopComponent.deleteBtn.text=Delete Persona +PersonaDetailsPanel.casesLbl.text=Cases found in: +PersonaDetailsPanel.deleteAliasBtn.text=Delete +PersonaDetailsPanel.addAliasBtn.text=Add +PersonaDetailsPanel.aliasesLabel.text=Aliases: +PersonaDetailsPanel.deleteMetadataBtn.text=Delete +PersonaDetailsPanel.addMetadataBtn.text=Add +PersonaDetailsPanel.metadataLabel.text=Metadata: +PersonaDetailsPanel.deleteAccountBtn.text=Delete +PersonaDetailsPanel.addAccountBtn.text=Add +PersonaDetailsPanel.accountsLbl.text=Accounts: +PersonaDetailsPanel.commentField.text= +PersonaDetailsPanel.commentLbl.text=Comment: +PersonaDetailsPanel.nameField.text= +PersonaDetailsPanel.nameLbl.text=Name: +PersonaDetailsPanel.examinerLbl.text=Created by: +PersonaDetailsPanel.examinerField.text= +PersonaDetailsPanel.creationDateLbl.text=Created on: +PersonaDetailsPanel.creationDateField.text= diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form index c4200d166b..1ee91512ea 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form @@ -37,18 +37,12 @@ - - - - + - - - - + @@ -61,12 +55,7 @@ - - - - - - + @@ -74,13 +63,22 @@ + + + + + + + + + + + + + + - - - - - @@ -99,6 +97,11 @@ + + + + + @@ -107,7 +110,19 @@ + + + + + + + + + + + + @@ -143,17 +158,57 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -168,9 +223,6 @@ - - - @@ -312,22 +364,6 @@ - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java index a7c76b7ad4..2b09647f28 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java @@ -20,8 +20,10 @@ package org.sleuthkit.autopsy.centralrepository.persona; import java.awt.Component; import java.awt.event.ActionEvent; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.logging.Level; import javax.swing.JButton; @@ -34,7 +36,9 @@ import org.openide.windows.TopComponent; import org.openide.util.NbBundle.Messages; import org.openide.windows.RetainLocation; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount; +import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoExaminer; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException; +import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase; import org.sleuthkit.autopsy.centralrepository.datamodel.Persona; import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAccount; @@ -282,6 +286,12 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { private void initComponents() { detailsPanel = new javax.swing.JPanel(); + examinerLbl = new javax.swing.JLabel(); + examinerField = new javax.swing.JTextField(); + creationDateLbl = new javax.swing.JLabel(); + creationDateField = new javax.swing.JTextField(); + commentLbl = new javax.swing.JLabel(); + commentField = new javax.swing.JTextField(); nameLbl = new javax.swing.JLabel(); nameField = new javax.swing.JTextField(); accountsLbl = new javax.swing.JLabel(); @@ -302,18 +312,26 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { casesLbl = new javax.swing.JLabel(); casesTablePane = new javax.swing.JScrollPane(); casesTable = new javax.swing.JTable(); - addCaseBtn = new javax.swing.JButton(); - deleteCaseBtn = new javax.swing.JButton(); + + org.openide.awt.Mnemonics.setLocalizedText(examinerLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.examinerLbl.text")); // NOI18N + + examinerField.setEditable(false); + examinerField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.examinerField.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(creationDateLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.creationDateLbl.text")); // NOI18N + + creationDateField.setEditable(false); + creationDateField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.creationDateField.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(commentLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.commentLbl.text")); // NOI18N + + commentField.setEditable(false); + commentField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.commentField.text")); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(nameLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameLbl.text")); // NOI18N nameField.setEditable(false); nameField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameField.text")); // NOI18N - nameField.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - nameFieldActionPerformed(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(accountsLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.accountsLbl.text")); // NOI18N @@ -393,12 +411,6 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { )); casesTablePane.setViewportView(casesTable); - org.openide.awt.Mnemonics.setLocalizedText(addCaseBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addCaseBtn.text")); // NOI18N - addCaseBtn.setEnabled(false); - - org.openide.awt.Mnemonics.setLocalizedText(deleteCaseBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteCaseBtn.text")); // NOI18N - deleteCaseBtn.setEnabled(false); - javax.swing.GroupLayout detailsPanelLayout = new javax.swing.GroupLayout(detailsPanel); detailsPanel.setLayout(detailsPanelLayout); detailsPanelLayout.setHorizontalGroup( @@ -406,11 +418,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { .addGroup(detailsPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(accountsTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 549, Short.MAX_VALUE) - .addGroup(detailsPanelLayout.createSequentialGroup() - .addComponent(nameLbl) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(nameField)) + .addComponent(accountsTablePane, javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(accountsLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(metadataLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(metadataTablePane, javax.swing.GroupLayout.Alignment.TRAILING) @@ -418,12 +426,20 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { .addComponent(aliasesTablePane) .addComponent(casesLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(casesTablePane) + .addGroup(detailsPanelLayout.createSequentialGroup() + .addComponent(commentLbl) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(commentField)) + .addGroup(detailsPanelLayout.createSequentialGroup() + .addComponent(examinerLbl) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(examinerField, javax.swing.GroupLayout.PREFERRED_SIZE, 222, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(creationDateLbl) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(creationDateField, javax.swing.GroupLayout.PREFERRED_SIZE, 222, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(detailsPanelLayout.createSequentialGroup() .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(detailsPanelLayout.createSequentialGroup() - .addComponent(addCaseBtn) - .addGap(18, 18, 18) - .addComponent(deleteCaseBtn)) .addGroup(detailsPanelLayout.createSequentialGroup() .addComponent(addAccountBtn) .addGap(18, 18, 18) @@ -436,13 +452,27 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { .addComponent(addAliasBtn) .addGap(18, 18, 18) .addComponent(deleteAliasBtn))) - .addGap(0, 0, Short.MAX_VALUE))) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(detailsPanelLayout.createSequentialGroup() + .addComponent(nameLbl) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(nameField))) .addContainerGap()) ); detailsPanelLayout.setVerticalGroup( detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(detailsPanelLayout.createSequentialGroup() - .addContainerGap() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(examinerLbl) + .addComponent(examinerField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(creationDateLbl) + .addComponent(creationDateField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(commentField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(commentLbl)) + .addGap(20, 20, 20) .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(nameLbl) .addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) @@ -474,40 +504,27 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { .addComponent(casesLbl) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(casesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(addCaseBtn) - .addComponent(deleteCaseBtn)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 561, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(detailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(detailsPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 559, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(detailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(detailsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) ); }// //GEN-END:initComponents - private void nameFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nameFieldActionPerformed - - }//GEN-LAST:event_nameFieldActionPerformed - // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel accountsLbl; private javax.swing.JTable accountsTable; private javax.swing.JScrollPane accountsTablePane; private javax.swing.JButton addAccountBtn; private javax.swing.JButton addAliasBtn; - private javax.swing.JButton addCaseBtn; private javax.swing.JButton addMetadataBtn; private javax.swing.JLabel aliasesLabel; private javax.swing.JTable aliasesTable; @@ -515,11 +532,16 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { private javax.swing.JLabel casesLbl; private javax.swing.JTable casesTable; private javax.swing.JScrollPane casesTablePane; + private javax.swing.JTextField commentField; + private javax.swing.JLabel commentLbl; + private javax.swing.JTextField creationDateField; + private javax.swing.JLabel creationDateLbl; private javax.swing.JButton deleteAccountBtn; private javax.swing.JButton deleteAliasBtn; - private javax.swing.JButton deleteCaseBtn; private javax.swing.JButton deleteMetadataBtn; private javax.swing.JPanel detailsPanel; + private javax.swing.JTextField examinerField; + private javax.swing.JLabel examinerLbl; private javax.swing.JLabel metadataLabel; private javax.swing.JTable metadataTable; private javax.swing.JScrollPane metadataTablePane; @@ -531,12 +553,22 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { "PersonaDetailsPanel_load_exception_Title=Initialization failure", "PersonaDetailsPanel_load_exception_msg=Failed to load persona",}) private void loadPersona(Component parent, Persona persona) { + String examiner; + String creationDate; + String comment; String name; Collection accounts; Collection metadata; Collection aliases; Collection cases; try { + examiner = persona.getExaminer().getLoginName(); + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Date cDate = new Date(persona.getCreatedDate()); + creationDate = dateFormat.format(cDate); + + comment = persona.getComment(); name = persona.getName(); accounts = persona.getPersonaAccounts(); metadata = persona.getMetadata(); @@ -551,6 +583,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { return; } this.currentPersona = persona; + this.examinerField.setText(examiner); + this.creationDateField.setText(creationDate); + this.commentField.setText(comment); this.nameField.setText(name); this.currentAccounts.addAll(accounts); this.currentMetadata.addAll(metadata); @@ -560,6 +595,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { void clear() { currentPersona = null; + examinerField.setText(""); + creationDateField.setText(""); + commentField.setText(""); nameField.setText(mode == PersonaDetailsMode.CREATE ? Persona.getDefaultName() : ""); currentAccounts = new ArrayList<>(); currentMetadata = new ArrayList<>(); @@ -569,17 +607,16 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { metadataToAdd.clear(); aliasesToAdd.clear(); nameField.setEditable(false); + commentField.setEditable(false); initializeFields(); addAccountBtn.setEnabled(false); addMetadataBtn.setEnabled(false); addAliasBtn.setEnabled(false); - addCaseBtn.setEnabled(false); deleteAccountBtn.setEnabled(false); deleteMetadataBtn.setEnabled(false); deleteAliasBtn.setEnabled(false); - deleteCaseBtn.setEnabled(false); } /** @@ -678,14 +715,26 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { } void enableEditUIComponents() { + commentField.setEditable(true); nameField.setEditable(true); addAccountBtn.setEnabled(true); addMetadataBtn.setEnabled(true); addAliasBtn.setEnabled(true); - //addCaseBtn.setEnabled(true); //todo } void initializeFields() { + if (mode == PersonaDetailsMode.CREATE) { + try { + CentralRepoExaminer examiner = CentralRepository.getInstance().getOrInsertExaminer(System.getProperty("user.name")); + examinerField.setText(examiner.getLoginName()); + } catch (CentralRepoException e) { + logger.log(Level.SEVERE, "Failed to access central repository", e); + JOptionPane.showMessageDialog(this, + Bundle.PersonaDetailsPanel_CentralRepoErr_msg(), + Bundle.PersonaDetailsPanel_CentralRepoErr_Title(), + JOptionPane.ERROR_MESSAGE); + } + } updateAccountsTable(); updateMetadataTable(); updateAliasesTable(); @@ -719,7 +768,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { "PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository", "PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure", "PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty", - "PersonaDetailsPanel_EmptyName_Title=Empty persona name",}) + "PersonaDetailsPanel_EmptyName_Title=Empty persona name", + "PersonaDetailsPanel_EmptyComment_msg=Persona comment cannot be empty", + "PersonaDetailsPanel_EmptyComment_Title=Empty persona comment",}) Persona okHandler() { if (accountsToAdd.size() + currentAccounts.size() < 1) { JOptionPane.showMessageDialog(this, @@ -729,6 +780,13 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { return null; } + if (commentField.getText().isEmpty()) { + JOptionPane.showMessageDialog(this, + Bundle.PersonaDetailsPanel_EmptyComment_msg(), + Bundle.PersonaDetailsPanel_EmptyComment_Title(), + JOptionPane.ERROR_MESSAGE); + return null; + } if (nameField.getText().isEmpty()) { JOptionPane.showMessageDialog(this, Bundle.PersonaDetailsPanel_EmptyName_msg(), @@ -743,7 +801,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { try { PAccount firstAccount = accountsToAdd.get(0); ret = Persona.createPersonaForAccount(nameField.getText(), - "", Persona.PersonaStatus.ACTIVE, firstAccount.account, + commentField.getText(), Persona.PersonaStatus.ACTIVE, firstAccount.account, firstAccount.justification, firstAccount.confidence); for (int i = 1; i < accountsToAdd.size(); i++) { ret.addAccount(accountsToAdd.get(i).account, @@ -768,6 +826,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { case EDIT: try { ret = currentPersona; + currentPersona.setComment(commentField.getText()); currentPersona.setName(nameField.getText()); for (PAccount acc : accountsToAdd) { ret.addAccount(acc.account, acc.justification, acc.confidence); From 0e8c1aee9fc1c042d1e4364f02a1b2db89f0b4c3 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Tue, 9 Jun 2020 14:09:53 -0400 Subject: [PATCH 10/21] 6409 Added date to ingest-related timestamps --- Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java | 2 +- .../sleuthkit/autopsy/ingest/IngestProgressSnapshotPanel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java index 00e0278d9a..0e12baa9a6 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestMessagePanel.java @@ -937,7 +937,7 @@ class IngestMessagePanel extends JPanel implements TableModelListener { Object aValue = value; if (value instanceof Date) { Date date = (Date) value; - DateFormat df = new SimpleDateFormat("HH:mm:ss"); + DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); aValue = df.format(date); } else { throw new RuntimeException(NbBundle.getMessage(this.getClass(), diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestProgressSnapshotPanel.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestProgressSnapshotPanel.java index 0448382309..44c508c75c 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestProgressSnapshotPanel.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestProgressSnapshotPanel.java @@ -221,7 +221,7 @@ class IngestProgressSnapshotPanel extends javax.swing.JPanel { cellValue = snapShot.getDataSource(); break; case 2: - SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); cellValue = dateFormat.format(new Date(snapShot.getJobStartTime())); break; case 3: From 15dbc32736c2b2f8ed1441b18a471e922fa9450e Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Tue, 9 Jun 2020 15:15:30 -0400 Subject: [PATCH 11/21] 6428 Fixing merge --- .../autopsy/centralrepository/datamodel/PersonaAccount.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAccount.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAccount.java index d652708b18..d0322ddbca 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAccount.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAccount.java @@ -282,9 +282,6 @@ public class PersonaAccount { CentralRepository cr = CentralRepository.getInstance(); if (cr != null) { - String queryClause = PERSONA_ACCOUNTS_QUERY_CALUSE - + " WHERE persona_accounts.account_id = " + accountId; - PersonaAccountsQueryCallback queryCallback = new PersonaAccountsQueryCallback(); cr.executeSelectSQL(queryClause, queryCallback); From f565cf8344704ceccaeb0406b176ba535d138e98 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Thu, 11 Jun 2020 11:36:52 -0400 Subject: [PATCH 12/21] 6428 PR comments --- .../centralrepository/datamodel/Persona.java | 17 +++++++++++++---- .../persona/PersonaManagerTopComponent.java | 4 ++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java index 654dfc5562..5b0226dea9 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java @@ -255,7 +255,7 @@ public class Persona { } /** - * Sets the comment of this persona + * Sets the comment of this persona. * * @param name The new comment. * @@ -263,7 +263,10 @@ public class Persona { */ public void setComment(String comment) throws CentralRepoException { String updateClause = "UPDATE personas SET comment = \"" + comment + "\" WHERE id = " + id; - CentralRepository.getInstance().executeUpdateSQL(updateClause); + CentralRepository cr = CentralRepository.getInstance(); + if (cr != null) { + cr.executeUpdateSQL(updateClause); + } } /** @@ -275,7 +278,10 @@ public class Persona { */ public void setName(String name) throws CentralRepoException { String updateClause = "UPDATE personas SET name = \"" + name + "\" WHERE id = " + id; - CentralRepository.getInstance().executeUpdateSQL(updateClause); + CentralRepository cr = CentralRepository.getInstance(); + if (cr != null) { + cr.executeUpdateSQL(updateClause); + } } /** @@ -311,7 +317,10 @@ public class Persona { */ public void delete() throws CentralRepoException { String deleteSQL = "UPDATE personas SET status_id = " + PersonaStatus.DELETED.status_id + " WHERE id = " + this.id; - CentralRepository.getInstance().executeUpdateSQL(deleteSQL); + CentralRepository cr = CentralRepository.getInstance(); + if (cr != null) { + cr.executeDeleteSQL(deleteSQL); + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java index be40c8d33c..ab20967822 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaManagerTopComponent.java @@ -56,7 +56,7 @@ public final class PersonaManagerTopComponent extends TopComponent { @Messages({ "PMTopComponent_Name=Persona Manager", "PMTopComponent_delete_exception_Title=Delete failure", - "PMTopComponent_delete_exception_msg=Failed to delete persona", + "PMTopComponent_delete_exception_msg=Failed to delete persona.", }) public PersonaManagerTopComponent() { initComponents(); @@ -204,7 +204,7 @@ public final class PersonaManagerTopComponent extends TopComponent { @Messages({ "PMTopComponent_search_exception_Title=Search failure", - "PMTopComponent_search_exception_msg=Failed to search personas",}) + "PMTopComponent_search_exception_msg=Failed to search personas.",}) private void executeSearch() { Collection results; try { From bc10b2657a2a1b67977affce5c3bbfa48cd06f28 Mon Sep 17 00:00:00 2001 From: Raman Arora Date: Fri, 12 Jun 2020 08:48:04 -0400 Subject: [PATCH 13/21] 6451: Do not search for personas, if Central Repo is disabled. --- .../autopsy/contentviewers/Bundle.properties | 2 +- .../contentviewers/CallLogArtifactViewer.java | 55 +++++++++++++------ .../contentviewers/ContactArtifactViewer.java | 34 ++++++++---- 3 files changed, 64 insertions(+), 27 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties index edb4c70bc2..b6e3b0044a 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties @@ -976,7 +976,7 @@ MessageArtifactViewer.rtfbodyScrollPane.TabConstraints.tabTitle=RTF MessageArtifactViewer.toText.text=to list goes here MessageArtifactViewer.toLabel.text=To: MessageArtifactViewer.htmlPane.TabConstraints.tabTitle=HTML -CallLogArtifactViewer.localAccountPersonaLabel.text=Persona: +CallLogArtifactViewer.localAccountPersonaLabel.text=Persona CallLogArtifactViewer.localAccountPersonaNameLabel.text=jLabel1 CallLogArtifactViewer.localAccountPersonaButton.text=jButton1 ContactArtifactViewer.personasLabel.text=Personas diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/CallLogArtifactViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/CallLogArtifactViewer.java index e4c66a16be..829c84bda2 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/CallLogArtifactViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/CallLogArtifactViewer.java @@ -454,11 +454,8 @@ public class CallLogArtifactViewer extends javax.swing.JPanel implements Artifac if (callLogViewData.getLocalAccountId() != null) { localAccountIdLabel.setText(callLogViewData.getLocalAccountId()); - // kick off a task to find the persona for this account - PersonaSearcherTask task = new PersonaSearcherTask(new AccountPersonaSearcherData(callLogViewData.getLocalAccountId(), localAccountPersonaNameLabel, localAccountPersonaButton)); - personaSearchtasks.add(task); - personatasksExecutor.submit(task); - + // Get the persona for the local account. + getPersona(new AccountPersonaSearcherData(callLogViewData.getLocalAccountId(), localAccountPersonaNameLabel, localAccountPersonaButton)); } else { // no local account info, hide all fields. localAccountLabel.setVisible(false); @@ -470,6 +467,35 @@ public class CallLogArtifactViewer extends javax.swing.JPanel implements Artifac } } + @NbBundle.Messages({ + "CallLogArtifactViewer_crdisbaled_persona_label=Unknown", + "CallLogArtifactViewer_crdisbaled_persona_button_text=Create" + }) + + /** + * Gets the persona for the account specified. The persona name and button are + * updated when the persona is retrieved. + * + * If CentralRepo is disabled, it disables the persona name & button. + * + * @param personaSearcherData Persona search data. + * + */ + private void getPersona(AccountPersonaSearcherData personaSearcherData) { + + if (CentralRepository.isEnabled()) { + PersonaSearcherTask task = new PersonaSearcherTask(personaSearcherData); + personaSearchtasks.add(task); + personatasksExecutor.submit(task); + } else { + personaSearcherData.getPersonaNameLabel().setText(Bundle.CallLogArtifactViewer_crdisbaled_persona_label()); + personaSearcherData.getPersonaNameLabel().setEnabled(false); + + personaSearcherData.getPersonaActionButton().setText(Bundle.CallLogArtifactViewer_crdisbaled_persona_button_text()); + personaSearcherData.getPersonaActionButton().setEnabled(false); + } + } + /** * Updates the Call participants panel. * @@ -502,7 +528,7 @@ public class CallLogArtifactViewer extends javax.swing.JPanel implements Artifac * Display a call participant in the view. * * @param participantDesignator Label to show - To/From. - * @param accountIdentifier account identifier for the participant. + * @param accountIdentifier account identifier for the participant. * @param gridBagLayout * @param constraints */ @@ -575,13 +601,10 @@ public class CallLogArtifactViewer extends javax.swing.JPanel implements Artifac constraints.insets = new java.awt.Insets(TOP_INSET, 0, 0, 0); - // Kick off a background thread to search for the persona - // for this particpant account. - PersonaSearcherTask task = new PersonaSearcherTask(new AccountPersonaSearcherData(accountIdentifier, participantPersonaNameLabel, personaButton)); - personaSearchtasks.add(task); - personatasksExecutor.submit(task); + // Get the persona for this party, and update the persona name & button. + getPersona(new AccountPersonaSearcherData(accountIdentifier, participantPersonaNameLabel, personaButton)); - // add a filler to take up rest of the space + // Add a filler to take up rest of the space constraints.gridx++; constraints.weightx = 1.0; constraints.fill = GridBagConstraints.HORIZONTAL; @@ -757,8 +780,8 @@ public class CallLogArtifactViewer extends javax.swing.JPanel implements Artifac * Extracts the other recipients numbers from the given attribute. Updates * the given CallLogViewData with the other recipients list. * - * @param recipientsAttr TO attribute, must not be null. - * @param directionAttr Direction attribute. + * @param recipientsAttr TO attribute, must not be null. + * @param directionAttr Direction attribute. * @param callLogViewData CallLogViewData object to update. * */ @@ -813,9 +836,9 @@ public class CallLogArtifactViewer extends javax.swing.JPanel implements Artifac * Extract the call time and duration from the artifact and saves in the * CallLogViewData. * - * @param artifact Call log artifact. + * @param artifact Call log artifact. * @param callLogViewData CallLogViewData object to save the time & duration - * in. + * in. * * @throws TskCoreException */ diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/ContactArtifactViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/ContactArtifactViewer.java index e7c6d2ccdc..698cafcd2a 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/ContactArtifactViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/ContactArtifactViewer.java @@ -42,6 +42,7 @@ import javax.swing.SwingWorker; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException; +import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository; import org.sleuthkit.autopsy.centralrepository.datamodel.Persona; import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAccount; import org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsDialog; @@ -424,12 +425,17 @@ public class ContactArtifactViewer extends javax.swing.JPanel implements Artifac * @throws CentralRepoException */ @NbBundle.Messages({ - "ContactArtifactViewer_persona_searching= Searching..." + "ContactArtifactViewer_persona_searching= Searching...", + "ContactArtifactViewer_persona_unknown=Unknown" }) private void initiatePersonasSearch(List accountAttributesList) throws CentralRepoException { personasLabel.setVisible(true); + String personaStatusLabelText = CentralRepository.isEnabled() + ? Bundle.ContactArtifactViewer_persona_searching() + : Bundle.ContactArtifactViewer_persona_unknown(); + // create a gridbag layout to show each participant on one line GridBagLayout gridBagLayout = new GridBagLayout(); GridBagConstraints constraints = new GridBagConstraints(); @@ -451,19 +457,27 @@ public class ContactArtifactViewer extends javax.swing.JPanel implements Artifac personasPanel.add(personaLabel); constraints.gridy++; - javax.swing.JLabel primaryPersonaNameLabel = new javax.swing.JLabel(); - primaryPersonaNameLabel.setText(Bundle.ContactArtifactViewer_persona_searching()); - gridBagLayout.setConstraints(primaryPersonaNameLabel, constraints); - personasPanel.add(primaryPersonaNameLabel); + javax.swing.JLabel personaStatusLabel = new javax.swing.JLabel(); + personaStatusLabel.setText(personaStatusLabelText); + gridBagLayout.setConstraints(personaStatusLabel, constraints); + personasPanel.add(personaStatusLabel); + + + if (CentralRepository.isEnabled() ) { + personasLabel.setEnabled(true); + + // Kick off a background task to serach for personas for the contact + ContactPersonaSearcherTask personaSearchTask = new ContactPersonaSearcherTask(accountAttributesList); + personaSearchTask.execute(); + } else { + personasLabel.setEnabled(false); + personaLabel.setEnabled(false); + personaStatusLabel.setEnabled(false); + } personasPanel.setLayout(gridBagLayout); personasPanel.revalidate(); personasPanel.repaint(); - - // Kick off a background task to serach for personas for the contact - ContactPersonaSearcherTask personaSearchTask = new ContactPersonaSearcherTask(accountAttributesList); - personaSearchTask.execute(); - } /** From 72242c5e9b94be73b4480c85cc69c13e6b695592 Mon Sep 17 00:00:00 2001 From: Mark McKinnon Date: Fri, 12 Jun 2020 09:35:53 -0400 Subject: [PATCH 14/21] Update ExtractRegistry.java Change contains to also ccheck only for lower case as well --- .../org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java index 7846a3ea1b..80171f0672 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java @@ -434,7 +434,7 @@ class ExtractRegistry extends Extract { String line = reader.readLine(); while (line != null) { line = line.trim(); - if (line.contains("Error") || line.contains("@INC")) { + if (line.toLowerCase().contains("error") || line.toLowerCase().contains("@inc")) { logger.log(Level.WARNING, "Regripper file {0} contains errors from run", errFilePath); //NON-NLS } From e67f065ee993d0d3ad747c780fe4d6620acb2436 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 12 Jun 2020 13:55:10 -0400 Subject: [PATCH 15/21] fix for NPE --- .../src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java index 970f94c9fc..4527892323 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/DataSourceIngestJob.java @@ -404,9 +404,9 @@ public final class DataSourceIngestJob { Map ingestModuleTemplates, Map jythonIngestModuleTemplates, List pipelineConfig) { List templates = new ArrayList<>(); for (String moduleClassName : pipelineConfig) { - if (ingestModuleTemplates.containsKey(moduleClassName)) { + if (ingestModuleTemplates != null && ingestModuleTemplates.containsKey(moduleClassName)) { templates.add(ingestModuleTemplates.remove(moduleClassName)); - } else if (jythonIngestModuleTemplates.containsKey(moduleClassName)) { + } else if (jythonIngestModuleTemplates != null && jythonIngestModuleTemplates.containsKey(moduleClassName)) { templates.add(jythonIngestModuleTemplates.remove(moduleClassName)); } } From 883dec3af7fb2b8d42478400cb978130beea580b Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Fri, 12 Jun 2020 15:11:04 -0400 Subject: [PATCH 16/21] 6455 Added the ability to modify justification and confidence in the Persona details panel --- .../Bundle.properties-MERGED | 5 +- .../centralrepository/datamodel/Persona.java | 36 ++++ .../datamodel/PersonaAccount.java | 19 ++ .../datamodel/PersonaAlias.java | 21 +- .../datamodel/PersonaMetadata.java | 18 ++ .../persona/Bundle.properties | 3 + .../persona/Bundle.properties-MERGED | 29 +-- .../persona/PersonaAccountDialog.java | 74 +++++--- .../persona/PersonaAliasDialog.java | 51 ++++- .../persona/PersonaDetailsPanel.form | 47 ++++- .../persona/PersonaDetailsPanel.java | 179 ++++++++++++++---- .../persona/PersonaMetadataDialog.java | 45 ++++- 12 files changed, 425 insertions(+), 102 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED index 007af703c5..75866a79d0 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED @@ -5,10 +5,7 @@ CentralRepoCommentDialog.title.addEditCentralRepoComment=Add/Edit Central Reposi OpenIDE-Module-Name=Central Repository OpenIDE-Module-Display-Category=Ingest Module OpenIDE-Module-Short-Description=Correlation Engine Ingest Module -OpenIDE-Module-Long-Description=\ - Correlation Engine ingest module and central database. \n\n\ - The Correlation Engine ingest module stores attributes of artifacts matching selected correlation types into a central database.\n\ - Stored attributes are used in future cases to correlate and analyzes files and artifacts during ingest. +OpenIDE-Module-Long-Description=Correlation Engine ingest module and central database. \n\nThe Correlation Engine ingest module stores attributes of artifacts matching selected correlation types into a central database.\nStored attributes are used in future cases to correlate and analyzes files and artifacts during ingest. CentralRepoCommentDialog.commentLabel.text=Comment: CentralRepoCommentDialog.okButton.text=&OK CentralRepoCommentDialog.cancelButton.text=C&ancel diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java index 7f4bfad144..dade8b321f 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java @@ -292,6 +292,18 @@ public class Persona { PersonaAccount.removePersonaAccount(account.getId()); } + /** + * Modifies the confidence / justification of the given PersonaAccount + * + * @param account account to modify + * + * @throws CentralRepoException If there is an error in querying the + * Personas table. + */ + public void modifyAccount(PersonaAccount account, Confidence confidence, String justification) throws CentralRepoException { + PersonaAccount.modifyPersonaAccount(account.getId(), confidence, justification); + } + /** * Marks this persona as deleted */ @@ -448,6 +460,18 @@ public class Persona { public void removeAlias(PersonaAlias alias) throws CentralRepoException { PersonaAlias.removePersonaAlias(alias); } + + /** + * Modifies the given alias + * + * @param alias alias to modify + * + * @throws CentralRepoException If there is an error in querying the + * Personas table. + */ + public void modifyAlias(PersonaAlias key, Confidence confidence, String justification) throws CentralRepoException { + PersonaAlias.modifyPersonaAlias(key, confidence, justification); + } /** * Gets all aliases for the persona. @@ -486,6 +510,18 @@ public class Persona { public void removeMetadata(PersonaMetadata metadata) throws CentralRepoException { PersonaMetadata.removePersonaMetadata(metadata); } + + /** + * Modifies the given metadata + * + * @param metadata metadata to modify + * + * @throws CentralRepoException If there is an error in querying the + * Personas table. + */ + public void modifyMetadata(PersonaMetadata key, Confidence confidence, String justification) throws CentralRepoException { + PersonaMetadata.modifyPersonaMetadata(key, confidence, justification); + } /** * Gets all metadata for the persona. diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAccount.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAccount.java index db4c8917c0..efd8b76152 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAccount.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAccount.java @@ -363,6 +363,25 @@ public class PersonaAccount { String deleteClause = " DELETE FROM persona_accounts WHERE id = " + id; cr.executeDeleteSQL(deleteClause); } + + /** + * Modifies the PersonaAccount row by the given id + * + * @param id row id for the account to be removed + * + * @throws CentralRepoException If there is an error in removing the + * account. + */ + static void modifyPersonaAccount(long id, Persona.Confidence confidence, String justification) throws CentralRepoException { + CentralRepository cr = CentralRepository.getInstance(); + + if (cr == null) { + throw new CentralRepoException("Failed to modify persona account, Central Repo is not enabled"); + } + + String updateClause = "UPDATE persona_accounts SET confidence_id = " + confidence.getLevelId() + ", justification = \"" + justification + "\" WHERE id = " + id; + cr.executeUpdateSQL(updateClause); + } /** * Callback to process a query that gets all accounts belonging to a diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAlias.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAlias.java index 12818d45da..421d8d0d9e 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAlias.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaAlias.java @@ -38,7 +38,7 @@ public class PersonaAlias { "SELECT pa.id, pa.persona_id, pa.alias, pa.justification, pa.confidence_id, pa.date_added, pa.examiner_id, e.login_name, e.display_name " + "FROM persona_alias as pa " + "INNER JOIN examiners as e ON e.id = pa.examiner_id "; - + private final long id; private final long personaId; private final String alias; @@ -144,6 +144,25 @@ public class PersonaAlias { CentralRepository.getInstance().executeDeleteSQL(deleteClause); } + /** + * Modifies a PesronaAlias. + * + * @param alias Alias to modify. + * + * @throws CentralRepoException If there is an error in modifying the alias. + */ + static void modifyPersonaAlias(PersonaAlias alias, Persona.Confidence confidence, String justification) throws CentralRepoException { + CentralRepository cr = CentralRepository.getInstance(); + + if (cr == null) { + throw new CentralRepoException("Failed to modify persona alias, Central Repo is not enabled"); + } + + String updateClause = "UPDATE persona_alias SET confidence_id = " + confidence.getLevelId() + ", justification = \"" + justification + "\" WHERE id = " + alias.id; + cr.executeUpdateSQL(updateClause); + } + + /** * Callback to process a Persona aliases query. */ diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaMetadata.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaMetadata.java index 5c3b9a900d..667c332dbc 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaMetadata.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/PersonaMetadata.java @@ -155,6 +155,24 @@ public class PersonaMetadata { CentralRepository.getInstance().executeDeleteSQL(deleteClause); } + /** + * Modifies the given PersonaMetadata + * + * @param metadata Metadata to modify. + * + * @throws CentralRepoException If there is an error in modifying the metadata. + */ + static void modifyPersonaMetadata(PersonaMetadata metadata, Persona.Confidence confidence, String justification) throws CentralRepoException { + CentralRepository cr = CentralRepository.getInstance(); + + if (cr == null) { + throw new CentralRepoException("Failed to modify persona metadata, Central Repo is not enabled"); + } + + String updateClause = "UPDATE persona_metadata SET confidence_id = " + confidence.getLevelId() + ", justification = \"" + justification + "\" WHERE id = " + metadata.id; + cr.executeUpdateSQL(updateClause); + } + /** * Callback to process a Persona metadata query. */ diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties index b9b11be945..be2575ce5e 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties @@ -52,3 +52,6 @@ PersonaMetadataDialog.nameTextField.text= PersonaMetadataDialog.nameLbl.text=Name: PersonaMetadataDialog.okBtn.text=OK PersonaMetadataDialog.cancelBtn.text=Cancel +PersonaDetailsPanel.editAccountBtn.text=Edit +PersonaDetailsPanel.editMetadataBtn.text=Edit +PersonaDetailsPanel.editAliasBtn.text=Edit diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED index 688182e360..84f4cb8874 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED @@ -6,31 +6,33 @@ CTL_PersonaManagerTopComponentAction=Persona Manager CTL_PersonaDetailsTopComponent=Persona Details OpenPersonasAction.displayName=Persona Manager PersonaAccountDialog.title.text=Add Account -PersonaAccountDialog_dup_msg=This account is already added to the persona +PersonaAccountDialog_dup_msg=This account is already added to the persona. PersonaAccountDialog_dup_Title=Account add failure -PersonaAccountDialog_get_types_exception_msg=Failed to access central repository +PersonaAccountDialog_get_types_exception_msg=Failed to access central repository. PersonaAccountDialog_get_types_exception_Title=Central Repository failure -PersonaAccountDialog_identifier_empty_msg=The identifier field cannot be empty +PersonaAccountDialog_identifier_empty_msg=The identifier field cannot be empty. PersonaAccountDialog_identifier_empty_Title=Empty identifier -PersonaAccountDialog_search_empty_msg=Account not found for given identifier and type +PersonaAccountDialog_search_empty_msg=Account not found for given identifier and type. PersonaAccountDialog_search_empty_Title=Account not found -PersonaAccountDialog_search_failure_msg=Central Repository account search failed +PersonaAccountDialog_search_failure_msg=Central Repository account search failed. PersonaAccountDialog_search_failure_Title=Account add failure PersonaAliasDialog.title.text=Add Alias PersonaAliasDialog_dup_msg=This alias has already been added to this persona PersonaAliasDialog_dup_Title=Alias add failure +PersonaAliasDialog_empty_msg=An alias cannot be empty. +PersonaAliasDialog_empty_Title=Empty alias PersonaDetailsDialogCreateTitle=Create Persona PersonaDetailsDialogEditTitle=Edit Persona PersonaDetailsDialogViewTitle=View Persona -PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository +PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository. PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure PersonaDetailsPanel_empty_justification_msg=The justification field cannot be empty PersonaDetailsPanel_empty_justification_Title=Empty justification -PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty +PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty. PersonaDetailsPanel_EmptyName_Title=Empty persona name -PersonaDetailsPanel_load_exception_msg=Failed to load persona +PersonaDetailsPanel_load_exception_msg=Failed to load persona. PersonaDetailsPanel_load_exception_Title=Initialization failure -PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account +PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account. PersonaDetailsPanel_NotEnoughAccounts_Title=Missing account PersonaManagerTopComponent.createBtn.text=New Persona PersonaManagerTopComponent.searchBtn.text=Search @@ -43,8 +45,6 @@ PersonaManagerTopComponent.searchField.text= PersonaManagerTopComponent.editBtn.text=Edit Persona PersonaDetailsDialog.cancelBtn.text=Cancel PersonaDetailsDialog.okBtn.text=OK -PersonaDetailsPanel.deleteCaseBtn.text=Delete -PersonaDetailsPanel.addCaseBtn.text=Add PersonaDetailsPanel.casesLbl.text=Cases found in: PersonaDetailsPanel.deleteAliasBtn.text=Delete PersonaDetailsPanel.addAliasBtn.text=Add @@ -85,7 +85,12 @@ PersonaMetadataDialog.nameTextField.text= PersonaMetadataDialog.nameLbl.text=Name: PersonaMetadataDialog.okBtn.text=OK PersonaMetadataDialog.cancelBtn.text=Cancel -PMTopComponent_delete_exception_msg=Failed to delete persona +PersonaDetailsPanel.editAccountBtn.text=Edit +PersonaDetailsPanel.editMetadataBtn.text=Edit +PersonaDetailsPanel.editAliasBtn.text=Edit +PMTopComponent_delete_confirmation_msg=Are you sure you want to delete this persona? +PMTopComponent_delete_confirmation_Title=Are you sure? +PMTopComponent_delete_exception_msg=Failed to delete persona. PMTopComponent_delete_exception_Title=Delete failure PMTopComponent_Name=Persona Manager PMTopComponent_search_exception_msg=Failed to search personas diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAccountDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAccountDialog.java index fb9e77da7b..bbb87c9899 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAccountDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAccountDialog.java @@ -23,11 +23,11 @@ import java.io.Serializable; import java.util.Collection; import java.util.logging.Level; import javax.swing.JDialog; -import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.ListCellRenderer; +import javax.swing.SwingUtilities; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount; @@ -46,27 +46,50 @@ public class PersonaAccountDialog extends JDialog { private static final Logger logger = Logger.getLogger(PersonaAccountDialog.class.getName()); private static final long serialVersionUID = 1L; - + private final TypeChoiceRenderer TYPE_CHOICE_RENDERER = new TypeChoiceRenderer(); private final PersonaDetailsPanel pdp; - + + private PersonaDetailsPanel.PAccount currentAccount = null; + /** * Creates new add account dialog */ @Messages({"PersonaAccountDialog.title.text=Add Account",}) public PersonaAccountDialog(PersonaDetailsPanel pdp) { - super((JFrame) WindowManager.getDefault().getMainWindow(), + super(SwingUtilities.windowForComponent(pdp), Bundle.PersonaAccountDialog_title_text(), - true); + ModalityType.APPLICATION_MODAL); this.pdp = pdp; initComponents(); typeComboBox.setRenderer(TYPE_CHOICE_RENDERER); display(); } - + + PersonaAccountDialog(PersonaDetailsPanel pdp, PersonaDetailsPanel.PAccount acc) { + super(SwingUtilities.windowForComponent(pdp), + Bundle.PersonaAccountDialog_title_text(), + ModalityType.APPLICATION_MODAL); + this.pdp = pdp; + + initComponents(); + currentAccount = acc; + confidenceComboBox.setSelectedItem(acc.confidence); + justificationTextField.setText(acc.justification); + typeComboBox.setSelectedItem(acc.account.getAccountType()); + identifierTextField.setText(acc.account.getIdentifier()); + + typeComboBox.setEnabled(false); + identifierTextField.setEnabled(false); + + typeComboBox.setRenderer(TYPE_CHOICE_RENDERER); + display(); + } + /** - * This class handles displaying and rendering drop down menu for account choices + * This class handles displaying and rendering drop down menu for account + * choices */ private class TypeChoiceRenderer extends JLabel implements ListCellRenderer, Serializable { @@ -80,11 +103,10 @@ public class PersonaAccountDialog extends JDialog { return this; } } - + @Messages({ "PersonaAccountDialog_get_types_exception_Title=Central Repository failure", - "PersonaAccountDialog_get_types_exception_msg=Failed to access central repository.", - }) + "PersonaAccountDialog_get_types_exception_msg=Failed to access central repository.",}) private CentralRepoAccountType[] getAllAccountTypes() { Collection allAccountTypes; try { @@ -92,9 +114,9 @@ public class PersonaAccountDialog extends JDialog { } catch (CentralRepoException e) { logger.log(Level.SEVERE, "Failed to access central repository", e); JOptionPane.showMessageDialog(this, - Bundle.PersonaAccountDialog_get_types_exception_Title(), - Bundle.PersonaAccountDialog_get_types_exception_msg(), - JOptionPane.ERROR_MESSAGE); + Bundle.PersonaAccountDialog_get_types_exception_Title(), + Bundle.PersonaAccountDialog_get_types_exception_msg(), + JOptionPane.ERROR_MESSAGE); return new CentralRepoAccountType[0]; } return allAccountTypes.toArray(new CentralRepoAccountType[0]); @@ -303,17 +325,23 @@ public class PersonaAccountDialog extends JDialog { JOptionPane.ERROR_MESSAGE); return; } - - if (pdp.addAccount( - result, - justificationTextField.getText(), - (Persona.Confidence) confidenceComboBox.getSelectedItem())) { + + Persona.Confidence confidence = (Persona.Confidence) confidenceComboBox.getSelectedItem(); + String justification = justificationTextField.getText(); + + if (currentAccount != null) { + currentAccount.confidence = confidence; + currentAccount.justification = justification; dispose(); } else { - JOptionPane.showMessageDialog(this, - Bundle.PersonaAccountDialog_dup_msg(), - Bundle.PersonaAccountDialog_dup_Title(), - JOptionPane.ERROR_MESSAGE); + if (pdp.addAccount(result, justification, confidence)) { + dispose(); + } else { + JOptionPane.showMessageDialog(this, + Bundle.PersonaAccountDialog_dup_msg(), + Bundle.PersonaAccountDialog_dup_Title(), + JOptionPane.ERROR_MESSAGE); + } } }//GEN-LAST:event_okBtnActionPerformed @@ -324,7 +352,7 @@ public class PersonaAccountDialog extends JDialog { private void identifierTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_identifierTextFieldActionPerformed // TODO add your handling code here: }//GEN-LAST:event_identifierTextFieldActionPerformed - + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cancelBtn; private javax.swing.JComboBox confidenceComboBox; diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAliasDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAliasDialog.java index 2ff8d38f52..e77bded2de 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAliasDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAliasDialog.java @@ -19,8 +19,8 @@ package org.sleuthkit.autopsy.centralrepository.persona; import javax.swing.JDialog; -import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.Persona; @@ -35,20 +35,39 @@ public class PersonaAliasDialog extends JDialog { private final PersonaDetailsPanel pdp; + private PersonaDetailsPanel.PAlias currentAlias = null; + /** * Creates new add alias dialog */ @Messages({"PersonaAliasDialog.title.text=Add Alias",}) public PersonaAliasDialog(PersonaDetailsPanel pdp) { - super((JFrame) WindowManager.getDefault().getMainWindow(), + super(SwingUtilities.windowForComponent(pdp), Bundle.PersonaAliasDialog_title_text(), - true); + ModalityType.APPLICATION_MODAL); this.pdp = pdp; initComponents(); display(); } + PersonaAliasDialog(PersonaDetailsPanel pdp, PersonaDetailsPanel.PAlias pa) { + super(SwingUtilities.windowForComponent(pdp), + Bundle.PersonaAliasDialog_title_text(), + ModalityType.APPLICATION_MODAL); + this.pdp = pdp; + + initComponents(); + currentAlias = pa; + confidenceComboBox.setSelectedItem(pa.confidence); + justificationTextField.setText(pa.justification); + aliasTextField.setText(pa.alias); + + aliasTextField.setEnabled(false); + + display(); + } + /** * 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 @@ -176,9 +195,18 @@ public class PersonaAliasDialog extends JDialog { } @Messages({ + "PersonaAliasDialog_empty_Title=Empty alias", + "PersonaAliasDialog_empty_msg=An alias cannot be empty.", "PersonaAliasDialog_dup_Title=Alias add failure", "PersonaAliasDialog_dup_msg=This alias has already been added to this persona",}) private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed + if (aliasTextField.getText().isEmpty()) { + JOptionPane.showMessageDialog(this, + Bundle.PersonaAliasDialog_empty_msg(), + Bundle.PersonaAliasDialog_empty_Title(), + JOptionPane.ERROR_MESSAGE); + return; + } if (justificationTextField.getText().isEmpty()) { JOptionPane.showMessageDialog(this, Bundle.PersonaDetailsPanel_empty_justification_msg(), @@ -186,16 +214,23 @@ public class PersonaAliasDialog extends JDialog { JOptionPane.ERROR_MESSAGE); return; } - if (pdp.addAlias( - aliasTextField.getText(), - justificationTextField.getText(), - (Persona.Confidence) confidenceComboBox.getSelectedItem())) { + + Persona.Confidence confidence = (Persona.Confidence) confidenceComboBox.getSelectedItem(); + String justification = justificationTextField.getText(); + + if (currentAlias != null) { + currentAlias.confidence = confidence; + currentAlias.justification = justification; dispose(); } else { - JOptionPane.showMessageDialog(this, + if (pdp.addAlias(aliasTextField.getText(), justification, confidence)) { + dispose(); + } else { + JOptionPane.showMessageDialog(this, Bundle.PersonaAliasDialog_dup_msg(), Bundle.PersonaAliasDialog_dup_Title(), JOptionPane.ERROR_MESSAGE); + } } }//GEN-LAST:event_okBtnActionPerformed diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form index 4a2e60e43b..ce071d41b3 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.form @@ -79,19 +79,25 @@ - + + + + + + + @@ -118,24 +124,27 @@ + - - - + + + + - - - + + + + @@ -196,6 +205,14 @@ + + + + + + + + @@ -235,6 +252,14 @@ + + + + + + + + @@ -274,6 +299,14 @@ + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java index 713f99ae46..c6e8f36d02 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaDetailsPanel.java @@ -22,7 +22,9 @@ import java.awt.Component; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.logging.Level; import javax.swing.JButton; import javax.swing.JOptionPane; @@ -65,6 +67,10 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { private final List metadataToRemove = new ArrayList<>(); private final List aliasesToRemove = new ArrayList<>(); + private final Map accountsToEdit = new HashMap<>(); + private final Map metadataToEdit = new HashMap<>(); + private final Map aliasesToEdit = new HashMap<>(); + private Persona currentPersona; private List currentAccounts = new ArrayList<>(); private List currentMetadata = new ArrayList<>(); @@ -87,6 +93,19 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { addAccountBtn.addActionListener((ActionEvent e) -> { new PersonaAccountDialog(this); }); + editAccountBtn.addActionListener((ActionEvent e) -> { + int selectedRow = accountsTable.getSelectedRow(); + if (selectedRow != -1) { + if (selectedRow >= currentAccounts.size()) { + PAccount acc = accountsToAdd.get(selectedRow - currentAccounts.size()); + new PersonaAccountDialog(this, acc); + } else { + PersonaAccount personaAccount = currentAccounts.get(selectedRow); + accountsToEdit.putIfAbsent(personaAccount, new PAccount(personaAccount.getAccount(), personaAccount.getJustification(), personaAccount.getConfidence())); + new PersonaAccountDialog(this, accountsToEdit.get(personaAccount)); + } + } + }); deleteAccountBtn.addActionListener((ActionEvent e) -> { int selectedRow = accountsTable.getSelectedRow(); if (selectedRow != -1) { @@ -94,21 +113,36 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { if (selectedRow >= currentAccounts.size()) { accountsToAdd.remove(selectedRow - currentAccounts.size()); } else { - accountsToRemove.add(currentAccounts.get(selectedRow)); - currentAccounts.remove(selectedRow); + PersonaAccount toRemove = currentAccounts.get(selectedRow); + accountsToEdit.remove(toRemove); + accountsToRemove.add(toRemove); + currentAccounts.remove(toRemove); } updateAccountsTable(); } }); accountsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); accountsTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { - handleSelectionChange(e, deleteAccountBtn, accountsTable); + handleSelectionChange(e, editAccountBtn, deleteAccountBtn, accountsTable); }); // Metadata addMetadataBtn.addActionListener((ActionEvent e) -> { new PersonaMetadataDialog(this); }); + editMetadataBtn.addActionListener((ActionEvent e) -> { + int selectedRow = metadataTable.getSelectedRow(); + if (selectedRow != -1) { + if (selectedRow >= currentMetadata.size()) { + PMetadata md = metadataToAdd.get(selectedRow - currentMetadata.size()); + new PersonaMetadataDialog(this, md); + } else { + PersonaMetadata personaMetadata = currentMetadata.get(selectedRow); + metadataToEdit.putIfAbsent(personaMetadata, new PMetadata(personaMetadata.getName(), personaMetadata.getValue(), personaMetadata.getJustification(), personaMetadata.getConfidence())); + new PersonaMetadataDialog(this, metadataToEdit.get(personaMetadata)); + } + } + }); deleteMetadataBtn.addActionListener((ActionEvent e) -> { int selectedRow = metadataTable.getSelectedRow(); if (selectedRow != -1) { @@ -116,21 +150,36 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { if (selectedRow >= currentMetadata.size()) { metadataToAdd.remove(selectedRow - currentMetadata.size()); } else { - metadataToRemove.add(currentMetadata.get(selectedRow)); - currentMetadata.remove(selectedRow); + PersonaMetadata toRemove = currentMetadata.get(selectedRow); + metadataToEdit.remove(toRemove); + metadataToRemove.add(toRemove); + currentMetadata.remove(toRemove); } updateMetadataTable(); } }); metadataTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); metadataTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { - handleSelectionChange(e, deleteMetadataBtn, metadataTable); + handleSelectionChange(e, editMetadataBtn, deleteMetadataBtn, metadataTable); }); // Aliases addAliasBtn.addActionListener((ActionEvent e) -> { new PersonaAliasDialog(this); }); + editAliasBtn.addActionListener((ActionEvent e) -> { + int selectedRow = aliasesTable.getSelectedRow(); + if (selectedRow != -1) { + if (selectedRow >= currentAliases.size()) { + PAlias pa = aliasesToAdd.get(selectedRow - currentAliases.size()); + new PersonaAliasDialog(this, pa); + } else { + PersonaAlias personaAlias = currentAliases.get(selectedRow); + aliasesToEdit.putIfAbsent(personaAlias, new PAlias(personaAlias.getAlias(), personaAlias.getJustification(), personaAlias.getConfidence())); + new PersonaAliasDialog(this, aliasesToEdit.get(personaAlias)); + } + } + }); deleteAliasBtn.addActionListener((ActionEvent e) -> { int selectedRow = aliasesTable.getSelectedRow(); if (selectedRow != -1) { @@ -138,33 +187,48 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { if (selectedRow >= currentAliases.size()) { aliasesToAdd.remove(selectedRow - currentAliases.size()); } else { - aliasesToRemove.add(currentAliases.get(selectedRow)); - currentAliases.remove(selectedRow); + PersonaAlias toRemove = currentAliases.get(selectedRow); + aliasesToEdit.remove(toRemove); + aliasesToRemove.add(toRemove); + currentAliases.remove(toRemove); } updateAliasesTable(); } }); aliasesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); aliasesTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> { - handleSelectionChange(e, deleteAliasBtn, aliasesTable); + handleSelectionChange(e, editAliasBtn, deleteAliasBtn, aliasesTable); }); } - private void handleSelectionChange(ListSelectionEvent e, JButton btn, JTable table) { + private void handleSelectionChange(ListSelectionEvent e, JButton editBtn, JButton deleteBtn, JTable table) { if (e.getValueIsAdjusting()) { return; } - btn.setEnabled(mode != PersonaDetailsMode.VIEW && table.getSelectedRow() != -1); + editBtn.setEnabled(mode != PersonaDetailsMode.VIEW && table.getSelectedRow() != -1); + deleteBtn.setEnabled(mode != PersonaDetailsMode.VIEW && table.getSelectedRow() != -1); + } + + void addEditExistingAccount(PersonaAccount account, String justification, Persona.Confidence confidence) { + accountsToEdit.put(account, new PAccount(account.getAccount(), justification, confidence)); + } + + void addEditExistingMetadata(PersonaMetadata metadata, String justification, Persona.Confidence confidence) { + metadataToEdit.put(metadata, new PMetadata(metadata.getName(), metadata.getValue(), justification, confidence)); + } + + void addEditExistingAlias(PersonaAlias alias, String justification, Persona.Confidence confidence) { + aliasesToEdit.put(alias, new PAlias(alias.getAlias(), justification, confidence)); } /** * A data bucket class for yet-to-be-created PersonaAccount */ - private class PAccount { + class PAccount { - private final CentralRepoAccount account; - private final String justification; - private final Persona.Confidence confidence; + CentralRepoAccount account; + String justification; + Persona.Confidence confidence; PAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence) { this.account = account; @@ -185,7 +249,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { } } return false; - } + } public boolean addAccount(CentralRepoAccount account, String justification, Persona.Confidence confidence) { if (!accountExists(account)) { @@ -199,12 +263,12 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { /** * A data bucket class for yet-to-be-created PersonaMetadata */ - private class PMetadata { + class PMetadata { - private final String name; - private final String value; - private final String justification; - private final Persona.Confidence confidence; + String name; + String value; + String justification; + Persona.Confidence confidence; PMetadata(String name, String value, String justification, Persona.Confidence confidence) { this.name = name; @@ -240,11 +304,11 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { /** * A data bucket class for yet-to-be-created PersonaAlias */ - private class PAlias { + class PAlias { - private final String alias; - private final String justification; - private final Persona.Confidence confidence; + String alias; + String justification; + Persona.Confidence confidence; PAlias(String alias, String justification, Persona.Confidence confidence) { this.alias = alias; @@ -291,16 +355,19 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { accountsTablePane = new javax.swing.JScrollPane(); accountsTable = new javax.swing.JTable(); addAccountBtn = new javax.swing.JButton(); + editAccountBtn = new javax.swing.JButton(); deleteAccountBtn = new javax.swing.JButton(); metadataLabel = new javax.swing.JLabel(); metadataTablePane = new javax.swing.JScrollPane(); metadataTable = new javax.swing.JTable(); addMetadataBtn = new javax.swing.JButton(); + editMetadataBtn = new javax.swing.JButton(); deleteMetadataBtn = new javax.swing.JButton(); aliasesLabel = new javax.swing.JLabel(); aliasesTablePane = new javax.swing.JScrollPane(); aliasesTable = new javax.swing.JTable(); addAliasBtn = new javax.swing.JButton(); + editAliasBtn = new javax.swing.JButton(); deleteAliasBtn = new javax.swing.JButton(); casesLbl = new javax.swing.JLabel(); casesTablePane = new javax.swing.JScrollPane(); @@ -334,6 +401,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(addAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAccountBtn.text")); // NOI18N addAccountBtn.setEnabled(false); + org.openide.awt.Mnemonics.setLocalizedText(editAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.editAccountBtn.text")); // NOI18N + editAccountBtn.setEnabled(false); + org.openide.awt.Mnemonics.setLocalizedText(deleteAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAccountBtn.text")); // NOI18N deleteAccountBtn.setEnabled(false); @@ -355,6 +425,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(addMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addMetadataBtn.text")); // NOI18N addMetadataBtn.setEnabled(false); + org.openide.awt.Mnemonics.setLocalizedText(editMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.editMetadataBtn.text")); // NOI18N + editMetadataBtn.setEnabled(false); + org.openide.awt.Mnemonics.setLocalizedText(deleteMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteMetadataBtn.text")); // NOI18N deleteMetadataBtn.setEnabled(false); @@ -376,6 +449,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(addAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAliasBtn.text")); // NOI18N addAliasBtn.setEnabled(false); + org.openide.awt.Mnemonics.setLocalizedText(editAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.editAliasBtn.text")); // NOI18N + editAliasBtn.setEnabled(false); + org.openide.awt.Mnemonics.setLocalizedText(deleteAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAliasBtn.text")); // NOI18N deleteAliasBtn.setEnabled(false); @@ -418,14 +494,20 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { .addGroup(detailsPanelLayout.createSequentialGroup() .addComponent(addAccountBtn) .addGap(18, 18, 18) + .addComponent(editAccountBtn) + .addGap(18, 18, 18) .addComponent(deleteAccountBtn)) .addGroup(detailsPanelLayout.createSequentialGroup() .addComponent(addMetadataBtn) .addGap(18, 18, 18) + .addComponent(editMetadataBtn) + .addGap(18, 18, 18) .addComponent(deleteMetadataBtn)) .addGroup(detailsPanelLayout.createSequentialGroup() .addComponent(addAliasBtn) .addGap(18, 18, 18) + .addComponent(editAliasBtn) + .addGap(18, 18, 18) .addComponent(deleteAliasBtn))) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) @@ -444,23 +526,26 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(addAccountBtn) - .addComponent(deleteAccountBtn)) + .addComponent(deleteAccountBtn) + .addComponent(editAccountBtn)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(metadataLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(metadataTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(addMetadataBtn) .addComponent(deleteMetadataBtn) - .addComponent(addMetadataBtn)) + .addComponent(editMetadataBtn)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(aliasesLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(aliasesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(addAliasBtn) .addComponent(deleteAliasBtn) - .addComponent(addAliasBtn)) + .addComponent(editAliasBtn)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(casesLbl) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) @@ -507,6 +592,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { private javax.swing.JButton deleteAliasBtn; private javax.swing.JButton deleteMetadataBtn; private javax.swing.JPanel detailsPanel; + private javax.swing.JButton editAccountBtn; + private javax.swing.JButton editAliasBtn; + private javax.swing.JButton editMetadataBtn; private javax.swing.JLabel metadataLabel; private javax.swing.JTable metadataTable; private javax.swing.JScrollPane metadataTablePane; @@ -516,7 +604,7 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { @Messages({ "PersonaDetailsPanel_load_exception_Title=Initialization failure", - "PersonaDetailsPanel_load_exception_msg=Failed to load persona",}) + "PersonaDetailsPanel_load_exception_msg=Failed to load persona.",}) private void loadPersona(Component parent, Persona persona) { String name; Collection accounts; @@ -565,6 +653,9 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { deleteAccountBtn.setEnabled(false); deleteMetadataBtn.setEnabled(false); deleteAliasBtn.setEnabled(false); + editAccountBtn.setEnabled(false); + editMetadataBtn.setEnabled(false); + editAliasBtn.setEnabled(false); } /** @@ -667,12 +758,15 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { addAccountBtn.setEnabled(enabled); addMetadataBtn.setEnabled(enabled); addAliasBtn.setEnabled(enabled); - + addAccountBtn.setVisible(enabled); + editAccountBtn.setVisible(enabled); deleteAccountBtn.setVisible(enabled); addMetadataBtn.setVisible(enabled); + editMetadataBtn.setVisible(enabled); deleteMetadataBtn.setVisible(enabled); addAliasBtn.setVisible(enabled); + editAliasBtn.setVisible(enabled); deleteAliasBtn.setVisible(enabled); } @@ -706,11 +800,11 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { } @Messages({ - "PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account", + "PersonaDetailsPanel_NotEnoughAccounts_msg=A persona needs at least one account.", "PersonaDetailsPanel_NotEnoughAccounts_Title=Missing account", - "PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository", + "PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository.", "PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure", - "PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty", + "PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty.", "PersonaDetailsPanel_EmptyName_Title=Empty persona name",}) Persona okHandler() { if (accountsToAdd.size() + currentAccounts.size() < 1) { @@ -767,18 +861,27 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { for (PersonaAccount acc : accountsToRemove) { ret.removeAccount(acc); } + for (HashMap.Entry entry : accountsToEdit.entrySet()) { + ret.modifyAccount(entry.getKey(), entry.getValue().confidence, entry.getValue().justification); + } for (PMetadata md : metadataToAdd) { ret.addMetadata(md.name, md.value, md.justification, md.confidence); } for (PersonaMetadata md : metadataToRemove) { ret.removeMetadata(md); } + for (HashMap.Entry entry : metadataToEdit.entrySet()) { + ret.modifyMetadata(entry.getKey(), entry.getValue().confidence, entry.getValue().justification); + } for (PAlias pa : aliasesToAdd) { ret.addAlias(pa.alias, pa.justification, pa.confidence); } for (PersonaAlias pa : aliasesToRemove) { ret.removeAlias(pa); } + for (HashMap.Entry entry : aliasesToEdit.entrySet()) { + ret.modifyAlias(entry.getKey(), entry.getValue().confidence, entry.getValue().justification); + } } catch (CentralRepoException e) { logger.log(Level.SEVERE, "Failed to access central repository", e); JOptionPane.showMessageDialog(this, @@ -795,14 +898,14 @@ public final class PersonaDetailsPanel extends javax.swing.JPanel { } return ret; } - + /** * Sets the persona name field. - * + * * @param name Persona name. */ public void setPersonaName(String name) { nameField.setText(name); } - + } diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaMetadataDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaMetadataDialog.java index 77495b3641..56048433a9 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaMetadataDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaMetadataDialog.java @@ -19,8 +19,8 @@ package org.sleuthkit.autopsy.centralrepository.persona; import javax.swing.JDialog; -import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.centralrepository.datamodel.Persona; @@ -35,20 +35,41 @@ public class PersonaMetadataDialog extends JDialog { private final PersonaDetailsPanel pdp; + private PersonaDetailsPanel.PMetadata currentMetadata; + /** * Creates new add metadata dialog */ @Messages({"AddMetadataDialog.title.text=Add Metadata",}) public PersonaMetadataDialog(PersonaDetailsPanel pdp) { - super((JFrame) WindowManager.getDefault().getMainWindow(), + super(SwingUtilities.windowForComponent(pdp), Bundle.AddMetadataDialog_title_text(), - true); + ModalityType.APPLICATION_MODAL); this.pdp = pdp; initComponents(); display(); } + PersonaMetadataDialog(PersonaDetailsPanel pdp, PersonaDetailsPanel.PMetadata md) { + super(SwingUtilities.windowForComponent(pdp), + Bundle.AddMetadataDialog_title_text(), + ModalityType.APPLICATION_MODAL); + this.pdp = pdp; + + initComponents(); + currentMetadata = md; + confidenceComboBox.setSelectedItem(md.confidence); + justificationTextField.setText(md.justification); + nameTextField.setText(md.name); + valueTextField.setText(md.value); + + nameTextField.setEnabled(false); + valueTextField.setEnabled(false); + + display(); + } + /** * 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 @@ -200,17 +221,23 @@ public class PersonaMetadataDialog extends JDialog { JOptionPane.ERROR_MESSAGE); return; } - if (pdp.addMetadata( - nameTextField.getText(), - valueTextField.getText(), - justificationTextField.getText(), - (Persona.Confidence) confidenceComboBox.getSelectedItem())) { + + Persona.Confidence confidence = (Persona.Confidence) confidenceComboBox.getSelectedItem(); + String justification = justificationTextField.getText(); + + if (currentMetadata != null) { + currentMetadata.confidence = confidence; + currentMetadata.justification = justification; dispose(); } else { - JOptionPane.showMessageDialog(this, + if (pdp.addMetadata(nameTextField.getText(), valueTextField.getText(), justification, confidence)) { + dispose(); + } else { + JOptionPane.showMessageDialog(this, Bundle.AddMetadataDialog_dup_msg(), Bundle.AddMetadataDialog_dup_Title(), JOptionPane.ERROR_MESSAGE); + } } }//GEN-LAST:event_okBtnActionPerformed From 40242fc3cc784113b5d7bbbb41695342ad78b8e8 Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Fri, 12 Jun 2020 15:26:30 -0400 Subject: [PATCH 17/21] 6472 Prevent persona metadata key or value from being empty --- .../Bundle.properties-MERGED | 5 +++- .../persona/Bundle.properties-MERGED | 27 +++++-------------- .../persona/PersonaAliasDialog.java | 2 +- .../persona/PersonaMetadataDialog.java | 11 +++++++- 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED index 75866a79d0..007af703c5 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED @@ -5,7 +5,10 @@ CentralRepoCommentDialog.title.addEditCentralRepoComment=Add/Edit Central Reposi OpenIDE-Module-Name=Central Repository OpenIDE-Module-Display-Category=Ingest Module OpenIDE-Module-Short-Description=Correlation Engine Ingest Module -OpenIDE-Module-Long-Description=Correlation Engine ingest module and central database. \n\nThe Correlation Engine ingest module stores attributes of artifacts matching selected correlation types into a central database.\nStored attributes are used in future cases to correlate and analyzes files and artifacts during ingest. +OpenIDE-Module-Long-Description=\ + Correlation Engine ingest module and central database. \n\n\ + The Correlation Engine ingest module stores attributes of artifacts matching selected correlation types into a central database.\n\ + Stored attributes are used in future cases to correlate and analyzes files and artifacts during ingest. CentralRepoCommentDialog.commentLabel.text=Comment: CentralRepoCommentDialog.okButton.text=&OK CentralRepoCommentDialog.cancelButton.text=C&ancel diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED index f2db62a19f..ed71818774 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED @@ -1,20 +1,8 @@ -AddAccountDialog.title.text=Add Account -AddAccountDialog_dup_msg=This account is already added to the persona. -AddAccountDialog_dup_Title=Account add failure -AddAccountDialog_empty_msg=The identifier field cannot be empty. -AddAccountDialog_empty_Title=Empty identifier -AddAccountDialog_get_types_exception_msg=Failed to access central repository. -AddAccountDialog_get_types_exception_Title=Central Repository failure -AddAccountDialog_search_empty_msg=Account not found in the Central Repository for the given identifier and type. -AddAccountDialog_search_empty_Title=Account not found -AddAccountDialog_search_failure_msg=Central Repository account search failed. -AddAccountDialog_search_failure_Title=Account add failure -AddAliasDialog.title.text=Add Alias -AddAliasDialog_dup_msg=This alias has already been added to this persona -AddAliasDialog_dup_Title=Alias add failure AddMetadataDialog.title.text=Add Metadata -AddMetadataDialog_dup_msg=A metadata entry with this name has already been added to this persona +AddMetadataDialog_dup_msg=A metadata entry with this name has already been added to this persona. AddMetadataDialog_dup_Title=Metadata add failure +AddMetadataDialog_empty_name_msg=A metadata entry cannot have an empty name or value. +AddMetadataDialog_empty_name_Title=Missing field(s) CTL_OpenPersonaManager=Persona Manager CTL_PersonaManagerTopComponentAction=Persona Manager CTL_PersonaDetailsTopComponent=Persona Details @@ -31,7 +19,7 @@ PersonaAccountDialog_search_empty_Title=Account not found PersonaAccountDialog_search_failure_msg=Central Repository account search failed. PersonaAccountDialog_search_failure_Title=Account add failure PersonaAliasDialog.title.text=Add Alias -PersonaAliasDialog_dup_msg=This alias has already been added to this persona +PersonaAliasDialog_dup_msg=This alias has already been added to this persona. PersonaAliasDialog_dup_Title=Alias add failure PersonaAliasDialog_empty_msg=An alias cannot be empty. PersonaAliasDialog_empty_Title=Empty alias @@ -40,10 +28,10 @@ PersonaDetailsDialogEditTitle=Edit Persona PersonaDetailsDialogViewTitle=View Persona PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository. PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure -PersonaDetailsPanel_EmptyComment_msg=Persona comment cannot be empty -PersonaDetailsPanel_EmptyComment_Title=Empty persona comment PersonaDetailsPanel_empty_justification_msg=The justification field cannot be empty PersonaDetailsPanel_empty_justification_Title=Empty justification +PersonaDetailsPanel_EmptyComment_msg=Persona comment cannot be empty. +PersonaDetailsPanel_EmptyComment_Title=Empty persona comment PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty. PersonaDetailsPanel_EmptyName_Title=Empty persona name PersonaDetailsPanel_load_exception_msg=Failed to load persona. @@ -95,9 +83,6 @@ PersonaDetailsPanel.examinerLbl.text=Created by: PersonaDetailsPanel.examinerField.text= PersonaDetailsPanel.creationDateLbl.text=Created on: PersonaDetailsPanel.creationDateField.text= -PMTopComponent_delete_confirmation_msg=Are you sure you want to delete this persona? -PMTopComponent_delete_confirmation_Title=Are you sure? -PMTopComponent_delete_exception_msg=Failed to delete persona. PersonaAccountDialog.confidenceLbl.text=Confidence: PersonaAccountDialog.justificationTextField.text= PersonaAccountDialog.justificationLbl.text=Justification: diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAliasDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAliasDialog.java index e77bded2de..46f70749a6 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAliasDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaAliasDialog.java @@ -198,7 +198,7 @@ public class PersonaAliasDialog extends JDialog { "PersonaAliasDialog_empty_Title=Empty alias", "PersonaAliasDialog_empty_msg=An alias cannot be empty.", "PersonaAliasDialog_dup_Title=Alias add failure", - "PersonaAliasDialog_dup_msg=This alias has already been added to this persona",}) + "PersonaAliasDialog_dup_msg=This alias has already been added to this persona.",}) private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed if (aliasTextField.getText().isEmpty()) { JOptionPane.showMessageDialog(this, diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaMetadataDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaMetadataDialog.java index 56048433a9..40cc893ed1 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaMetadataDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/PersonaMetadataDialog.java @@ -212,8 +212,17 @@ public class PersonaMetadataDialog extends JDialog { @Messages({ "AddMetadataDialog_dup_Title=Metadata add failure", - "AddMetadataDialog_dup_msg=A metadata entry with this name has already been added to this persona",}) + "AddMetadataDialog_dup_msg=A metadata entry with this name has already been added to this persona.", + "AddMetadataDialog_empty_name_Title=Missing field(s)", + "AddMetadataDialog_empty_name_msg=A metadata entry cannot have an empty name or value.",}) private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed + if (nameTextField.getText().isEmpty() || valueTextField.getText().isEmpty()) { + JOptionPane.showMessageDialog(this, + Bundle.AddMetadataDialog_empty_name_msg(), + Bundle.AddMetadataDialog_empty_name_Title(), + JOptionPane.ERROR_MESSAGE); + return; + } if (justificationTextField.getText().isEmpty()) { JOptionPane.showMessageDialog(this, Bundle.PersonaDetailsPanel_empty_justification_msg(), From ccb3416da9730995f8f7075c8765cc8d50da170a Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 12 Jun 2020 15:45:21 -0400 Subject: [PATCH 18/21] Update bundle.properties-MERGED files --- .../persona/Bundle.properties-MERGED | 35 ++++++------------- .../contentviewers/Bundle.properties-MERGED | 16 ++++++--- .../autopsy/core/Bundle.properties-MERGED | 8 ++++- .../coreutils/Bundle.properties-MERGED | 4 ++- .../directorytree/Bundle.properties-MERGED | 6 ++-- .../filesearch/Bundle.properties-MERGED | 10 +++--- .../autopsy/ingest/Bundle.properties-MERGED | 2 +- .../livetriage/Bundle.properties-MERGED | 4 +-- .../Bundle.properties-MERGED | 4 +-- .../Bundle.properties-MERGED | 8 +++-- .../modules/exif/Bundle.properties-MERGED | 4 ++- .../fileextmismatch/Bundle.properties-MERGED | 18 +++++----- .../filetypeid/Bundle.properties-MERGED | 6 ++-- .../interestingitems/Bundle.properties-MERGED | 18 +++++----- .../photoreccarver/Bundle.properties-MERGED | 2 +- .../modules/html/Bundle.properties-MERGED | 6 ++-- .../ui/Bundle.properties-MERGED | 1 + .../autoingest/Bundle.properties-MERGED | 12 +++++++ .../configuration/Bundle.properties-MERGED | 1 + .../keywordsearch/Bundle.properties-MERGED | 20 +++++------ .../recentactivity/Bundle.properties-MERGED | 8 ++++- .../netbeans/core/startup/Bundle.properties | 4 +-- .../core/windows/view/ui/Bundle.properties | 6 ++-- 23 files changed, 115 insertions(+), 88 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED index 95f7bb618e..fb18bdb9a6 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties-MERGED @@ -1,17 +1,3 @@ -AddAccountDialog.title.text=Add Account -AddAccountDialog_dup_msg=This account is already added to the persona. -AddAccountDialog_dup_Title=Account add failure -AddAccountDialog_empty_msg=The identifier field cannot be empty. -AddAccountDialog_empty_Title=Empty identifier -AddAccountDialog_get_types_exception_msg=Failed to access central repository. -AddAccountDialog_get_types_exception_Title=Central Repository failure -AddAccountDialog_search_empty_msg=Account not found in the Central Repository for the given identifier and type. -AddAccountDialog_search_empty_Title=Account not found -AddAccountDialog_search_failure_msg=Central Repository account search failed. -AddAccountDialog_search_failure_Title=Account add failure -AddAliasDialog.title.text=Add Alias -AddAliasDialog_dup_msg=This alias has already been added to this persona -AddAliasDialog_dup_Title=Alias add failure AddMetadataDialog.title.text=Add Metadata AddMetadataDialog_dup_msg=A metadata entry with this name has already been added to this persona AddMetadataDialog_dup_Title=Metadata add failure @@ -20,15 +6,15 @@ CTL_PersonaManagerTopComponentAction=Persona Manager CTL_PersonaDetailsTopComponent=Persona Details OpenPersonasAction.displayName=Persona Manager PersonaAccountDialog.title.text=Add Account -PersonaAccountDialog_dup_msg=This account is already added to the persona +PersonaAccountDialog_dup_msg=This account is already added to the persona. PersonaAccountDialog_dup_Title=Account add failure -PersonaAccountDialog_get_types_exception_msg=Failed to access central repository +PersonaAccountDialog_get_types_exception_msg=Failed to access central repository. PersonaAccountDialog_get_types_exception_Title=Central Repository failure -PersonaAccountDialog_identifier_empty_msg=The identifier field cannot be empty +PersonaAccountDialog_identifier_empty_msg=The identifier field cannot be empty. PersonaAccountDialog_identifier_empty_Title=Empty identifier -PersonaAccountDialog_search_empty_msg=Account not found for given identifier and type +PersonaAccountDialog_search_empty_msg=Account not found for given identifier and type. PersonaAccountDialog_search_empty_Title=Account not found -PersonaAccountDialog_search_failure_msg=Central Repository account search failed +PersonaAccountDialog_search_failure_msg=Central Repository account search failed. PersonaAccountDialog_search_failure_Title=Account add failure PersonaAliasDialog.title.text=Add Alias PersonaAliasDialog_dup_msg=This alias has already been added to this persona @@ -38,10 +24,10 @@ PersonaDetailsDialogEditTitle=Edit Persona PersonaDetailsDialogViewTitle=View Persona PersonaDetailsPanel_CentralRepoErr_msg=Failure to write to Central Repository PersonaDetailsPanel_CentralRepoErr_Title=Central Repository failure -PersonaDetailsPanel_EmptyComment_msg=Persona comment cannot be empty -PersonaDetailsPanel_EmptyComment_Title=Empty persona comment PersonaDetailsPanel_empty_justification_msg=The justification field cannot be empty PersonaDetailsPanel_empty_justification_Title=Empty justification +PersonaDetailsPanel_EmptyComment_msg=Persona comment cannot be empty +PersonaDetailsPanel_EmptyComment_Title=Empty persona comment PersonaDetailsPanel_EmptyName_msg=Persona name cannot be empty PersonaDetailsPanel_EmptyName_Title=Empty persona name PersonaDetailsPanel_load_exception_msg=Failed to load persona @@ -93,9 +79,6 @@ PersonaDetailsPanel.examinerLbl.text=Created by: PersonaDetailsPanel.examinerField.text= PersonaDetailsPanel.creationDateLbl.text=Created on: PersonaDetailsPanel.creationDateField.text= -PMTopComponent_delete_confirmation_msg=Are you sure you want to delete this persona? -PMTopComponent_delete_confirmation_Title=Are you sure? -PMTopComponent_delete_exception_msg=Failed to delete persona. PersonaAccountDialog.confidenceLbl.text=Confidence: PersonaAccountDialog.justificationTextField.text= PersonaAccountDialog.justificationLbl.text=Justification: @@ -120,7 +103,9 @@ PersonaMetadataDialog.nameTextField.text= PersonaMetadataDialog.nameLbl.text=Name: PersonaMetadataDialog.okBtn.text=OK PersonaMetadataDialog.cancelBtn.text=Cancel -PMTopComponent_delete_exception_msg=Failed to delete persona +PMTopComponent_delete_confirmation_msg=Are you sure you want to delete this persona? +PMTopComponent_delete_confirmation_Title=Are you sure? +PMTopComponent_delete_exception_msg=Failed to delete persona. PMTopComponent_delete_exception_Title=Delete failure PMTopComponent_Name=Persona Manager PMTopComponent_search_exception_msg=Failed to search personas. diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED index 4383f2c3d1..1af9137d7b 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED @@ -37,11 +37,18 @@ ApplicationContentViewer.title=Application ApplicationContentViewer.toolTip=Displays file contents. CallLogArtifactViewer_number_from=From CallLogArtifactViewer_number_to=To -CallLogArtifactViewer_persona_button_new=New +CallLogArtifactViewer_persona_button_new=Create CallLogArtifactViewer_persona_button_view=View -CallLogArtifactViewer_persona_label=\ Persona: -CallLogArtifactViewer_persona_searching=\ Searching... -CallLogArtifactViewer_persona_text_none=No Persona +CallLogArtifactViewer_persona_label=\ Persona +CallLogArtifactViewer_persona_searching=Searching... +CallLogArtifactViewer_persona_text_none=None Found +ContactArtifactViewer_missing_account_label=Missing Account: +ContactArtifactViewer_persona_account_justification=Account found in Contact artifact +ContactArtifactViewer_persona_button_new=Create +ContactArtifactViewer_persona_button_view=View +ContactArtifactViewer_persona_label=Persona +ContactArtifactViewer_persona_searching=\ Searching... +ContactArtifactViewer_persona_text_none=None found DataContentViewerArtifact.failedToGetAttributes.message=Failed to get some or all attributes from case database DataContentViewerArtifact.failedToGetSourcePath.message=Failed to get source file path from case database DefaultArtifactContentViewer.attrsTableHeader.sources=Source(s) @@ -1080,3 +1087,4 @@ MessageArtifactViewer.htmlPane.TabConstraints.tabTitle=HTML CallLogArtifactViewer.localAccountPersonaLabel.text=Persona: CallLogArtifactViewer.localAccountPersonaNameLabel.text=jLabel1 CallLogArtifactViewer.localAccountPersonaButton.text=jButton1 +ContactArtifactViewer.personasLabel.text=Personas diff --git a/Core/src/org/sleuthkit/autopsy/core/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/core/Bundle.properties-MERGED index c84f1f1b86..0b16a9701f 100755 --- a/Core/src/org/sleuthkit/autopsy/core/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/core/Bundle.properties-MERGED @@ -3,7 +3,13 @@ Installer.closing.confirmationDialog.title=Ingest is Running # {0} - exception message Installer.closing.messageBox.caseCloseExceptionMessage=Error closing case: {0} OpenIDE-Module-Display-Category=Infrastructure -OpenIDE-Module-Long-Description=This is the core Autopsy module.\n\nThe module contains the core components needed for the bare application to run; the RCP platform, windowing GUI, sleuthkit bindings, datamodel / storage, explorer, result viewers, content viewers, ingest framework, reporting, and core tools, such as the file search.\n\nThe framework included in the module contains APIs for developing modules for ingest, viewers and reporting. The modules can be deployed as Plugins using the Autopsy plugin installer.\nThis module should not be uninstalled - without it, Autopsy will not run.\n\nFor more information, see http://www.sleuthkit.org/autopsy/ +OpenIDE-Module-Long-Description=\ + This is the core Autopsy module.\n\n\ + The module contains the core components needed for the bare application to run; the RCP platform, windowing GUI, sleuthkit bindings, datamodel / storage, explorer, result viewers, content viewers, ingest framework, reporting, and core tools, such as the file search.\n\n\ + The framework included in the module contains APIs for developing modules for ingest, viewers and reporting. \ + The modules can be deployed as Plugins using the Autopsy plugin installer.\n\ + This module should not be uninstalled - without it, Autopsy will not run.\n\n\ + For more information, see http://www.sleuthkit.org/autopsy/ OpenIDE-Module-Name=Autopsy-Core OpenIDE-Module-Short-Description=Autopsy Core Module org_sleuthkit_autopsy_core_update_center=http://sleuthkit.org/autopsy/updates.xml diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/coreutils/Bundle.properties-MERGED index 18e279dd2c..a0d535f8e6 100755 --- a/Core/src/org/sleuthkit/autopsy/coreutils/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/coreutils/Bundle.properties-MERGED @@ -30,7 +30,9 @@ PlatformUtil.getProcVmUsed.sigarNotInit.msg=Cannot get virt mem used, sigar not PlatformUtil.getProcVmUsed.gen.msg=Cannot get virt mem used, {0} PlatformUtil.getJvmMemInfo.usageText=JVM heap usage: {0}, JVM non-heap usage: {1} PlatformUtil.getPhysicalMemInfo.usageText=Physical memory usage (max, total, free): {0}, {1}, {2} -PlatformUtil.getAllMemUsageInfo.usageText={0}\n{1}\nProcess Virtual Memory: {2} +PlatformUtil.getAllMemUsageInfo.usageText={0}\n\ +{1}\n\ +Process Virtual Memory: {2} # {0} - file name ReadImageTask.mesageText=Reading image: {0} StringExtract.illegalStateException.cannotInit.msg=Unicode table not properly initialized, cannot instantiate StringExtract diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED index 63b416b176..7e96d8fdaa 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED @@ -38,8 +38,6 @@ HINT_DirectoryTreeTopComponent=This is a DirectoryTree window OpenIDE-Module-Name=DirectoryTree FileSystemDetailsPanel.imgOffsetLabel.text=Image Offset: FileSystemDetailsPanel.fsTypeLabel.text=FileSystem Type: -FileSystemDetailsPanel.jLabel2.text=bytes -FileSystemDetailsPanel.jLabel3.text=bytes FileSystemDetailsPanel.fsTypeValue.text=... FileSystemDetailsPanel.imgOffsetValue.text=... FileSystemDetailsPanel.volumeIDValue.text=... @@ -71,7 +69,6 @@ VolumeDetailsPanel.startLabel.text=Starting Sector: VolumeDetailsPanel.lengthLabel.text=Length in Sectors: VolumeDetailsPanel.descLabel.text=Description: VolumeDetailsPanel.flagsLabel.text=Flags: -VolumeDetailsPanel.jLabel1.text=General Volume Information VolumeDetailsPanel.OKButton.text=OK ImageDetailsPanel.imageInfoLabel.text=Image Information ImageDetailsPanel.imgNameLabel.text=Name: @@ -160,3 +157,6 @@ ExternalViewerGlobalSettingsPanel.jButton2.text=jButton2 ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=Browse ExternalViewerGlobalSettingsPanel.HxDLabel.text=HxD Editor Path: ExternalViewerGlobalSettingsPanel.ContentViewerExtensionLabel.text=Add content viewer extensions: +FileSystemDetailsPanel.bytesLabel1.text=bytes +FileSystemDetailsPanel.bytesLabel2.text=bytes +VolumeDetailsPanel.generalVolumeLabel.text=General Volume Information diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED index c585d0edf5..b304bc1342 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED @@ -14,11 +14,9 @@ KnownStatusSearchPanel.knownCheckBox.text=Known Status: KnownStatusSearchPanel.knownBadOptionCheckBox.text=Notable KnownStatusSearchPanel.knownOptionCheckBox.text=Known (NSRL or other) KnownStatusSearchPanel.unknownOptionCheckBox.text=Unknown -DateSearchFilter.noneSelectedMsg.text=At least one date type must be selected! +DateSearchFilter.noneSelectedMsg.text=At least one date type must be selected\! DateSearchPanel.dateCheckBox.text=Date: DateSearchPanel.jLabel4.text=Timezone: -DateSearchPanel.jLabel3.text=*The date format is mm/dd/yyyy -DateSearchPanel.jLabel2.text=*Empty fields mean "No Limit" DateSearchPanel.createdCheckBox.text=Created DateSearchPanel.accessedCheckBox.text=Accessed DateSearchPanel.changedCheckBox.text=Changed @@ -57,12 +55,11 @@ FileSearchPanel.search.results.details=Large number of matches may impact perfor FileSearchPanel.search.exception.noFilterSelected.msg=At least one filter must be selected. FileSearchPanel.search.validationErr.msg=Validation Error: {0} FileSearchPanel.emptyWhereClause.text=Invalid options, nothing to show. -KnownStatusSearchFilter.noneSelectedMsg.text=At least one known status must be selected! +KnownStatusSearchFilter.noneSelectedMsg.text=At least one known status must be selected\! NameSearchFilter.emptyNameMsg.text=Must enter something for name search. SizeSearchPanel.sizeCompareComboBox.equalTo=equal to SizeSearchPanel.sizeCompareComboBox.greaterThan=greater than SizeSearchPanel.sizeCompareComboBox.lessThan=less than -MimeTypePanel.jLabel1.text=*Note: Multiple MIME types can be selected FileSearchPanel.searchButton.text=Search MimeTypePanel.mimeTypeCheckBox.text=MIME Type: HashSearchPanel.md5CheckBox.text=MD5: @@ -72,3 +69,6 @@ DataSourcePanel.dataSourceCheckBox.label=Data Source: DataSourcePanel.dataSourceCheckBox.actionCommand=Data Source: DataSourcePanel.dataSourceCheckBox.text=Data Source: DataSourcePanel.dataSourceNoteLabel.text=*Note: Multiple data sources can be selected +DateSearchPanel.noLimitLabel.text=*Empty fields mean "No Limit" +DateSearchPanel.dateFormatLabel.text=*The date format is mm/dd/yyyy +MimeTypePanel.noteLabel.text=*Note: Multiple MIME types can be selected diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED index 6be3e48e71..9e4f612b6b 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED @@ -140,7 +140,7 @@ IngestJob.cancelReason.outOfDiskSpace.text=Out of disk space IngestJob.cancelReason.servicesDown.text=Services Down IngestJob.cancelReason.caseClosed.text=Case closed IngestJobSettingsPanel.globalSettingsButton.text=Global Settings -gest= +gest IngestJobSettingsPanel.globalSettingsButton.actionCommand=Advanced IngestJobSettingsPanel.globalSettingsButton.text=Global Settings IngestJobSettingsPanel.pastJobsButton.text=History diff --git a/Core/src/org/sleuthkit/autopsy/livetriage/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/livetriage/Bundle.properties-MERGED index e0a2ab0413..309a07d3da 100755 --- a/Core/src/org/sleuthkit/autopsy/livetriage/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/livetriage/Bundle.properties-MERGED @@ -18,10 +18,10 @@ SelectDriveDialog.diskTable.column2.title=Disk Size SelectDriveDialog.errLabel.disksNotDetected.text=Disks were not detected. On some systems it requires admin privileges SelectDriveDialog.errLabel.disksNotDetected.toolTipText=Disks were not detected. SelectDriveDialog.lbSelectDrive.text=Select the drive to copy the application and script to: -SelectDriveDialog.jLabel1.text=Select drive to use for live triage (may take time to load): SelectDriveDialog.errorLabel.text=jLabel2 SelectDriveDialog.bnCancel.text=Cancel -SelectDriveDialog.jTextArea1.text=This feature copies the application and a batch file to a removable drive,\nallowing systems to be analyzed without installing the software or\nimaging the drives.\n\nTo analyze a system, insert the drive and run "RunFromUSB.bat" as\nadministrator, then select the "Local Disk" option on the Add Data Source\npanel. +SelectDriveDialog.descriptionTextArea.text=This feature copies the application and a batch file to a removable drive,\nallowing systems to be analyzed without installing the software or\nimaging the drives.\n\nTo analyze a system, insert the drive and run "RunFromUSB.bat" as\nadministrator, then select the "Local Disk" option on the Add Data Source\npanel. SelectDriveDialog.localDiskModel.loading.msg= SelectDriveDialog.localDiskModel.nodrives.msg=Executable could not be found +SelectDriveDialog.selectDriveLabel.text=Select drive to use for live triage (may take time to load): SelectDriveDialog.title=Create Live Triage Drive diff --git a/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/Bundle.properties-MERGED index b006deb22d..e69126f939 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/Bundle.properties-MERGED @@ -45,6 +45,6 @@ DataSourceIntegrityIngestModule.shutDown.resultLi=
  • Result:{0}
  • DataSourceIntegrityIngestModule.shutDown.calcHashLi=
  • Calculated hash: {0}
  • DataSourceIntegrityIngestModule.shutDown.storedHashLi=
  • Stored hash: {0}
  • DataSourceIntegrityIngestSettingsPanel.computeHashesCheckbox.text=Calculate data source hashes if none are present -DataSourceIntegrityIngestSettingsPanel.jLabel1.text=Note that this module will not run on logical files -DataSourceIntegrityIngestSettingsPanel.jLabel3.text=Ingest Settings DataSourceIntegrityIngestSettingsPanel.verifyHashesCheckbox.text=Verify existing data source hashes +DataSourceIntegrityIngestSettingsPanel.ingestSettingsLabel.text=Ingest Settings +DataSourceIntegrityIngestSettingsPanel.noteLabel.text=Note that this module will not run on logical files diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties-MERGED index 4729293fb9..4585d86449 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties-MERGED @@ -11,7 +11,12 @@ ExtractArchiveWithPasswordAction.progress.text=Unpacking contents of archive: {0 ExtractArchiveWithPasswordAction.prompt.text=Enter Password ExtractArchiveWithPasswordAction.prompt.title=Enter Password OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Embedded File Extraction Ingest Module\n\nThe Embedded File Extraction Ingest Module processes document files (such as doc, docx, ppt, pptx, xls, xlsx) and archive files (such as zip and others archive types supported by the 7zip extractor).\nContents of these files are extracted and the derived files are added back to the current ingest to be processed by the configured ingest modules.\nIf the derived file happens to be an archive file, it will be re-processed by the 7zip extractor - the extractor will process archive files N-levels deep.\n\nThe extracted files are navigable in the directory tree.\n\nThe module is supported on Windows, Linux and Mac operating systems. +OpenIDE-Module-Long-Description=\ + Embedded File Extraction Ingest Module\n\nThe Embedded File Extraction Ingest Module processes document files (such as doc, docx, ppt, pptx, xls, xlsx) and archive files (such as zip and others archive types supported by the 7zip extractor).\n\ + Contents of these files are extracted and the derived files are added back to the current ingest to be processed by the configured ingest modules.\n\ + If the derived file happens to be an archive file, it will be re-processed by the 7zip extractor - the extractor will process archive files N-levels deep.\n\n\ + The extracted files are navigable in the directory tree.\n\n\ + The module is supported on Windows, Linux and Mac operating systems. OpenIDE-Module-Name=Embedded File Extraction OpenIDE-Module-Short-Description=Embedded File Extraction Ingest Module EmbeddedFileExtractorIngestModule.SevenZipContentReadStream.seek.exception.invalidOrigin=Invalid seek origin: {0} @@ -23,7 +28,6 @@ EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnMsg=Possib EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnDetails=Compression ratio is {0}, skipping items in {1}. EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnMsg.zipBomb=Possible ZIP bomb detected: {0} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnDetails.zipBomb=The archive is {0} levels deep, skipping processing of {1} -EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.unknownPath.msg=Unknown item path in archive: {0}, will use: {1} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.msg=Not enough disk space to unpack archive item: {0}, {1} EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.details=The archive item is too large to unpack, skipping unpacking this item. EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.msg=Error unpacking {0} diff --git a/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle.properties-MERGED index 4915d5a124..f9a5a88b1b 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle.properties-MERGED @@ -2,7 +2,9 @@ CannotRunFileTypeDetection=Cannot run file type detection. ExifParserFileIngestModule.indexError.message=Failed to post EXIF Metadata artifact(s). ExifParserFileIngestModule.userContent.description=EXIF metadata exists for this file. OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Exif metadata ingest module. \n\nThe ingest module analyzes image files, extracts Exif information and posts the Exif data as results. +OpenIDE-Module-Long-Description=\ + Exif metadata ingest module. \n\n\ + The ingest module analyzes image files, extracts Exif information and posts the Exif data as results. OpenIDE-Module-Name=ExifParser OpenIDE-Module-Short-Description=Exif metadata ingest module ExifParserFileIngestModule.moduleName.text=Exif Parser diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties-MERGED index 5063bd55fa..cfaadf1635 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties-MERGED @@ -36,27 +36,27 @@ FileExtMismatchSettingsPanel.jLabel1.text=File Types: FileExtMismatchSettingsPanel.newExtButton.text=New Extension FileExtMismatchSettingsPanel.newMimePrompt.message=Add a new MIME file type: FileExtMismatchSettingsPanel.newMimePrompt.title=New MIME -FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.message=MIME type text is empty! +FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.message=MIME type text is empty\! FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.title=Empty type -FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.message=MIME type not supported! +FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.message=MIME type not supported\! FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.title=Type not supported -FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.message=MIME type already exists! +FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.message=MIME type already exists\! FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.title=Type already exists FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.message=MIME type is not detectable by this module. FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.title=Type not detectable -FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.message=No MIME type selected! +FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.message=No MIME type selected\! FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.title=No type selected FileExtMismatchSettingsPanel.newExtPrompt.message=Add an allowed extension: FileExtMismatchSettingsPanel.newExtPrompt.title=New allowed extension -FileExtMismatchSettingsPanel.newExtPrompt.empty.message=Extension text is empty! +FileExtMismatchSettingsPanel.newExtPrompt.empty.message=Extension text is empty\! FileExtMismatchSettingsPanel.newExtPrompt.empty.title=Extension text empty -FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.message=No MIME type selected! +FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.message=No MIME type selected\! FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.title=No MIME type selected -FileExtMismatchSettingsPanel.newExtPrompt.extExists.message=Extension already exists! +FileExtMismatchSettingsPanel.newExtPrompt.extExists.message=Extension already exists\! FileExtMismatchSettingsPanel.newExtPrompt.extExists.title=Extension already exists -FileExtMismatchSettingsPanel.removeExtButton.noneSelected.message=No extension selected! +FileExtMismatchSettingsPanel.removeExtButton.noneSelected.message=No extension selected\! FileExtMismatchSettingsPanel.removeExtButton.noneSelected.title=No extension selected -FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.message=No MIME type selected! +FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.message=No MIME type selected\! FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.title=No MIME type selected FileExtMismatchSettingsPanel.removeTypeButton.toolTipText= FileExtMismatchModuleSettingsPanel.checkAllRadioButton.text=Check all file types diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties-MERGED index ccc55e18b0..ca866a4a13 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties-MERGED @@ -51,7 +51,6 @@ FileTypeIdGlobalSettingsPanel.JOptionPane.loadFailed.title=Load Failed FileTypeIdGlobalSettingsPanel.loadFileTypes.errorMessage=Failed to load existing file type definitions. FileTypeIdGlobalSettingsPanel.saveFileTypes.errorMessage=Failed to save file type definitions. FileTypeIdGlobalSettingsPanel.newTypeButton.text=New Type -FileTypeIdGlobalSettingsPanel.jLabel2.text=Custom MIME Types: FileTypeIdGlobalSettingsPanel.startUp.fileTypeDetectorInitializationException.msg=Error initializing the file type detector. AddFileTypeSignaturePanel.offsetLabel.text=Byte Offset AddFileTypeSignaturePanel.signatureTextField.text= @@ -60,7 +59,6 @@ AddFileTypeSignaturePanel.signatureLabel.text=Signature AddFileTypeSignaturePanel.hexPrefixLabel.text=0x AddFileTypeSignaturePanel.offsetRelativeToLabel.text=Offset is relative to AddFileTypeSignaturePanel.offsetTextField.text= -FileTypeIdGlobalSettingsPanel.jLabel1.text=Signatures FileTypeIdGlobalSettingsPanel.editTypeButton.text=Edit Type AddFileTypePanel.mimeTypeTextField.text= AddFileTypePanel.mimeTypeLabel.text=MIME Type @@ -72,4 +70,6 @@ AddFileTypePanel.postHitCheckBox.text=Alert as an "Interesting File" when found AddFileTypePanel.setNameLabel.text=Set Name AddFileTypePanel.setNameTextField.text= FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text=Cannot make changes to file type definitions when ingest is running! -FileTypeIdGlobalSettingsPanel.jLabel3.text=Autopsy can automatically detect many file types. Add your custom file types here. +FileTypeIdGlobalSettingsPanel.descriptionLabel.text=Autopsy can automatically detect many file types. Add your custom file types here. +FileTypeIdGlobalSettingsPanel.customTypesLabel.text=Custom MIME Types: +FileTypeIdGlobalSettingsPanel.signaturesLabel.text=Signatures diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties-MERGED index 31a0690b82..3c275ee9cb 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties-MERGED @@ -83,8 +83,8 @@ FilesSetRulePanel.nameTextField.text= FilesSetRulePanel.ruleNameLabel.text=Rule Name (Optional): FilesSetRulePanel.messages.emptyNameCondition=You must specify a name pattern for this rule. FilesSetRulePanel.messages.invalidNameRegex=The name regular expression is not valid:\n\n{0} -FilesSetRulePanel.messages.invalidCharInName=The name cannot contain \\, /, :, *, ?, ", <, or > unless it is a regular expression. -FilesSetRulePanel.messages.invalidCharInPath=The path cannot contain \\, :, *, ?, ", <, or > unless it is a regular expression. +FilesSetRulePanel.messages.invalidCharInName=The name cannot contain \\, /, :, *, ?, \", <, or > unless it is a regular expression. +FilesSetRulePanel.messages.invalidCharInPath=The path cannot contain \\, :, *, ?, \", <, or > unless it is a regular expression. FilesSetRulePanel.messages.invalidPathRegex=The path regular expression is not valid:\n\n{0} FilesSetDefsPanel.doFileSetsDialog.duplicateRuleSet.text=Rule set with name {0} already exists. FilesSetRulePanel.pathSeparatorInfoLabel.text=Folder must be in parent path. Use '/' to give consecutive names @@ -109,21 +109,14 @@ FilesSetDefsPanel.ingest.deleteSetButton.text=Delete Filter FilesSetDefsPanel.interesting.jLabel6.text=Set Details FilesSetDefsPanel.ingest.jLabel6.text=Filter Details FilesSetDefsPanel.newRuleButton.text=New Rule -FilesSetDefsPanel.jLabel8.text=File Size: -FilesSetDefsPanel.jLabel7.text=MIME Type: FilesSetDefsPanel.rulePathConditionRegexCheckBox.text=Regex -FilesSetDefsPanel.jLabel4.text=Path Substring: -FilesSetDefsPanel.jLabel1.text=Rule Details FilesSetDefsPanel.dirsRadioButton.text=Directories -FilesSetDefsPanel.jLabel2.text=File Type: FilesSetDefsPanel.deleteRuleButton.text=Delete Rule FilesSetDefsPanel.fileNameRegexCheckbox.text=Substring / Regex FilesSetDefsPanel.ignoreKnownFilesCheckbox.text=Ignore Known Files FilesSetDefsPanel.rulePathConditionTextField.text= FilesSetDefsPanel.fileNameRadioButton.text=Full Name -FilesSetDefsPanel.jLabel5.text=Description: FilesSetDefsPanel.fileNameTextField.text= -FilesSetDefsPanel.jLabel3.text=Name: FilesSetDefsPanel.fileNameExtensionRadioButton.text=Extension Only FilesSetDefsPanel.rulesListLabel.text=Rules: FilesSetDefsPanel.editRuleButton.text=Edit Rule @@ -140,3 +133,10 @@ FilesSetDefsPanel.modifiedDateLabel.text=Modified Within: FilesSetDefsPanel.daysIncludedTextField.text= FilesSetDefsPanel.daysIncludedLabel.text=day(s) FilesSetRulePanel.daysIncludedLabel.text=day(s) +FilesSetDefsPanel.nameLabel.text=Name: +FilesSetDefsPanel.descriptionLabel.text=Description: +FilesSetDefsPanel.fileTypeLabel.text=File Type: +FilesSetDefsPanel.ruleLabel.text=Rule Details +FilesSetDefsPanel.pathLabel.text=Path Substring: +FilesSetDefsPanel.mimeTypeLabel.text=MIME Type: +FilesSetDefsPanel.fileSizeLabel.text=File Size: diff --git a/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle.properties-MERGED index 2dc971a40d..87dacfc16c 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle.properties-MERGED @@ -21,7 +21,7 @@ PhotoRecIngestModule.complete.totalParsetime=Total Parsing Time: PhotoRecIngestModule.complete.photoRecResults=PhotoRec Results PhotoRecIngestModule.NotEnoughDiskSpace.detail.msg=PhotoRec error processing {0} with {1} Not enough space on primary disk to save unallocated space. PhotoRecIngestModule.cancelledByUser=PhotoRec cancelled by user. -PhotoRecIngestModule.error.exitValue=PhotoRec carver returned error exit value = {0} when scanning {1} +PhotoRecIngestModule.error.exitValue=PhotoRec carver returned error exit value \= {0} when scanning {1} PhotoRecIngestModule.error.msg=Error processing {0} with PhotoRec carver. PhotoRecIngestModule.complete.numberOfErrors=Number of Errors while Carving: PhotoRecCarverIngestJobSettingsPanel.detectionSettingsLabel.text=PhotoRec Settings 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/texttranslation/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties-MERGED index fa1a250e44..802b117c35 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties-MERGED @@ -19,3 +19,4 @@ TranslationContentPanel.ocrLabel.text=OCR: TranslationOptionsPanelController.moduleErr=Module Error TranslationOptionsPanelController.moduleErr.msg=A module caused an error listening to TranslationSettingsPanelController updates. See log to determine which module. Some data could be incomplete. TranslationContentPanel.showLabel.text=Show: +TranslationContentPanel.jSepLarge1.AccessibleContext.accessibleName= diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED index adb7693b48..823399e0d0 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED @@ -89,6 +89,10 @@ AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the c AutoIngestControlPanel.SharedConfigurationDisabled=Shared configuration disabled AutoIngestControlPanel.ShowLogFailed.Message=Case log file does not exist AutoIngestControlPanel.ShowLogFailed.Title=Unable to display case log +# {0} - case db status +# {1} - search svc Status +# {2} - coord svc Status +# {3} - msg broker status AutoIngestControlPanel.tbServicesStatusMessage.Message=Case databases {0}, keyword search {1}, coordination {2}, messaging {3} AutoIngestControlPanel.tbServicesStatusMessage.Message.Down=down AutoIngestControlPanel.tbServicesStatusMessage.Message.Unknown=unknown @@ -182,16 +186,22 @@ DeleteCaseTask.progress.acquiringManifestLocks=Acquiring exclusive manifest file DeleteCaseTask.progress.connectingToCoordSvc=Connecting to the coordination service... DeleteCaseTask.progress.deletingCaseDirCoordSvcNode=Deleting case directory znode... DeleteCaseTask.progress.deletingCaseNameCoordSvcNode=Deleting case name znode... +# {0} - data source path DeleteCaseTask.progress.deletingDataSource=Deleting data source {0}... DeleteCaseTask.progress.deletingJobLogLockNode=Deleting case auto ingest log znode... +# {0} - manifest file path DeleteCaseTask.progress.deletingManifest=Deleting manifest file {0}... +# {0} - manifest file path DeleteCaseTask.progress.deletingManifestFileNode=Deleting the manifest file znode for {0}... DeleteCaseTask.progress.deletingResourcesLockNode=Deleting case resources znode... DeleteCaseTask.progress.gettingManifestPaths=Getting manifest file paths... +# {0} - manifest file path DeleteCaseTask.progress.lockingManifest=Locking manifest file {0}... DeleteCaseTask.progress.openingCaseDatabase=Opening the case database... DeleteCaseTask.progress.openingCaseMetadataFile=Opening case metadata file... +# {0} - manifest file path DeleteCaseTask.progress.parsingManifest=Parsing manifest file {0}... +# {0} - manifest file path DeleteCaseTask.progress.releasingManifestLock=Releasing lock on the manifest file {0}... DeleteCaseTask.progress.startMessage=Starting deletion... DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes @@ -207,6 +217,7 @@ DeleteOrphanCaseNodesTask.progress.lookingForOrphanedCaseZnodes=Looking for orph DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup DeleteOrphanManifestNodesAction.progressDisplayName=Cleanup Manifest File Znodes DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service +# {0} - node path DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0} DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for manifest file znodes DeleteOrphanManifestNodesTask.progress.lookingForOrphanedManifestFileZnodes=Looking for orphaned manifest file znodes @@ -215,6 +226,7 @@ HINT_CasesDashboardTopComponent=This is an adminstrative dashboard for multi-use OpenAutoIngestLogAction.deletedLogErrorMsg=The case auto ingest log has been deleted. OpenAutoIngestLogAction.logOpenFailedErrorMsg=Failed to open case auto ingest log. See application log for details. OpenAutoIngestLogAction.menuItemText=Open Auto Ingest Log File +# {0} - caseErrorMessage OpenCaseAction.errorMsg=Failed to open case: {0} OpenCaseAction.menuItemText=Open OpenIDE-Module-Long-Description=This module contains features that are being developed by Basis Technology and are not part of the default Autopsy distribution. You can enable this module to use the new features. The features should be stable, but their exact behavior and API are subject to change.\n\nWe make no guarantee that the API of this module will not change, so developers should be careful when relying on it. diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle.properties-MERGED b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle.properties-MERGED index 91e2bebd08..337e80b346 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle.properties-MERGED +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle.properties-MERGED @@ -75,6 +75,7 @@ MultiUserTestTool.unableCreatFile=Unable to create a file in case output directo MultiUserTestTool.unableToCheckService=Unable to check Multi User service state: {0} MultiUserTestTool.unableToCreateCase=Unable to create case MultiUserTestTool.unableToInitializeDatabase=Case database was not successfully initialized +MultiUserTestTool.unableToInitializeFilTypeDetector=Unable to initialize File Type Detector MultiUserTestTool.unableToReadDatabase=Unable to read from case database MultiUserTestTool.unableToReadTestFileFromDatabase=Unable to read test file info from case database MultiUserTestTool.unableToRunIngest=Unable to run ingest on test data source diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED index 9aeeabc046..79a4135ce4 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED @@ -36,7 +36,7 @@ KeywordSearchResultFactory.createNodeForKey.noResultsFound.text=No results found KeywordSearchResultFactory.query.exception.msg=Could not perform the query OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\nThe module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. +OpenIDE-Module-Long-Description=Keyword Search ingest module.\n\nThe module indexes files found in the disk image at ingest time.\nIt then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword search bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. OpenIDE-Module-Name=KeywordSearch OptionsCategory_Name_KeywordSearchOptions=Keyword Search OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search @@ -360,24 +360,24 @@ DropdownListSearchPanel.jSaveSearchResults.text=Save search results GlobalEditListPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes. KeywordSearchGlobalLanguageSettingsPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes. KeywordSearchGlobalSearchSettingsPanel.ingestWarningLabel.text=Ingest is ongoing, some settings will be unavailable until it finishes. -ExtractedContentPanel.hitCountLabel.text=- +ExtractedContentPanel.AccessibleContext.accessibleName= +ExtractedContentPanel.jLabel1.text=Text Source: +ExtractedContentPanel.hitNextButton.text= ExtractedContentPanel.hitPreviousButton.text= +ExtractedContentPanel.hitButtonsLabel.text=Match ExtractedContentPanel.hitTotalLabel.text=- ExtractedContentPanel.hitOfLabel.text=of -ExtractedContentPanel.hitNextButton.text= -ExtractedContentPanel.hitButtonsLabel.text=Match +ExtractedContentPanel.hitCountLabel.text=- ExtractedContentPanel.hitLabel.toolTipText= ExtractedContentPanel.hitLabel.text=Matches on page: -ExtractedContentPanel.pageCurLabel.text=- +ExtractedContentPanel.pageNextButton.text= ExtractedContentPanel.pagePreviousButton.actionCommand=pagePreviousButton ExtractedContentPanel.pagePreviousButton.text= -ExtractedContentPanel.pageNextButton.text= -ExtractedContentPanel.pagesLabel.text=Page: -ExtractedContentPanel.pageTotalLabel.text=- ExtractedContentPanel.pageButtonsLabel.text=Page +ExtractedContentPanel.pageTotalLabel.text=- ExtractedContentPanel.pageOfLabel.text=of -ExtractedContentPanel.jLabel1.text=Text Source: -ExtractedContentPanel.AccessibleContext.accessibleName= +ExtractedContentPanel.pageCurLabel.text=- +ExtractedContentPanel.pagesLabel.text=Page: TextZoomPanel.zoomInButton.text= TextZoomPanel.zoomOutButton.text= TextZoomPanel.zoomResetButton.text=Reset diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED index 310602b0f9..26823e1150 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED @@ -5,10 +5,15 @@ ChromeCacheExtract_adding_artifacts_msg=Chrome Cache: Adding %d artifacts for an ChromeCacheExtract_adding_extracted_files_msg=Chrome Cache: Adding %d extracted files for analysis. ChromeCacheExtract_loading_files_msg=Chrome Cache: Loading files from %s. 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} DataSourceUsage_AndroidMedia=Android Media Card DataSourceUsage_DJU_Drone_DAT=DJI Internal SD Card DataSourceUsage_FlashDrive=Flash Drive +# {0} - OS name DataSourceUsageAnalyzer.customVolume.label=OS Drive ({0}) DataSourceUsageAnalyzer.parentModuleName=Recent Activity Extract.indexError.message=Failed to index artifact for keyword search. @@ -71,7 +76,7 @@ ExtractZone_progress_Msg=Extracting :Zone.Identifer files ExtractZone_Restricted=Restricted Sites Zone ExtractZone_Trusted=Trusted Sites Zone OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\nThe module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy. +OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\n\The module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy. OpenIDE-Module-Name=RecentActivity OpenIDE-Module-Short-Description=Recent Activity finder ingest module Chrome.moduleName=Chrome @@ -202,6 +207,7 @@ Recently_Used_Artifacts_Officedocs=Recently opened according to Office MRU Recently_Used_Artifacts_Winrar=Recently opened according to WinRAR MRU RegRipperFullNotFound=Full version RegRipper executable not found. RegRipperNotFound=Autopsy RegRipper executable not found. +# {0} - file name SearchEngineURLQueryAnalyzer.init.exception.msg=Unable to find {0}. SearchEngineURLQueryAnalyzer.moduleName.text=Search Engine SearchEngineURLQueryAnalyzer.engineName.none=NONE diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index b20ccf5912..5f60aed634 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Tue, 12 Nov 2019 17:21:46 -0500 +#Fri, 12 Jun 2020 14:50:38 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 @@ -8,4 +8,4 @@ SplashRunningTextBounds=0,289,538,18 SplashRunningTextColor=0x0 SplashRunningTextFontSize=19 -currentVersion=Autopsy 4.13.0 +currentVersion=Autopsy 4.15.0 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index 998d3f715c..6160c1ec95 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,4 +1,4 @@ #Updated by build script -#Tue, 12 Nov 2019 17:21:46 -0500 -CTL_MainWindow_Title=Autopsy 4.13.0 -CTL_MainWindow_Title_No_Project=Autopsy 4.13.0 +#Fri, 12 Jun 2020 14:50:38 -0400 +CTL_MainWindow_Title=Autopsy 4.15.0 +CTL_MainWindow_Title_No_Project=Autopsy 4.15.0 From 3e1bee8668010e04ef41a91534005b402f0511f2 Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 12 Jun 2020 17:03:10 -0400 Subject: [PATCH 19/21] Suppressed warnings for display of deprecated aritfact types --- Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java | 8 ++++++-- .../org/sleuthkit/autopsy/geolocation/MapWaypoint.java | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java index 242d8e81d6..0304891afb 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java @@ -81,6 +81,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; /** * The map panel. This panel contains the jxmapviewer MapViewer */ +@SuppressWarnings("deprecation") final public class MapPanel extends javax.swing.JPanel { static final String CURRENT_MOUSE_GEOPOSITION = "CURRENT_MOUSE_GEOPOSITION"; @@ -399,7 +400,7 @@ final public class MapPanel extends javax.swing.JPanel { * Show the popup menu for the given waypoint and location. * * @param waypoint Selected waypoint - * @param point Current mouse click location + * @param point Current mouse click location */ private void showPopupMenu(MapWaypoint waypoint, Point point) throws TskCoreException { if (waypoint == null) { @@ -478,7 +479,7 @@ final public class MapPanel extends javax.swing.JPanel { * @param clickPoint The mouse click point * * @return A waypoint that is within 10 pixels of the given point, or null - * if none was found. + * if none was found. */ private List findClosestWaypoint(Point clickPoint) { if (waypointTree == null) { @@ -759,6 +760,7 @@ final public class MapPanel extends javax.swing.JPanel { /** * * @param waypoint the waypoint for which to get the color selected + * * @return the color that this waypoint should be rendered */ private Color getColor(MapWaypoint waypoint) { @@ -776,6 +778,7 @@ final public class MapPanel extends javax.swing.JPanel { * Creates a dot image with the specified color * * @param color the color of the new image + * * @return the new dot image */ private BufferedImage createTrackDotImage(Color color) { @@ -797,6 +800,7 @@ final public class MapPanel extends javax.swing.JPanel { * Creates a waypoint image with the specified color * * @param color the color of the new image + * * @return the new waypoint image */ private BufferedImage createWaypointImage(Color color) { diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MapWaypoint.java b/Core/src/org/sleuthkit/autopsy/geolocation/MapWaypoint.java index f7673338b1..7007c7f025 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/MapWaypoint.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/MapWaypoint.java @@ -62,6 +62,7 @@ import org.sleuthkit.datamodel.TskCoreException; * Waypoint interface. * */ +@SuppressWarnings("deprecation") final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewer.Waypoint { private static final Logger logger = Logger.getLogger(MapWaypoint.class.getName()); From fac9777bbb9372a748c5bd3c08bd0fc5ecd9591a Mon Sep 17 00:00:00 2001 From: Richard Cordovano Date: Fri, 12 Jun 2020 17:07:33 -0400 Subject: [PATCH 20/21] Correct truncated key name in JA properties file --- Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties index 40abf528ad..2fbfbee07b 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties @@ -199,7 +199,7 @@ ContentTagNode.createSheet.filePath.name=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 ContentTagNode.createSheet.filePath.displayName=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 ContentTagNode.createSheet.comment.name=\u30b3\u30e1\u30f3\u30c8 ContentTagNode.createSheet.comment.displayName=\u30b3\u30e1\u30f3\u30c8 -ContentTagNode.createSheet.fileModifiedTime.nam=\u66f4\u65b0\u65e5\u6642 +ContentTagNode.createSheet.fileModifiedTime.name=\u66f4\u65b0\u65e5\u6642 ContentTagNode.createSheet.fileModifiedTime.displayName=\u66f4\u65b0\u65e5\u6642 ContentTagNode.createSheet.fileChangedTime.name=\u30a8\u30f3\u30c8\u30ea\u66f4\u65b0\u65e5\u6642 ContentTagNode.createSheet.fileChangedTime.displayName=\u30a8\u30f3\u30c8\u30ea\u66f4\u65b0\u65e5\u6642 From 0241957e44ddc2cbd9caa54a2a846a16c5357fac Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Mon, 15 Jun 2020 10:22:32 -0400 Subject: [PATCH 21/21] PR suggestion --- .../autopsy/centralrepository/datamodel/Persona.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java index 731794b504..502e4ddfbc 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/datamodel/Persona.java @@ -471,7 +471,7 @@ public class Persona { } /** - * Removes the given alias + * Removes the given alias. * * @param alias alias to remove * @@ -483,7 +483,7 @@ public class Persona { } /** - * Modifies the given alias + * Modifies the given alias. * * @param alias alias to modify * @@ -521,7 +521,7 @@ public class Persona { } /** - * Removes the given metadata from this persona + * Removes the given metadata from this persona. * * @param metadata metadata to remove * @@ -533,7 +533,7 @@ public class Persona { } /** - * Modifies the given metadata + * Modifies the given metadata. * * @param metadata metadata to modify *