From a561f0fa9c409e6b05b6534074862b38f0708281 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Fri, 26 Mar 2021 16:50:07 -0400 Subject: [PATCH 01/21] When ingest fails allow the tree to popup with the datasource --- .../sleuthkit/autopsy/casemodule/ImageDSProcessor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java b/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java index 07a88ee07f..9b174f28f7 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/ImageDSProcessor.java @@ -284,10 +284,10 @@ public class ImageDSProcessor implements DataSourceProcessor, AutoIngestDataSour ingestStream = IngestManager.getInstance().openIngestStream(image, settings); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error starting ingest modules", ex); - final List errors = new ArrayList<>(); - errors.add(ex.getMessage()); - callBack.done(DataSourceProcessorCallback.DataSourceProcessorResult.CRITICAL_ERRORS, errors, new ArrayList<>()); - return; + // There was an error with ingest, but the data source has already been added + // so proceed with the defaultIngestStream. Code in openIngestStream + // should have caused a dialog to popup with the errors. + ingestStream = new DefaultIngestStream(); } doAddImageProcess(deviceId, imagePath, sectorSize, timeZone, ignoreFatOrphanFiles, md5, sha1, sha256, progress, callBack); From 7542d9cd121e398d6d6c4b56813ce95c0ca861c3 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 29 Mar 2021 12:00:23 -0400 Subject: [PATCH 02/21] 2882 combine message lines, use messagenotifyUtil --- .../autopsy/apputils/Bundle.properties-MERGED | 4 +- .../autopsy/apputils/ResetWindowsAction.java | 41 ++++++++++++------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED index d9811e349a..dbac8b0fc1 100644 --- a/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED @@ -1,3 +1,3 @@ CTL_ResetWindowsAction=Reset Windows -ResetWindowAction.confirm.text=The program will close and restart to perform the resetting of window locations.\n\nAre you sure you want to reset all window locations? -ResetWindowAction.confirm.title=Reset Windows +ResetWindowAction.caseCloseFailure.text=Unable to close the current case, the software will restart and the windows locations will reset the next time the software is closed. +ResetWindowAction.confirm.text=In order to perform the resetting of window locations the software will close and restart. If a case is currently open it will be closed. If ingest or a search is currently running it will be terminated. Are you sure you want to restart the software to reset all window locations? diff --git a/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java b/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java index 36a9b915df..b282cde19b 100644 --- a/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java +++ b/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java @@ -21,7 +21,6 @@ package org.sleuthkit.autopsy.apputils; import java.io.File; import java.io.IOException; import java.util.logging.Level; -import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import org.apache.commons.io.FileUtils; import org.openide.LifecycleManager; @@ -32,9 +31,10 @@ import org.openide.awt.ActionRegistration; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; -import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.CaseActionException; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.PlatformUtil; /** @@ -54,33 +54,46 @@ public final class ResetWindowsAction extends CallableSystemAction { @Override public boolean isEnabled() { - return !Case.isCaseOpen(); + return true; } - @NbBundle.Messages({"ResetWindowAction.confirm.title=Reset Windows", - "ResetWindowAction.confirm.text=The program will close and restart to perform the resetting of window locations.\n\nAre you sure you want to reset all window locations?"}) + @NbBundle.Messages({"ResetWindowAction.confirm.text=In order to perform the resetting of window locations the software will close and restart. " + + "If a case is currently open it will be closed. If ingest or a search is currently running it will be terminated. " + + "Are you sure you want to restart the software to reset all window locations?", + "ResetWindowAction.caseCloseFailure.text=Unable to close the current case, " + + "the software will restart and the windows locations will reset the next time the software is closed."}) @Override public void performAction() { SwingUtilities.invokeLater(() -> { - int response = JOptionPane.showConfirmDialog( - WindowManager.getDefault().getMainWindow(), - Bundle.ResetWindowAction_confirm_text(), - Bundle.ResetWindowAction_confirm_title(), - JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE); - if (response == JOptionPane.YES_OPTION) { + boolean response = MessageNotifyUtil.Message.confirm(Bundle.ResetWindowAction_confirm_text()); + if (response) { + //adding the shutdown hook, closing the current case, and marking for restart can be re-ordered if slightly different behavior is desired Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { FileUtils.deleteDirectory(new File(PlatformUtil.getUserConfigDirectory() + File.separator + "Windows2Local")); } catch (IOException ex) { - logger.log(Level.WARNING, "Unable to delete config directory, window locations will not be reset.", ex); + //While we would like the user to be aware of this in the unlikely event that the directory can not be deleted + //Because our deletion is being attempted in a shutdown hook I don't know that we can pop up UI elements during the shutdown proces + logger.log(Level.SEVERE, "Unable to delete config directory, window locations will not be reset. To manually reset the windows please delete the following directory while the software is closed. " + PlatformUtil.getUserConfigDirectory() + File.separator + "Windows2Local", ex); } } }); - LifecycleManager.getDefault().markForRestart(); - LifecycleManager.getDefault().exit(); + if (Case.isCaseOpen()) { + try { + Case.closeCurrentCase(); + // The method markForRestart can not be undone once it is called. + LifecycleManager.getDefault().markForRestart(); + //we need to call exit last + LifecycleManager.getDefault().exit(); + } catch (CaseActionException ex) { + logger.log(Level.WARNING, Bundle.ResetWindowAction_caseCloseFailure_text(), ex); + MessageNotifyUtil.Message.show(Bundle.ResetWindowAction_caseCloseFailure_text(), MessageNotifyUtil.MessageType.ERROR); + } + } + } }); } From f74889c5773ec941550017efa3d6a32908db1ea0 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 30 Mar 2021 11:46:14 -0400 Subject: [PATCH 03/21] 2882 fix bug that prevents working when no case is open --- .../autopsy/apputils/ResetWindowsAction.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java b/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java index b282cde19b..7a44030bb6 100644 --- a/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java +++ b/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java @@ -81,19 +81,18 @@ public final class ResetWindowsAction extends CallableSystemAction { } } }); - if (Case.isCaseOpen()) { - try { + try { + if (Case.isCaseOpen()) { Case.closeCurrentCase(); - // The method markForRestart can not be undone once it is called. - LifecycleManager.getDefault().markForRestart(); - //we need to call exit last - LifecycleManager.getDefault().exit(); - } catch (CaseActionException ex) { - logger.log(Level.WARNING, Bundle.ResetWindowAction_caseCloseFailure_text(), ex); - MessageNotifyUtil.Message.show(Bundle.ResetWindowAction_caseCloseFailure_text(), MessageNotifyUtil.MessageType.ERROR); } + // The method markForRestart can not be undone once it is called. + LifecycleManager.getDefault().markForRestart(); + //we need to call exit last + LifecycleManager.getDefault().exit(); + } catch (CaseActionException ex) { + logger.log(Level.WARNING, Bundle.ResetWindowAction_caseCloseFailure_text(), ex); + MessageNotifyUtil.Message.show(Bundle.ResetWindowAction_caseCloseFailure_text(), MessageNotifyUtil.MessageType.ERROR); } - } }); } @@ -104,6 +103,7 @@ public final class ResetWindowsAction extends CallableSystemAction { * @param value whether to enable this action or not */ @Override + public void setEnabled(boolean value) { super.setEnabled(value); } From 8caf0fe4cd2fc17ea94643c615e5095818035adc Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Wed, 31 Mar 2021 15:41:51 -0400 Subject: [PATCH 04/21] 7471 re-open case when reset windows used and case is open --- .../autopsy/apputils/Bundle.properties-MERGED | 1 + .../autopsy/apputils/ResetWindowsAction.java | 20 +++- .../sleuthkit/autopsy/casemodule/Case.java | 2 +- .../autopsy/casemodule/CaseMetadata.java | 2 +- .../casemodule/StartupWindowProvider.java | 94 ++++++++++++------- 5 files changed, 83 insertions(+), 36 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED index dbac8b0fc1..dd9fc3b03e 100644 --- a/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED @@ -1,3 +1,4 @@ CTL_ResetWindowsAction=Reset Windows ResetWindowAction.caseCloseFailure.text=Unable to close the current case, the software will restart and the windows locations will reset the next time the software is closed. +ResetWindowAction.caseSaveMetadata.text=Unable to save current case path, the software will restart and the windows locations will reset but the current case will not be opened upon restart. ResetWindowAction.confirm.text=In order to perform the resetting of window locations the software will close and restart. If a case is currently open it will be closed. If ingest or a search is currently running it will be terminated. Are you sure you want to restart the software to reset all window locations? diff --git a/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java b/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java index 7a44030bb6..faab218a59 100644 --- a/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java +++ b/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.apputils; import java.io.File; import java.io.IOException; +import java.nio.charset.Charset; import java.util.logging.Level; import javax.swing.SwingUtilities; import org.apache.commons.io.FileUtils; @@ -51,6 +52,8 @@ public final class ResetWindowsAction extends CallableSystemAction { private static final String DISPLAY_NAME = Bundle.CTL_ResetWindowsAction(); private static final long serialVersionUID = 1L; private final static Logger logger = Logger.getLogger(ResetWindowsAction.class.getName()); + private final static String WINDOWS2LOCAL = "Windows2Local"; + private final static String CASE_TO_REOPEN_FILE = "caseToOpen.txt"; @Override public boolean isEnabled() { @@ -61,7 +64,9 @@ public final class ResetWindowsAction extends CallableSystemAction { + "If a case is currently open it will be closed. If ingest or a search is currently running it will be terminated. " + "Are you sure you want to restart the software to reset all window locations?", "ResetWindowAction.caseCloseFailure.text=Unable to close the current case, " - + "the software will restart and the windows locations will reset the next time the software is closed."}) + + "the software will restart and the windows locations will reset the next time the software is closed.", + "ResetWindowAction.caseSaveMetadata.text=Unable to save current case path, " + + "the software will restart and the windows locations will reset but the current case will not be opened upon restart."}) @Override public void performAction() { @@ -73,7 +78,7 @@ public final class ResetWindowsAction extends CallableSystemAction { @Override public void run() { try { - FileUtils.deleteDirectory(new File(PlatformUtil.getUserConfigDirectory() + File.separator + "Windows2Local")); + FileUtils.deleteDirectory(new File(PlatformUtil.getUserConfigDirectory() + File.separator + WINDOWS2LOCAL)); } catch (IOException ex) { //While we would like the user to be aware of this in the unlikely event that the directory can not be deleted //Because our deletion is being attempted in a shutdown hook I don't know that we can pop up UI elements during the shutdown proces @@ -83,6 +88,10 @@ public final class ResetWindowsAction extends CallableSystemAction { }); try { if (Case.isCaseOpen()) { + String caseMetadataFilePath = Case.getCurrentCase().getMetadata().getFilePath().toString(); + File caseToOpenFile = new File(ResetWindowsAction.getCaseToReopenFilePath()); + Charset encoding = null; + FileUtils.writeStringToFile(caseToOpenFile, caseMetadataFilePath, encoding); Case.closeCurrentCase(); } // The method markForRestart can not be undone once it is called. @@ -92,10 +101,17 @@ public final class ResetWindowsAction extends CallableSystemAction { } catch (CaseActionException ex) { logger.log(Level.WARNING, Bundle.ResetWindowAction_caseCloseFailure_text(), ex); MessageNotifyUtil.Message.show(Bundle.ResetWindowAction_caseCloseFailure_text(), MessageNotifyUtil.MessageType.ERROR); + } catch (IOException ex) { + logger.log(Level.WARNING, Bundle.ResetWindowAction_caseSaveMetadata_text(), ex); + MessageNotifyUtil.Message.show(Bundle.ResetWindowAction_caseSaveMetadata_text(), MessageNotifyUtil.MessageType.ERROR); } } }); } + + public static String getCaseToReopenFilePath(){ + return PlatformUtil.getUserConfigDirectory() + File.separator + CASE_TO_REOPEN_FILE; + } /** * Set this action to be enabled/disabled diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index c0497c083c..15b18d2c4d 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -1932,7 +1932,7 @@ public class Case { * * @return A CaseMetaData object. */ - CaseMetadata getMetadata() { + public CaseMetadata getMetadata() { return metadata; } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java index 5f7ffe9ea7..96f9899dae 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/CaseMetadata.java @@ -218,7 +218,7 @@ public final class CaseMetadata { * * @return The path to the metadata file */ - Path getFilePath() { + public Path getFilePath() { return metadataFilePath; } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java index 9b62bdb0e0..d3cc39f6ad 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java @@ -18,12 +18,16 @@ */ package org.sleuthkit.autopsy.casemodule; +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; import java.util.Collection; import java.util.Iterator; import java.util.logging.Level; -import org.netbeans.spi.sendopts.OptionProcessor; +import org.apache.commons.io.FileUtils; import org.openide.util.Lookup; import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.apputils.ResetWindowsAction; import org.sleuthkit.autopsy.commandlineingest.CommandLineIngestManager; import org.sleuthkit.autopsy.commandlineingest.CommandLineOpenCaseManager; import org.sleuthkit.autopsy.commandlineingest.CommandLineOptionProcessor; @@ -65,11 +69,11 @@ public class StartupWindowProvider implements StartupWindowInterface { if (startupWindowToUse == null) { // first check whether we are running from command line if (isRunningFromCommandLine()) { - + String defaultArg = getDefaultArgument(); - if(defaultArg != null) { - new CommandLineOpenCaseManager(defaultArg).start(); - return; + if (defaultArg != null) { + new CommandLineOpenCaseManager(defaultArg).start(); + return; } else { // Autopsy is running from command line logger.log(Level.INFO, "Running from command line"); //NON-NLS @@ -84,35 +88,61 @@ public class StartupWindowProvider implements StartupWindowInterface { checkSolr(); } + File openPreviousCaseFile = new File(ResetWindowsAction.getCaseToReopenFilePath()); + String caseFilePath = ""; + if (openPreviousCaseFile.exists()) { + try { + Charset encoding = null; + caseFilePath = FileUtils.readFileToString(openPreviousCaseFile, encoding); + if (new File(caseFilePath).exists()) { + Case.openAsCurrentCase(caseFilePath); + FileUtils.forceDelete(openPreviousCaseFile); + //the case is now open we do not want to display the start up windows + return; + } else { + logger.log(Level.WARNING, "Unable to open previously open case because metadata file not found at: {0}", caseFilePath); + } + } catch (IOException ex) { + logger.log(Level.WARNING, "Unable to open file containing path " + ResetWindowsAction.getCaseToReopenFilePath() + " to previously open case, will not open previous case.", ex); + } catch (CaseActionException ex) { + logger.log(Level.WARNING, "Unable to open previously open case with metadata file: " + caseFilePath, ex); + } + } //discover the registered windows Collection startupWindows = Lookup.getDefault().lookupAll(StartupWindowInterface.class); int windowsCount = startupWindows.size(); - if (windowsCount == 1) { - startupWindowToUse = startupWindows.iterator().next(); - logger.log(Level.INFO, "Will use the default startup window: " + startupWindowToUse.toString()); //NON-NLS - } else if (windowsCount == 2) { - //pick the non default one - Iterator it = startupWindows.iterator(); - while (it.hasNext()) { - StartupWindowInterface window = it.next(); - if (!org.sleuthkit.autopsy.casemodule.StartupWindow.class.isInstance(window)) { - startupWindowToUse = window; - logger.log(Level.INFO, "Will use the custom startup window: " + startupWindowToUse.toString()); //NON-NLS - break; + switch (windowsCount) { + case 1: + startupWindowToUse = startupWindows.iterator().next(); + logger.log(Level.INFO, "Will use the default startup window: {0}", startupWindowToUse.toString()); //NON-NLS + break; + case 2: { + //pick the non default one + Iterator it = startupWindows.iterator(); + while (it.hasNext()) { + StartupWindowInterface window = it.next(); + if (!org.sleuthkit.autopsy.casemodule.StartupWindow.class.isInstance(window)) { + startupWindowToUse = window; + logger.log(Level.INFO, "Will use the custom startup window: {0}", startupWindowToUse.toString()); //NON-NLS + break; + } } + break; } - } else { - // select first non-Autopsy start up window - Iterator it = startupWindows.iterator(); - while (it.hasNext()) { - StartupWindowInterface window = it.next(); - if (!window.getClass().getCanonicalName().startsWith("org.sleuthkit.autopsy")) { - startupWindowToUse = window; - logger.log(Level.INFO, "Will use the custom startup window: " + startupWindowToUse.toString()); //NON-NLS - break; + default: { + // select first non-Autopsy start up window + Iterator it = startupWindows.iterator(); + while (it.hasNext()) { + StartupWindowInterface window = it.next(); + if (!window.getClass().getCanonicalName().startsWith("org.sleuthkit.autopsy")) { + startupWindowToUse = window; + logger.log(Level.INFO, "Will use the custom startup window: {0}", startupWindowToUse.toString()); //NON-NLS + break; + } } + break; } } @@ -147,9 +177,9 @@ public class StartupWindowProvider implements StartupWindowInterface { * @return True if running from command line, false otherwise */ private boolean isRunningFromCommandLine() { - + CommandLineOptionProcessor processor = Lookup.getDefault().lookup(CommandLineOptionProcessor.class); - if(processor != null) { + if (processor != null) { return processor.isRunFromCommandLine(); } return false; @@ -157,12 +187,12 @@ public class StartupWindowProvider implements StartupWindowInterface { /** * Get the default argument from the CommandLineOptionProcessor. - * - * @return If set, the default argument otherwise null. + * + * @return If set, the default argument otherwise null. */ - private String getDefaultArgument() { + private String getDefaultArgument() { CommandLineOptionProcessor processor = Lookup.getDefault().lookup(CommandLineOptionProcessor.class); - if(processor != null) { + if (processor != null) { return processor.getDefaultArgument(); } return null; From ab8f58efd70b29fb557dc584a9ad2e3ffda6106f Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 1 Apr 2021 10:43:40 -0400 Subject: [PATCH 05/21] 7471 re-order case opening and deleting of file --- .../sleuthkit/autopsy/casemodule/StartupWindowProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java index d3cc39f6ad..bb624254ff 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java @@ -95,15 +95,15 @@ public class StartupWindowProvider implements StartupWindowInterface { Charset encoding = null; caseFilePath = FileUtils.readFileToString(openPreviousCaseFile, encoding); if (new File(caseFilePath).exists()) { - Case.openAsCurrentCase(caseFilePath); FileUtils.forceDelete(openPreviousCaseFile); + Case.openAsCurrentCase(caseFilePath); //the case is now open we do not want to display the start up windows return; } else { logger.log(Level.WARNING, "Unable to open previously open case because metadata file not found at: {0}", caseFilePath); } } catch (IOException ex) { - logger.log(Level.WARNING, "Unable to open file containing path " + ResetWindowsAction.getCaseToReopenFilePath() + " to previously open case, will not open previous case.", ex); + logger.log(Level.WARNING, "Unable to open or delete file containing path " + ResetWindowsAction.getCaseToReopenFilePath() + " to previously open case, will not open previous case.", ex); } catch (CaseActionException ex) { logger.log(Level.WARNING, "Unable to open previously open case with metadata file: " + caseFilePath, ex); } From d65495df3feee5d6d79c2bab1cba5c03a876c299 Mon Sep 17 00:00:00 2001 From: apriestman Date: Wed, 7 Apr 2021 13:04:56 -0400 Subject: [PATCH 06/21] Handle UnsupportedContent type --- .../sleuthkit/autopsy/ingest/GetRootDirectoryVisitor.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/ingest/GetRootDirectoryVisitor.java b/Core/src/org/sleuthkit/autopsy/ingest/GetRootDirectoryVisitor.java index cf02c8e11b..a50f266c57 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/GetRootDirectoryVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/GetRootDirectoryVisitor.java @@ -31,6 +31,7 @@ import org.sleuthkit.datamodel.LocalFile; import org.sleuthkit.datamodel.LocalDirectory; import org.sleuthkit.datamodel.OsAccount; import org.sleuthkit.datamodel.SlackFile; +import org.sleuthkit.datamodel.UnsupportedContent; import org.sleuthkit.datamodel.VirtualDirectory; /** @@ -113,4 +114,9 @@ final class GetRootDirectoryVisitor extends GetFilesContentVisitor { public Collection visit(OsAccount art) { return getAllFromChildren(art); } + + @Override + public Collection visit(UnsupportedContent uc) { + return getAllFromChildren(uc); + } } From 1c2730c93d060e6b0197f715c743a0f7051e8f79 Mon Sep 17 00:00:00 2001 From: Kelly Kelly Date: Thu, 8 Apr 2021 15:17:58 -0400 Subject: [PATCH 07/21] Added background task to fetch realm data for OsAccountNode --- .../autopsy/datamodel/ContentNodeVisitor.java | 9 + .../autopsy/datamodel/OsAccounts.java | 167 +++++++++++++++--- 2 files changed, 149 insertions(+), 27 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java index af7eb3a249..4d9f3e0870 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.datamodel; +import org.sleuthkit.autopsy.datamodel.OsAccounts.OsAccountNode; + /** * Visitor Pattern interface that goes over Content nodes in the data source * area of the tree. @@ -50,6 +52,8 @@ interface ContentNodeVisitor { T visit(BlackboardArtifactNode bban); + T visit(OsAccountNode bban); + /** * Visitor with an implementable default behavior for all types. Override @@ -122,5 +126,10 @@ interface ContentNodeVisitor { public T visit(BlackboardArtifactNode bban) { return defaultVisit(bban); } + + @Override + public T visit(OsAccountNode bban) { + return defaultVisit(bban); + } } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java index 4b2588c6bb..9a9026b91c 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java @@ -18,8 +18,10 @@ */ package org.sleuthkit.autopsy.datamodel; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.lang.ref.WeakReference; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -27,20 +29,30 @@ import java.util.Collections; import java.util.EnumSet; import java.util.List; import java.util.Optional; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.logging.Level; import javax.swing.Action; +import org.apache.commons.lang3.tuple.Pair; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.nodes.Sheet; +import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; -import org.openide.util.lookup.Lookups; +import org.openide.util.WeakListeners; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.events.OsAccountChangedEvent; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; +import org.sleuthkit.autopsy.corecomponents.DataResultViewerTable; import org.sleuthkit.autopsy.coreutils.Logger; +import static org.sleuthkit.autopsy.datamodel.AbstractContentNode.backgroundTasksPool; +import org.sleuthkit.autopsy.events.AutopsyEvent; import org.sleuthkit.datamodel.Host; import org.sleuthkit.datamodel.OsAccount; +import org.sleuthkit.datamodel.OsAccountRealm; import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.Tag; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskDataException; @@ -52,6 +64,7 @@ public final class OsAccounts implements AutopsyVisitableItem { private static final Logger logger = Logger.getLogger(OsAccounts.class.getName()); private static final String ICON_PATH = "org/sleuthkit/autopsy/images/os-account.png"; private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); + private static final String REALM_DATA_AVAILABLE_EVENT = "REALM_DATA_AVAILABLE_EVENT"; private SleuthkitCase skCase; private final long filteringDSObjId; @@ -114,9 +127,9 @@ public final class OsAccounts implements AutopsyVisitableItem { @Override public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - if(eventType.equals(Case.Events.OS_ACCOUNT_ADDED.toString()) + if (eventType.equals(Case.Events.OS_ACCOUNT_ADDED.toString()) || eventType.equals(Case.Events.OS_ACCOUNT_REMOVED.toString())) { - refresh(true); + refresh(true); } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) { // case was closed. Remove listeners so that we don't get called with a stale case handle if (evt.getNewValue() == null) { @@ -126,22 +139,22 @@ public final class OsAccounts implements AutopsyVisitableItem { } } }; - + @Override protected void addNotify() { Case.addEventTypeSubscriber(EnumSet.of(Case.Events.OS_ACCOUNT_ADDED, Case.Events.OS_ACCOUNT_REMOVED), listener); Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), listener); } - + @Override protected void removeNotify() { Case.removeEventTypeSubscriber(Collections.singleton(Case.Events.OS_ACCOUNT_ADDED), listener); Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), listener); } - + @Override protected boolean createKeys(List list) { - if(skCase != null) { + if (skCase != null) { try { if (filteringDSObjId == 0) { list.addAll(skCase.getOsAccountManager().getOsAccounts()); @@ -166,35 +179,52 @@ public final class OsAccounts implements AutopsyVisitableItem { /** * An OsAccount leaf Node. */ - public static final class OsAccountNode extends DisplayableItemNode { + public static final class OsAccountNode extends AbstractContentNode { private OsAccount account; - + private final PropertyChangeListener listener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - if(((OsAccountChangedEvent)evt).getOsAccount().getId() == account.getId()) { - // Update the account node to the new one - account = ((OsAccountChangedEvent)evt).getOsAccount(); - updateSheet(); + if (evt.getPropertyName().equals(Case.Events.OS_ACCOUNT_CHANGED.name())) { + if (((OsAccountChangedEvent) evt).getOsAccount().getId() == account.getId()) { + // Update the account node to the new one + account = ((OsAccountChangedEvent) evt).getOsAccount(); + updateSheet(); + } + } else if (evt.getPropertyName().equals(REALM_DATA_AVAILABLE_EVENT)) { + OsAccountRealm realm = (OsAccountRealm) evt.getNewValue(); + + // Currently only 0 or 1 names are supported, this will need + // to be modified if that changes. + List realmNames = realm.getRealmNames(); + if (!realmNames.isEmpty()) { + updateSheet(new NodeProperty<>( + Bundle.OsAccounts_accountRealmNameProperty_name(), + Bundle.OsAccounts_accountRealmNameProperty_displayName(), + Bundle.OsAccounts_accountRealmNameProperty_desc(), + "")); + } } } }; + private final PropertyChangeListener weakListener = WeakListeners.propertyChange(listener, null); + /** * Constructs a new OsAccountNode. * * @param account Node object. */ OsAccountNode(OsAccount account) { - super(Children.LEAF, Lookups.fixed(account)); + super(account); this.account = account; setName(account.getName()); setDisplayName(account.getName()); setIconBaseWithExtension(ICON_PATH); - - Case.addEventTypeSubscriber(Collections.singleton(Case.Events.OS_ACCOUNT_CHANGED), listener); + + Case.addEventTypeSubscriber(Collections.singleton(Case.Events.OS_ACCOUNT_CHANGED), weakListener); } @Override @@ -211,7 +241,16 @@ public final class OsAccounts implements AutopsyVisitableItem { public String getItemType() { return getClass().getName(); } - + + /** + * Returns the OsAccount associated with this node. + * + * @return + */ + OsAccount getOsAccount() { + return account; + } + @Messages({ "OsAccounts_accountNameProperty_name=Name", "OsAccounts_accountNameProperty_displayName=Name", @@ -226,13 +265,13 @@ public final class OsAccounts implements AutopsyVisitableItem { "OsAccounts_loginNameProperty_displayName=Login Name", "OsAccounts_loginNameProperty_desc=Os Account login name" }) - + /** - * Refreshes this node's property sheet. - */ - void updateSheet() { - this.setSheet(createSheet()); - } + * Refreshes this node's property sheet. + */ + void updateSheet() { + this.setSheet(createSheet()); + } @Override protected Sheet createSheet() { @@ -256,9 +295,8 @@ public final class OsAccounts implements AutopsyVisitableItem { Bundle.OsAccounts_loginNameProperty_desc(), optional.isPresent() ? optional.get() : "")); - // TODO - load realm on background thread + // Fill with empty string, fetch on background task. String realmName = ""; - //String realmName = account.getRealm().getRealmNames().isEmpty() ? "" : account.getRealm().getRealmNames().get(0); propertiesSet.put(new NodeProperty<>( Bundle.OsAccounts_accountRealmNameProperty_name(), Bundle.OsAccounts_accountRealmNameProperty_displayName(), @@ -275,16 +313,91 @@ public final class OsAccounts implements AutopsyVisitableItem { Bundle.OsAccounts_createdTimeProperty_desc(), timeDisplayStr)); + backgroundTasksPool.submit(new GetOsAccountRealmTask(new WeakReference<>(this), weakListener)); + return sheet; } - + @Override public Action[] getActions(boolean popup) { List actionsList = new ArrayList<>(); actionsList.addAll(Arrays.asList(super.getActions(popup))); actionsList.addAll(DataModelActionsFactory.getActions(account)); - + return actionsList.toArray(new Action[actionsList.size()]); } + + @Override + protected List getAllTagsFromDatabase() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + protected CorrelationAttributeInstance getCorrelationAttributeInstance() { + return null; + } + + @Override + protected Pair getScorePropertyAndDescription(List tags) { + return null; + } + + @Override + protected DataResultViewerTable.HasCommentStatus getCommentProperty(List tags, CorrelationAttributeInstance attribute) { + return DataResultViewerTable.HasCommentStatus.NO_COMMENT; + } + + @Override + protected Pair getCountPropertyAndDescription(CorrelationAttributeInstance.Type attributeType, String attributeValue, String defaultDescription) { + return null; + } + + @Override + public T accept(ContentNodeVisitor visitor) { + return visitor.visit(this); + } + + /** + * Task for grabbing the osAccount realm. + */ + static class GetOsAccountRealmTask implements Runnable { + + private final WeakReference weakNodeRef; + private final PropertyChangeListener listener; + + /** + * Construct a new task. + * + * @param weakContentRef + * @param listener + */ + GetOsAccountRealmTask(WeakReference weakContentRef, PropertyChangeListener listener) { + this.weakNodeRef = weakContentRef; + this.listener = listener; + } + + @Override + public void run() { + OsAccountNode node = weakNodeRef.get(); + if (node == null) { + return; + } + + try { + long realmId = node.getOsAccount().getRealmId(); + OsAccountRealm realm = Case.getCurrentCase().getSleuthkitCase().getOsAccountRealmManager().getRealmByRealmId(realmId); + + if (listener != null && realm != null) { + listener.propertyChange(new PropertyChangeEvent( + AutopsyEvent.SourceType.LOCAL.toString(), + REALM_DATA_AVAILABLE_EVENT, + null, realm)); + } + + } catch (TskCoreException ex) { + Exceptions.printStackTrace(ex); + } + } + } } } From 9b9607a49203ffcee4a38d0bb9e97b016ee4f8dc Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 9 Apr 2021 09:45:53 -0400 Subject: [PATCH 08/21] temp path changes --- .../recentactivity/ChromeCacheExtractor.java | 2 +- .../recentactivity/RAImageIngestModule.java | 66 +++++++++++-------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java index 1ddc1ed401..a2d8409f20 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java @@ -176,7 +176,7 @@ final class ChromeCacheExtractor { // Create an output folder to save any derived files absOutputFolderName = RAImageIngestModule.getRAOutputPath(currentCase, moduleName); - relOutputFolderName = Paths.get( RAImageIngestModule.getRelModuleOutputPath(), moduleName).normalize().toString(); + relOutputFolderName = RAImageIngestModule.getRelModuleOutputPath(currentCase, moduleName); File dir = new File(absOutputFolderName); if (dir.exists() == false) { diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java index b92ebffa98..dc2f9995a2 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java @@ -23,15 +23,16 @@ package org.sleuthkit.autopsy.recentactivity; import java.io.File; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.logging.Level; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.coreutils.TimeStampUtils; import org.sleuthkit.autopsy.ingest.DataSourceIngestModule; import org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress; import org.sleuthkit.autopsy.ingest.IngestServices; @@ -41,7 +42,6 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.autopsy.ingest.IngestModule.ProcessResult; import org.sleuthkit.autopsy.ingest.IngestJobContext; import org.sleuthkit.datamodel.DataSource; -import org.sleuthkit.datamodel.OsAccount; import org.sleuthkit.datamodel.SleuthkitCase; /** @@ -49,6 +49,7 @@ import org.sleuthkit.datamodel.SleuthkitCase; */ public final class RAImageIngestModule implements DataSourceIngestModule { + private static final String RECENT_ACTIVITY_FOLDER = "RecentActivity"; private static final Logger logger = Logger.getLogger(RAImageIngestModule.class.getName()); private final List extractors = new ArrayList<>(); private final List browserExtractors = new ArrayList<>(); @@ -64,7 +65,7 @@ public final class RAImageIngestModule implements DataSourceIngestModule { @Override public void startUp(IngestJobContext context) throws IngestModuleException { this.context = context; - + tskCase = Case.getCurrentCase().getSleuthkitCase(); Extract iexplore; @@ -104,10 +105,10 @@ public final class RAImageIngestModule implements DataSourceIngestModule { extractors.add(webAccountType); // this needs to run after the web browser modules extractors.add(zoneInfo); // this needs to run after the web browser modules extractors.add(recycleBin); // this needs to run after ExtractRegistry and ExtractOS - extractors.add(sru); + extractors.add(sru); extractors.add(prefetch); extractors.add(messageDomainType); - + browserExtractors.add(chrome); browserExtractors.add(firefox); browserExtractors.add(iexplore); @@ -141,8 +142,8 @@ public final class RAImageIngestModule implements DataSourceIngestModule { try { extracter.process(dataSource, context, progressBar, accountCache); - if(extracter instanceof ExtractRegistry) { - accountCache.initialize(tskCase, ((DataSource)dataSource).getHost()); + if (extracter instanceof ExtractRegistry) { + accountCache.initialize(tskCase, ((DataSource) dataSource).getHost()); } } catch (Exception ex) { logger.log(Level.SEVERE, "Exception occurred in " + extracter.getName(), ex); //NON-NLS @@ -221,23 +222,38 @@ public final class RAImageIngestModule implements DataSourceIngestModule { return ProcessResult.OK; } + /** + * Makes a path of the format + * [basePath]/[RECENT_ACTIVITY_FOLDER]/[module]_[timestamp] if it does not + * already exist and returns the created folder. + * + * @param basePath The base path (a case-related folder like temp or + * output). + * @param module The module name to include in the folder name. + * @return The path to the folder. + */ + private static String getAndMakeRAPath(String basePath, String module) { + String moduleFolder = String.format("%s_%s", module, TimeStampUtils.createTimeStamp()); + Path tmpPath = Paths.get(basePath, RECENT_ACTIVITY_FOLDER, moduleFolder); + File dir = tmpPath.toFile(); + if (dir.exists() == false) { + dir.mkdirs(); + } + return tmpPath.toString(); + } + /** * Get the temp path for a specific sub-module in recent activity. Will * create the dir if it doesn't exist. * * @param a_case Case that directory is for - * @param mod Module name that will be used for a sub folder in the temp - * folder to prevent name collisions + * @param mod Module name that will be used for a sub folder in the temp + * folder to prevent name collisions * * @return Path to directory */ static String getRATempPath(Case a_case, String mod) { - String tmpDir = a_case.getTempDirectory() + File.separator + "RecentActivity" + File.separator + mod; //NON-NLS - File dir = new File(tmpDir); - if (dir.exists() == false) { - dir.mkdirs(); - } - return tmpDir; + return getAndMakeRAPath(a_case.getTempDirectory(), mod); } /** @@ -245,28 +261,24 @@ public final class RAImageIngestModule implements DataSourceIngestModule { * create the dir if it doesn't exist. * * @param a_case Case that directory is for - * @param mod Module name that will be used for a sub folder in the temp - * folder to prevent name collisions + * @param mod Module name that will be used for a sub folder in the temp + * folder to prevent name collisions * * @return Path to directory */ static String getRAOutputPath(Case a_case, String mod) { - String tmpDir = a_case.getModuleDirectory() + File.separator + "RecentActivity" + File.separator + mod; //NON-NLS - File dir = new File(tmpDir); - if (dir.exists() == false) { - dir.mkdirs(); - } - return tmpDir; + return getAndMakeRAPath(a_case.getModuleDirectory(), mod); } - + /** * Get relative path for module output folder. * * @throws NoCurrentCaseException if there is no open case. * @return the relative path of the module output folder */ - static String getRelModuleOutputPath() throws NoCurrentCaseException { - return Paths.get(Case.getCurrentCaseThrows().getModuleOutputDirectoryRelativePath(), - "RecentActivity").normalize().toString() ; //NON-NLS + static String getRelModuleOutputPath(Case autCase, String mod) { + return Paths.get(getAndMakeRAPath(autCase.getModuleOutputDirectoryRelativePath(), mod)) + .normalize() + .toString(); } } From c99491a8e77341d04b275f9e97c92284cf12b68c Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Fri, 9 Apr 2021 11:45:30 -0400 Subject: [PATCH 09/21] categorizer initialize on demand --- .../DefaultDomainCategorizer.java | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/DefaultDomainCategorizer.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/DefaultDomainCategorizer.java index 0d64661f6c..9519a37bb1 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/DefaultDomainCategorizer.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/DefaultDomainCategorizer.java @@ -128,18 +128,33 @@ public class DefaultDomainCategorizer implements DomainCategorizer { private Map mapping = null; @Override - public void initialize() throws DomainCategorizerException { - if (this.mapping == null) { - try { - this.mapping = loadMapping(); - } catch (IOException ex) { - throw new DomainCategorizerException("Unable to load domain type csv for domain category analysis", ex); - } + public synchronized void initialize() throws DomainCategorizerException { + if (isInitialized()) { + return; + } + + try { + this.mapping = loadMapping(); + } catch (IOException ex) { + throw new DomainCategorizerException("Unable to load domain type csv for domain category analysis", ex); } } + /** + * Returns true if this categorizer is properly initialized. + * + * @return True if this categorizer is properly initialized. + */ + private synchronized boolean isInitialized() { + return this.mapping != null; + } + @Override - public DomainCategory getCategory(String domain, String host) throws DomainCategorizerException { + public synchronized DomainCategory getCategory(String domain, String host) throws DomainCategorizerException { + if (!isInitialized()) { + initialize(); + } + // use host; use domain as fallback if no host provided String hostToUse = StringUtils.isBlank(host) ? domain : host; @@ -162,7 +177,7 @@ public class DefaultDomainCategorizer implements DomainCategorizer { } @Override - public void close() throws Exception { + public synchronized void close() throws Exception { // clear out the mapping to release resources mapping = null; } From eea0ddb8100a6bcdec05059dc0a99878f813bff2 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 12 Apr 2021 10:04:35 -0400 Subject: [PATCH 10/21] updates to RA temp path --- .../recentactivity/ExtractPrefetch.java | 9 +-- .../recentactivity/ExtractRecycleBin.java | 2 +- .../recentactivity/ExtractRegistry.java | 23 ++++---- .../autopsy/recentactivity/ExtractSru.java | 2 +- .../autopsy/recentactivity/Firefox.java | 59 +++++++++++-------- .../recentactivity/RAImageIngestModule.java | 19 +++--- 6 files changed, 65 insertions(+), 49 deletions(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractPrefetch.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractPrefetch.java index 32312c2ee1..3144c831b2 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractPrefetch.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractPrefetch.java @@ -91,6 +91,7 @@ final class ExtractPrefetch extends Extract { void process(Content dataSource, IngestJobContext context, DataSourceIngestModuleProgress progressBar) { this.context = context; + long ingestJobId = context.getJobId(); String modOutPath = Case.getCurrentCase().getModuleDirectory() + File.separator + PREFETCH_DIR_NAME; File dir = new File(modOutPath); @@ -102,7 +103,7 @@ final class ExtractPrefetch extends Extract { } } - extractPrefetchFiles(dataSource); + extractPrefetchFiles(dataSource, ingestJobId); final String prefetchDumper = getPathForPrefetchDumper(); if (prefetchDumper == null) { @@ -116,7 +117,7 @@ final class ExtractPrefetch extends Extract { String modOutFile = modOutPath + File.separator + dataSource.getName() + "-" + PREFETCH_PARSER_DB_FILE; try { - String tempDirPath = RAImageIngestModule.getRATempPath(Case.getCurrentCase(), dataSource.getName() + "-" + PREFETCH_DIR_NAME); + String tempDirPath = RAImageIngestModule.getRATempPath(Case.getCurrentCase(), dataSource.getName() + "-" + PREFETCH_DIR_NAME, ingestJobId); parsePrefetchFiles(prefetchDumper, tempDirPath, modOutFile, modOutPath); createAppExecArtifacts(modOutFile, dataSource); } catch (IOException ex) { @@ -131,7 +132,7 @@ final class ExtractPrefetch extends Extract { * * @param dataSource - datasource to search for prefetch files */ - void extractPrefetchFiles(Content dataSource) { + void extractPrefetchFiles(Content dataSource, long ingestJobId) { List pFiles; FileManager fileManager = Case.getCurrentCase().getServices().getFileManager(); @@ -154,7 +155,7 @@ final class ExtractPrefetch extends Extract { String ext = FilenameUtils.getExtension(origFileName); String baseName = FilenameUtils.getBaseName(origFileName); String fileName = String.format("%s_%d.%s", baseName, pFile.getId(), ext); - String baseRaTempPath = RAImageIngestModule.getRATempPath(Case.getCurrentCase(), dataSource.getName() + "-" + PREFETCH_DIR_NAME); + String baseRaTempPath = RAImageIngestModule.getRATempPath(Case.getCurrentCase(), dataSource.getName() + "-" + PREFETCH_DIR_NAME, ingestJobId); String prefetchFile = Paths.get(baseRaTempPath, fileName).toString(); try { ContentUtils.writeToFile(pFile, new File(prefetchFile)); diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRecycleBin.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRecycleBin.java index 1ced615661..5d727f5b7d 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRecycleBin.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRecycleBin.java @@ -136,7 +136,7 @@ final class ExtractRecycleBin extends Extract { return; // No need to continue } - String tempRARecycleBinPath = RAImageIngestModule.getRATempPath(Case.getCurrentCase(), "recyclebin"); //NON-NLS + String tempRARecycleBinPath = RAImageIngestModule.getRATempPath(Case.getCurrentCase(), "recyclebin", context.getJobId()); //NON-NLS // cycle through the $I files and process each. for (AbstractFile iFile : iFiles) { diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java index a1048d6df6..95f0fee429 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java @@ -294,14 +294,15 @@ class ExtractRegistry extends Extract { /** * Identifies registry files in the database by mtimeItem, runs regripper on * them, and parses the output. + * @param ingestJobId The ingest job id. */ - private void analyzeRegistryFiles() { + private void analyzeRegistryFiles(long ingestJobId) { List allRegistryFiles = findRegistryFiles(); // open the log file FileWriter logFile = null; try { - logFile = new FileWriter(RAImageIngestModule.getRAOutputPath(currentCase, "reg") + File.separator + "regripper-info.txt"); //NON-NLS + logFile = new FileWriter(RAImageIngestModule.getRAOutputPath(currentCase, "reg", ingestJobId) + File.separator + "regripper-info.txt"); //NON-NLS } catch (IOException ex) { logger.log(Level.SEVERE, null, ex); } @@ -313,8 +314,8 @@ class ExtractRegistry extends Extract { String regFileName = regFile.getName(); long regFileId = regFile.getId(); - String regFileNameLocal = RAImageIngestModule.getRATempPath(currentCase, "reg") + File.separator + regFileName; - String outputPathBase = RAImageIngestModule.getRAOutputPath(currentCase, "reg") + File.separator + regFileName + "-regripper-" + Long.toString(regFileId); //NON-NLS + String regFileNameLocal = RAImageIngestModule.getRATempPath(currentCase, "reg", ingestJobId) + File.separator + regFileName; + String outputPathBase = RAImageIngestModule.getRAOutputPath(currentCase, "reg", ingestJobId) + File.separator + regFileName + "-regripper-" + Long.toString(regFileId); //NON-NLS File regFileNameLocalFile = new File(regFileNameLocal); try { ContentUtils.writeToFile(regFile, regFileNameLocalFile, context::dataSourceIngestIsCancelled); @@ -366,7 +367,7 @@ class ExtractRegistry extends Extract { // create a report for the full output if (!regOutputFiles.fullPlugins.isEmpty()) { //parse the full regripper output from SAM hive files - if (regFileNameLocal.toLowerCase().contains("sam") && parseSamPluginOutput(regOutputFiles.fullPlugins, regFile) == false) { + if (regFileNameLocal.toLowerCase().contains("sam") && parseSamPluginOutput(regOutputFiles.fullPlugins, regFile, ingestJobId) == false) { this.addErrorMessage( NbBundle.getMessage(this.getClass(), "ExtractRegistry.analyzeRegFiles.failedParsingResults", this.getName(), regFileName)); @@ -1049,11 +1050,12 @@ class ExtractRegistry extends Extract { * * @param regFilePath the path to the registry file being parsed * @param regAbstractFile the file to associate newly created artifacts with + * @param ingestJobId The ingest job id. * * @return true if successful, false if parsing failed at some point */ - private boolean parseSamPluginOutput(String regFilePath, AbstractFile regAbstractFile) { - parseSystemHostDomain(); + private boolean parseSamPluginOutput(String regFilePath, AbstractFile regAbstractFile, long ingestJobId) { + parseSystemHostDomain(ingestJobId); File regfile = new File(regFilePath); List newArtifacts = new ArrayList<>(); @@ -1139,14 +1141,15 @@ class ExtractRegistry extends Extract { /** * Finds the Host and Domain information from the registry. + * @param ingestJobId The ingest job id. */ - private void parseSystemHostDomain() { + private void parseSystemHostDomain(long ingestJobId) { List regFiles = findRegistryFiles(); for (AbstractFile systemHive: regFiles) { if (systemHive.getName().toLowerCase().equals("system")) { - String systemFileNameLocal = RAImageIngestModule.getRATempPath(currentCase, "reg") + File.separator + systemHive.getName(); + String systemFileNameLocal = RAImageIngestModule.getRATempPath(currentCase, "reg", ingestJobId) + File.separator + systemHive.getName(); File systemFileNameLocalFile = new File(systemFileNameLocal); if (!systemFileNameLocalFile.exists()) { @@ -1989,7 +1992,7 @@ class ExtractRegistry extends Extract { this.context = context; progressBar.progress(Bundle.Progress_Message_Analyze_Registry()); - analyzeRegistryFiles(); + analyzeRegistryFiles(context.getJobId()); } diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSru.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSru.java index 53b65951f9..50c2c6afd4 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSru.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSru.java @@ -100,7 +100,7 @@ final class ExtractSru extends Extract { dir.mkdirs(); } - String tempDirPath = RAImageIngestModule.getRATempPath(Case.getCurrentCase(), "sru"); //NON-NLS + String tempDirPath = RAImageIngestModule.getRATempPath(Case.getCurrentCase(), "sru", context.getJobId()); //NON-NLS String softwareHiveFileName = getSoftwareHiveFile(dataSource, tempDirPath); if (softwareHiveFileName == null) { diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java index c4a472a350..6dd30ed4cc 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Firefox.java @@ -108,47 +108,52 @@ class Firefox extends Extract { this.dataSource = dataSource; this.context = context; dataFound = false; + long ingestJobId = context.getJobId(); progressBar.progress(Bundle.Progress_Message_Firefox_History()); - this.getHistory(); + this.getHistory(context.getJobId()); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(Bundle.Progress_Message_Firefox_Bookmarks()); - this.getBookmark(); + this.getBookmark(ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(Bundle.Progress_Message_Firefox_Downloads()); - this.getDownload(); + this.getDownload(ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(Bundle.Progress_Message_Firefox_Cookies()); - this.getCookie(); + this.getCookie(ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(Bundle.Progress_Message_Firefox_FormHistory()); - this.getFormsHistory(); + this.getFormsHistory(ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(Bundle.Progress_Message_Firefox_AutoFill()); - this.getAutofillProfiles(); + this.getAutofillProfiles(ingestJobId); } - private void getHistory() { + /** + * Get Firefox history. + * @param ingestJobId The ingest job id. + */ + private void getHistory(long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List historyFiles; try { @@ -180,7 +185,7 @@ class Firefox extends Extract { } String fileName = historyFile.getName(); - String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox") + File.separator + fileName + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox", ingestJobId) + File.separator + fileName + j + ".db"; //NON-NLS try { ContentUtils.writeToFile(historyFile, new File(temps), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { @@ -254,8 +259,9 @@ class Firefox extends Extract { /** * Queries for bookmark files and adds artifacts + * @param ingestJobId The ingest job id. */ - private void getBookmark() { + private void getBookmark(long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List bookmarkFiles; @@ -281,7 +287,7 @@ class Firefox extends Extract { continue; } String fileName = bookmarkFile.getName(); - String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox") + File.separator + fileName + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox", ingestJobId) + File.separator + fileName + j + ".db"; //NON-NLS try { ContentUtils.writeToFile(bookmarkFile, new File(temps), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { @@ -351,8 +357,9 @@ class Firefox extends Extract { /** * Queries for cookies file and adds artifacts + * @param ingestJobId The ingest job id. */ - private void getCookie() { + private void getCookie(long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List cookiesFiles; try { @@ -381,7 +388,7 @@ class Firefox extends Extract { continue; } String fileName = cookiesFile.getName(); - String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox") + File.separator + fileName + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox", ingestJobId) + File.separator + fileName + j + ".db"; //NON-NLS try { ContentUtils.writeToFile(cookiesFile, new File(temps), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { @@ -468,18 +475,20 @@ class Firefox extends Extract { /** * Queries for downloads files and adds artifacts + * @param ingestJobId The ingest job id. */ - private void getDownload() { - getDownloadPreVersion24(); - getDownloadVersion24(); + private void getDownload(long ingestJobId) { + getDownloadPreVersion24(ingestJobId); + getDownloadVersion24(ingestJobId); } /** * Finds downloads artifacts from Firefox data from versions before 24.0. * * Downloads were stored in a separate downloads database. + * @param ingestJobId The ingest job id. */ - private void getDownloadPreVersion24() { + private void getDownloadPreVersion24(long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List downloadsFiles; @@ -505,7 +514,7 @@ class Firefox extends Extract { continue; } String fileName = downloadsFile.getName(); - String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox") + File.separator + fileName + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox", ingestJobId) + File.separator + fileName + j + ".db"; //NON-NLS int errors = 0; try { ContentUtils.writeToFile(downloadsFile, new File(temps), context::dataSourceIngestIsCancelled); @@ -611,8 +620,9 @@ class Firefox extends Extract { * Gets download artifacts from Firefox data from version 24. * * Downloads are stored in the places database. + * @param ingestJobId The ingest job id. */ - private void getDownloadVersion24() { + private void getDownloadVersion24(long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List downloadsFiles; try { @@ -637,7 +647,7 @@ class Firefox extends Extract { continue; } String fileName = downloadsFile.getName(); - String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox") + File.separator + fileName + "-downloads" + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, "firefox", ingestJobId) + File.separator + fileName + "-downloads" + j + ".db"; //NON-NLS int errors = 0; try { ContentUtils.writeToFile(downloadsFile, new File(temps), context::dataSourceIngestIsCancelled); @@ -742,8 +752,9 @@ class Firefox extends Extract { /** * Gets data from formshistory.sqlite database. * Parses and creates artifacts. + * @param ingestJobId The ingest job id. */ - private void getFormsHistory() { + private void getFormsHistory(long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List formHistoryFiles; @@ -777,7 +788,7 @@ class Firefox extends Extract { } String fileName = formHistoryFile.getName(); - String tempFilePath = RAImageIngestModule.getRATempPath(currentCase, "firefox") + File.separator + fileName + j + ".db"; //NON-NLS + String tempFilePath = RAImageIngestModule.getRATempPath(currentCase, "firefox", ingestJobId) + File.separator + fileName + j + ".db"; //NON-NLS try { ContentUtils.writeToFile(formHistoryFile, new File(tempFilePath), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { @@ -864,9 +875,9 @@ class Firefox extends Extract { /** * Gets data from autofill-profiles.json file. * Parses file and makes artifacts. - * + * @param ingestJobId The ingest job id. */ - private void getAutofillProfiles() { + private void getAutofillProfiles(long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List autofillProfilesFiles; try { @@ -891,7 +902,7 @@ class Firefox extends Extract { if (profileFile.getSize() == 0) { continue; } - String temps = RAImageIngestModule.getRATempPath(currentCase, "Firefox") + File.separator + profileFile.getName() + j + ".json"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, "Firefox", ingestJobId) + File.separator + profileFile.getName() + j + ".json"; //NON-NLS try { ContentUtils.writeToFile(profileFile, new File(temps), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java index dc2f9995a2..a98f7a32eb 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java @@ -224,16 +224,17 @@ public final class RAImageIngestModule implements DataSourceIngestModule { /** * Makes a path of the format - * [basePath]/[RECENT_ACTIVITY_FOLDER]/[module]_[timestamp] if it does not + * [basePath]/[RECENT_ACTIVITY_FOLDER]/[module]_[ingest job id] if it does not * already exist and returns the created folder. * * @param basePath The base path (a case-related folder like temp or * output). * @param module The module name to include in the folder name. + * @param ingestJobId The id of the ingest job. * @return The path to the folder. */ - private static String getAndMakeRAPath(String basePath, String module) { - String moduleFolder = String.format("%s_%s", module, TimeStampUtils.createTimeStamp()); + private static String getAndMakeRAPath(String basePath, String module, long ingestJobId) { + String moduleFolder = String.format("%s_%d", module, ingestJobId); Path tmpPath = Paths.get(basePath, RECENT_ACTIVITY_FOLDER, moduleFolder); File dir = tmpPath.toFile(); if (dir.exists() == false) { @@ -252,8 +253,8 @@ public final class RAImageIngestModule implements DataSourceIngestModule { * * @return Path to directory */ - static String getRATempPath(Case a_case, String mod) { - return getAndMakeRAPath(a_case.getTempDirectory(), mod); + static String getRATempPath(Case a_case, String mod, long ingestJobId) { + return getAndMakeRAPath(a_case.getTempDirectory(), mod, ingestJobId); } /** @@ -266,8 +267,8 @@ public final class RAImageIngestModule implements DataSourceIngestModule { * * @return Path to directory */ - static String getRAOutputPath(Case a_case, String mod) { - return getAndMakeRAPath(a_case.getModuleDirectory(), mod); + static String getRAOutputPath(Case a_case, String mod, long ingestJobId) { + return getAndMakeRAPath(a_case.getModuleDirectory(), mod, ingestJobId); } /** @@ -276,8 +277,8 @@ public final class RAImageIngestModule implements DataSourceIngestModule { * @throws NoCurrentCaseException if there is no open case. * @return the relative path of the module output folder */ - static String getRelModuleOutputPath(Case autCase, String mod) { - return Paths.get(getAndMakeRAPath(autCase.getModuleOutputDirectoryRelativePath(), mod)) + static String getRelModuleOutputPath(Case autCase, String mod, long ingestJobId) { + return Paths.get(getAndMakeRAPath(autCase.getModuleOutputDirectoryRelativePath(), mod, ingestJobId)) .normalize() .toString(); } From 9adbe1ffe05d1e27a4b49e35f5e5b743e531a313 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 12 Apr 2021 10:19:04 -0400 Subject: [PATCH 11/21] 7520 fix NPE in objects detected filter panel --- .../autopsy/discovery/ui/ObjectDetectedFilterPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/discovery/ui/ObjectDetectedFilterPanel.java b/Core/src/org/sleuthkit/autopsy/discovery/ui/ObjectDetectedFilterPanel.java index b4a9a0182a..cd50214b84 100644 --- a/Core/src/org/sleuthkit/autopsy/discovery/ui/ObjectDetectedFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/discovery/ui/ObjectDetectedFilterPanel.java @@ -60,7 +60,7 @@ final class ObjectDetectedFilterPanel extends AbstractDiscoveryFilterPanel { objectsList.clearList(); List setNames = DiscoveryUiUtils.getSetNames(BlackboardArtifact.ARTIFACT_TYPE.TSK_OBJECT_DETECTED, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION); for (String name : setNames) { - objectsList.addElement(name, null, null); + objectsList.addElement(name, null, name); } } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Error loading object detected set names", ex); From 28e8bed5f3057ab2e8db9d013e53c04955804fbb Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 12 Apr 2021 11:29:33 -0400 Subject: [PATCH 12/21] other ingest job id changes --- .../recentactivity/ChromeCacheExtractor.java | 10 ++-- .../autopsy/recentactivity/Chromium.java | 55 +++++++++++++------ .../autopsy/recentactivity/Extract.java | 5 +- .../autopsy/recentactivity/ExtractEdge.java | 29 ++++++---- .../autopsy/recentactivity/ExtractIE.java | 28 ++++++---- .../autopsy/recentactivity/ExtractSafari.java | 8 +-- .../recentactivity/RAImageIngestModule.java | 11 +--- 7 files changed, 86 insertions(+), 60 deletions(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java index a2d8409f20..392d19dc12 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java @@ -175,8 +175,8 @@ final class ChromeCacheExtractor { fileManager = currentCase.getServices().getFileManager(); // Create an output folder to save any derived files - absOutputFolderName = RAImageIngestModule.getRAOutputPath(currentCase, moduleName); - relOutputFolderName = RAImageIngestModule.getRelModuleOutputPath(currentCase, moduleName); + absOutputFolderName = RAImageIngestModule.getRAOutputPath(currentCase, moduleName, context.getJobId()); + relOutputFolderName = RAImageIngestModule.getRelModuleOutputPath(currentCase, moduleName, context.getJobId()); File dir = new File(absOutputFolderName); if (dir.exists() == false) { @@ -206,7 +206,7 @@ final class ChromeCacheExtractor { outDir.mkdirs(); } - String cacheTempPath = RAImageIngestModule.getRATempPath(currentCase, moduleName) + cachePath; + String cacheTempPath = RAImageIngestModule.getRATempPath(currentCase, moduleName, context.getJobId()) + cachePath; File tempDir = new File(cacheTempPath); if (tempDir.exists() == false) { tempDir.mkdirs(); @@ -222,7 +222,7 @@ final class ChromeCacheExtractor { private void cleanup () { for (Entry entry : this.fileCopyCache.entrySet()) { - Path tempFilePath = Paths.get(RAImageIngestModule.getRATempPath(currentCase, moduleName), entry.getKey() ); + Path tempFilePath = Paths.get(RAImageIngestModule.getRATempPath(currentCase, moduleName, context.getJobId()), entry.getKey() ); try { entry.getValue().getFileCopy().getChannel().close(); entry.getValue().getFileCopy().close(); @@ -652,7 +652,7 @@ final class ChromeCacheExtractor { // write the file to disk so that we can have a memory-mapped ByteBuffer AbstractFile cacheFile = abstractFileOptional.get(); RandomAccessFile randomAccessFile = null; - String tempFilePathname = RAImageIngestModule.getRATempPath(currentCase, moduleName) + cacheFolderName + cacheFile.getName(); //NON-NLS + String tempFilePathname = RAImageIngestModule.getRATempPath(currentCase, moduleName, context.getJobId()) + cacheFolderName + cacheFile.getName(); //NON-NLS try { File newFile = new File(tempFilePathname); ContentUtils.writeToFile(cacheFile, newFile, context::dataSourceIngestIsCancelled); diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java index 3570f71622..c163ab16ad 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java @@ -130,42 +130,43 @@ class Chromium extends Extract { this.dataSource = dataSource; this.context = context; dataFound = false; + long ingestJobId = context.getJobId(); for (Map.Entry browser : BROWSERS_MAP.entrySet()) { String browserName = browser.getKey(); String browserLocation = browser.getValue(); progressBar.progress(NbBundle.getMessage(this.getClass(), "Progress_Message_Chrome_History", browserName)); - this.getHistory(browser.getKey(), browser.getValue()); + this.getHistory(browser.getKey(), browser.getValue(), ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(NbBundle.getMessage(this.getClass(), "Progress_Message_Chrome_Bookmarks", browserName)); - this.getBookmark(browser.getKey(), browser.getValue()); + this.getBookmark(browser.getKey(), browser.getValue(), ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(NbBundle.getMessage(this.getClass(), "Progress_Message_Chrome_Cookies", browserName)); - this.getCookie(browser.getKey(), browser.getValue()); + this.getCookie(browser.getKey(), browser.getValue(), ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(NbBundle.getMessage(this.getClass(), "Progress_Message_Chrome_Logins", browserName)); - this.getLogins(browser.getKey(), browser.getValue()); + this.getLogins(browser.getKey(), browser.getValue(), ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(NbBundle.getMessage(this.getClass(), "Progress_Message_Chrome_AutoFill", browserName)); - this.getAutofill(browser.getKey(), browser.getValue()); + this.getAutofill(browser.getKey(), browser.getValue(), ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } progressBar.progress(NbBundle.getMessage(this.getClass(), "Progress_Message_Chrome_Downloads", browserName)); - this.getDownload(browser.getKey(), browser.getValue()); + this.getDownload(browser.getKey(), browser.getValue(), ingestJobId); if (context.dataSourceIngestIsCancelled()) { return; } @@ -179,8 +180,11 @@ class Chromium extends Extract { /** * Query for history databases and add artifacts + * @param browser + * @param browserLocation + * @param ingestJobId The ingest job id. */ - private void getHistory(String browser, String browserLocation) { + private void getHistory(String browser, String browserLocation, long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List historyFiles; String historyFileName = HISTORY_FILE_NAME; @@ -215,7 +219,7 @@ class Chromium extends Extract { Collection bbartifacts = new ArrayList<>(); int j = 0; while (j < allocatedHistoryFiles.size()) { - String temps = RAImageIngestModule.getRATempPath(currentCase, browser) + File.separator + allocatedHistoryFiles.get(j).getName() + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, browser, ingestJobId) + File.separator + allocatedHistoryFiles.get(j).getName() + j + ".db"; //NON-NLS final AbstractFile historyFile = allocatedHistoryFiles.get(j++); if ((historyFile.getSize() == 0) || (historyFile.getName().toLowerCase().contains("-slack")) || (historyFile.getName().toLowerCase().contains("cache")) || (historyFile.getName().toLowerCase().contains("media")) @@ -281,8 +285,11 @@ class Chromium extends Extract { /** * Search for bookmark files and make artifacts. + * @param browser + * @param browserLocation + * @param ingestJobId The ingest job id. */ - private void getBookmark(String browser, String browserLocation) { + private void getBookmark(String browser, String browserLocation, long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List bookmarkFiles; String bookmarkFileName = BOOKMARK_FILE_NAME; @@ -315,7 +322,7 @@ class Chromium extends Extract { || (bookmarkFile.getName().toLowerCase().contains("bak")) || (bookmarkFile.getParentPath().toLowerCase().contains("backup"))) { continue; } - String temps = RAImageIngestModule.getRATempPath(currentCase, browser) + File.separator + bookmarkFile.getName() + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, browser, ingestJobId) + File.separator + bookmarkFile.getName() + j + ".db"; //NON-NLS try { ContentUtils.writeToFile(bookmarkFile, new File(temps), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { @@ -423,8 +430,11 @@ class Chromium extends Extract { /** * Queries for cookie files and adds artifacts + * @param browser + * @param browserLocation + * @param ingestJobId The ingest job id. */ - private void getCookie(String browser, String browserLocation) { + private void getCookie(String browser, String browserLocation, long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List cookiesFiles; @@ -456,7 +466,7 @@ class Chromium extends Extract { if ((cookiesFile.getSize() == 0) || (cookiesFile.getName().toLowerCase().contains("-slack"))) { continue; } - String temps = RAImageIngestModule.getRATempPath(currentCase, browser) + File.separator + cookiesFile.getName() + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, browser, ingestJobId) + File.separator + cookiesFile.getName() + j + ".db"; //NON-NLS try { ContentUtils.writeToFile(cookiesFile, new File(temps), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { @@ -519,8 +529,11 @@ class Chromium extends Extract { /** * Queries for download files and adds artifacts + * @param browser + * @param browserLocation + * @param ingestJobId The ingest job id. */ - private void getDownload(String browser, String browserLocation) { + private void getDownload(String browser, String browserLocation, long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List downloadFiles; String historyFileName = HISTORY_FILE_NAME; @@ -551,7 +564,7 @@ class Chromium extends Extract { continue; } - String temps = RAImageIngestModule.getRATempPath(currentCase, browser) + File.separator + downloadFile.getName() + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, browser, ingestJobId) + File.separator + downloadFile.getName() + j + ".db"; //NON-NLS try { ContentUtils.writeToFile(downloadFile, new File(temps), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { @@ -633,8 +646,11 @@ class Chromium extends Extract { /** * Gets user logins from Login Data sqlite database + * @param browser + * @param browserLocation + * @param ingestJobId The ingest job id. */ - private void getLogins(String browser, String browserLocation) { + private void getLogins(String browser, String browserLocation, long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List loginDataFiles; @@ -665,7 +681,7 @@ class Chromium extends Extract { if ((loginDataFile.getSize() == 0) || (loginDataFile.getName().toLowerCase().contains("-slack"))) { continue; } - String temps = RAImageIngestModule.getRATempPath(currentCase, browser) + File.separator + loginDataFile.getName() + j + ".db"; //NON-NLS + String temps = RAImageIngestModule.getRATempPath(currentCase, browser, ingestJobId) + File.separator + loginDataFile.getName() + j + ".db"; //NON-NLS try { ContentUtils.writeToFile(loginDataFile, new File(temps), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { @@ -736,8 +752,11 @@ class Chromium extends Extract { /** * Gets and parses Autofill data from 'Web Data' database, and creates * TSK_WEB_FORM_AUTOFILL, TSK_WEB_FORM_ADDRESS artifacts + * @param browser + * @param browserLocation + * @param ingestJobId The ingest job id. */ - private void getAutofill(String browser, String browserLocation) { + private void getAutofill(String browser, String browserLocation, long ingestJobId) { FileManager fileManager = currentCase.getServices().getFileManager(); List webDataFiles; @@ -768,7 +787,7 @@ class Chromium extends Extract { if ((webDataFile.getSize() == 0) || (webDataFile.getName().toLowerCase().contains("-slack"))) { continue; } - String tempFilePath = RAImageIngestModule.getRATempPath(currentCase, browser) + File.separator + webDataFile.getName() + j + ".db"; //NON-NLS + String tempFilePath = RAImageIngestModule.getRATempPath(currentCase, browser, ingestJobId) + File.separator + webDataFile.getName() + j + ".db"; //NON-NLS try { ContentUtils.writeToFile(webDataFile, new File(tempFilePath), context::dataSourceIngestIsCancelled); } catch (ReadContentInputStreamException ex) { diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java index c2abe0223d..5945712018 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Extract.java @@ -520,12 +520,13 @@ abstract class Extract { * * @param context * @param file + * @param IngestJobId The ingest job id. * @return Newly created copy of the AbstractFile * @throws IOException */ - protected File createTemporaryFile(IngestJobContext context, AbstractFile file) throws IOException{ + protected File createTemporaryFile(IngestJobContext context, AbstractFile file, long ingestJobId) throws IOException{ Path tempFilePath = Paths.get(RAImageIngestModule.getRATempPath( - getCurrentCase(), getName()), file.getName() + file.getId() + file.getNameExtension()); + getCurrentCase(), getName(), ingestJobId), file.getName() + file.getId() + file.getNameExtension()); java.io.File tempFile = tempFilePath.toFile(); try { diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractEdge.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractEdge.java index 3187955c10..68f280a5fa 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractEdge.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractEdge.java @@ -64,7 +64,6 @@ import org.sleuthkit.datamodel.TskCoreException; final class ExtractEdge extends Extract { private static final Logger LOG = Logger.getLogger(ExtractEdge.class.getName()); - private final Path moduleTempResultPath; private Content dataSource; private IngestJobContext context; private HashMap> containersTable; @@ -125,9 +124,8 @@ final class ExtractEdge extends Extract { /** * Extract the bookmarks, cookies, downloads and history from Microsoft Edge */ - ExtractEdge() throws NoCurrentCaseException { + ExtractEdge() { super(Bundle.ExtractEdge_Module_Name()); - moduleTempResultPath = Paths.get(RAImageIngestModule.getRATempPath(Case.getCurrentCaseThrows(), EDGE), EDGE_RESULT_FOLDER_NAME); } @Override @@ -137,6 +135,9 @@ final class ExtractEdge extends Extract { @Override void process(Content dataSource, IngestJobContext context, DataSourceIngestModuleProgress progressBar) { + String moduleTempDir = RAImageIngestModule.getRATempPath(getCurrentCase(), EDGE, context.getJobId()); + String moduleTempResultDir = Paths.get(moduleTempDir, EDGE_RESULT_FOLDER_NAME).toString(); + this.dataSource = dataSource; this.context = context; this.setFoundData(false); @@ -186,7 +187,7 @@ final class ExtractEdge extends Extract { } try { - this.processWebCacheDbFile(esedumper, webCacheFiles, progressBar); + this.processWebCacheDbFile(esedumper, webCacheFiles, progressBar, moduleTempDir, moduleTempResultDir); } catch (IOException | TskCoreException ex) { LOG.log(Level.SEVERE, "Error processing 'WebCacheV01.dat' files for Microsoft Edge", ex); // NON-NLS this.addErrorMessage(Bundle.ExtractEdge_process_errMsg_webcacheFail()); @@ -194,7 +195,7 @@ final class ExtractEdge extends Extract { progressBar.progress(Bundle.Progress_Message_Edge_Bookmarks()); try { - this.processSpartanDbFile(esedumper, spartanFiles); + this.processSpartanDbFile(esedumper, spartanFiles, moduleTempDir, moduleTempResultDir); } catch (IOException | TskCoreException ex) { LOG.log(Level.SEVERE, "Error processing 'spartan.edb' files for Microsoft Edge", ex); // NON-NLS this.addErrorMessage(Bundle.ExtractEdge_process_errMsg_spartanFail()); @@ -207,10 +208,13 @@ final class ExtractEdge extends Extract { * * @param eseDumperPath Path to ESEDatabaseView.exe * @param webCacheFiles List of case WebCacheV01.dat files + * @param moduleTempDir The temp directory for this module. + * @param moduleTempResultDir The temp results directory for this module. * @throws IOException * @throws TskCoreException */ - void processWebCacheDbFile(String eseDumperPath, List webCacheFiles, DataSourceIngestModuleProgress progressBar) throws IOException, TskCoreException { + void processWebCacheDbFile(String eseDumperPath, List webCacheFiles, DataSourceIngestModuleProgress progressBar, + String moduleTempDir, String moduleTempResultDir) throws IOException, TskCoreException { for (AbstractFile webCacheFile : webCacheFiles) { @@ -223,7 +227,7 @@ final class ExtractEdge extends Extract { //Run the dumper String tempWebCacheFileName = EDGE_WEBCACHE_PREFIX + Integer.toString((int) webCacheFile.getId()) + EDGE_WEBCACHE_EXT; //NON-NLS - File tempWebCacheFile = new File(RAImageIngestModule.getRATempPath(currentCase, EDGE), tempWebCacheFileName); + File tempWebCacheFile = new File(moduleTempDir, tempWebCacheFileName); try { ContentUtils.writeToFile(webCacheFile, tempWebCacheFile, @@ -232,7 +236,7 @@ final class ExtractEdge extends Extract { throw new IOException("Error writingToFile: " + webCacheFile, ex); //NON-NLS } - File resultsDir = new File(moduleTempResultPath.toAbsolutePath() + Integer.toString((int) webCacheFile.getId())); + File resultsDir = new File(moduleTempDir, Integer.toString((int) webCacheFile.getId())); resultsDir.mkdirs(); try { executeDumper(eseDumperPath, tempWebCacheFile.getAbsolutePath(), @@ -267,10 +271,13 @@ final class ExtractEdge extends Extract { * * @param eseDumperPath Path to ESEDatabaseViewer * @param spartanFiles List of the case spartan.edb files + * @param moduleTempDir The temp directory for this module. + * @param moduleTempResultDir The temp results directory for this module. * @throws IOException * @throws TskCoreException */ - void processSpartanDbFile(String eseDumperPath, List spartanFiles) throws IOException, TskCoreException { + void processSpartanDbFile(String eseDumperPath, List spartanFiles, + String moduleTempDir, String moduleTempResultDir) throws IOException, TskCoreException { for (AbstractFile spartanFile : spartanFiles) { @@ -281,7 +288,7 @@ final class ExtractEdge extends Extract { //Run the dumper String tempSpartanFileName = EDGE_WEBCACHE_PREFIX + Integer.toString((int) spartanFile.getId()) + EDGE_WEBCACHE_EXT; - File tempSpartanFile = new File(RAImageIngestModule.getRATempPath(currentCase, EDGE), tempSpartanFileName); + File tempSpartanFile = new File(moduleTempDir, tempSpartanFileName); try { ContentUtils.writeToFile(spartanFile, tempSpartanFile, @@ -290,7 +297,7 @@ final class ExtractEdge extends Extract { throw new IOException("Error writingToFile: " + spartanFile, ex); //NON-NLS } - File resultsDir = new File(moduleTempResultPath.toAbsolutePath() + Integer.toString((int) spartanFile.getId())); + File resultsDir = new File(moduleTempResultDir, Integer.toString((int) spartanFile.getId())); resultsDir.mkdirs(); try { executeDumper(eseDumperPath, tempSpartanFile.getAbsolutePath(), diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java index 58f4672118..a28db7fbcc 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java @@ -31,6 +31,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; +import java.nio.file.Paths; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -43,7 +44,6 @@ import java.util.stream.Collectors; import org.openide.modules.InstalledFileLocator; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.casemodule.services.FileManager; import org.sleuthkit.autopsy.datamodel.ContentUtils; import org.sleuthkit.datamodel.BlackboardArtifact; @@ -67,7 +67,7 @@ import org.sleuthkit.datamodel.TskCoreException; class ExtractIE extends Extract { private static final Logger logger = Logger.getLogger(ExtractIE.class.getName()); - private final String moduleTempResultsDir; + //private String moduleTempResultsDir; private String PASCO_LIB_PATH; private final String JAVA_PATH; private static final String RESOURCE_URL_PREFIX = "res://"; @@ -84,14 +84,16 @@ class ExtractIE extends Extract { "Progress_Message_IE_AutoFill=IE Auto Fill", "Progress_Message_IE_Logins=IE Logins",}) - ExtractIE() throws NoCurrentCaseException { + ExtractIE() { super(NbBundle.getMessage(ExtractIE.class, "ExtractIE.moduleName.text")); - moduleTempResultsDir = RAImageIngestModule.getRATempPath(Case.getCurrentCaseThrows(), "IE") + File.separator + "results"; //NON-NLS JAVA_PATH = PlatformUtil.getJavaPath(); } @Override public void process(Content dataSource, IngestJobContext context, DataSourceIngestModuleProgress progressBar) { + String moduleTempDir = RAImageIngestModule.getRATempPath(getCurrentCase(), "IE", context.getJobId()); + String moduleTempResultsDir = Paths.get(moduleTempDir, "results").toString(); + this.dataSource = dataSource; this.context = context; dataFound = false; @@ -111,7 +113,7 @@ class ExtractIE extends Extract { } progressBar.progress(Bundle.Progress_Message_IE_History()); - this.getHistory(); + this.getHistory(moduleTempDir, moduleTempResultsDir); } /** @@ -297,8 +299,10 @@ class ExtractIE extends Extract { /** * Locates index.dat files, runs Pasco on them, and creates artifacts. + * @param moduleTempDir The path to the module temp directory. + * @param moduleTempResultsDir The path to the module temp results directory. */ - private void getHistory() { + private void getHistory(String moduleTempDir, String moduleTempResultsDir) { logger.log(Level.INFO, "Pasco results path: {0}", moduleTempResultsDir); //NON-NLS boolean foundHistory = false; @@ -350,7 +354,7 @@ class ExtractIE extends Extract { //BlackboardArtifact bbart = fsc.newArtifact(ARTIFACT_TYPE.TSK_WEB_HISTORY); indexFileName = "index" + Integer.toString((int) indexFile.getId()) + ".dat"; //NON-NLS //indexFileName = "index" + Long.toString(bbart.getArtifactID()) + ".dat"; - temps = RAImageIngestModule.getRATempPath(currentCase, "IE") + File.separator + indexFileName; //NON-NLS + temps = moduleTempDir + File.separator + indexFileName; //NON-NLS File datFile = new File(temps); if (context.dataSourceIngestIsCancelled()) { break; @@ -366,7 +370,7 @@ class ExtractIE extends Extract { } String filename = "pasco2Result." + indexFile.getId() + ".txt"; //NON-NLS - boolean bPascProcSuccess = executePasco(temps, filename); + boolean bPascProcSuccess = executePasco(temps, filename, moduleTempResultsDir); if (context.dataSourceIngestIsCancelled()) { return; } @@ -375,7 +379,7 @@ class ExtractIE extends Extract { //Now fetch the results, parse them and the delete the files. if (bPascProcSuccess) { // Don't add TSK_OS_ACCOUNT artifacts to the ModuleDataEvent - bbartifacts.addAll(parsePascoOutput(indexFile, filename).stream() + bbartifacts.addAll(parsePascoOutput(indexFile, filename, moduleTempResultsDir).stream() .filter(bbart -> bbart.getArtifactTypeID() == ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()) .collect(Collectors.toList())); if (context.dataSourceIngestIsCancelled()) { @@ -402,6 +406,7 @@ class ExtractIE extends Extract { * * @param indexFilePath Path to local index.dat file to analyze * @param outputFileName Name of file to save output to + * @param moduleTempResultsDir the path to the module temp directory. * * @return false on error */ @@ -409,7 +414,7 @@ class ExtractIE extends Extract { "# {0} - sub module name", "ExtractIE_executePasco_errMsg_errorRunningPasco={0}: Error analyzing Internet Explorer web history", }) - private boolean executePasco(String indexFilePath, String outputFileName) { + private boolean executePasco(String indexFilePath, String outputFileName, String moduleTempResultsDir) { boolean success = true; try { final String outputFileFullPath = moduleTempResultsDir + File.separator + outputFileName; @@ -451,10 +456,11 @@ class ExtractIE extends Extract { * @param origFile Original index.dat file that was analyzed to * get this output * @param pascoOutputFileName name of pasco output file + * @param moduleTempResultsDir the path to the module temp directory. * * @return A collection of created artifacts */ - private Collection parsePascoOutput(AbstractFile origFile, String pascoOutputFileName) { + private Collection parsePascoOutput(AbstractFile origFile, String pascoOutputFileName, String moduleTempResultsDir) { Collection bbartifacts = new ArrayList<>(); String fnAbs = moduleTempResultsDir + File.separator + pascoOutputFileName; diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSafari.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSafari.java index 15575ab61d..2bf0351542 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSafari.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractSafari.java @@ -289,7 +289,7 @@ final class ExtractSafari extends Extract { return; } - File tempHistoryFile = createTemporaryFile(context, historyFile); + File tempHistoryFile = createTemporaryFile(context, historyFile, context.getJobId()); try { ContentUtils.writeToFile(historyFile, tempHistoryFile, context::dataSourceIngestIsCancelled); @@ -324,7 +324,7 @@ final class ExtractSafari extends Extract { return; } - File tempFile = createTemporaryFile(context, file); + File tempFile = createTemporaryFile(context, file, context.getJobId()); try { if(!context.dataSourceIngestIsCancelled()) { @@ -354,7 +354,7 @@ final class ExtractSafari extends Extract { return; } - File tempFile = createTemporaryFile(context, file); + File tempFile = createTemporaryFile(context, file, context.getJobId()); try { if(!context.dataSourceIngestIsCancelled()) { @@ -385,7 +385,7 @@ final class ExtractSafari extends Extract { File tempFile = null; try { - tempFile = createTemporaryFile(context, file); + tempFile = createTemporaryFile(context, file, context.getJobId()); if(!context.dataSourceIngestIsCancelled()) { postArtifacts(getCookieArtifacts(file, tempFile, context)); diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java index a98f7a32eb..a18ced587e 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RAImageIngestModule.java @@ -68,15 +68,8 @@ public final class RAImageIngestModule implements DataSourceIngestModule { tskCase = Case.getCurrentCase().getSleuthkitCase(); - Extract iexplore; - Extract edge; - try { - iexplore = new ExtractIE(); - edge = new ExtractEdge(); - } catch (NoCurrentCaseException ex) { - throw new IngestModuleException(ex.getMessage(), ex); - } - + Extract iexplore = new ExtractIE(); + Extract edge = new ExtractEdge(); Extract registry = new ExtractRegistry(); Extract recentDocuments = new RecentDocumentsByLnk(); Extract chrome = new Chromium(); From 425158b5826800aaf43b26ff80801e6fa9bcf423 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Mon, 12 Apr 2021 11:40:21 -0400 Subject: [PATCH 13/21] minor bug fixes --- .../sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java | 2 +- .../src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java index 392d19dc12..7d41888121 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ChromeCacheExtractor.java @@ -176,7 +176,7 @@ final class ChromeCacheExtractor { // Create an output folder to save any derived files absOutputFolderName = RAImageIngestModule.getRAOutputPath(currentCase, moduleName, context.getJobId()); - relOutputFolderName = RAImageIngestModule.getRelModuleOutputPath(currentCase, moduleName, context.getJobId()); + relOutputFolderName = Paths.get(RAImageIngestModule.getRelModuleOutputPath(currentCase, moduleName, context.getJobId())).normalize().toString(); File dir = new File(absOutputFolderName); if (dir.exists() == false) { diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java index a28db7fbcc..29754fcdcb 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractIE.java @@ -67,7 +67,6 @@ import org.sleuthkit.datamodel.TskCoreException; class ExtractIE extends Extract { private static final Logger logger = Logger.getLogger(ExtractIE.class.getName()); - //private String moduleTempResultsDir; private String PASCO_LIB_PATH; private final String JAVA_PATH; private static final String RESOURCE_URL_PREFIX = "res://"; From 6eeaffbec80019aac959abc32d8daa265b2de29e Mon Sep 17 00:00:00 2001 From: apriestman Date: Mon, 12 Apr 2021 14:23:10 -0400 Subject: [PATCH 14/21] Fix doxygen comments --- .../sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java index edbef370b2..56ff4a0993 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/AutopsyOptionsPanel.java @@ -301,7 +301,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { /** - * Values for configuration located in the /etc/*.conf file. + * Values for configuration located in the /etc/\*.conf file. */ private static class ConfValues { private final String XmxVal; @@ -335,7 +335,7 @@ final class AutopsyOptionsPanel extends javax.swing.JPanel { } /** - * Retrieve the /etc/*.conf file values pertinent to settings. + * Retrieve the /etc/\*.conf file values pertinent to settings. * @return The conf file values. * @throws IOException */ From bfd7701d11ba720a689604d850ab3f898f72d0da Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Mon, 12 Apr 2021 18:58:21 -0400 Subject: [PATCH 15/21] 7471 adjust messages and add pop up on start up if unable to open case --- .../autopsy/apputils/Bundle.properties-MERGED | 2 +- .../autopsy/apputils/ResetWindowsAction.java | 4 ++-- .../casemodule/Bundle.properties-MERGED | 6 +++++ .../casemodule/StartupWindowProvider.java | 22 ++++++++++++++++--- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED index dd9fc3b03e..de7c28c948 100644 --- a/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/apputils/Bundle.properties-MERGED @@ -1,4 +1,4 @@ CTL_ResetWindowsAction=Reset Windows ResetWindowAction.caseCloseFailure.text=Unable to close the current case, the software will restart and the windows locations will reset the next time the software is closed. ResetWindowAction.caseSaveMetadata.text=Unable to save current case path, the software will restart and the windows locations will reset but the current case will not be opened upon restart. -ResetWindowAction.confirm.text=In order to perform the resetting of window locations the software will close and restart. If a case is currently open it will be closed. If ingest or a search is currently running it will be terminated. Are you sure you want to restart the software to reset all window locations? +ResetWindowAction.confirm.text=In order to perform the resetting of window locations the software will close and restart. If a case is currently open, it will be closed. If ingest or a search is currently running, it will be terminated. Are you sure you want to restart the software to reset all window locations? diff --git a/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java b/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java index faab218a59..c5298bc64e 100644 --- a/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java +++ b/Core/src/org/sleuthkit/autopsy/apputils/ResetWindowsAction.java @@ -61,7 +61,7 @@ public final class ResetWindowsAction extends CallableSystemAction { } @NbBundle.Messages({"ResetWindowAction.confirm.text=In order to perform the resetting of window locations the software will close and restart. " - + "If a case is currently open it will be closed. If ingest or a search is currently running it will be terminated. " + + "If a case is currently open, it will be closed. If ingest or a search is currently running, it will be terminated. " + "Are you sure you want to restart the software to reset all window locations?", "ResetWindowAction.caseCloseFailure.text=Unable to close the current case, " + "the software will restart and the windows locations will reset the next time the software is closed.", @@ -90,7 +90,7 @@ public final class ResetWindowsAction extends CallableSystemAction { if (Case.isCaseOpen()) { String caseMetadataFilePath = Case.getCurrentCase().getMetadata().getFilePath().toString(); File caseToOpenFile = new File(ResetWindowsAction.getCaseToReopenFilePath()); - Charset encoding = null; + Charset encoding = null; //prevents writeStringToFile from having ambiguous arguments FileUtils.writeStringToFile(caseToOpenFile, caseMetadataFilePath, encoding); Case.closeCurrentCase(); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED index f731913af5..1a5bb3d251 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED @@ -346,6 +346,12 @@ RecentCases.getName.text=Clear Recent Cases RecentItems.openRecentCase.msgDlg.text=Case {0} no longer exists. SelectDataSourceProcessorPanel.name.text=Select Data Source Type StartupWindow.title.text=Welcome +# {0} - autFilePath +StartupWindowProvider.openCase.cantOpen=Unable to open previously open case with metadata file: {0} +# {0} - reOpenFilePath +StartupWindowProvider.openCase.deleteOpenFailure=Unable to open or delete file containing path {0} to previously open case. The previous case will not be opened. +# {0} - autFilePath +StartupWindowProvider.openCase.noFile=Unable to open previously open case because metadata file not found at: {0} UnpackagePortableCaseDialog.title.text=Unpackage Portable Case UnpackagePortableCaseDialog.UnpackagePortableCaseDialog.extensions=Portable case package (.zip, .zip.001) UnpackagePortableCaseDialog.validatePaths.badExtension=File extension must be .zip or .zip.001 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java index bb624254ff..4d8c5ac538 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.logging.Level; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.apputils.ResetWindowsAction; @@ -65,6 +66,13 @@ public class StartupWindowProvider implements StartupWindowInterface { return instance; } + @NbBundle.Messages({ + "# {0} - autFilePath", + "StartupWindowProvider.openCase.noFile=Unable to open previously open case because metadata file not found at: {0}", + "# {0} - reOpenFilePath", + "StartupWindowProvider.openCase.deleteOpenFailure=Unable to open or delete file containing path {0} to previously open case. The previous case will not be opened.", + "# {0} - autFilePath", + "StartupWindowProvider.openCase.cantOpen=Unable to open previously open case with metadata file: {0}"}) private void init() { if (startupWindowToUse == null) { // first check whether we are running from command line @@ -90,7 +98,9 @@ public class StartupWindowProvider implements StartupWindowInterface { File openPreviousCaseFile = new File(ResetWindowsAction.getCaseToReopenFilePath()); String caseFilePath = ""; + if (openPreviousCaseFile.exists()) { + String unableToOpenMessage = null; try { Charset encoding = null; caseFilePath = FileUtils.readFileToString(openPreviousCaseFile, encoding); @@ -100,12 +110,18 @@ public class StartupWindowProvider implements StartupWindowInterface { //the case is now open we do not want to display the start up windows return; } else { - logger.log(Level.WARNING, "Unable to open previously open case because metadata file not found at: {0}", caseFilePath); + unableToOpenMessage = Bundle.StartupWindowProvider_openCase_noFile(caseFilePath); + logger.log(Level.WARNING, unableToOpenMessage); } } catch (IOException ex) { - logger.log(Level.WARNING, "Unable to open or delete file containing path " + ResetWindowsAction.getCaseToReopenFilePath() + " to previously open case, will not open previous case.", ex); + unableToOpenMessage = Bundle.StartupWindowProvider_openCase_deleteOpenFailure(ResetWindowsAction.getCaseToReopenFilePath()); + logger.log(Level.WARNING, unableToOpenMessage, ex); } catch (CaseActionException ex) { - logger.log(Level.WARNING, "Unable to open previously open case with metadata file: " + caseFilePath, ex); + unableToOpenMessage = Bundle.StartupWindowProvider_openCase_cantOpen(caseFilePath); + logger.log(Level.WARNING, unableToOpenMessage, ex); + } + if (RuntimeProperties.runningWithGUI() && !StringUtils.isBlank(unableToOpenMessage)) { + MessageNotifyUtil.Message.warn(unableToOpenMessage); } } //discover the registered windows From 8e0570abd295c162da0bd3fcec6c851182b17377 Mon Sep 17 00:00:00 2001 From: apriestman Date: Tue, 13 Apr 2021 08:21:54 -0400 Subject: [PATCH 16/21] Add UnsupportedContentNode --- .../datamodel/Bundle.properties-MERGED | 4 + .../autopsy/datamodel/ContentNodeVisitor.java | 7 + .../datamodel/CreateSleuthkitNodeVisitor.java | 6 + .../datamodel/DisplayableItemNodeVisitor.java | 10 + .../datamodel/UnsupportedContentNode.java | 186 ++++++++++++++++++ .../directorytree/Bundle.properties-MERGED | 1 + .../directorytree/DataResultFilterNode.java | 1 - .../directorytree/ViewContextAction.java | 11 +- 8 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/UnsupportedContentNode.java diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED index 6d7a1dc7ff..d2a7f32bf7 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED @@ -376,6 +376,10 @@ TagNode.propertySheet.origNameDisplayName=Original Name TagsNode.displayName.text=Tags TagsNode.createSheet.name.name=Name TagsNode.createSheet.name.displayName=Name +UnsupportedContentNode.createSheet.name.desc=no description +UnsupportedContentNode.createSheet.name.displayName=Name +UnsupportedContentNode.createSheet.name.name=Name +UnsupportedContentNode.displayName=Unsupported Content ViewsNode.name.text=Views ViewsNode.createSheet.name.name=Name ViewsNode.createSheet.name.displayName=Name diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java index af7eb3a249..69ab1bcec6 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java @@ -50,6 +50,8 @@ interface ContentNodeVisitor { T visit(BlackboardArtifactNode bban); + T visit(UnsupportedContentNode ucn); + /** * Visitor with an implementable default behavior for all types. Override @@ -122,5 +124,10 @@ interface ContentNodeVisitor { public T visit(BlackboardArtifactNode bban) { return defaultVisit(bban); } + + @Override + public T visit(UnsupportedContentNode ucn) { + return defaultVisit(ucn); + } } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/CreateSleuthkitNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/CreateSleuthkitNodeVisitor.java index b5d808153d..7601f4a88c 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/CreateSleuthkitNodeVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/CreateSleuthkitNodeVisitor.java @@ -32,6 +32,7 @@ import org.sleuthkit.datamodel.Pool; import org.sleuthkit.datamodel.SlackFile; import org.sleuthkit.datamodel.SleuthkitItemVisitor; import org.sleuthkit.datamodel.SleuthkitVisitableItem; +import org.sleuthkit.datamodel.UnsupportedContent; import org.sleuthkit.datamodel.VirtualDirectory; import org.sleuthkit.datamodel.Volume; @@ -99,6 +100,11 @@ public class CreateSleuthkitNodeVisitor extends SleuthkitItemVisitor.Default visit(BlackboardArtifact art) { return new BlackboardArtifactNode(art); } + + @Override + public AbstractContentNode visit(UnsupportedContent uc) { + return new UnsupportedContentNode(uc); + } @Override protected AbstractContentNode defaultVisit(SleuthkitVisitableItem di) { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java index fa87c8df2e..61bc401ee5 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java @@ -202,6 +202,11 @@ public interface DisplayableItemNodeVisitor { T visit(HostNode node); T visit(DataSourcesByTypeNode node); + + /* + * Unsupported node + */ + T visit(UnsupportedContentNode ucn); /** * Visitor with an implementable default behavior for all types. Override @@ -574,5 +579,10 @@ public interface DisplayableItemNodeVisitor { public T visit(PersonGroupingNode node) { return defaultVisit(node); } + + @Override + public T visit(UnsupportedContentNode node) { + return defaultVisit(node); + } } } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/UnsupportedContentNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/UnsupportedContentNode.java new file mode 100644 index 0000000000..4d8a3473e6 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/datamodel/UnsupportedContentNode.java @@ -0,0 +1,186 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2021 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.datamodel; + +import java.util.ArrayList; +import java.util.List; +import javax.swing.Action; +import org.apache.commons.lang3.tuple.Pair; +import org.openide.nodes.Sheet; +import org.openide.util.NbBundle; +import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; +import org.sleuthkit.autopsy.corecomponents.DataResultViewerTable; +import static org.sleuthkit.autopsy.datamodel.AbstractContentNode.NO_DESCR; +import org.sleuthkit.datamodel.UnsupportedContent; +import org.sleuthkit.datamodel.Tag; + +/** + * This class is used to represent the "Node" for an unsupported content object. + */ +public class UnsupportedContentNode extends AbstractContentNode { + + /** + * + * @param unsupportedContent underlying Content instance + */ + @NbBundle.Messages({ + "UnsupportedContentNode.displayName=Unsupported Content", + }) + public UnsupportedContentNode(UnsupportedContent unsupportedContent) { + super(unsupportedContent); + + // set name, display name, and icon + this.setDisplayName(Bundle.UnsupportedContentNode_displayName()); + + this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/file-icon.png"); //NON-NLS + } + + /** + * Right click action for UnsupportedContentNode node + * + * @param popup + * + * @return + */ + @Override + public Action[] getActions(boolean popup) { + List actionsList = new ArrayList<>(); + + for (Action a : super.getActions(true)) { + actionsList.add(a); + } + + return actionsList.toArray(new Action[actionsList.size()]); + + } + + @NbBundle.Messages({ + "UnsupportedContentNode.createSheet.name.name=Name", + "UnsupportedContentNode.createSheet.name.displayName=Name", + "UnsupportedContentNode.createSheet.name.desc=no description", + }) + @Override + protected Sheet createSheet() { + Sheet sheet = super.createSheet(); + Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES); + if (sheetSet == null) { + sheetSet = Sheet.createPropertiesSet(); + sheet.put(sheetSet); + } + + sheetSet.put(new NodeProperty<>(Bundle.UnsupportedContentNode_createSheet_name_name(), + Bundle.UnsupportedContentNode_createSheet_name_displayName(), + Bundle.UnsupportedContentNode_createSheet_name_desc(), + this.getDisplayName())); + + return sheet; + } + + @Override + public T accept(ContentNodeVisitor visitor) { + return visitor.visit(this); + } + + @Override + public boolean isLeafTypeNode() { + return false; + } + + @Override + public T accept(DisplayableItemNodeVisitor visitor) { + return visitor.visit(this); + } + + @Override + public String getItemType() { + return getClass().getName(); + } + + /** + * Reads and returns a list of all tags associated with this content node. + * + * Null implementation of an abstract method. + * + * @return list of tags associated with the node. + */ + @Override + protected List getAllTagsFromDatabase() { + return new ArrayList<>(); + } + + /** + * Returns correlation attribute instance for the underlying content of the + * node. + * + * Null implementation of an abstract method. + * + * @return correlation attribute instance for the underlying content of the + * node. + */ + @Override + protected CorrelationAttributeInstance getCorrelationAttributeInstance() { + return null; + } + + /** + * Returns Score property for the node. + * + * Null implementation of an abstract method. + * + * @param tags list of tags. + * + * @return Score property for the underlying content of the node. + */ + @Override + protected Pair getScorePropertyAndDescription(List tags) { + return Pair.of(DataResultViewerTable.Score.NO_SCORE, NO_DESCR); + } + + /** + * Returns comment property for the node. + * + * Null implementation of an abstract method. + * + * @param tags list of tags + * @param attribute correlation attribute instance + * + * @return Comment property for the underlying content of the node. + */ + @Override + protected DataResultViewerTable.HasCommentStatus getCommentProperty(List tags, CorrelationAttributeInstance attribute) { + return DataResultViewerTable.HasCommentStatus.NO_COMMENT; + } + + /** + * Returns occurrences/count property for the node. + * + * Null implementation of an abstract method. + * + * @param attributeType the type of the attribute to count + * @param attributeValue the value of the attribute to coun + * @param defaultDescription a description to use when none is determined by + * the getCountPropertyAndDescription method + * + * @return count property for the underlying content of the node. + */ + @Override + protected Pair getCountPropertyAndDescription(CorrelationAttributeInstance.Type attributeType, String attributeValue, String defaultDescription) { + return Pair.of(-1L, NO_DESCR); + } +} diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED index c648387016..0ab883cbd4 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED @@ -59,6 +59,7 @@ SelectionContext.views=Views ViewContextAction.errorMessage.cannotFindDirectory=Failed to locate directory. ViewContextAction.errorMessage.cannotFindNode=Failed to locate data source node in tree. ViewContextAction.errorMessage.cannotSelectDirectory=Failed to select directory in tree. +ViewContextAction.errorMessage.unsupportedParent=Unable to navigate to content not supported in this release. VolumeDetailsPanel.volumeIDLabel.text=Volume ID: VolumeDetailsPanel.volumeIDValue.text=... VolumeDetailsPanel.startValue.text=... diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java index a412bb5970..bf99de6183 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java @@ -304,7 +304,6 @@ public class DataResultFilterNode extends FilterNode { NbBundle.getMessage(this.getClass(), "DataResultFilterNode.action.viewFileInDir.text"), c)); } // action to go to the source file of the artifact - // action to go to the source file of the artifact Content fileContent = ban.getLookup().lookup(AbstractFile.class); if (fileContent == null) { Content content = ban.getLookup().lookup(Content.class); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java index ca9aa43198..6fb134ceec 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java @@ -63,6 +63,7 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; import org.sleuthkit.datamodel.TskDataException; +import org.sleuthkit.datamodel.UnsupportedContent; import org.sleuthkit.datamodel.VolumeSystem; /** @@ -161,7 +162,8 @@ public class ViewContextAction extends AbstractAction { @Messages({ "ViewContextAction.errorMessage.cannotFindDirectory=Failed to locate directory.", "ViewContextAction.errorMessage.cannotSelectDirectory=Failed to select directory in tree.", - "ViewContextAction.errorMessage.cannotFindNode=Failed to locate data source node in tree." + "ViewContextAction.errorMessage.cannotFindNode=Failed to locate data source node in tree.", + "ViewContextAction.errorMessage.unsupportedParent=Unable to navigate to content not supported in this release." }) public void actionPerformed(ActionEvent event) { EventQueue.invokeLater(() -> { @@ -181,6 +183,13 @@ public class ViewContextAction extends AbstractAction { logger.log(Level.SEVERE, String.format("Could not get parent of Content object: %s", content), ex); //NON-NLS return; } + + if ((parentContent != null) + && (parentContent instanceof UnsupportedContent)) { + MessageNotifyUtil.Message.error(Bundle.ViewContextAction_errorMessage_unsupportedParent()); + logger.log(Level.WARNING, String.format("Could not navigate to unsupported content with id: %d", parentContent.getId())); //NON-NLS + return; + } /* * Get the "Data Sources" node from the tree view. From 30485239c23b8cc096d55c3d6798921cea7deeab Mon Sep 17 00:00:00 2001 From: apriestman Date: Tue, 13 Apr 2021 11:10:10 -0400 Subject: [PATCH 17/21] Revert bundles --- .../casemodule/Bundle.properties-MERGED | 25 +- .../Bundle.properties-MERGED | 5 +- .../contentviewers/Bundle.properties-MERGED | 1337 +++++++++-------- .../autopsy/core/Bundle.properties-MERGED | 8 +- .../corecomponents/Bundle.properties-MERGED | 6 +- .../coreutils/Bundle.properties-MERGED | 4 +- .../datamodel/Bundle.properties-MERGED | 12 +- .../directorytree/Bundle.properties-MERGED | 1 - .../filesearch/Bundle.properties-MERGED | 4 +- .../autopsy/ingest/Bundle.properties-MERGED | 6 +- .../Bundle.properties-MERGED | 7 +- .../fileextmismatch/Bundle.properties-MERGED | 18 +- .../hashdatabase/Bundle.properties-MERGED | 10 +- .../interestingitems/Bundle.properties-MERGED | 4 +- .../leappanalyzers/Bundle.properties-MERGED | 4 - .../photoreccarver/Bundle.properties-MERGED | 2 +- .../modules/html/Bundle.properties-MERGED | 6 +- .../recentactivity/Bundle.properties-MERGED | 1 - 18 files changed, 769 insertions(+), 691 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED index 72899aead8..f731913af5 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED @@ -248,10 +248,15 @@ AddImageWizardIngestConfigPanel.dsProcDone.errs.text=*Errors encountered in addi AddImageWizardIngestConfigVisual.getName.text=Configure Ingest AddImageWizardIterator.stepXofN=Step {0} of {1} AddLocalFilesTask.localFileAdd.progress.text=Adding: {0}/{1} -Case.getCurCase.exception.noneOpen=Cannot get the current case; there is no case open! +Case.getCurCase.exception.noneOpen=Cannot get the current case; there is no case open\! Case.open.msgDlg.updated.msg=Updated case database schema.\nA backup copy of the database with the following path has been made:\n {0} Case.open.msgDlg.updated.title=Case Database Schema Update -Case.checkImgExist.confDlg.doesntExist.msg=One of the images associated with \nthis case are missing. Would you like to search for them now?\nPreviously, the image was located at:\n{0}\nPlease note that you will still be able to browse directories and generate reports\nif you choose No, but you will not be able to view file content or run the ingest process. +Case.checkImgExist.confDlg.doesntExist.msg=One of the images associated with \n\ +this case are missing. Would you like to search for them now?\n\ +Previously, the image was located at:\n\ +{0}\n\ +Please note that you will still be able to browse directories and generate reports\n\ +if you choose No, but you will not be able to view file content or run the ingest process. Case.checkImgExist.confDlg.doesntExist.title=Missing Image Case.addImg.exception.msg=Error adding image to the case Case.updateCaseName.exception.msg=Error while trying to update the case name. @@ -270,9 +275,12 @@ Case.GetCaseTypeGivenPath.Failure=Unable to get case type Case.metaDataFileCorrupt.exception.msg=The case metadata file (.aut) is corrupted. Case.deleteReports.deleteFromDiskException.log.msg=Unable to delete the report from the disk. Case.deleteReports.deleteFromDiskException.msg=Unable to delete the report {0} from the disk.\nYou may manually delete it from {1} -CaseDeleteAction.closeConfMsg.text=Are you sure want to close and delete this case? \nCase Name: {0}\nCase Directory: {1} +CaseDeleteAction.closeConfMsg.text=Are you sure want to close and delete this case? \n\ + Case Name: {0}\n\ + Case Directory: {1} CaseDeleteAction.closeConfMsg.title=Warning: Closing the Current Case -CaseDeleteAction.msgDlg.fileInUse.msg=The delete action cannot be fully completed because the folder or file in it is open by another program.\n\nClose the folder and file and try again or you can delete the case manually. +CaseDeleteAction.msgDlg.fileInUse.msg=The delete action cannot be fully completed because the folder or file in it is open by another program.\n\n\ +Close the folder and file and try again or you can delete the case manually. CaseDeleteAction.msgDlg.fileInUse.title=Error: Folder In Use CaseDeleteAction.msgDlg.caseDelete.msg=Case {0} has been deleted. CaseOpenAction.autFilter.title={0} Case File ( {1}) @@ -304,7 +312,8 @@ NewCaseWizardAction.databaseProblem1.text=Cannot open database. Cancelling case NewCaseWizardAction.databaseProblem2.text=Error NewCaseWizardPanel1.validate.errMsg.invalidSymbols=The Case Name cannot contain any of the following symbols: \\ / : * ? " < > | NewCaseWizardPanel1.validate.errMsg.dirExists=Case directory ''{0}'' already exists. -NewCaseWizardPanel1.validate.confMsg.createDir.msg=The base directory "{0}" does not exist. \n\nDo you want to create that directory? +NewCaseWizardPanel1.validate.confMsg.createDir.msg=The base directory "{0}" does not exist. \n\n\ + Do you want to create that directory? NewCaseWizardPanel1.validate.confMsg.createDir.title=Create directory NewCaseWizardPanel1.validate.errMsg.cantCreateParDir.msg=Error: Could not create case parent directory {0} NewCaseWizardPanel1.validate.errMsg.prevCreateBaseDir.msg=Prevented from creating base directory {0} @@ -355,8 +364,8 @@ UnpackageWorker.doInBackground.previouslySeenCase=Case has been previously opene UpdateRecentCases.menuItem.clearRecentCases.text=Clear Recent Cases UpdateRecentCases.menuItem.empty=-Empty- AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=Cancel -NewCaseVisualPanel1.CaseFolderOnCDriveError.text=Warning: Path to multi-user case folder is on "C:" drive -NewCaseVisualPanel1.CaseFolderOnInternalDriveWindowsError.text=Warning: Path to case folder is on "C:" drive. Case folder is created on the target system +NewCaseVisualPanel1.CaseFolderOnCDriveError.text=Warning: Path to multi-user case folder is on \"C:\" drive +NewCaseVisualPanel1.CaseFolderOnInternalDriveWindowsError.text=Warning: Path to case folder is on \"C:\" drive. Case folder is created on the target system NewCaseVisualPanel1.CaseFolderOnInternalDriveLinuxError.text=Warning: Path to case folder is on the target system. Create case folder in mounted drive. NewCaseVisualPanel1.uncPath.error=Error: UNC paths are not allowed for Single-User cases CollaborationMonitor.addingDataSourceStatus.msg={0} adding data source @@ -364,7 +373,7 @@ CollaborationMonitor.analyzingDataSourceStatus.msg={0} analyzing {1} MissingImageDialog.lbWarning.text= MissingImageDialog.lbWarning.toolTipText= NewCaseVisualPanel1.caseParentDirWarningLabel.text= -NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-User\t\t +NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-User NewCaseVisualPanel1.singleUserCaseRadioButton.text=Single-User NewCaseVisualPanel1.caseTypeLabel.text=Case Type: SingleUserCaseConverter.BadDatabaseFileName=Database file does not exist! diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED index b2320b5408..b4f7f835ef 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=Central Repository Ingest Module -OpenIDE-Module-Long-Description=Central Repository ingest module and central database. \n\nThe Central Repository 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=\ + Central Repository ingest module and central database. \n\n\ + The Central Repository 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/contentviewers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED index 9465ad9a84..6df3399a0a 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED @@ -194,776 +194,837 @@ TranslatablePanel.comboBoxOption.translatedText=Translated Text # {0} - exception message TranslatablePanel.onSetContentError.text=There was an error displaying the text: {0} ## Window toolbar Title -viewer.window.title.default=ICEpdf Viewer -viewer.window.title.open.default=ICEpdf Viewer - [{0}] +viewer.window.title.default = ICEpdf Viewer +viewer.window.title.open.default = ICEpdf Viewer - [{0}] #status bar -viewer.statusbar.currentPage=Page {0} / {1} +viewer.statusbar.currentPage = Page {0} / {1} -viewer.common.number.one=1 -viewer.common.number.two=2 -viewer.common.number.three=3 -viewer.common.number.four=4 -viewer.common.number.five=5 -viewer.common.number.six=6 -viewer.common.number.seven=7 -viewer.common.number.eight=8 -viewer.common.number.nine=9 -viewer.common.number.ten=10 -viewer.common.number.eleven=11 -viewer.common.number.twelve=12 -viewer.common.number.thirteen=13 -viewer.common.number.fourteen=14 -viewer.common.number.fifteen=15 -viewer.common.number.sixteen=16 -viewer.common.number.seventeen=17 -viewer.common.number.eighteen=18 -viewer.common.number.nineteen=19 -viewer.common.number.twenty=20 -viewer.common.number.twentyOne=21 -viewer.common.number.twentyTwo=22 -viewer.common.number.twentyThree=23 -viewer.common.number.twentyFour=24 -viewer.common.number.twentyFive=25 -viewer.common.number.twentySix=26 -viewer.common.number.twentySeven=27 -viewer.common.number.thirtySix=36 -viewer.common.number.fortyEight=48 +viewer.common.number.one = 1 +viewer.common.number.two = 2 +viewer.common.number.three = 3 +viewer.common.number.four = 4 +viewer.common.number.five = 5 +viewer.common.number.six = 6 +viewer.common.number.seven = 7 +viewer.common.number.eight = 8 +viewer.common.number.nine = 9 +viewer.common.number.ten = 10 +viewer.common.number.eleven = 11 +viewer.common.number.twelve = 12 +viewer.common.number.thirteen = 13 +viewer.common.number.fourteen = 14 +viewer.common.number.fifteen = 15 +viewer.common.number.sixteen = 16 +viewer.common.number.seventeen = 17 +viewer.common.number.eighteen = 18 +viewer.common.number.nineteen = 19 +viewer.common.number.twenty = 20 +viewer.common.number.twentyOne = 21 +viewer.common.number.twentyTwo = 22 +viewer.common.number.twentyThree = 23 +viewer.common.number.twentyFour = 24 +viewer.common.number.twentyFive = 25 +viewer.common.number.twentySix = 26 +viewer.common.number.twentySeven = 27 +viewer.common.number.thirtySix = 36 +viewer.common.number.fortyEight = 48 ## Top Page Control Toolbar -viewer.toolbar.hideToolBar.label=Hide Toolbar -viewer.toolbar.showToolBar.label=Show Toolbar -viewer.toolbar.showUtilityPane.label=Show Utility Pane -viewer.toolbar.hideUtilityPane.label=Hide Utility Pane -viewer.toolbar.open.label= -viewer.toolbar.open.tooltip=Open Document -viewer.toolbar.saveAs.label=Save As -viewer.toolbar.saveAs.tooltip=Save As... -viewer.toolbar.print.label=Print -viewer.toolbar.print.tooltip=Print Document -viewer.toolbar.search.label=Search -viewer.toolbar.search.tooltip=Search Document -viewer.toolbar.utilityPane.label=Utility Pane -viewer.toolbar.utilityPane.tooltip=Show/Hide Utility Pane -viewer.toolbar.navigation.label= -viewer.toolbar.navigation.pages.tooltip=Number of Pages -viewer.toolbar.navigation.pages.firstPage.label= -viewer.toolbar.navigation.current.tooltip=Current Page Number -viewer.toolbar.navigation.current.firstPage.label= -viewer.toolbar.navigation.firstPage.label= -viewer.toolbar.navigation.firstPage.tooltip=First Page -viewer.toolbar.navigation.previousPage.label= -viewer.toolbar.navigation.previousPage.tooltip=Previous Page -viewer.toolbar.navigation.nextPage.label= -viewer.toolbar.navigation.nextPage.tooltip=Next Page -viewer.toolbar.navigation.lastPage.label= -viewer.toolbar.navigation.lastPage.tooltip=Last Page -viewer.toolbar.pageIndicator=of {0} -viewer.toolbar.zoom.label= -viewer.toolbar.zoom.tooltip=Zoom -viewer.toolbar.zoom.out.label= -viewer.toolbar.zoom.out.tooltip=Zoom Out -viewer.toolbar.zoom.in.label= -viewer.toolbar.zoom.in.tooltip=Zoom In -viewer.toolbar.pageFit.actualsize.label= -viewer.toolbar.pageFit.actualsize.tooltip=Actual Size -viewer.toolbar.pageFit.fitWindow.label= -viewer.toolbar.pageFit.fitWindow.tooltip=Fit in Window -viewer.toolbar.pageFit.fitWidth.label= -viewer.toolbar.pageFit.fitWidth.tooltip=Fit Width -viewer.toolbar.rotation.left.label= -viewer.toolbar.rotation.left.tooltip=Rotate Left -viewer.toolbar.rotation.right.label= -viewer.toolbar.rotation.right.tooltip=Rotate Right -viewer.toolbar.tool.pan.label= -viewer.toolbar.tool.pan.tooltip=Pan Tool -viewer.toolbar.tool.text.label= -viewer.toolbar.tool.text.tooltip=Text Select Tool -viewer.toolbar.tool.select.label= -viewer.toolbar.tool.select.tooltip=Select Tool -viewer.toolbar.tool.link.label= -viewer.toolbar.tool.link.tooltip=Link Annotation Tool -viewer.toolbar.tool.highlight.label=Highlight -viewer.toolbar.tool.highlight.tooltip=Highlight Annotation Tool -viewer.toolbar.tool.strikeOut.label=Strike Out -viewer.toolbar.tool.strikeOut.tooltip=Strike Out Annotation Tool -viewer.toolbar.tool.underline.label=Underline -viewer.toolbar.tool.underline.tooltip=Underline Annotation Tool -viewer.toolbar.tool.line.label=Line -viewer.toolbar.tool.line.tooltip=Line Annotation Tool -viewer.toolbar.tool.lineArrow.label=Line Arrow -viewer.toolbar.tool.lineArrow.tooltip=Line Arrow Annotation Tool -viewer.toolbar.tool.rectangle.label=Rectangle -viewer.toolbar.tool.rectangle.tooltip=Rectangle Annotation Tool -viewer.toolbar.tool.circle.label=Circle -viewer.toolbar.tool.circle.tooltip=Circle Annotation Tool -viewer.toolbar.tool.ink.label=Ink -viewer.toolbar.tool.ink.tooltip=Ink Annotation Tool -viewer.toolbar.tool.freeText.label=Free Text -viewer.toolbar.tool.freeText.tooltip=Free Text Annotation Tool -viewer.toolbar.tool.textAnno.label=Text Annotation -viewer.toolbar.tool.textAnno.tooltip=Text Annotation Tool -viewer.toolbar.tool.plolyLine.label=Poly Line -viewer.toolbar.tool.plolyLine.tooltip=Poly Line Annotation Tool -viewer.toolbar.tool.zoomIn.label= -viewer.toolbar.tool.zoomIn.tooltip=Zoom In Tool -viewer.toolbar.tool.zoomMarquis.label= -viewer.toolbar.tool.zoomMarquis.tooltip=Zoom Marquee Tool -viewer.toolbar.tool.zoomDynamic.label= -viewer.toolbar.tool.zoomDynamic.tooltip=Zoom Dynamic Tool -viewer.toolbar.tool.zoomOut.label= -viewer.toolbar.tool.zoomOut.tooltip=Zoom Out Tool -viewer.toolbar.pageFit.fontEngine.label= -viewer.toolbar.pageFit.fontEngine.tooltip=Enable/Disable Font Engine -viewer.toolbar.tool.forms.highlight.label=Highlight Forms -viewer.toolbar.tool.forms.highlight.tooltip=Show/Hide Form Highlighting +viewer.toolbar.hideToolBar.label = Hide Toolbar +viewer.toolbar.showToolBar.label = Show Toolbar +viewer.toolbar.showUtilityPane.label = Show Utility Pane +viewer.toolbar.hideUtilityPane.label = Hide Utility Pane +viewer.toolbar.open.label = +viewer.toolbar.open.tooltip = Open Document +viewer.toolbar.saveAs.label = Save As +viewer.toolbar.saveAs.tooltip = Save As... +viewer.toolbar.print.label = Print +viewer.toolbar.print.tooltip = Print Document +viewer.toolbar.search.label = Search +viewer.toolbar.search.tooltip = Search Document +viewer.toolbar.utilityPane.label = Utility Pane +viewer.toolbar.utilityPane.tooltip = Show/Hide Utility Pane +viewer.toolbar.navigation.label = +viewer.toolbar.navigation.pages.tooltip = Number of Pages +viewer.toolbar.navigation.pages.firstPage.label = +viewer.toolbar.navigation.current.tooltip = Current Page Number +viewer.toolbar.navigation.current.firstPage.label = +viewer.toolbar.navigation.firstPage.label = +viewer.toolbar.navigation.firstPage.tooltip = First Page +viewer.toolbar.navigation.previousPage.label = +viewer.toolbar.navigation.previousPage.tooltip = Previous Page +viewer.toolbar.navigation.nextPage.label = +viewer.toolbar.navigation.nextPage.tooltip = Next Page +viewer.toolbar.navigation.lastPage.label = +viewer.toolbar.navigation.lastPage.tooltip = Last Page +viewer.toolbar.pageIndicator = of {0} +viewer.toolbar.zoom.label = +viewer.toolbar.zoom.tooltip = Zoom +viewer.toolbar.zoom.out.label = +viewer.toolbar.zoom.out.tooltip = Zoom Out +viewer.toolbar.zoom.in.label = +viewer.toolbar.zoom.in.tooltip = Zoom In +viewer.toolbar.pageFit.actualsize.label = +viewer.toolbar.pageFit.actualsize.tooltip = Actual Size +viewer.toolbar.pageFit.fitWindow.label = +viewer.toolbar.pageFit.fitWindow.tooltip = Fit in Window +viewer.toolbar.pageFit.fitWidth.label = +viewer.toolbar.pageFit.fitWidth.tooltip = Fit Width +viewer.toolbar.rotation.left.label = +viewer.toolbar.rotation.left.tooltip = Rotate Left +viewer.toolbar.rotation.right.label = +viewer.toolbar.rotation.right.tooltip = Rotate Right +viewer.toolbar.tool.pan.label = +viewer.toolbar.tool.pan.tooltip = Pan Tool +viewer.toolbar.tool.text.label = +viewer.toolbar.tool.text.tooltip = Text Select Tool +viewer.toolbar.tool.select.label = +viewer.toolbar.tool.select.tooltip = Select Tool +viewer.toolbar.tool.link.label = +viewer.toolbar.tool.link.tooltip = Link Annotation Tool +viewer.toolbar.tool.highlight.label = Highlight +viewer.toolbar.tool.highlight.tooltip = Highlight Annotation Tool +viewer.toolbar.tool.strikeOut.label = Strike Out +viewer.toolbar.tool.strikeOut.tooltip = Strike Out Annotation Tool +viewer.toolbar.tool.underline.label = Underline +viewer.toolbar.tool.underline.tooltip = Underline Annotation Tool +viewer.toolbar.tool.line.label = Line +viewer.toolbar.tool.line.tooltip = Line Annotation Tool +viewer.toolbar.tool.lineArrow.label = Line Arrow +viewer.toolbar.tool.lineArrow.tooltip = Line Arrow Annotation Tool +viewer.toolbar.tool.rectangle.label = Rectangle +viewer.toolbar.tool.rectangle.tooltip = Rectangle Annotation Tool +viewer.toolbar.tool.circle.label = Circle +viewer.toolbar.tool.circle.tooltip = Circle Annotation Tool +viewer.toolbar.tool.ink.label = Ink +viewer.toolbar.tool.ink.tooltip = Ink Annotation Tool +viewer.toolbar.tool.freeText.label = Free Text +viewer.toolbar.tool.freeText.tooltip = Free Text Annotation Tool +viewer.toolbar.tool.textAnno.label = Text Annotation +viewer.toolbar.tool.textAnno.tooltip = Text Annotation Tool +viewer.toolbar.tool.plolyLine.label = Poly Line +viewer.toolbar.tool.plolyLine.tooltip = Poly Line Annotation Tool +viewer.toolbar.tool.zoomIn.label = +viewer.toolbar.tool.zoomIn.tooltip = Zoom In Tool +viewer.toolbar.tool.zoomMarquis.label = +viewer.toolbar.tool.zoomMarquis.tooltip = Zoom Marquee Tool +viewer.toolbar.tool.zoomDynamic.label = +viewer.toolbar.tool.zoomDynamic.tooltip = Zoom Dynamic Tool +viewer.toolbar.tool.zoomOut.label = +viewer.toolbar.tool.zoomOut.tooltip = Zoom Out Tool +viewer.toolbar.pageFit.fontEngine.label = +viewer.toolbar.pageFit.fontEngine.tooltip = Enable/Disable Font Engine +viewer.toolbar.tool.forms.highlight.label = Highlight Forms +viewer.toolbar.tool.forms.highlight.tooltip = Show/Hide Form Highlighting ## Bottom Page View Control Toolbar -viewer.toolbar.pageView.nonContinuous.singlePage.label= -viewer.toolbar.pageView.nonContinuous.singlePage.tooltip=Single Page View Non-Continuous -viewer.toolbar.pageView.nonContinuous.facingPage.label= -viewer.toolbar.pageView.nonContinuous.facingPage.tooltip=Facing Page View Non-Continuous -viewer.toolbar.pageView.continuous.singlePage.label= -viewer.toolbar.pageView.continuous.singlePage.tooltip=Single Page View Continuous -viewer.toolbar.pageView.continuous.facingPage.label= -viewer.toolbar.pageView.continuous.facingPage.tooltip=Facing Page View Continuous +viewer.toolbar.pageView.nonContinuous.singlePage.label = +viewer.toolbar.pageView.nonContinuous.singlePage.tooltip = Single Page View Non-Continuous +viewer.toolbar.pageView.nonContinuous.facingPage.label = +viewer.toolbar.pageView.nonContinuous.facingPage.tooltip = Facing Page View Non-Continuous +viewer.toolbar.pageView.continuous.singlePage.label = +viewer.toolbar.pageView.continuous.singlePage.tooltip = Single Page View Continuous +viewer.toolbar.pageView.continuous.facingPage.label = +viewer.toolbar.pageView.continuous.facingPage.tooltip = Facing Page View Continuous ## File Menu and submenu items -viewer.menu.file.label=File -viewer.menu.file.mnemonic=F -viewer.menu.open.label=Open -viewer.menu.open.file.label=File... -viewer.menu.open.URL.label=URL... -viewer.menu.close.label=Close -viewer.menu.saveAs.label=Save As... -viewer.menu.exportText.label=Export Text... -viewer.menu.exportSVG.label=Export SVG... -viewer.menu.documentPermission.label=Document Permissions... -viewer.menu.documentInformation.label=Document Information... -viewer.menu.documentFonts.label=Document Fonts... -viewer.menu.printSetup.label=Print Setup... -viewer.menu.print.label=Print... -viewer.menu.exit.label=Exit +viewer.menu.file.label = File +viewer.menu.file.mnemonic = F +viewer.menu.open.label = Open +viewer.menu.open.file.label = File... +viewer.menu.open.URL.label = URL... +viewer.menu.close.label = Close +viewer.menu.saveAs.label = Save As... +viewer.menu.exportText.label = Export Text... +viewer.menu.exportSVG.label = Export SVG... +viewer.menu.documentPermission.label = Document Permissions... +viewer.menu.documentInformation.label = Document Information... +viewer.menu.documentFonts.label = Document Fonts... +viewer.menu.printSetup.label = Print Setup... +viewer.menu.print.label = Print... +viewer.menu.exit.label = Exit ## View Menu and submenu items -viewer.menu.edit.label=Edit -viewer.menu.edit.mnemonic=E -viewer.menu.edit.undo.label=Undo -viewer.menu.edit.redo.label=Redo -viewer.menu.edit.copy.label=Copy -viewer.menu.edit.delete.label=Delete -viewer.menu.edit.selectAll.label=Select All -viewer.menu.edit.deselectAll.label=Deselect All +viewer.menu.edit.label = Edit +viewer.menu.edit.mnemonic = E +viewer.menu.edit.undo.label = Undo +viewer.menu.edit.redo.label = Redo +viewer.menu.edit.copy.label = Copy +viewer.menu.edit.delete.label = Delete +viewer.menu.edit.selectAll.label = Select All +viewer.menu.edit.deselectAll.label = Deselect All ## View Menu and submenu items -viewer.menu.view.label=View -viewer.menu.view.mnemonic=V -viewer.menu.view.actualSize.label=Actual Size -viewer.menu.view.fitInWindow.label=Fit in Window -viewer.menu.view.fitWidth.label=Fit Width -viewer.menu.view.zoomIn.label=Zoom In -viewer.menu.view.zoomOut.label=Zoom Out -viewer.menu.view.rotateLeft.label=Rotate Left -viewer.menu.view.rotateRight.label=Rotate Right -viewer.menu.view.hideToolBar.label=Hide Toolbar -viewer.menu.view.showToolBar.label=Show Toolbar -viewer.menu.view.showUtilityPane.label=Show Utility Pane -viewer.menu.view.hideUtilityPane.label=Hide Utility Pane +viewer.menu.view.label = View +viewer.menu.view.mnemonic = V +viewer.menu.view.actualSize.label = Actual Size +viewer.menu.view.fitInWindow.label = Fit in Window +viewer.menu.view.fitWidth.label = Fit Width +viewer.menu.view.zoomIn.label = Zoom In +viewer.menu.view.zoomOut.label = Zoom Out +viewer.menu.view.rotateLeft.label = Rotate Left +viewer.menu.view.rotateRight.label = Rotate Right +viewer.menu.view.hideToolBar.label = Hide Toolbar +viewer.menu.view.showToolBar.label = Show Toolbar +viewer.menu.view.showUtilityPane.label = Show Utility Pane +viewer.menu.view.hideUtilityPane.label = Hide Utility Pane ## Document Menu and submenu items -viewer.menu.document.label=Document -viewer.menu.document.mnemonic=D -viewer.menu.document.firstPage.label=First Page -viewer.menu.document.previousPage.label=Previous Page -viewer.menu.document.nextPage.label=Next Page -viewer.menu.document.lastPage.label=Last Page -viewer.menu.document.search.label=Search... -viewer.menu.document.gotToPage.label=Go To Page... +viewer.menu.document.label = Document +viewer.menu.document.mnemonic = D +viewer.menu.document.firstPage.label = First Page +viewer.menu.document.previousPage.label = Previous Page +viewer.menu.document.nextPage.label = Next Page +viewer.menu.document.lastPage.label = Last Page +viewer.menu.document.search.label = Search... +viewer.menu.document.gotToPage.label = Go To Page... ## Window Menu and submenu items -viewer.menu.window.label=Window -viewer.menu.window.mnemonic=W -viewer.menu.window.minAll.label=Minimize All -viewer.menu.window.minAll.mnemonic=M -viewer.menu.window.frontAll.label=Bring All to Front -viewer.menu.window.frontAll.mnemonic=B -viewer.menu.window.1.label=1 -viewer.menu.window.1.mnemonic=1 -viewer.menu.window.2.label=2 -viewer.menu.window.2.mnemonic=2 -viewer.menu.window.3.label=3 -viewer.menu.window.3.mnemonic=3 -viewer.menu.window.4.label=4 -viewer.menu.window.4.mnemonic=4 -viewer.menu.window.5.label=5 -viewer.menu.window.5.mnemonic=5 -viewer.menu.window.6.label=6 -viewer.menu.window.6.mnemonic=6 -viewer.menu.window.7.label=7 -viewer.menu.window.7.mnemonic=7 -viewer.menu.window.8.label=8 -viewer.menu.window.8.mnemonic=8 -viewer.menu.window.9.label=9 -viewer.menu.window.9.mnemonic=9 +viewer.menu.window.label = Window +viewer.menu.window.mnemonic = W +viewer.menu.window.minAll.label = Minimize All +viewer.menu.window.minAll.mnemonic = M +viewer.menu.window.frontAll.label = Bring All to Front +viewer.menu.window.frontAll.mnemonic = B +viewer.menu.window.1.label = 1 +viewer.menu.window.1.mnemonic = 1 +viewer.menu.window.2.label = 2 +viewer.menu.window.2.mnemonic = 2 +viewer.menu.window.3.label = 3 +viewer.menu.window.3.mnemonic = 3 +viewer.menu.window.4.label = 4 +viewer.menu.window.4.mnemonic = 4 +viewer.menu.window.5.label = 5 +viewer.menu.window.5.mnemonic = 5 +viewer.menu.window.6.label = 6 +viewer.menu.window.6.mnemonic = 6 +viewer.menu.window.7.label = 7 +viewer.menu.window.7.mnemonic = 7 +viewer.menu.window.8.label = 8 +viewer.menu.window.8.mnemonic = 8 +viewer.menu.window.9.label = 9 +viewer.menu.window.9.mnemonic = 9 ## Add as many entries as you want, to viewer.menu.window.X.label and mnemonic ## where X is an incrementing integer. The mnemonic should be one unique ## character found within the label ## Help Menu and submenu items -viewer.menu.help.label=Help -viewer.menu.help.mnemonic=H -viewer.menu.help.about.label=About ICEpdf viewer... +viewer.menu.help.label = Help +viewer.menu.help.mnemonic = H +viewer.menu.help.about.label = About ICEpdf viewer... ## General error dialog -viewer.dialog.error.exception.title=ICEsoft ICEpdf - Exception -viewer.dialog.error.exception.msg=There was an error executing your command do to the following exception\n{0}. +viewer.dialog.error.exception.title = ICEsoft ICEpdf - Exception +viewer.dialog.error.exception.msg = \ + There was an error executing your command do to the following exception\n\ + {0}. ## Open File Dialog -viewer.dialog.openFile.title=Open File -viewer.dialog.openFile.error.title=ICEsoft ICEpdf - Open File Error -viewer.dialog.openFile.error.msg=ICEpdf could not open the specified file at {0}\nThe file may be corrupt or not a supported file type. +viewer.dialog.openFile.title = Open File +viewer.dialog.openFile.error.title = ICEsoft ICEpdf - Open File Error +viewer.dialog.openFile.error.msg = \ + ICEpdf could not open the specified file at {0}\n\ + The file may be corrupt or not a supported file type. -viewer.dialog.openDocument.pdfException.title=ICEsoft ICEpdf - PDF Exception -viewer.dialog.openDocument.pdfException.msg=ICEpdf could not open the specified file {0} \nThe file may be corrupt or not a supported file type. +viewer.dialog.openDocument.pdfException.title = ICEsoft ICEpdf - PDF Exception +viewer.dialog.openDocument.pdfException.msg = \ + ICEpdf could not open the specified file {0} \n\ + The file may be corrupt or not a supported file type. -viewer.dialog.openDocument.pdfSecurityException.title=ICEsoft ICEpdf - PDF Security Exception -viewer.dialog.openDocument.pdfSecurityException.msg=ICEpdf could not open the encrypted file at {0}\nThis may be the result of an invalid password or a missing JCE Security Provider.\n\nPlease refer to ICEpdf Developer's Guide for more information. +viewer.dialog.openDocument.pdfSecurityException.title = ICEsoft ICEpdf - PDF Security Exception +viewer.dialog.openDocument.pdfSecurityException.msg = \ + ICEpdf could not open the encrypted file at {0}\n\ + This may be the result of an invalid password or a missing JCE Security Provider.\n\n\ + Please refer to ICEpdf Developer's Guide for more information. -viewer.dialog.openDocument.exception.title=ICEsoft ICEpdf - Exception -viewer.dialog.openDocument.exception.msg=ICEpdf could not open the specified file at {0}\nThe file may be corrupt or not a supported file type. +viewer.dialog.openDocument.exception.title = ICEsoft ICEpdf - Exception +viewer.dialog.openDocument.exception.msg = \ + ICEpdf could not open the specified file at {0}\n\ + The file may be corrupt or not a supported file type. -viewer.dialog.openURL.exception.title=ICEsoft ICEpdf - URL Exception -viewer.dialog.openURL.exception.msg=ICEpdf could not open the specified file. {0} \nat URL: {1} -viewer.dialog.openURL.downloading.msg=Downloading {0} +viewer.dialog.openURL.exception.title = ICEsoft ICEpdf - URL Exception +viewer.dialog.openURL.exception.msg = \ + ICEpdf could not open the specified file. {0} \n\ + at URL: {1} +viewer.dialog.openURL.downloading.msg = Downloading {0} ## General error dialog -viewer.dialog.information.copyAll.title=ICEsoft ICEpdf - Information -viewer.dialog.information.copyAll.msg=The document has more than {0} pages, please use\n"Export text..." to extract document text. +viewer.dialog.information.copyAll.title = ICEsoft ICEpdf - Information +viewer.dialog.information.copyAll.msg = \ + The document has more than {0} pages, please use\n\ + "Export text..." to extract document text. ## Open URL Dialog -viewer.dialog.security.title=Document Security -viewer.dialog.security.msg=This PDF is protected -viewer.dialog.security.password.label=Password: -viewer.dialog.security.okButton.label=Ok -viewer.dialog.security.okButton.mnemonic=O -viewer.dialog.security.cancelButton.label=Cancel -viewer.dialog.security.cancelButton.mnemonic=C +viewer.dialog.security.title = Document Security +viewer.dialog.security.msg = This PDF is protected +viewer.dialog.security.password.label = Password: +viewer.dialog.security.okButton.label = Ok +viewer.dialog.security.okButton.mnemonic = O +viewer.dialog.security.cancelButton.label = Cancel +viewer.dialog.security.cancelButton.mnemonic = C ## Open URL Dialog -viewer.dialog.openURL.title=Open URL +viewer.dialog.openURL.title = Open URL ### Save a Copy Dialog -viewer.dialog.saveAs.title=Save As -viewer.dialog.saveAs.extensionError.title=ICEsoft ICEpdf - Save Error -viewer.dialog.saveAs.extensionError.msg=ICEpdf could not save to {0} because it is not a supported file type. -viewer.dialog.saveAs.noExtensionError.title=ICEsoft ICEpdf - Save Error -viewer.dialog.saveAs.noExtensionError.msg=Please specify a file extension. -viewer.dialog.saveAs.noneUniqueName.title=ICEsoft ICEpdf - Save Error -viewer.dialog.saveAs.noneUniqueName.msg=The file named {0} already exists. Please specify a unique name. -viewer.dialog.saveAs.noPermission.title=ICEpdf Viewer RI - Save Error -viewer.dialog.saveAs.noPermission.msg=You do not have permission or the credentials to save this document. -viewer.dialog.saveAs.noUpdates.title=ICEpdf Viewer RI -viewer.dialog.saveAs.noUpdates.msg=Document changes will not be saved, please upgrade to ICEpdf PRO. -viewer.dialog.saveOnClose.noUpdates.title=ICEpdf Viewer RI -viewer.dialog.saveOnClose.noUpdates.msg=Do you want to save changes to {0}? +viewer.dialog.saveAs.title = Save As +viewer.dialog.saveAs.extensionError.title = ICEsoft ICEpdf - Save Error +viewer.dialog.saveAs.extensionError.msg = \ + ICEpdf could not save to {0} because it is not a supported file type. +viewer.dialog.saveAs.noExtensionError.title = ICEsoft ICEpdf - Save Error +viewer.dialog.saveAs.noExtensionError.msg = Please specify a file extension. +viewer.dialog.saveAs.noneUniqueName.title = ICEsoft ICEpdf - Save Error +viewer.dialog.saveAs.noneUniqueName.msg = \ + The file named {0} already exists. Please specify a unique name. +viewer.dialog.saveAs.noPermission.title = ICEpdf Viewer RI - Save Error +viewer.dialog.saveAs.noPermission.msg = You do not have permission or the credentials to save this document. +viewer.dialog.saveAs.noUpdates.title = ICEpdf Viewer RI +viewer.dialog.saveAs.noUpdates.msg = Document changes will not be saved, please upgrade to ICEpdf PRO. +viewer.dialog.saveOnClose.noUpdates.title = ICEpdf Viewer RI +viewer.dialog.saveOnClose.noUpdates.msg = Do you want to save changes to {0}? ## Export Text Dialog -viewer.dialog.exportText.title=Export Document Text -viewer.dialog.exportText.progress.msg=Extracting PDF Text -viewer.dialog.exportText.noExtensionError.title=ICEsoft ICEpdf - Save Error -viewer.dialog.exportText.noExtensionError.msg=Please specify a file extension. +viewer.dialog.exportText.title = Export Document Text +viewer.dialog.exportText.progress.msg = Extracting PDF Text +viewer.dialog.exportText.noExtensionError.title = ICEsoft ICEpdf - Save Error +viewer.dialog.exportText.noExtensionError.msg = Please specify a file extension. # Text extraction output file -viewer.exportText.fileStamp.msg=ICEsoft ICEpdf Viewer, (c) ICEsoft Technologies, Inc. -viewer.exportText.pageStamp.msg= +viewer.exportText.fileStamp.msg = ICEsoft ICEpdf Viewer, (c) ICEsoft Technologies, Inc. +viewer.exportText.pageStamp.msg = # Completed x out of y page(s). -viewer.exportText.fileStamp.progress.msg=Completed {0} out of {1}. -viewer.exportText.fileStamp.progress.oneFile.msg={2} page -viewer.exportText.fileStamp.progress.moreFile.msg={2} pages +viewer.exportText.fileStamp.progress.msg = \ + Completed {0} out of {1}. +viewer.exportText.fileStamp.progress.oneFile.msg = {2} page +viewer.exportText.fileStamp.progress.moreFile.msg = {2} pages ## Export SVG Dialog -viewer.dialog.exportSVG.title=Export to SVG -viewer.dialog.exportSVG.status.exporting.msg=Exporting page {0} to SVG file {1} ... -viewer.dialog.exportSVG.status.error.msg=Problem exporting page {0} to SVG file {1} : {2} -viewer.dialog.exportSVG.status.finished.msg=Finished exporting page {0} to SVG file {1} -viewer.dialog.exportSVG.noExtensionError.title=ICEsoft ICEpdf - SVG Error -viewer.dialog.exportSVG.noExtensionError.msg=Please specify a file extension. -viewer.dialog.exportSVG.exportError.title=ICEsoft ICEpdf - SVG Error -viewer.dialog.exportSVG.exportError.msg=ICEpdf could not export to {0} \nbecuase it is either not a supported file type or \nbecause the file has been corrupted. +viewer.dialog.exportSVG.title = Export to SVG +viewer.dialog.exportSVG.status.exporting.msg = Exporting page {0} to SVG file {1} ... +viewer.dialog.exportSVG.status.error.msg = \ + Problem exporting page {0} to SVG file {1} : {2} +viewer.dialog.exportSVG.status.finished.msg = \ + Finished exporting page {0} to SVG file {1} +viewer.dialog.exportSVG.noExtensionError.title = ICEsoft ICEpdf - SVG Error +viewer.dialog.exportSVG.noExtensionError.msg = Please specify a file extension. +viewer.dialog.exportSVG.exportError.title = ICEsoft ICEpdf - SVG Error +viewer.dialog.exportSVG.exportError.msg = \ + ICEpdf could not export to {0} \n\ + becuase it is either not a supported file type or \n\ + because the file has been corrupted. # Printing Progress bar -viewer.dialog.printing.status.progress.msg=Page {0} of {1} -viewer.dialog.printing.status.start.msg=Spooling Page(s) to Printer +viewer.dialog.printing.status.progress.msg = Page {0} of {1} +viewer.dialog.printing.status.start.msg = Spooling Page(s) to Printer ## Document Permissions Dialog -viewer.dialog.documentPermissions.title=Document Permissions -viewer.dialog.documentPermissions.securityMethod.label=Security Method: -viewer.dialog.documentPermissions.userPassword.label=User Password: -viewer.dialog.documentPermissions.ownerPassword.label=Owner Password: -viewer.dialog.documentPermissions.printing.label=Printing: -viewer.dialog.documentPermissions.changing.label=Changing the Document: -viewer.dialog.documentPermissions.copyExtraction.label=Content Copying or Extraction: -viewer.dialog.documentPermissions.comments.label=Aurthoring Comments and Form Fields: -viewer.dialog.documentPermissions.formFillingIn.label=Form Field Fill-in or Signing: -viewer.dialog.documentPermissions.accessibility.label=Content Accessibility Enabled: -viewer.dialog.documentPermissions.assembly.label=Document Assembly: -viewer.dialog.documentPermissions.encryptionLevel.label=Encryption Level: -viewer.dialog.documentPermissions.securityLevel={0}-bit v{1} R {2} -viewer.dialog.documentPermissions.none=None -viewer.dialog.documentPermissions.no=No -viewer.dialog.documentPermissions.yes=Yes -viewer.dialog.documentPermissions.allowed=Allowed -viewer.dialog.documentPermissions.notAllowed=Not Allowed -viewer.dialog.documentPermissions.fullyAllowed=Fully Allowed -viewer.dialog.documentPermissions.standardSecurity=Adobe Acrobat Standard Security -viewer.dialog.documentPermissions.partial=Partial (Low Quality) +viewer.dialog.documentPermissions.title = Document Permissions +viewer.dialog.documentPermissions.securityMethod.label = Security Method: +viewer.dialog.documentPermissions.userPassword.label = User Password: +viewer.dialog.documentPermissions.ownerPassword.label = Owner Password: +viewer.dialog.documentPermissions.printing.label = Printing: +viewer.dialog.documentPermissions.changing.label = Changing the Document: +viewer.dialog.documentPermissions.copyExtraction.label = Content Copying or Extraction: +viewer.dialog.documentPermissions.comments.label = Aurthoring Comments and Form Fields: +viewer.dialog.documentPermissions.formFillingIn.label = Form Field Fill-in or Signing: +viewer.dialog.documentPermissions.accessibility.label = Content Accessibility Enabled: +viewer.dialog.documentPermissions.assembly.label = Document Assembly: +viewer.dialog.documentPermissions.encryptionLevel.label = Encryption Level: +viewer.dialog.documentPermissions.securityLevel = {0}-bit v{1} R {2} +viewer.dialog.documentPermissions.none = None +viewer.dialog.documentPermissions.no = No +viewer.dialog.documentPermissions.yes = Yes +viewer.dialog.documentPermissions.allowed = Allowed +viewer.dialog.documentPermissions.notAllowed = Not Allowed +viewer.dialog.documentPermissions.fullyAllowed = Fully Allowed +viewer.dialog.documentPermissions.standardSecurity = Adobe Acrobat Standard Security +viewer.dialog.documentPermissions.partial = Partial (Low Quality) ## Document Information Dialog -viewer.dialog.documentInformation.title=Document Information -viewer.dialog.documentInformation.title.label=Title: -viewer.dialog.documentInformation.subject.label=Subject: -viewer.dialog.documentInformation.author.label=Author: -viewer.dialog.documentInformation.keywords.label=Keywords: -viewer.dialog.documentInformation.creator.label=Creator: -viewer.dialog.documentInformation.producer.label=Producer: -viewer.dialog.documentInformation.created.label=Created: -viewer.dialog.documentInformation.modified.label=Modified: -viewer.dialog.documentInformation.notAvailable=Not Available +viewer.dialog.documentInformation.title = Document Information +viewer.dialog.documentInformation.title.label = Title: +viewer.dialog.documentInformation.subject.label = Subject: +viewer.dialog.documentInformation.author.label = Author: +viewer.dialog.documentInformation.keywords.label = Keywords: +viewer.dialog.documentInformation.creator.label = Creator: +viewer.dialog.documentInformation.producer.label = Producer: +viewer.dialog.documentInformation.created.label = Created: +viewer.dialog.documentInformation.modified.label = Modified: +viewer.dialog.documentInformation.notAvailable = Not Available ## Go to Page Dialog -viewer.dialog.goToPage.title=Go to Page... -viewer.dialog.goToPage.description.label=Page Number +viewer.dialog.goToPage.title = Go to Page... +viewer.dialog.goToPage.description.label = Page Number ## About Dialog -viewer.dialog.about.title=About ICEpdf Viewer -viewer.dialog.about.pageNumber.label=\n\nCheck the ICEpdf web site for the latest news:\nhttp://www.icepdf.org/ \n\n +viewer.dialog.about.title = About ICEpdf Viewer +viewer.dialog.about.pageNumber.label = \n\ +\n\ +Check the ICEpdf web site for the latest news:\n\ +http://www.icepdf.org/ \n\n ## Font Properties Dialog -viewer.dialog.fonts.title=Document Font Properties -viewer.dialog.fonts.border.label=Fonts used by this document -viewer.dialog.fonts.info.type.label=Type: {0} -viewer.dialog.fonts.info.encoding.label=Encoding: {0} -viewer.dialog.fonts.info.substitution.type.label=Actual Type: {0} -viewer.dialog.fonts.info.substitution.path.label=Path: {0} -viewer.dialog.fonts.searching.label=Collecting font data ({0}%). -viewer.dialog.fonts.resetCache.label=Reset Cache -viewer.dialog.fonts.resetCache.tip=Reset font properties cache file and rescan system for new fonts. +viewer.dialog.fonts.title = Document Font Properties +viewer.dialog.fonts.border.label = Fonts used by this document +viewer.dialog.fonts.info.type.label = Type: {0} +viewer.dialog.fonts.info.encoding.label = Encoding: {0} +viewer.dialog.fonts.info.substitution.type.label = Actual Type: {0} +viewer.dialog.fonts.info.substitution.path.label = Path: {0} +viewer.dialog.fonts.searching.label = Collecting font data ({0}%). +viewer.dialog.fonts.resetCache.label = Reset Cache +viewer.dialog.fonts.resetCache.tip = Reset font properties cache file and rescan system for new fonts. ## Utility Pane Bookmarks Tab -viewer.utilityPane.bookmarks.tab.title=Bookmarks +viewer.utilityPane.bookmarks.tab.title = Bookmarks ## Utility Pane Bookmarks Tab -viewer.utilityPane.attachments.tab.title=Attachments -viewer.utilityPane.attachments.column.fileName.title=Name -viewer.utilityPane.attachments.column.description.title=Description -viewer.utilityPane.attachments.column.modified.title=Modified -viewer.utilityPane.attachments.column.size.title=Size -viewer.utilityPane.attachments.column.compressedSize.title=Compressed size -viewer.utilityPane.attachments.menu.saveAs.label=Save As... -viewer.utilityPane.attachments.saveAs.replace.title=ICEsoft ICEpdf - Save Error -viewer.utilityPane.attachments.saveAs.replace.msg=The file named {0} already exists. Do you want to replace It? +viewer.utilityPane.attachments.tab.title = Attachments +viewer.utilityPane.attachments.column.fileName.title = Name +viewer.utilityPane.attachments.column.description.title = Description +viewer.utilityPane.attachments.column.modified.title = Modified +viewer.utilityPane.attachments.column.size.title = Size +viewer.utilityPane.attachments.column.compressedSize.title = Compressed size +viewer.utilityPane.attachments.menu.saveAs.label = Save As... +viewer.utilityPane.attachments.saveAs.replace.title = ICEsoft ICEpdf - Save Error +viewer.utilityPane.attachments.saveAs.replace.msg = \ + The file named {0} already exists. Do you want to replace It? ## Utility Pane Thumbnails -viewer.utilityPane.thumbs.tab.title=Thumbnails +viewer.utilityPane.thumbs.tab.title = Thumbnails ## Layers Pane -viewer.utilityPane.layers.tab.title=Layers +viewer.utilityPane.layers.tab.title = Layers ## Signature Pane -viewer.utilityPane.signatures.tab.title=Signatures -viewer.utilityPane.signatures.tab.certTree.error.label=Unsigned Signature Fields Signer certificate could not be validated {0} {1} -viewer.utilityPane.signatures.tab.certTree.rootSigned.label=Signed by {0} {1} -viewer.utilityPane.signatures.tab.certTree.rootValidating.label=Validating signature {0} {1} -viewer.utilityPane.signatures.tab.certTree.cert.invalid.label=Signature is invalid: -viewer.utilityPane.signatures.tab.certTree.cert.unknown.label=Signature is valid: -viewer.utilityPane.signatures.tab.certTree.cert.valid.label=Signature validity is unknown: -viewer.utilityPane.signatures.tab.certTree.doc.modified.label=This version of the document is unaltered but subsequent changes have been made -viewer.utilityPane.signatures.tab.certTree.doc.unmodified.label=Document has not been modified since it was signed -viewer.utilityPane.signatures.tab.certTree.doc.major.label=Document has been altered or corrupted since it was signed -viewer.utilityPane.signatures.tab.certTree.signature.identity.unknown.label=Signer's identity is unknown because it could not be found in your keystore -viewer.utilityPane.signatures.tab.certTree.signature.identity.unchecked.label=Signature is valid, but revocation of the signer's identity could not be checked -viewer.utilityPane.signatures.tab.certTree.signature.identity.valid.label=Signer's identity is valid -viewer.utilityPane.signatures.tab.certTree.signature.time.local.label=Signing time is from the clock on this signer's computer -viewer.utilityPane.signatures.tab.certTree.signature.time.embedded.label=Signature included an embedded timestamp but it could not be validated -viewer.utilityPane.signatures.tab.certTree.signature.details.label=Signature Details -viewer.utilityPane.signatures.tab.certTree.signature.details.reason.label=Reason: {0} -viewer.utilityPane.signatures.tab.certTree.signature.details.location.label=Location: {0} -viewer.utilityPane.signatures.tab.certTree.signature.details.full.label=Certificate Details... -viewer.utilityPane.signatures.tab.certTree.signature.lastChecked.label=Last Checked: {0} -viewer.utilityPane.signatures.tab.certTree.unsigned.label=Unsigned Signature Fields +viewer.utilityPane.signatures.tab.title = Signatures +viewer.utilityPane.signatures.tab.certTree.error.label = \ + Unsigned Signature Fields Signer certificate could not be validated {0} {1} +viewer.utilityPane.signatures.tab.certTree.rootSigned.label = Signed by {0} {1} +viewer.utilityPane.signatures.tab.certTree.rootValidating.label = Validating signature {0} {1} +viewer.utilityPane.signatures.tab.certTree.cert.invalid.label = Signature is invalid: +viewer.utilityPane.signatures.tab.certTree.cert.unknown.label = Signature is valid: +viewer.utilityPane.signatures.tab.certTree.cert.valid.label = Signature validity is unknown: +viewer.utilityPane.signatures.tab.certTree.doc.modified.label = \ + This version of the document is unaltered but subsequent changes have been made +viewer.utilityPane.signatures.tab.certTree.doc.unmodified.label = Document has not been modified since it was signed +viewer.utilityPane.signatures.tab.certTree.doc.major.label = Document has been altered or corrupted since it was signed +viewer.utilityPane.signatures.tab.certTree.signature.identity.unknown.label = \ + Signer's identity is unknown because it could not be found in your keystore +viewer.utilityPane.signatures.tab.certTree.signature.identity.unchecked.label = \ + Signature is valid, but revocation of the signer's identity could not be checked +viewer.utilityPane.signatures.tab.certTree.signature.identity.valid.label = Signer's identity is valid +viewer.utilityPane.signatures.tab.certTree.signature.time.local.label = Signing time is from the clock on this signer's computer +viewer.utilityPane.signatures.tab.certTree.signature.time.embedded.label = \ + Signature included an embedded timestamp but it could not be validated +viewer.utilityPane.signatures.tab.certTree.signature.details.label = Signature Details +viewer.utilityPane.signatures.tab.certTree.signature.details.reason.label = Reason: {0} +viewer.utilityPane.signatures.tab.certTree.signature.details.location.label = Location: {0} +viewer.utilityPane.signatures.tab.certTree.signature.details.full.label = Certificate Details... +viewer.utilityPane.signatures.tab.certTree.signature.lastChecked.label = Last Checked: {0} +viewer.utilityPane.signatures.tab.certTree.unsigned.label = Unsigned Signature Fields ## Signature certificate view dialog. -viewer.utilityPane.signatures.cert.dialog.title=Certificate Details -viewer.utilityPane.signatures.cert.dialog.closeButton.label=Close -viewer.utilityPane.signatures.cert.dialog.closeButton.mnemonic=C -viewer.utilityPane.signatures.cert.dialog.info.notAvailable.label=N/A -viewer.utilityPane.signatures.cert.dialog.info.unknownSubject.label=N/A Subject -viewer.utilityPane.signatures.cert.dialog.info.unknownIssuer.label=N/A Issuer -viewer.utilityPane.signatures.cert.dialog.info.certificateInfo.label={0} - {1} -viewer.utilityPane.signatures.cert.dialog.info.column1.label=Field -viewer.utilityPane.signatures.cert.dialog.info.column2.label=Value -viewer.utilityPane.signatures.cert.dialog.info.version.label=Version -viewer.utilityPane.signatures.cert.dialog.info.version.value=v{0} -viewer.utilityPane.signatures.cert.dialog.info.serialNumber.label=Serial Number -viewer.utilityPane.signatures.cert.dialog.info.serialNumber.value={0} -viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.label=Signature Algorithm -viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.value={0} -viewer.utilityPane.signatures.cert.dialog.info.issuer.label=Issuer -viewer.utilityPane.signatures.cert.dialog.info.issuer.value=Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6} -viewer.utilityPane.signatures.cert.dialog.info.validity.label=Validity -viewer.utilityPane.signatures.cert.dialog.info.validity.value=From: {0}\n To: {1} -viewer.utilityPane.signatures.cert.dialog.info.subject.label=Subject -viewer.utilityPane.signatures.cert.dialog.info.subject.value=Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6} -viewer.utilityPane.signatures.cert.dialog.info.signature.label=Signature -viewer.utilityPane.signatures.cert.dialog.info.md5.label=MD5 Fingerprint -viewer.utilityPane.signatures.cert.dialog.info.md5.value={0} -viewer.utilityPane.signatures.cert.dialog.info.sha1.label=SHA1 Fingerprint -viewer.utilityPane.signatures.cert.dialog.info.sha1.value={0} -viewer.utilityPane.signatures.verify.initializingMessage.label=Validating {0} of {1} Signatures -viewer.utilityPane.signatures.verify.completeMessage.label=Validating process complete -viewer.utilityPane.signatures.verify.validating.label=Validating signature... +viewer.utilityPane.signatures.cert.dialog.title = Certificate Details +viewer.utilityPane.signatures.cert.dialog.closeButton.label = Close +viewer.utilityPane.signatures.cert.dialog.closeButton.mnemonic = C +viewer.utilityPane.signatures.cert.dialog.info.notAvailable.label = N/A +viewer.utilityPane.signatures.cert.dialog.info.unknownSubject.label = N/A Subject +viewer.utilityPane.signatures.cert.dialog.info.unknownIssuer.label = N/A Issuer +viewer.utilityPane.signatures.cert.dialog.info.certificateInfo.label = {0} - {1} +viewer.utilityPane.signatures.cert.dialog.info.column1.label = Field +viewer.utilityPane.signatures.cert.dialog.info.column2.label = Value +viewer.utilityPane.signatures.cert.dialog.info.version.label = Version +viewer.utilityPane.signatures.cert.dialog.info.version.value = v{0} +viewer.utilityPane.signatures.cert.dialog.info.serialNumber.label = Serial Number +viewer.utilityPane.signatures.cert.dialog.info.serialNumber.value = {0} +viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.label = Signature Algorithm +viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.value = {0} +viewer.utilityPane.signatures.cert.dialog.info.issuer.label = Issuer +viewer.utilityPane.signatures.cert.dialog.info.issuer.value = \ + Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6} +viewer.utilityPane.signatures.cert.dialog.info.validity.label = Validity +viewer.utilityPane.signatures.cert.dialog.info.validity.value = From: {0}\n To: {1} +viewer.utilityPane.signatures.cert.dialog.info.subject.label = Subject +viewer.utilityPane.signatures.cert.dialog.info.subject.value = \ + Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6} +viewer.utilityPane.signatures.cert.dialog.info.signature.label = Signature +viewer.utilityPane.signatures.cert.dialog.info.md5.label = MD5 Fingerprint +viewer.utilityPane.signatures.cert.dialog.info.md5.value = {0} +viewer.utilityPane.signatures.cert.dialog.info.sha1.label = SHA1 Fingerprint +viewer.utilityPane.signatures.cert.dialog.info.sha1.value = {0} +viewer.utilityPane.signatures.verify.initializingMessage.label = Validating {0} of {1} Signatures +viewer.utilityPane.signatures.verify.completeMessage.label = Validating process complete +viewer.utilityPane.signatures.verify.validating.label = Validating signature... ## Annotation Tab -viewer.utilityPane.annotation.tab.title=Annotations +viewer.utilityPane.annotation.tab.title = Annotations ## Utility Pane Annotation Link Tab -viewer.utilityPane.annotation.link.appearance.title=Link Annotation -viewer.utilityPane.annotation.link.highlightType=Highlight Style: -viewer.utilityPane.annotation.link.none=None -viewer.utilityPane.annotation.link.invert=Invert` -viewer.utilityPane.annotation.link.outline=Outline -viewer.utilityPane.annotation.link.push=Push +viewer.utilityPane.annotation.link.appearance.title = Link Annotation +viewer.utilityPane.annotation.link.highlightType = Highlight Style: +viewer.utilityPane.annotation.link.none = None +viewer.utilityPane.annotation.link.invert = Invert` +viewer.utilityPane.annotation.link.outline = Outline +viewer.utilityPane.annotation.link.push = Push ## Utility Pane Annotation text markup Tab -viewer.utilityPane.annotation.textMarkup.appearance.title=Text Markup Annotation -viewer.utilityPane.annotation.textMarkup.highlightType=Type: -viewer.utilityPane.annotation.textMarkup.colorChooserTitle=MarKup Color -viewer.utilityPane.annotation.textMarkup.colorLabel=Color: -viewer.utilityPane.annotation.textMarkup.transparencyLabel=Transparency: +viewer.utilityPane.annotation.textMarkup.appearance.title = Text Markup Annotation +viewer.utilityPane.annotation.textMarkup.highlightType = Type: +viewer.utilityPane.annotation.textMarkup.colorChooserTitle = MarKup Color +viewer.utilityPane.annotation.textMarkup.colorLabel = Color: +viewer.utilityPane.annotation.textMarkup.transparencyLabel = Transparency: ## Utility Pane Annotation line Tab -viewer.utilityPane.annotation.line.appearance.title=Line Annotation -viewer.utilityPane.annotation.line.lineThickness=Line Thickness: -viewer.utilityPane.annotation.line.lineStyle=Line Style: -viewer.utilityPane.annotation.line.startStyle=Start: -viewer.utilityPane.annotation.line.endStyle=End: -viewer.utilityPane.annotation.line.colorChooserTitle=Line Color -viewer.utilityPane.annotation.line.colorInternalChooserTitle=Line Internal Color -viewer.utilityPane.annotation.line.colorLabel=Color: -viewer.utilityPane.annotation.line.colorInternalLabel=Fill Color: -viewer.utilityPane.annotation.line.end.none=None -viewer.utilityPane.annotation.line.end.openArrow=Open Arrow -viewer.utilityPane.annotation.line.end.closedArrow=Closed Arrow -viewer.utilityPane.annotation.line.end.diamond=Diamond -viewer.utilityPane.annotation.line.end.square=Square -viewer.utilityPane.annotation.line.end.circle=Circle -viewer.utilityPane.annotation.line.transparencyLabel=Transparency: +viewer.utilityPane.annotation.line.appearance.title = Line Annotation +viewer.utilityPane.annotation.line.lineThickness = Line Thickness: +viewer.utilityPane.annotation.line.lineStyle = Line Style: +viewer.utilityPane.annotation.line.startStyle = Start: +viewer.utilityPane.annotation.line.endStyle = End: +viewer.utilityPane.annotation.line.colorChooserTitle = Line Color +viewer.utilityPane.annotation.line.colorInternalChooserTitle = Line Internal Color +viewer.utilityPane.annotation.line.colorLabel = Color: +viewer.utilityPane.annotation.line.colorInternalLabel = Fill Color: +viewer.utilityPane.annotation.line.end.none = None +viewer.utilityPane.annotation.line.end.openArrow = Open Arrow +viewer.utilityPane.annotation.line.end.closedArrow = Closed Arrow +viewer.utilityPane.annotation.line.end.diamond = Diamond +viewer.utilityPane.annotation.line.end.square = Square +viewer.utilityPane.annotation.line.end.circle = Circle +viewer.utilityPane.annotation.line.transparencyLabel = Transparency: ## Utility Pane Annotation square Tab -viewer.utilityPane.annotation.square.appearance.title=Square Annotation -viewer.utilityPane.annotation.square.lineThickness=Border Thickness: -viewer.utilityPane.annotation.square.lineStyle=Border Style: -viewer.utilityPane.annotation.square.colorBorderChooserTitle=Border Color -viewer.utilityPane.annotation.square.colorInteriorChooserTitle=Fill Color -viewer.utilityPane.annotation.square.borderTypeLabel=Border Type: -viewer.utilityPane.annotation.square.colorBorderLabel=Border Color: -viewer.utilityPane.annotation.square.colorInteriorLabel=Fill Color: -viewer.utilityPane.annotation.square.fillTypeLabel=Fill Type: -viewer.utilityPane.annotation.square.transparencyLabel=Transparency: +viewer.utilityPane.annotation.square.appearance.title = Square Annotation +viewer.utilityPane.annotation.square.lineThickness = Border Thickness: +viewer.utilityPane.annotation.square.lineStyle = Border Style: +viewer.utilityPane.annotation.square.colorBorderChooserTitle = Border Color +viewer.utilityPane.annotation.square.colorInteriorChooserTitle = Fill Color +viewer.utilityPane.annotation.square.borderTypeLabel = Border Type: +viewer.utilityPane.annotation.square.colorBorderLabel = Border Color: +viewer.utilityPane.annotation.square.colorInteriorLabel = Fill Color: +viewer.utilityPane.annotation.square.fillTypeLabel = Fill Type: +viewer.utilityPane.annotation.square.transparencyLabel = Transparency: ## Utility Pane Annotation free text Tab -viewer.utilityPane.annotation.freeText.appearance.title=FreeText Annotation -viewer.utilityPane.annotation.freeText.font.name=Font Name: -viewer.utilityPane.annotation.freeText.font.style=Font Style: -viewer.utilityPane.annotation.freeText.font.size=Font Size: -viewer.utilityPane.annotation.freeText.font.color=Font Color: -viewer.utilityPane.annotation.freeText.font.color.ChooserTitle=Font Color -viewer.utilityPane.annotation.freeText.border.thickness=Border Thickness: -viewer.utilityPane.annotation.freeText.border.type=Border Type: -viewer.utilityPane.annotation.freeText.border.style=Border Style: -viewer.utilityPane.annotation.freeText.border.color=Border Color: -viewer.utilityPane.annotation.freeText.border.color.ChooserTitle=Border Color -viewer.utilityPane.annotation.freeText.fill.type=Fill Type: -viewer.utilityPane.annotation.freeText.fill.color=Fill Color: -viewer.utilityPane.annotation.freeText.transparencyLabel=Transparency: -viewer.utilityPane.annotation.freeText.fill.color.ChooserTitle=Fill Color -viewer.utilityPane.annotation.freeText.font.dialog=Dialog -viewer.utilityPane.annotation.freeText.font.dialogInput=DialogInput -viewer.utilityPane.annotation.freeText.font.monospaced=Monospaced -viewer.utilityPane.annotation.freeText.font.serif=Serif -viewer.utilityPane.annotation.freeText.font.sanSerif=SansSerif -viewer.utilityPane.annotation.freeText.font.style.plain=Plain -viewer.utilityPane.annotation.freeText.font.style.italic=Italic -viewer.utilityPane.annotation.freeText.font.style.bold=Bold -viewer.utilityPane.annotation.freeText.font.name.helvetica=Helvetica -viewer.utilityPane.annotation.freeText.font.name.helveticaOblique=Helvetica-Oblique -viewer.utilityPane.annotation.freeText.font.name.helveticaBold=Helvetica-Bold -viewer.utilityPane.annotation.freeText.font.name.HelveticaBoldOblique=Helvetica-BoldOblique -viewer.utilityPane.annotation.freeText.font.name.timesItalic=Times-Italic -viewer.utilityPane.annotation.freeText.font.name.timesBold=Times-Bold -viewer.utilityPane.annotation.freeText.font.name.timesBoldItalic=Times-BoldItalic -viewer.utilityPane.annotation.freeText.font.name.timesRoman=Times-Roman -viewer.utilityPane.annotation.freeText.font.name.courier=Courier -viewer.utilityPane.annotation.freeText.font.name.courierOblique=Courier-Oblique -viewer.utilityPane.annotation.freeText.font.name.courierBoldOblique=Courier-BoldOblique -viewer.utilityPane.annotation.freeText.font.name.courierBold=Courier-Bold +viewer.utilityPane.annotation.freeText.appearance.title = FreeText Annotation +viewer.utilityPane.annotation.freeText.font.name = Font Name: +viewer.utilityPane.annotation.freeText.font.style = Font Style: +viewer.utilityPane.annotation.freeText.font.size = Font Size: +viewer.utilityPane.annotation.freeText.font.color = Font Color: +viewer.utilityPane.annotation.freeText.font.color.ChooserTitle = Font Color +viewer.utilityPane.annotation.freeText.border.thickness = Border Thickness: +viewer.utilityPane.annotation.freeText.border.type = Border Type: +viewer.utilityPane.annotation.freeText.border.style = Border Style: +viewer.utilityPane.annotation.freeText.border.color = Border Color: +viewer.utilityPane.annotation.freeText.border.color.ChooserTitle = Border Color +viewer.utilityPane.annotation.freeText.fill.type = Fill Type: +viewer.utilityPane.annotation.freeText.fill.color = Fill Color: +viewer.utilityPane.annotation.freeText.transparencyLabel = Transparency: +viewer.utilityPane.annotation.freeText.fill.color.ChooserTitle = Fill Color +viewer.utilityPane.annotation.freeText.font.dialog = Dialog +viewer.utilityPane.annotation.freeText.font.dialogInput = DialogInput +viewer.utilityPane.annotation.freeText.font.monospaced = Monospaced +viewer.utilityPane.annotation.freeText.font.serif = Serif +viewer.utilityPane.annotation.freeText.font.sanSerif = SansSerif +viewer.utilityPane.annotation.freeText.font.style.plain = Plain +viewer.utilityPane.annotation.freeText.font.style.italic = Italic +viewer.utilityPane.annotation.freeText.font.style.bold = Bold +viewer.utilityPane.annotation.freeText.font.name.helvetica = Helvetica +viewer.utilityPane.annotation.freeText.font.name.helveticaOblique = Helvetica-Oblique +viewer.utilityPane.annotation.freeText.font.name.helveticaBold = Helvetica-Bold +viewer.utilityPane.annotation.freeText.font.name.HelveticaBoldOblique = Helvetica-BoldOblique +viewer.utilityPane.annotation.freeText.font.name.timesItalic = Times-Italic +viewer.utilityPane.annotation.freeText.font.name.timesBold = Times-Bold +viewer.utilityPane.annotation.freeText.font.name.timesBoldItalic = Times-BoldItalic +viewer.utilityPane.annotation.freeText.font.name.timesRoman = Times-Roman +viewer.utilityPane.annotation.freeText.font.name.courier = Courier +viewer.utilityPane.annotation.freeText.font.name.courierOblique = Courier-Oblique +viewer.utilityPane.annotation.freeText.font.name.courierBoldOblique = Courier-BoldOblique +viewer.utilityPane.annotation.freeText.font.name.courierBold = Courier-Bold ## Utility Pane Annotation text Tab -viewer.utilityPane.annotation.text.appearance.title=Text Annotation -viewer.utilityPane.annotation.text.iconName=Icon: -viewer.utilityPane.annotation.text.iconName.comment=Comment -viewer.utilityPane.annotation.text.iconName.check=Check -viewer.utilityPane.annotation.text.iconName.checkMark=CheckMark -viewer.utilityPane.annotation.text.iconName.circle=Circle -viewer.utilityPane.annotation.text.iconName.cross=Cross -viewer.utilityPane.annotation.text.iconName.crossHairs=CrossHairs -viewer.utilityPane.annotation.text.iconName.help=Help -viewer.utilityPane.annotation.text.iconName.insert=Insert -viewer.utilityPane.annotation.text.iconName.key=Key -viewer.utilityPane.annotation.text.iconName.newParagraph=NewParagraph -viewer.utilityPane.annotation.text.iconName.paragraph=Paragraph -viewer.utilityPane.annotation.text.iconName.rightArrow=RightArrow -viewer.utilityPane.annotation.text.iconName.rightPointer=RightPointer -viewer.utilityPane.annotation.text.iconName.star=Star -viewer.utilityPane.annotation.text.iconName.upArrow=UpArrow -viewer.utilityPane.annotation.text.iconName.upLeftArrow=UpLeftArrow +viewer.utilityPane.annotation.text.appearance.title = Text Annotation +viewer.utilityPane.annotation.text.iconName = Icon: +viewer.utilityPane.annotation.text.iconName.comment = Comment +viewer.utilityPane.annotation.text.iconName.check = Check +viewer.utilityPane.annotation.text.iconName.checkMark = CheckMark +viewer.utilityPane.annotation.text.iconName.circle = Circle +viewer.utilityPane.annotation.text.iconName.cross = Cross +viewer.utilityPane.annotation.text.iconName.crossHairs = CrossHairs +viewer.utilityPane.annotation.text.iconName.help = Help +viewer.utilityPane.annotation.text.iconName.insert = Insert +viewer.utilityPane.annotation.text.iconName.key = Key +viewer.utilityPane.annotation.text.iconName.newParagraph = NewParagraph +viewer.utilityPane.annotation.text.iconName.paragraph = Paragraph +viewer.utilityPane.annotation.text.iconName.rightArrow = RightArrow +viewer.utilityPane.annotation.text.iconName.rightPointer = RightPointer +viewer.utilityPane.annotation.text.iconName.star = Star +viewer.utilityPane.annotation.text.iconName.upArrow = UpArrow +viewer.utilityPane.annotation.text.iconName.upLeftArrow = UpLeftArrow ## Utility Pane Annotation circle Tab -viewer.utilityPane.annotation.circle.appearance.title=Circle Annotation -viewer.utilityPane.annotation.circle.lineThickness=Border Thickness: -viewer.utilityPane.annotation.circle.lineStyle=Border Style: -viewer.utilityPane.annotation.circle.colorBorderChooserTitle=Border Color -viewer.utilityPane.annotation.circle.colorInteriorChooserTitle=Interior Color -viewer.utilityPane.annotation.circle.colorBorderLabel=Border Color: -viewer.utilityPane.annotation.circle.colorInteriorLabel=Fill Color: -viewer.utilityPane.annotation.circle.fillTypeLabel=Fill Type: -viewer.utilityPane.annotation.circle.transparencyLabel=Transparency: +viewer.utilityPane.annotation.circle.appearance.title = Circle Annotation +viewer.utilityPane.annotation.circle.lineThickness = Border Thickness: +viewer.utilityPane.annotation.circle.lineStyle = Border Style: +viewer.utilityPane.annotation.circle.colorBorderChooserTitle = Border Color +viewer.utilityPane.annotation.circle.colorInteriorChooserTitle = Interior Color +viewer.utilityPane.annotation.circle.colorBorderLabel = Border Color: +viewer.utilityPane.annotation.circle.colorInteriorLabel = Fill Color: +viewer.utilityPane.annotation.circle.fillTypeLabel = Fill Type: +viewer.utilityPane.annotation.circle.transparencyLabel = Transparency: ## Utility Pane Annotation ink Tab -viewer.utilityPane.annotation.ink.appearance.title=Ink Annotation -viewer.utilityPane.annotation.ink.lineThickness=Ink Thickness: -viewer.utilityPane.annotation.ink.lineStyle=Ink Style: -viewer.utilityPane.annotation.ink.colorBorderChooserTitle=Ink Color -viewer.utilityPane.annotation.ink.colorBorderLabel=Ink Color: -viewer.utilityPane.annotation.ink.transparencyLabel=Transparency: +viewer.utilityPane.annotation.ink.appearance.title = Ink Annotation +viewer.utilityPane.annotation.ink.lineThickness = Ink Thickness: +viewer.utilityPane.annotation.ink.lineStyle = Ink Style: +viewer.utilityPane.annotation.ink.colorBorderChooserTitle = Ink Color +viewer.utilityPane.annotation.ink.colorBorderLabel = Ink Color: +viewer.utilityPane.annotation.ink.transparencyLabel = Transparency: ## Utility Pane border Tab -viewer.utilityPane.annotation.border.title=Border -viewer.utilityPane.annotation.border.linkType=Border Type: -viewer.utilityPane.annotation.border.lineThickness=Border Thickness: -viewer.utilityPane.annotation.border.lineStyle=Border Style: -viewer.utilityPane.annotation.border.colorChooserTitle=Border Color -viewer.utilityPane.annotation.border.colorLabel=Color: -viewer.utilityPane.annotation.border.borderType.visibleRectangle=Visible -viewer.utilityPane.annotation.border.borderType.invisibleRectangle=Invisible -viewer.utilityPane.annotation.border.solid=Solid -viewer.utilityPane.annotation.border.dashed=Dashed -viewer.utilityPane.annotation.border.beveled=Beveled -viewer.utilityPane.annotation.border.inset=Inset -viewer.utilityPane.annotation.border.underline=Underline +viewer.utilityPane.annotation.border.title = Border +viewer.utilityPane.annotation.border.linkType = Border Type: +viewer.utilityPane.annotation.border.lineThickness = Border Thickness: +viewer.utilityPane.annotation.border.lineStyle = Border Style: +viewer.utilityPane.annotation.border.colorChooserTitle = Border Color +viewer.utilityPane.annotation.border.colorLabel = Color: +viewer.utilityPane.annotation.border.borderType.visibleRectangle = Visible +viewer.utilityPane.annotation.border.borderType.invisibleRectangle = Invisible +viewer.utilityPane.annotation.border.solid = Solid +viewer.utilityPane.annotation.border.dashed = Dashed +viewer.utilityPane.annotation.border.beveled = Beveled +viewer.utilityPane.annotation.border.inset = Inset +viewer.utilityPane.annotation.border.underline = Underline ## Utility Pane border Tab -viewer.utilityPane.annotation.flags.title=Flags -viewer.utilityPane.annotation.flags.noRotate=No Rotate: -viewer.utilityPane.annotation.flags.noZoom=No Zoom: -viewer.utilityPane.annotation.flags.readOnly=Read Only: -viewer.utilityPane.annotation.flags.printable=Printable: -viewer.utilityPane.annotation.flags.yes=Printable: -viewer.utilityPane.annotation.flags.enabled=Enabled -viewer.utilityPane.annotation.flags.disabled=Disabled +viewer.utilityPane.annotation.flags.title = Flags +viewer.utilityPane.annotation.flags.noRotate = No Rotate: +viewer.utilityPane.annotation.flags.noZoom = No Zoom: +viewer.utilityPane.annotation.flags.readOnly = Read Only: +viewer.utilityPane.annotation.flags.printable = Printable: +viewer.utilityPane.annotation.flags.yes = Printable: +viewer.utilityPane.annotation.flags.enabled = Enabled +viewer.utilityPane.annotation.flags.disabled = Disabled ## annotation action pane and dialogs. -viewer.utilityPane.action.selectionTitle=Action -viewer.utilityPane.action.addAction=Add -viewer.utilityPane.action.editAction=Edit -viewer.utilityPane.action.removeAction=Remove -viewer.utilityPane.action.type.destination.label=Destination -viewer.utilityPane.action.type.uriAction.label=URI Action -viewer.utilityPane.action.type.goToAction.label=GoTo Action -viewer.utilityPane.action.type.launchAction.label=Launch Action -viewer.utilityPane.action.dialog.new.title=Add New Action -viewer.utilityPane.action.dialog.new.msgs=Action Type: -viewer.utilityPane.action.dialog.delete.title=Delete Confirmation -viewer.utilityPane.action.dialog.delete.msgs=Are you sure your want to delete this action? +viewer.utilityPane.action.selectionTitle = Action +viewer.utilityPane.action.addAction = Add +viewer.utilityPane.action.editAction = Edit +viewer.utilityPane.action.removeAction = Remove +viewer.utilityPane.action.type.destination.label = Destination +viewer.utilityPane.action.type.uriAction.label = URI Action +viewer.utilityPane.action.type.goToAction.label = GoTo Action +viewer.utilityPane.action.type.launchAction.label = Launch Action +viewer.utilityPane.action.dialog.new.title = Add New Action +viewer.utilityPane.action.dialog.new.msgs = Action Type: +viewer.utilityPane.action.dialog.delete.title = Delete Confirmation +viewer.utilityPane.action.dialog.delete.msgs = Are you sure your want to delete this action? ## uri action dialog test -viewer.utilityPane.action.dialog.uri.title=URI Action Properties -viewer.utilityPane.action.dialog.uri.msgs=URI: +viewer.utilityPane.action.dialog.uri.title = URI Action Properties +viewer.utilityPane.action.dialog.uri.msgs = URI: ## launch action dialog test -viewer.utilityPane.action.dialog.launch.title=Launch Action Properties -viewer.utilityPane.action.dialog.launch.msgs=File Path: +viewer.utilityPane.action.dialog.launch.title = Launch Action Properties +viewer.utilityPane.action.dialog.launch.msgs = File Path: ## GoTo action dialog text -viewer.utilityPane.action.dialog.goto.title=GoTo Action Properties -viewer.utilityPane.action.dialog.goto.page.label=Page: -viewer.utilityPane.action.dialog.goto.type.label=Type -viewer.utilityPane.action.dialog.goto.type.xyz.label=Absolute -viewer.utilityPane.action.dialog.goto.type.fit.label=Fit Page -viewer.utilityPane.action.dialog.goto.type.fith.label=Fit Top Width -viewer.utilityPane.action.dialog.goto.type.fitv.label=Fit Left Width -viewer.utilityPane.action.dialog.goto.type.fitr.label=Fit Zoom Box -viewer.utilityPane.action.dialog.goto.type.fitb.label=Fit Page Bounds -viewer.utilityPane.action.dialog.goto.type.fitbh.label=Fit Bounds Top -viewer.utilityPane.action.dialog.goto.type.fitbv.label=Fit Bounds Left -viewer.utilityPane.action.dialog.goto.right.label=Right: -viewer.utilityPane.action.dialog.goto.left.label=Left: -viewer.utilityPane.action.dialog.goto.top.label=Top: -viewer.utilityPane.action.dialog.goto.bottom.label=Bottom: -viewer.utilityPane.action.dialog.goto.zoom.label=Zoom: -viewer.utilityPane.action.dialog.goto.unassigned.label=NaN -viewer.utilityPane.action.dialog.goto.current.label=Current View: -viewer.utilityPane.action.dialog.goto.current=Set Location -viewer.utilityPane.action.dialog.goto.name.label=Name: -viewer.utilityPane.action.dialog.goto.browse=Browse... -viewer.utilityPane.action.dialog.goto.explicitDestination.title=Implicit Destination -viewer.utilityPane.action.dialog.goto.nameDestination.title=Named Destination +viewer.utilityPane.action.dialog.goto.title = GoTo Action Properties +viewer.utilityPane.action.dialog.goto.page.label = Page: +viewer.utilityPane.action.dialog.goto.type.label = Type +viewer.utilityPane.action.dialog.goto.type.xyz.label = Absolute +viewer.utilityPane.action.dialog.goto.type.fit.label = Fit Page +viewer.utilityPane.action.dialog.goto.type.fith.label = Fit Top Width +viewer.utilityPane.action.dialog.goto.type.fitv.label = Fit Left Width +viewer.utilityPane.action.dialog.goto.type.fitr.label = Fit Zoom Box +viewer.utilityPane.action.dialog.goto.type.fitb.label = Fit Page Bounds +viewer.utilityPane.action.dialog.goto.type.fitbh.label = Fit Bounds Top +viewer.utilityPane.action.dialog.goto.type.fitbv.label = Fit Bounds Left +viewer.utilityPane.action.dialog.goto.right.label = Right: +viewer.utilityPane.action.dialog.goto.left.label = Left: +viewer.utilityPane.action.dialog.goto.top.label = Top: +viewer.utilityPane.action.dialog.goto.bottom.label = Bottom: +viewer.utilityPane.action.dialog.goto.zoom.label = Zoom: +viewer.utilityPane.action.dialog.goto.unassigned.label = NaN +viewer.utilityPane.action.dialog.goto.current.label = Current View: +viewer.utilityPane.action.dialog.goto.current = Set Location +viewer.utilityPane.action.dialog.goto.name.label = Name: +viewer.utilityPane.action.dialog.goto.browse = Browse... +viewer.utilityPane.action.dialog.goto.explicitDestination.title = Implicit Destination +viewer.utilityPane.action.dialog.goto.nameDestination.title = Named Destination # Destination Named Tree -viewer.utilityPane.action.dialog.goto.nameTree.title=Document Name Tree -viewer.utilityPane.action.dialog.goto.nameTree.root.label=Name Tree -viewer.utilityPane.action.dialog.goto.nameTree.branch.label={0} to {1} +viewer.utilityPane.action.dialog.goto.nameTree.title = Document Name Tree +viewer.utilityPane.action.dialog.goto.nameTree.root.label = Name Tree +viewer.utilityPane.action.dialog.goto.nameTree.branch.label = {0} to {1} ## Utility Pane Search Tab -viewer.utilityPane.search.tab.title=Search -viewer.utilityPane.search.searchText.label=Search Text: -viewer.utilityPane.search.results.label=Results: -viewer.utilityPane.search.searchButton.label=Search -viewer.utilityPane.search.clearSearchButton.label=Clear -viewer.utilityPane.search.caseSenstiveCheckbox.label=Case-sensitive -viewer.utilityPane.search.wholeWordCheckbox.label=Whole words only -viewer.utilityPane.search.cumlitiveCheckbox.label=Cumulative -viewer.utilityPane.search.showPagesCheckbox.label=Show Pages -viewer.utilityPane.search.stopButton.label=Stop -viewer.utilityPane.search.searching.msg=Search... +viewer.utilityPane.search.tab.title = Search +viewer.utilityPane.search.searchText.label = Search Text: +viewer.utilityPane.search.results.label = Results: +viewer.utilityPane.search.searchButton.label = Search +viewer.utilityPane.search.clearSearchButton.label = Clear +viewer.utilityPane.search.caseSenstiveCheckbox.label = Case-sensitive +viewer.utilityPane.search.wholeWordCheckbox.label = Whole words only +viewer.utilityPane.search.cumlitiveCheckbox.label = Cumulative +viewer.utilityPane.search.showPagesCheckbox.label = Show Pages +viewer.utilityPane.search.stopButton.label = Stop +viewer.utilityPane.search.searching.msg = Search... # Searching x out of y page(s) -viewer.utilityPane.search.searching1.msg=Searching {0} out of {1} -viewer.utilityPane.search.searching1.oneFile.msg={2} page -viewer.utilityPane.search.searching1.moreFile.msg={2} pages +viewer.utilityPane.search.searching1.msg = \ + Searching {0} out of {1} +viewer.utilityPane.search.searching1.oneFile.msg = {2} page +viewer.utilityPane.search.searching1.moreFile.msg = {2} pages # Page x (y result(s)) -viewer.utilityPane.search.result.msg=Page {0} ({1}) -viewer.utilityPane.search.result.oneFile.msg={2} result -viewer.utilityPane.search.result.moreFile.msg={2} results +viewer.utilityPane.search.result.msg = Page {0} ({1}) +viewer.utilityPane.search.result.oneFile.msg = {2} result +viewer.utilityPane.search.result.moreFile.msg = {2} results # Searched x page(s) (y matches) -viewer.utilityPane.search.progress.msg=Searched {0} {1} ({2}) -viewer.utilityPane.search.progress.onePage.msg=page -viewer.utilityPane.search.progress.morePage.msg=pages -viewer.utilityPane.search.progress.oneMatch.msg={2} match -viewer.utilityPane.search.progress.moreMatch.msg={2} matches +viewer.utilityPane.search.progress.msg = \ + Searched {0} {1} ({2}) +viewer.utilityPane.search.progress.onePage.msg = page +viewer.utilityPane.search.progress.morePage.msg = pages +viewer.utilityPane.search.progress.oneMatch.msg = {2} match +viewer.utilityPane.search.progress.moreMatch.msg = {2} matches ## Popup Annotation component -viewer.annotation.popup.reply.label=Reply -viewer.annotation.popup.delete.label=Delete -viewer.annotation.popup.status.label=Set Status -viewer.annotation.popup.status.accepted.label=Accepted -viewer.annotation.popup.status.cancelled.label=Cancelled -viewer.annotation.popup.status.completed.label=Completed -viewer.annotation.popup.status.rejected.label=Rejected -viewer.annotation.popup.status.none.label=None -viewer.annotation.popup.openAll.label=Open all Popups -viewer.annotation.popup.minimizeAll.label=Minimize Popups -viewer.annotation.popup.replyTo.label=Re: {0} -viewer.annotation.popup.status.none.title=None: {0} -viewer.annotation.popup.status.none.msg=None set by {0} -viewer.annotation.popup.status.accepted.title=Accepted: {0} -viewer.annotation.popup.status.accepted.msg=Accepted set by {0} -viewer.annotation.popup.status.cancelled.title=Cancelled: {0} -viewer.annotation.popup.status.cancelled.msg=Cancelled set by {0} -viewer.annotation.popup.status.completed.title=Completed: {0} -viewer.annotation.popup.status.completed.msg=Completed set by {0} -viewer.annotation.popup.status.rejected.title=Rejected: {0} -viewer.annotation.popup.status.rejected.msg=Rejected set by {0} +viewer.annotation.popup.reply.label = Reply +viewer.annotation.popup.delete.label = Delete +viewer.annotation.popup.status.label = Set Status +viewer.annotation.popup.status.accepted.label = Accepted +viewer.annotation.popup.status.cancelled.label = Cancelled +viewer.annotation.popup.status.completed.label = Completed +viewer.annotation.popup.status.rejected.label = Rejected +viewer.annotation.popup.status.none.label = None +viewer.annotation.popup.openAll.label = Open all Popups +viewer.annotation.popup.minimizeAll.label = Minimize Popups +viewer.annotation.popup.replyTo.label = Re: {0} +viewer.annotation.popup.status.none.title = None: {0} +viewer.annotation.popup.status.none.msg = None set by {0} +viewer.annotation.popup.status.accepted.title = Accepted: {0} +viewer.annotation.popup.status.accepted.msg = Accepted set by {0} +viewer.annotation.popup.status.cancelled.title = Cancelled: {0} +viewer.annotation.popup.status.cancelled.msg = Cancelled set by {0} +viewer.annotation.popup.status.completed.title = Completed: {0} +viewer.annotation.popup.status.completed.msg = Completed set by {0} +viewer.annotation.popup.status.rejected.title = Rejected: {0} +viewer.annotation.popup.status.rejected.msg = Rejected set by {0} ## Signature component -viewer.annotation.signature.menu.validateSignature.label=Validate Signature -viewer.annotation.signature.menu.showCertificates.label=Show Certificate Properties -viewer.annotation.signature.menu.signatureProperties.label=Show Signature Properties -viewer.annotation.signature.menu.signaturePageNavigation.label=Go to Page... +viewer.annotation.signature.menu.validateSignature.label = Validate Signature +viewer.annotation.signature.menu.showCertificates.label = Show Certificate Properties +viewer.annotation.signature.menu.signatureProperties.label = Show Signature Properties +viewer.annotation.signature.menu.signaturePageNavigation.label = Go to Page... ## Signature validation dialog. -viewer.annotation.signature.validation.dialog.title=Signature Validation Summary -viewer.annotation.signature.validation.dialog.close.button.label=Close -viewer.annotation.signature.validation.dialog.signerProperties.button.label=Signature Properties... +viewer.annotation.signature.validation.dialog.title = Signature Validation Summary +viewer.annotation.signature.validation.dialog.close.button.label = Close +viewer.annotation.signature.validation.dialog.signerProperties.button.label = Signature Properties... # common validation messages -viewer.annotation.signature.validation.common.invalid.label=Signature is invalid: -viewer.annotation.signature.validation.common.unknown.label=Signature is valid: -viewer.annotation.signature.validation.common.valid.label=Signature validity is unknown: -viewer.annotation.signature.validation.common.signedBy.label=- Signed by {0} {1} -viewer.annotation.signature.validation.common.doc.modified.label=- This version of the document is unaltered but subsequent changes have been made -viewer.annotation.signature.validation.common.doc.unmodified.label=- Document has not been modified since it was signed -viewer.annotation.signature.validation.common.doc.major.label=- Document has been altered or corrupted since it was signed -viewer.annotation.signature.validation.common.identity.unknown.label=- Signer's identity is unknown because it could not be found in your keystore -viewer.annotation.signature.validation.common.identity.unchecked.label=- Signature is valid, but revocation of the signer's identity could not be checked -viewer.annotation.signature.validation.common.identity.valid.label=- Signer's identity is valid -viewer.annotation.signature.validation.common.time.local.label=- Signing time is from the clock on this signer's computer -viewer.annotation.signature.validation.common.time.embedded.label=- Signature included an embedded timestamp but it could not be validated -viewer.annotation.signature.validation.common.notAvailable.label=N/A +viewer.annotation.signature.validation.common.invalid.label = Signature is invalid: +viewer.annotation.signature.validation.common.unknown.label = Signature is valid: +viewer.annotation.signature.validation.common.valid.label = Signature validity is unknown: +viewer.annotation.signature.validation.common.signedBy.label = - Signed by {0} {1} +viewer.annotation.signature.validation.common.doc.modified.label = \ + - This version of the document is unaltered but subsequent changes have been made +viewer.annotation.signature.validation.common.doc.unmodified.label = - Document has not been modified since it was signed +viewer.annotation.signature.validation.common.doc.major.label = - Document has been altered or corrupted since it was signed +viewer.annotation.signature.validation.common.identity.unknown.label = \ + - Signer's identity is unknown because it could not be found in your keystore +viewer.annotation.signature.validation.common.identity.unchecked.label = \ + - Signature is valid, but revocation of the signer's identity could not be checked +viewer.annotation.signature.validation.common.identity.valid.label = - Signer's identity is valid +viewer.annotation.signature.validation.common.time.local.label = - Signing time is from the clock on this signer's computer +viewer.annotation.signature.validation.common.time.embedded.label = \ + - Signature included an embedded timestamp but it could not be validated +viewer.annotation.signature.validation.common.notAvailable.label = N/A ## Signatures properties Dialog. -viewer.annotation.signature.properties.dialog.title=Signature Properties -viewer.annotation.signature.properties.dialog.invalid.label=Signature is invalid -viewer.annotation.signature.properties.dialog.unknown.label=Signature is valid -viewer.annotation.signature.properties.dialog.valid.label=Signature validity is unknown -viewer.annotation.signature.properties.dialog.signedBy.label=Signed by {0} {1} -viewer.annotation.signature.properties.dialog.signingTime.label=Signed time: {0} -viewer.annotation.signature.properties.dialog.reason.label=Reason: {0} -viewer.annotation.signature.properties.dialog.location.label=Location: {0} +viewer.annotation.signature.properties.dialog.title = Signature Properties +viewer.annotation.signature.properties.dialog.invalid.label = Signature is invalid +viewer.annotation.signature.properties.dialog.unknown.label = Signature is valid +viewer.annotation.signature.properties.dialog.valid.label = Signature validity is unknown +viewer.annotation.signature.properties.dialog.signedBy.label = Signed by {0} {1} +viewer.annotation.signature.properties.dialog.signingTime.label = Signed time: {0} +viewer.annotation.signature.properties.dialog.reason.label = Reason: {0} +viewer.annotation.signature.properties.dialog.location.label = Location: {0} # SignatureSigner Info -viewer.annotation.signature.properties.dialog.pathValidation.success=- Path validation checks were successful. -viewer.annotation.signature.properties.dialog.pathValidation.failure=- Path validation checks were unsuccessful. -viewer.annotation.signature.properties.dialog.revocation.success=- Signer's certificate is valid and has not been revoked. -viewer.annotation.signature.properties.dialog.revocation.failure=- Revocation checking was not performed. -viewer.annotation.signature.properties.dialog.certificateExpired.failure=- Signer certificate has expired. -viewer.annotation.signature.properties.dialog.showCertificates.label=Signer's Certificate... -viewer.annotation.signature.properties.dialog.validity.title=Validity Summary -viewer.annotation.signature.properties.dialog.signerInfo.title=Signer Info +viewer.annotation.signature.properties.dialog.pathValidation.success = - Path validation checks were successful. +viewer.annotation.signature.properties.dialog.pathValidation.failure = - Path validation checks were unsuccessful. +viewer.annotation.signature.properties.dialog.revocation.success = - Signer's certificate is valid and has not been revoked. +viewer.annotation.signature.properties.dialog.revocation.failure = - Revocation checking was not performed. +viewer.annotation.signature.properties.dialog.certificateExpired.failure = - Signer certificate has expired. +viewer.annotation.signature.properties.dialog.showCertificates.label = Signer's Certificate... +viewer.annotation.signature.properties.dialog.validity.title = Validity Summary +viewer.annotation.signature.properties.dialog.signerInfo.title = Signer Info ## Common Button Labels -viewer.button.ok.label=Ok -viewer.button.ok.mnemonic=O -viewer.button.cancel.label=Cancel -viewer.button.cancel.mnemonic=C +viewer.button.ok.label = Ok +viewer.button.ok.mnemonic = O +viewer.button.cancel.label = Cancel +viewer.button.cancel.mnemonic = C ## Pilot Specific Mesages -pilot.title=ICEbrowser - ICEpdf Pilot Errror -pilot.loading.msg=Opening document {0} ... -pilot.display.msg=Displaying {0} -pilot.loading.error.msg=PDF Pilot: Failed to load {0}. -pilot.error.classLoading=Required class {0} not found. Required library 'icepdf.jar' may not be on the classpath - PDF Pilot disabled."; +pilot.title = ICEbrowser - ICEpdf Pilot Errror +pilot.loading.msg =Opening document {0} ... +pilot.display.msg = Displaying {0} +pilot.loading.error.msg = PDF Pilot: Failed to load {0}. +pilot.error.classLoading = Required class {0} not found. Required library \ + 'icepdf.jar' may not be on the classpath - PDF Pilot disabled."; ### # General Error Messages # Command Line Errors -viewer.commandLin.error=Usage: java org.icepdf.ri.viewer.Main [-loadfile ] [-loadurl ] +viewer.commandLin.error = \ + Usage: java org.icepdf.ri.viewer.Main [-loadfile ] [-loadurl ] # Launcher errors -viewer.launcher.URLError.dialog.title=ICEsoft ICEpdf -viewer.launcher.URLError.dialog.message=ICEpdf could not open the specified file. {0} at URL: {1}. -viewer.launcher.lookAndFeel.error.message=The specified look-and-feel ({0}) is not accessible from this platform. +viewer.launcher.URLError.dialog.title =ICEsoft ICEpdf +viewer.launcher.URLError.dialog.message = ICEpdf could not open the specified file. {0} at URL: {1}. +viewer.launcher.lookAndFeel.error.message = The specified look-and-feel ({0}) is not accessible from this platform. # Pilot Loading Errors ### parser error dialogs -parse.title=Properties Parsing Error -parse.integer=Warning : {0} is not a correct integer. -parse.float=Warning : {0} is not a correct float. -parse.double=Warning : {0} is not a correct double. -parse.choice=Warning : {0} is not a valid choice. -parse.laf=Warning : look-and-feel {0} is not supported. +parse.title = Properties Parsing Error +parse.integer = Warning : {0} is not a correct integer. +parse.float = Warning : {0} is not a correct float. +parse.double = Warning : {0} is not a correct double. +parse.choice = Warning : {0} is not a valid choice. +parse.laf = Warning : look-and-feel {0} is not supported. ### Properties Manager Errors -manager.properties.title=ICEpdf Properties Manager -fontManager.properties.title=ICEpdf Font Manager +manager.properties.title = ICEpdf Properties Manager +fontManager.properties.title = ICEpdf Font Manager -manager.properties.createNewDirectory=To create the directory {0},\nwhere the ICEpdf Viewer will store changes to its setup, click Yes.\n\nIf you click "No", all changes you make to the ICEpdf Viewer setup\nwill be lost when you quit the application. \n\n +manager.properties.createNewDirectory = \ + To create the directory {0},\n\ + where the ICEpdf Viewer will store changes to its setup, click Yes.\n\n\ + If you click "No", all changes you make to the ICEpdf Viewer setup\n\ + will be lost when you quit the application. \n\n -manager.properties.failedCreation=ICEpdf Viewer directory to store user data can not be created:\n{0}\nICEpdf Viewer will not save changes to its default setup. +manager.properties.failedCreation = \ + ICEpdf Viewer directory to store user data can not be created:\n\ + {0}\n\ + ICEpdf Viewer will not save changes to its default setup. -manager.properties.session.nolock=Error creating the lock file :\n{0}\n +manager.properties.session.nolock = \ + Error creating the lock file :\n\ + {0}\n -manager.properties.session.readError=Error loading properties file: \n{0} +manager.properties.session.readError = \ + Error loading properties file: \n\ + {0} -manager.properties.deleted=Property file has been deleted\n({0})\nRecreate it ? +manager.properties.deleted = Property file has been deleted\n\ + ({0})\n\ + Recreate it ? -manager.properties.modified=Property file has been modified since last update\n({0,date,long})\nWould you like to merge changes in the file with the current properties? +manager.properties.modified = Property file has been modified since last update\n\ +({0,date,long})\n\ +Would you like to merge changes in the file with the current properties? -manager.properties.saveError=Impossible to save property file.\nEncountered the folowing error :\n{0} +manager.properties.saveError = Impossible to save property file.\n\ +Encountered the folowing error :\n\ +{0} -manager.properties.lafError=Look&Feel {0} given in the default properties is unsupported.\nUsing system default. +manager.properties.lafError =\ + Look&Feel {0} given in the default properties is unsupported.\n\ + Using system default. -manager.properties.brokenProperty=Broken default property {0} value: {1} +manager.properties.brokenProperty = Broken default property {0} value: {1} -manager.properties.missingProperty=Missing default property {0} value: {1} +manager.properties.missingProperty = Missing default property {0} value: {1} diff --git a/Core/src/org/sleuthkit/autopsy/core/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/core/Bundle.properties-MERGED index 681c169bcb..cd9d1002cd 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/corecomponents/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED index e0f806367a..16fa8d0e5f 100755 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle.properties-MERGED @@ -75,9 +75,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-2020.
+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 @@ -105,7 +105,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 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/datamodel/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED index d8c0156f6a..6d7a1dc7ff 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED @@ -274,10 +274,10 @@ ImageNode.getActions.viewInNewWin.text=View in New Window ImageNode.createSheet.name.name=Name ImageNode.createSheet.name.displayName=Name ImageNode.createSheet.name.desc=no description -Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI test call returned without error, but version string was null! -Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI test call returned without error, but version string was ""! -Installer.tskLibErr.msg=Problem with Sleuth Kit JNI. Test call failed!\n\nDetails: {0} -Installer.tskLibErr.err=Fatal Error! +Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI test call returned without error, but version string was null\! +Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI test call returned without error, but version string was ""\! +Installer.tskLibErr.msg=Problem with Sleuth Kit JNI. Test call failed\!\n\nDetails: {0} +Installer.tskLibErr.err=Fatal Error\! InterestingHits.interestingItems.text=INTERESTING ITEMS InterestingHits.displayName.text=Interesting Items InterestingHits.createSheet.name.name=Name @@ -376,10 +376,6 @@ TagNode.propertySheet.origNameDisplayName=Original Name TagsNode.displayName.text=Tags TagsNode.createSheet.name.name=Name TagsNode.createSheet.name.displayName=Name -UnsupportedContentNode.createSheet.name.desc=no description -UnsupportedContentNode.createSheet.name.displayName=Name -UnsupportedContentNode.createSheet.name.name=Name -UnsupportedContentNode.displayName=Unsupported Content ViewsNode.name.text=Views ViewsNode.createSheet.name.name=Name ViewsNode.createSheet.name.displayName=Name diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED index 0ab883cbd4..c648387016 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED @@ -59,7 +59,6 @@ SelectionContext.views=Views ViewContextAction.errorMessage.cannotFindDirectory=Failed to locate directory. ViewContextAction.errorMessage.cannotFindNode=Failed to locate data source node in tree. ViewContextAction.errorMessage.cannotSelectDirectory=Failed to select directory in tree. -ViewContextAction.errorMessage.unsupportedParent=Unable to navigate to content not supported in this release. VolumeDetailsPanel.volumeIDLabel.text=Volume ID: VolumeDetailsPanel.volumeIDValue.text=... VolumeDetailsPanel.startValue.text=... diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED index 4f0fdfbb56..93c5ed7987 100755 --- a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED @@ -16,7 +16,7 @@ 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.createdCheckBox.text=Created @@ -57,7 +57,7 @@ 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 diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED index 41964b300e..65d3ba064d 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED @@ -1,8 +1,4 @@ CTL_RunIngestAction=Run Ingest -CustomGPSIngestModule_Description=Just makes a few custom artifacts with GPS data -CustomGPSIngestModule_Name=Custom GPS Module -# {0} - AbstractFileName -CustomGPSIngestModule_process_start=Started {0} FileIngestPipeline_SaveResults_Activity=Saving Results IngestJobSettingsPanel.IngestModulesTableRenderer.info.message=A previous version of this ingest module has been run before on this data source. IngestJobSettingsPanel.IngestModulesTableRenderer.warning.message=This ingest module has been run before on this data source. @@ -146,7 +142,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/modules/embeddedfileextractor/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties-MERGED index e8411caa04..efee783e8f 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties-MERGED @@ -12,7 +12,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} 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/hashdatabase/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties-MERGED index 8dbb55e35f..dd5aa258cc 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties-MERGED @@ -61,7 +61,10 @@ ImportCentralRepoDbProgressDialog.errorParsingFile.message=Error parsing hash se ImportCentralRepoDbProgressDialog.linesProcessed.message=\ hashes processed ImportCentralRepoDbProgressDialog.title.text=Central Repository Import Progress OpenIDE-Module-Display-Category=Ingest Module -OpenIDE-Module-Long-Description=Hash Set ingest module. \n\nThe ingest module analyzes files in the disk image and marks them as "known" (based on NSRL hashset lookup for "known" files) and "bad / interesting" (based on one or more hash sets supplied by the user).\n\nThe module also contains additional non-ingest tools that are integrated in the GUI, such as file lookup by hash and hash set configuration. +OpenIDE-Module-Long-Description=\ + Hash Set ingest module. \n\n\ + The ingest module analyzes files in the disk image and marks them as "known" (based on NSRL hashset lookup for "known" files) and "bad / interesting" (based on one or more hash sets supplied by the user).\n\n\ + The module also contains additional non-ingest tools that are integrated in the GUI, such as file lookup by hash and hash set configuration. OpenIDE-Module-Name=HashDatabases OptionsCategory_Name_HashDatabase=Hash Sets OptionsCategory_Keywords_HashDatabase=Hash Sets @@ -188,7 +191,10 @@ HashDbSearchThread.name.searching=Searching HashDbSearchThread.noMoreFilesWithMD5Msg=No other files with the same MD5 hash were found. ModalNoButtons.indexingDbsTitle=Indexing hash sets ModalNoButtons.indexingDbTitle=Indexing hash set -ModalNoButtons.exitHashDbIndexingMsg=You are about to exit out of indexing your hash sets. \nThe generated index will be left unusable. If you choose to continue,\nplease delete the corresponding -md5.idx file in the hash folder.\nExit indexing? +ModalNoButtons.exitHashDbIndexingMsg=You are about to exit out of indexing your hash sets. \n\ +The generated index will be left unusable. If you choose to continue,\n\ + please delete the corresponding -md5.idx file in the hash folder.\n\ + Exit indexing? ModalNoButtons.dlgTitle.unfinishedIndexing=Unfinished Indexing ModalNoButtons.indexThis.currentlyIndexing1Db=Currently indexing 1 hash set ModalNoButtons.indexThese.currentlyIndexing1OfNDbs=Currently indexing 1 of {0} 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 06699b446a..6fb258f014 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties-MERGED @@ -122,8 +122,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 diff --git a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties-MERGED index a07ed802be..f46304e2be 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/leappanalyzers/Bundle.properties-MERGED @@ -34,11 +34,7 @@ ILeappAnalyzerIngestModule.running.iLeapp=Running iLeapp ILeappAnalyzerIngestModule.starting.iLeapp=Starting iLeapp ILeappAnalyzerModuleFactory_moduleDesc=Uses iLEAPP to analyze logical acquisitions of iOS devices. ILeappAnalyzerModuleFactory_moduleName=iOS Analyzer (iLEAPP) -LeappFileProcessor.cannot.create.calllog.relationship=Cannot create TSK_CALLLOG Relationship. -LeappFileProcessor.cannot.create.contact.relationship=Cannot create TSK_CONTACT Relationship. LeappFileProcessor.cannot.create.message.relationship=Cannot create TSK_MESSAGE Relationship. -LeappFileProcessor.cannot.create.trackpoint.relationship=Cannot create TSK_TRACK_POINT artifact. -LeappFileProcessor.cannot.create.waypoint.relationship=Cannot create TSK_WAYPOINT artifact. LeappFileProcessor.cannot.load.artifact.xml=Cannot load xml artifact file. LeappFileProcessor.cannotBuildXmlParser=Cannot buld an XML parser. LeappFileProcessor.completed=Leapp Processing Completed 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 f5dd54dc50..1d07988e4c 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle.properties-MERGED @@ -24,7 +24,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/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED index b796a16d26..4538c2836c 100755 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED @@ -13,7 +13,6 @@ ChromeCacheExtractor.progressMsg={0}: Extracting cache entry {1} of {2} entries 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 DefaultPriorityDomainCategorizer_searchEngineCategory=Search Engine From 8eeaaf17c573f74d2f5afe36e4e7334cc164cc51 Mon Sep 17 00:00:00 2001 From: apriestman Date: Tue, 13 Apr 2021 11:15:43 -0400 Subject: [PATCH 18/21] Update merged files --- .../org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED | 4 ++++ .../sleuthkit/autopsy/directorytree/Bundle.properties-MERGED | 1 + 2 files changed, 5 insertions(+) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED index 6d7a1dc7ff..d2a7f32bf7 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED @@ -376,6 +376,10 @@ TagNode.propertySheet.origNameDisplayName=Original Name TagsNode.displayName.text=Tags TagsNode.createSheet.name.name=Name TagsNode.createSheet.name.displayName=Name +UnsupportedContentNode.createSheet.name.desc=no description +UnsupportedContentNode.createSheet.name.displayName=Name +UnsupportedContentNode.createSheet.name.name=Name +UnsupportedContentNode.displayName=Unsupported Content ViewsNode.name.text=Views ViewsNode.createSheet.name.name=Name ViewsNode.createSheet.name.displayName=Name diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED index c648387016..0ab883cbd4 100755 --- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle.properties-MERGED @@ -59,6 +59,7 @@ SelectionContext.views=Views ViewContextAction.errorMessage.cannotFindDirectory=Failed to locate directory. ViewContextAction.errorMessage.cannotFindNode=Failed to locate data source node in tree. ViewContextAction.errorMessage.cannotSelectDirectory=Failed to select directory in tree. +ViewContextAction.errorMessage.unsupportedParent=Unable to navigate to content not supported in this release. VolumeDetailsPanel.volumeIDLabel.text=Volume ID: VolumeDetailsPanel.volumeIDValue.text=... VolumeDetailsPanel.startValue.text=... From b5c841a1d9035564cfc0cda04f0a1993a533e5de Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 13 Apr 2021 11:41:07 -0400 Subject: [PATCH 19/21] 7471 perform case opening on background thread --- .../casemodule/StartupWindowProvider.java | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java index 4d8c5ac538..7b3040e778 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java @@ -24,6 +24,7 @@ import java.nio.charset.Charset; import java.util.Collection; import java.util.Iterator; import java.util.logging.Level; +import javax.swing.SwingUtilities; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.openide.util.Lookup; @@ -95,35 +96,6 @@ public class StartupWindowProvider implements StartupWindowInterface { if (RuntimeProperties.runningWithGUI()) { checkSolr(); } - - File openPreviousCaseFile = new File(ResetWindowsAction.getCaseToReopenFilePath()); - String caseFilePath = ""; - - if (openPreviousCaseFile.exists()) { - String unableToOpenMessage = null; - try { - Charset encoding = null; - caseFilePath = FileUtils.readFileToString(openPreviousCaseFile, encoding); - if (new File(caseFilePath).exists()) { - FileUtils.forceDelete(openPreviousCaseFile); - Case.openAsCurrentCase(caseFilePath); - //the case is now open we do not want to display the start up windows - return; - } else { - unableToOpenMessage = Bundle.StartupWindowProvider_openCase_noFile(caseFilePath); - logger.log(Level.WARNING, unableToOpenMessage); - } - } catch (IOException ex) { - unableToOpenMessage = Bundle.StartupWindowProvider_openCase_deleteOpenFailure(ResetWindowsAction.getCaseToReopenFilePath()); - logger.log(Level.WARNING, unableToOpenMessage, ex); - } catch (CaseActionException ex) { - unableToOpenMessage = Bundle.StartupWindowProvider_openCase_cantOpen(caseFilePath); - logger.log(Level.WARNING, unableToOpenMessage, ex); - } - if (RuntimeProperties.runningWithGUI() && !StringUtils.isBlank(unableToOpenMessage)) { - MessageNotifyUtil.Message.warn(unableToOpenMessage); - } - } //discover the registered windows Collection startupWindows = Lookup.getDefault().lookupAll(StartupWindowInterface.class); @@ -167,6 +139,42 @@ public class StartupWindowProvider implements StartupWindowInterface { startupWindowToUse = new org.sleuthkit.autopsy.casemodule.StartupWindow(); } } + File openPreviousCaseFile = new File(ResetWindowsAction.getCaseToReopenFilePath()); + + if (openPreviousCaseFile.exists()) { + //do actual opening on another thread + new Thread(() -> { + String caseFilePath = ""; + String unableToOpenMessage = null; + try { + Charset encoding = null; + caseFilePath = FileUtils.readFileToString(openPreviousCaseFile, encoding); + if (new File(caseFilePath).exists()) { + FileUtils.forceDelete(openPreviousCaseFile); + Case.openAsCurrentCase(caseFilePath); + } else { + unableToOpenMessage = Bundle.StartupWindowProvider_openCase_noFile(caseFilePath); + logger.log(Level.WARNING, unableToOpenMessage); + } + } catch (IOException ex) { + unableToOpenMessage = Bundle.StartupWindowProvider_openCase_deleteOpenFailure(ResetWindowsAction.getCaseToReopenFilePath()); + logger.log(Level.WARNING, unableToOpenMessage, ex); + } catch (CaseActionException ex) { + unableToOpenMessage = Bundle.StartupWindowProvider_openCase_cantOpen(caseFilePath); + logger.log(Level.WARNING, unableToOpenMessage, ex); + } + + if (RuntimeProperties.runningWithGUI() && !StringUtils.isBlank(unableToOpenMessage)) { + final String message = unableToOpenMessage; + SwingUtilities.invokeLater(() -> { + MessageNotifyUtil.Message.warn(message); + }); + } else { + close(); + } + + }).start(); + } } private void checkSolr() { From 9dd4abfc49553aae8284ca9bc07936ef67a6ac9e Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 13 Apr 2021 11:48:57 -0400 Subject: [PATCH 20/21] 7471 tweak startup window behavior --- .../autopsy/casemodule/StartupWindowProvider.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java index 7b3040e778..a6b020b849 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java @@ -144,9 +144,12 @@ public class StartupWindowProvider implements StartupWindowInterface { if (openPreviousCaseFile.exists()) { //do actual opening on another thread new Thread(() -> { + //close the startup window as we attempt to open the case + close(); String caseFilePath = ""; String unableToOpenMessage = null; try { + //avoid readFileToString having ambiguous arguments Charset encoding = null; caseFilePath = FileUtils.readFileToString(openPreviousCaseFile, encoding); if (new File(caseFilePath).exists()) { @@ -168,11 +171,10 @@ public class StartupWindowProvider implements StartupWindowInterface { final String message = unableToOpenMessage; SwingUtilities.invokeLater(() -> { MessageNotifyUtil.Message.warn(message); + //the case was not opened restore the startup window + open(); }); - } else { - close(); - } - + } }).start(); } } From 63bcad58b309e34a67e30f514c61bcaf8b989b09 Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Tue, 13 Apr 2021 12:00:11 -0400 Subject: [PATCH 21/21] 7471 tweak startup window behavior --- .../casemodule/StartupWindowProvider.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java index a6b020b849..821beea6b3 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/StartupWindowProvider.java @@ -144,8 +144,6 @@ public class StartupWindowProvider implements StartupWindowInterface { if (openPreviousCaseFile.exists()) { //do actual opening on another thread new Thread(() -> { - //close the startup window as we attempt to open the case - close(); String caseFilePath = ""; String unableToOpenMessage = null; try { @@ -154,7 +152,10 @@ public class StartupWindowProvider implements StartupWindowInterface { caseFilePath = FileUtils.readFileToString(openPreviousCaseFile, encoding); if (new File(caseFilePath).exists()) { FileUtils.forceDelete(openPreviousCaseFile); + //close the startup window as we attempt to open the case + close(); Case.openAsCurrentCase(caseFilePath); + } else { unableToOpenMessage = Bundle.StartupWindowProvider_openCase_noFile(caseFilePath); logger.log(Level.WARNING, unableToOpenMessage); @@ -166,15 +167,15 @@ public class StartupWindowProvider implements StartupWindowInterface { unableToOpenMessage = Bundle.StartupWindowProvider_openCase_cantOpen(caseFilePath); logger.log(Level.WARNING, unableToOpenMessage, ex); } - + if (RuntimeProperties.runningWithGUI() && !StringUtils.isBlank(unableToOpenMessage)) { final String message = unableToOpenMessage; SwingUtilities.invokeLater(() -> { - MessageNotifyUtil.Message.warn(message); - //the case was not opened restore the startup window - open(); - }); - } + MessageNotifyUtil.Message.warn(message); + //the case was not opened restore the startup window + open(); + }); + } }).start(); } }