diff --git a/Core/src/org/sleuthkit/autopsy/actions/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/actions/Bundle.properties-MERGED index 5c9a0ea3ac..cc5c9222e4 100755 --- a/Core/src/org/sleuthkit/autopsy/actions/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/actions/Bundle.properties-MERGED @@ -1,24 +1,18 @@ AddBlackboardArtifactTagAction.pluralTagResult=Add Result Tags AddBlackboardArtifactTagAction.singularTagResult=Add Result Tag AddBlackboardArtifactTagAction.taggingErr=Tagging Error -# {0} - artifactName AddBlackboardArtifactTagAction.unableToTag.msg=Unable to tag {0}. AddContentTagAction.cannotApplyTagErr=Cannot Apply Tag AddContentTagAction.pluralTagFile=Add File Tags AddContentTagAction.singularTagFile=Add File Tag -# {0} - fileName -# {1} - tagName AddContentTagAction.tagExists={0} has been tagged as {1}. Cannot reapply the same tag. AddContentTagAction.taggingErr=Tagging Error -# {0} - fileName AddContentTagAction.unableToTag.msg=Unable to tag {0}, not a regular file. -# {0} - fileName AddContentTagAction.unableToTag.msg2=Unable to tag {0}. CTL_DumpThreadAction=Thread Dump CTL_ShowIngestProgressSnapshotAction=Ingest Status Details DeleteBlackboardArtifactTagAction.deleteTag=Remove Selected Tag(s) DeleteBlackboardArtifactTagAction.tagDelErr=Tag Deletion Error -# {0} - tagName DeleteBlackboardArtifactTagAction.unableToDelTag.msg=Unable to delete tag {0}. DeleteContentTagAction.deleteTag=Remove Selected Tag(s) DeleteContentTagAction.tagDelErr=Tag Deletion Error @@ -84,8 +78,6 @@ CTL_OpenOutputFolder=Open Case Folder OpenOutputFolder.error1=Case Folder Not Found: {0} OpenOutputFolder.noCaseOpen=No open case, therefore no current case folder available. OpenOutputFolder.CouldNotOpenOutputFolder=Could not open case folder -# {0} - old tag name -# {1} - artifactID ReplaceBlackboardArtifactTagAction.replaceTag.alert=Unable to replace tag {0} for artifact {1}. # {0} - old tag name # {1} - content obj id diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED index 528d3a5088..9a43ffe229 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED @@ -247,15 +247,10 @@ 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 \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.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.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. @@ -274,12 +269,9 @@ 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? \n\ - Case Name: {0}\n\ - Case Directory: {1} +CaseDeleteAction.closeConfMsg.text=Are you sure want to close and delete this case? \nCase Name: {0}\nCase 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\n\ -Close 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\nClose 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}) @@ -311,8 +303,7 @@ 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\n\ - Do you want to create that directory? +NewCaseWizardPanel1.validate.confMsg.createDir.msg=The base directory "{0}" does not exist. \n\nDo 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} @@ -341,7 +332,6 @@ OptionalCasePropertiesPanel.lbPointOfContactPhoneLabel.text=Phone: OptionalCasePropertiesPanel.orgainizationPanel.border.title=Organization RecentCases.exception.caseIdxOutOfRange.msg=Recent case index {0} is out of range. RecentCases.getName.text=Clear Recent Cases -# {0} - case name RecentItems.openRecentCase.msgDlg.text=Case {0} no longer exists. SelectDataSourceProcessorPanel.name.text=Select Data Source Type StartupWindow.title.text=Welcome @@ -354,7 +344,6 @@ StartupWindowProvider.openCase.noFile=Unable to open previously open case becaus 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 -# {0} - case folder UnpackagePortableCaseDialog.validatePaths.caseFolderExists=Folder {0} already exists UnpackagePortableCaseDialog.validatePaths.caseIsNotFile=Selected path is not a file UnpackagePortableCaseDialog.validatePaths.caseNotFound=File does not exist @@ -369,8 +358,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 @@ -378,7 +367,7 @@ CollaborationMonitor.analyzingDataSourceStatus.msg={0} analyzing {1} MissingImageDialog.lbWarning.text= MissingImageDialog.lbWarning.toolTipText= NewCaseVisualPanel1.caseParentDirWarningLabel.text= -NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-User +NewCaseVisualPanel1.multiUserCaseRadioButton.text=Multi-User\t\t 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/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 6c4ede3d99..19d70deb62 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -85,13 +85,15 @@ import org.sleuthkit.autopsy.casemodule.events.DataSourceAddedEvent; import org.sleuthkit.autopsy.casemodule.events.DataSourceDeletedEvent; import org.sleuthkit.autopsy.casemodule.events.DataSourceNameChangedEvent; import org.sleuthkit.autopsy.casemodule.events.HostsAddedEvent; -import org.sleuthkit.autopsy.casemodule.events.HostsChangedEvent; -import org.sleuthkit.autopsy.casemodule.events.HostsRemovedEvent; -import org.sleuthkit.autopsy.casemodule.events.OsAccountAddedEvent; -import org.sleuthkit.autopsy.casemodule.events.OsAccountChangedEvent; -import org.sleuthkit.autopsy.casemodule.events.OsAccountDeletedEvent; +import org.sleuthkit.autopsy.casemodule.events.HostsAddedToPersonEvent; +import org.sleuthkit.autopsy.casemodule.events.HostsUpdatedEvent; +import org.sleuthkit.autopsy.casemodule.events.HostsDeletedEvent; +import org.sleuthkit.autopsy.casemodule.events.HostsRemovedFromPersonEvent; +import org.sleuthkit.autopsy.casemodule.events.OsAccountsAddedEvent; +import org.sleuthkit.autopsy.casemodule.events.OsAccountsUpdatedEvent; +import org.sleuthkit.autopsy.casemodule.events.OsAccountsDeletedEvent; import org.sleuthkit.autopsy.casemodule.events.PersonsAddedEvent; -import org.sleuthkit.autopsy.casemodule.events.PersonsChangedEvent; +import org.sleuthkit.autopsy.casemodule.events.PersonsUpdatedEvent; import org.sleuthkit.autopsy.casemodule.events.PersonsDeletedEvent; import org.sleuthkit.autopsy.casemodule.events.ReportAddedEvent; import org.sleuthkit.autopsy.casemodule.multiusercases.CaseNodeData.CaseNodeDataException; @@ -190,7 +192,7 @@ public class Case { private final SleuthkitEventListener sleuthkitEventListener; private CollaborationMonitor collaborationMonitor; private Services caseServices; - + private volatile boolean hasDataSource = false; private volatile boolean hasData = false; @@ -434,43 +436,50 @@ public class Case { */ CR_COMMENT_CHANGED, /** - * OSAccount associated with the current case added. Call getOsAccount - * to get the added account; + * One or more OS accounts have been added to the case. */ - OS_ACCOUNT_ADDED, + OS_ACCOUNTS_ADDED, /** - * OSAccount associated with the current case has changed. Call - * getOsAccount to get the changed account; + * One or more OS accounts in the case have been updated. */ - OS_ACCOUNT_CHANGED, + OS_ACCOUNTS_UPDATED, /** - * OSAccount associated with the current case has been deleted. + * One or more OS accounts have been deleted from the case. */ - OS_ACCOUNT_REMOVED, + OS_ACCOUNTS_DELETED, /** - * Hosts associated with the current case added. + * One or more hosts have been added to the case. */ HOSTS_ADDED, /** - * Hosts associated with the current case has changed. + * One or more hosts in the case have been updated. */ - HOSTS_CHANGED, + HOSTS_UPDATED, /** - * Hosts associated with the current case has been deleted. + * One or more hosts have been deleted from the case. */ HOSTS_DELETED, /** - * Persons associated with the current case added. + * One or more persons have been added to the case. */ PERSONS_ADDED, /** - * Persons associated with the current case has changed. + * One or more persons in the case have been updated. */ - PERSONS_CHANGED, + PERSONS_UPDATED, /** - * Persons associated with the current case has been deleted. + * One or more persons been deleted from the case. */ - PERSONS_DELETED; + PERSONS_DELETED, + /** + * One or more hosts have been added to a person. + */ + HOSTS_ADDED_TO_PERSON, + /** + * One or more hosts have been removed from a person. + */ + HOSTS_REMOVED_FROM_PERSON; + }; /** @@ -505,18 +514,14 @@ public class Case { } @Subscribe - public void publishOsAccountAddedEvent(TskEvent.OsAccountsAddedTskEvent event) { + public void publishOsAccountsAddedEvent(TskEvent.OsAccountsAddedTskEvent event) { hasData = true; - for (OsAccount account : event.getOsAcounts()) { - eventPublisher.publish(new OsAccountAddedEvent(account)); - } + eventPublisher.publish(new OsAccountsAddedEvent(event.getOsAcounts())); } @Subscribe - public void publishOsAccountChangedEvent(TskEvent.OsAccountsChangedTskEvent event) { - for (OsAccount account : event.getOsAcounts()) { - eventPublisher.publish(new OsAccountChangedEvent(account)); - } + public void publishOsAccountsUpdatedEvent(TskEvent.OsAccountsUpdatedTskEvent event) { + eventPublisher.publish(new OsAccountsUpdatedEvent(event.getOsAcounts())); } @Subscribe @@ -526,10 +531,7 @@ public class Case { } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Unable to retrieve the hasData status from the db", ex); } - - for (Long accountId : event.getOsAcountObjectIds()) { - eventPublisher.publish(new OsAccountDeletedEvent(accountId)); - } + eventPublisher.publish(new OsAccountsDeletedEvent(event.getOsAccountObjectIds())); } /** @@ -541,8 +543,7 @@ public class Case { @Subscribe public void publishHostsAddedEvent(TskEvent.HostsAddedTskEvent event) { hasData = true; - eventPublisher.publish(new HostsAddedEvent( - event == null ? Collections.emptyList() : event.getHosts())); + eventPublisher.publish(new HostsAddedEvent(event.getHosts())); } /** @@ -552,9 +553,8 @@ public class Case { * @param event The sleuthkit event for the updating of hosts. */ @Subscribe - public void publishHostsChangedEvent(TskEvent.HostsChangedTskEvent event) { - eventPublisher.publish(new HostsChangedEvent( - event == null ? Collections.emptyList() : event.getHosts())); + public void publishHostsUpdatedEvent(TskEvent.HostsUpdatedTskEvent event) { + eventPublisher.publish(new HostsUpdatedEvent(event.getHosts())); } /** @@ -570,9 +570,8 @@ public class Case { } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Unable to retrieve the hasData status from the db", ex); } - - eventPublisher.publish(new HostsRemovedEvent( - event == null ? Collections.emptyList() : event.getHosts())); + + eventPublisher.publish(new HostsDeletedEvent(event.getHostIds())); } /** @@ -583,8 +582,7 @@ public class Case { */ @Subscribe public void publishPersonsAddedEvent(TskEvent.PersonsAddedTskEvent event) { - eventPublisher.publish(new PersonsAddedEvent( - event == null ? Collections.emptyList() : event.getPersons())); + eventPublisher.publish(new PersonsAddedEvent(event.getPersons())); } /** @@ -594,9 +592,8 @@ public class Case { * @param event The sleuthkit event for the updating of persons. */ @Subscribe - public void publishPersonsChangedEvent(TskEvent.PersonsChangedTskEvent event) { - eventPublisher.publish(new PersonsChangedEvent( - event == null ? Collections.emptyList() : event.getPersons())); + public void publishPersonsUpdatedEvent(TskEvent.PersonsUpdatedTskEvent event) { + eventPublisher.publish(new PersonsUpdatedEvent(event.getPersons())); } /** @@ -607,9 +604,19 @@ public class Case { */ @Subscribe public void publishPersonsDeletedEvent(TskEvent.PersonsDeletedTskEvent event) { - eventPublisher.publish(new PersonsDeletedEvent( - event == null ? Collections.emptyList() : event.getPersons())); + eventPublisher.publish(new PersonsDeletedEvent(event.getPersonIds())); } + + @Subscribe + public void publishHostsAddedToPersonEvent(TskEvent.HostsAddedToPersonTskEvent event) { + eventPublisher.publish(new HostsAddedToPersonEvent(event.getPerson(), event.getHosts())); + } + + @Subscribe + public void publisHostsRemovedFromPersonEvent(TskEvent.HostsRemovedFromPersonTskEvent event) { + eventPublisher.publish(new HostsRemovedFromPersonEvent(event.getPerson(), event.getHostIds())); + } + } /** @@ -1232,106 +1239,105 @@ public class Case { /** * Update the GUI to to reflect the current case. */ - private static void updateGUIForCaseOpened(Case newCurrentCase) { - /* - * If the case database was upgraded for a new schema and a - * backup database was created, notify the user. - */ - SleuthkitCase caseDb = newCurrentCase.getSleuthkitCase(); - String backupDbPath = caseDb.getBackupDatabasePath(); - if (null != backupDbPath) { - JOptionPane.showMessageDialog( - mainFrame, - NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.msg", backupDbPath), - NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.title"), - JOptionPane.INFORMATION_MESSAGE); - } + private static void updateGUIForCaseOpened(Case newCurrentCase) { + /* + * If the case database was upgraded for a new schema and a backup + * database was created, notify the user. + */ + SleuthkitCase caseDb = newCurrentCase.getSleuthkitCase(); + String backupDbPath = caseDb.getBackupDatabasePath(); + if (null != backupDbPath) { + JOptionPane.showMessageDialog( + mainFrame, + NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.msg", backupDbPath), + NbBundle.getMessage(Case.class, "Case.open.msgDlg.updated.title"), + JOptionPane.INFORMATION_MESSAGE); + } - /* - * Look for the files for the data sources listed in the case - * database and give the user the opportunity to locate any that - * are missing. - */ - Map imgPaths = getImagePaths(caseDb); - for (Map.Entry entry : imgPaths.entrySet()) { - long obj_id = entry.getKey(); - String path = entry.getValue(); - boolean fileExists = (new File(path).isFile() || DriveUtils.driveExists(path)); - if (!fileExists) { - try { - // Using invokeAndWait means that the dialog will - // open on the EDT but this thread will wait for an - // answer. Using invokeLater would cause this loop to - // end before all of the dialogs appeared. - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - int response = JOptionPane.showConfirmDialog( + /* + * Look for the files for the data sources listed in the case database + * and give the user the opportunity to locate any that are missing. + */ + Map imgPaths = getImagePaths(caseDb); + for (Map.Entry entry : imgPaths.entrySet()) { + long obj_id = entry.getKey(); + String path = entry.getValue(); + boolean fileExists = (new File(path).isFile() || DriveUtils.driveExists(path)); + if (!fileExists) { + try { + // Using invokeAndWait means that the dialog will + // open on the EDT but this thread will wait for an + // answer. Using invokeLater would cause this loop to + // end before all of the dialogs appeared. + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + int response = JOptionPane.showConfirmDialog( mainFrame, NbBundle.getMessage(Case.class, "Case.checkImgExist.confDlg.doesntExist.msg", path), NbBundle.getMessage(Case.class, "Case.checkImgExist.confDlg.doesntExist.title"), JOptionPane.YES_NO_OPTION); - if (response == JOptionPane.YES_OPTION) { - MissingImageDialog.makeDialog(obj_id, caseDb); - } else { - logger.log(Level.SEVERE, "User proceeding with missing image files"); //NON-NLS + if (response == JOptionPane.YES_OPTION) { + MissingImageDialog.makeDialog(obj_id, caseDb); + } else { + logger.log(Level.SEVERE, "User proceeding with missing image files"); //NON-NLS - } - } - - }); - } catch (InterruptedException | InvocationTargetException ex) { - logger.log(Level.SEVERE, "Failed to show missing image confirmation dialog", ex); //NON-NLS - } - } + } + } + + }); + } catch (InterruptedException | InvocationTargetException ex) { + logger.log(Level.SEVERE, "Failed to show missing image confirmation dialog", ex); //NON-NLS } + } + } - /* - * Enable the case-specific actions. - */ - CallableSystemAction.get(AddImageAction.class).setEnabled(FeatureAccessUtils.canAddDataSources()); - CallableSystemAction.get(OpenHostsAction.class).setEnabled(true); - CallableSystemAction.get(CaseCloseAction.class).setEnabled(true); - CallableSystemAction.get(CaseDetailsAction.class).setEnabled(true); - CallableSystemAction.get(DataSourceSummaryAction.class).setEnabled(true); - CallableSystemAction.get(CaseDeleteAction.class).setEnabled(FeatureAccessUtils.canDeleteCurrentCase()); - CallableSystemAction.get(OpenTimelineAction.class).setEnabled(true); - CallableSystemAction.get(OpenCommVisualizationToolAction.class).setEnabled(true); - CallableSystemAction.get(CommonAttributeSearchAction.class).setEnabled(true); - CallableSystemAction.get(OpenOutputFolderAction.class).setEnabled(false); - CallableSystemAction.get(OpenDiscoveryAction.class).setEnabled(true); - + /* + * Enable the case-specific actions. + */ + CallableSystemAction.get(AddImageAction.class).setEnabled(FeatureAccessUtils.canAddDataSources()); + CallableSystemAction.get(OpenHostsAction.class).setEnabled(true); + CallableSystemAction.get(CaseCloseAction.class).setEnabled(true); + CallableSystemAction.get(CaseDetailsAction.class).setEnabled(true); + CallableSystemAction.get(DataSourceSummaryAction.class).setEnabled(true); + CallableSystemAction.get(CaseDeleteAction.class).setEnabled(FeatureAccessUtils.canDeleteCurrentCase()); + CallableSystemAction.get(OpenTimelineAction.class).setEnabled(true); + CallableSystemAction.get(OpenCommVisualizationToolAction.class).setEnabled(true); + CallableSystemAction.get(CommonAttributeSearchAction.class).setEnabled(true); + CallableSystemAction.get(OpenOutputFolderAction.class).setEnabled(false); + CallableSystemAction.get(OpenDiscoveryAction.class).setEnabled(true); + + /* + * Add the case to the recent cases tracker that supplies a list of + * recent cases to the recent cases menu item and the open/create case + * dialog. + */ + RecentCases.getInstance().addRecentCase(newCurrentCase.getDisplayName(), newCurrentCase.getMetadata().getFilePath().toString()); + final boolean hasData = newCurrentCase.hasData(); + + SwingUtilities.invokeLater(() -> { /* - * Add the case to the recent cases tracker that supplies a list - * of recent cases to the recent cases menu item and the - * open/create case dialog. + * Open the top components (windows within the main application + * window). + * + * Note: If the core windows are not opened here, they will be + * opened via the DirectoryTreeTopComponent 'propertyChange()' + * method on a DATA_SOURCE_ADDED event. */ - RecentCases.getInstance().addRecentCase(newCurrentCase.getDisplayName(), newCurrentCase.getMetadata().getFilePath().toString()); - final boolean hasData = newCurrentCase.hasData(); - - SwingUtilities.invokeLater(() -> { - /* - * Open the top components (windows within the main application - * window). - * - * Note: If the core windows are not opened here, they will be - * opened via the DirectoryTreeTopComponent 'propertyChange()' - * method on a DATA_SOURCE_ADDED event. - */ - if (hasData) { - CoreComponentControl.openCoreWindows(); - } else { - //ensure that the DirectoryTreeTopComponent is open so that it's listener can open the core windows including making it visible. - DirectoryTreeTopComponent.findInstance(); - } + if (hasData) { + CoreComponentControl.openCoreWindows(); + } else { + //ensure that the DirectoryTreeTopComponent is open so that it's listener can open the core windows including making it visible. + DirectoryTreeTopComponent.findInstance(); + } - /* - * Reset the main window title to: - * - * [curent case display name] - [application name]. - */ - mainFrame.setTitle(newCurrentCase.getDisplayName() + " - " + getNameForTitle()); - }); + /* + * Reset the main window title to: + * + * [curent case display name] - [application name]. + */ + mainFrame.setTitle(newCurrentCase.getDisplayName() + " - " + getNameForTitle()); + }); } /* @@ -1684,16 +1690,16 @@ public class Case { /** * Returns true if there is any data in the case. - * + * * @return True or false. */ public boolean hasData() { return hasData; } - + /** * Returns true if there is one or more data sources in the case. - * + * * @return True or false. */ public boolean hasDataSource() { @@ -1858,72 +1864,6 @@ public class Case { eventPublisher.publish(new BlackBoardArtifactTagDeletedEvent(deletedTag)); } - public void notifyOsAccountAdded(OsAccount account) { - eventPublisher.publish(new OsAccountAddedEvent(account)); - } - - public void notifyOsAccountChanged(OsAccount account) { - eventPublisher.publish(new OsAccountChangedEvent(account)); - } - - public void notifyOsAccountRemoved(Long osAccountObjectId) { - eventPublisher.publish(new OsAccountDeletedEvent(osAccountObjectId)); - } - - /** - * Notify via an autopsy event that a host has been added. - * - * @param host The host that has been added. - */ - public void notifyHostAdded(Host host) { - eventPublisher.publish(new HostsAddedEvent(Collections.singletonList(host))); - } - - /** - * Notify via an autopsy event that a host has been changed. - * - * @param newValue The host that has been updated. - */ - public void notifyHostChanged(Host newValue) { - eventPublisher.publish(new HostsChangedEvent(Collections.singletonList(newValue))); - } - - /** - * Notify via an autopsy event that a host has been deleted. - * - * @param host The host that has been deleted. - */ - public void notifyHostDeleted(Host host) { - eventPublisher.publish(new HostsRemovedEvent(Collections.singletonList(host))); - } - - /** - * Notify via an autopsy event that a person has been added. - * - * @param person The person that has been added. - */ - public void notifyPersonAdded(Person person) { - eventPublisher.publish(new PersonsAddedEvent(Collections.singletonList(person))); - } - - /** - * Notify via an autopsy event that a person has been changed. - * - * @param newValue The person that has been updated. - */ - public void notifyPersonChanged(Person newValue) { - eventPublisher.publish(new PersonsChangedEvent(Collections.singletonList(newValue))); - } - - /** - * Notify via an autopsy event that a person has been deleted. - * - * @param person The person that has been deleted. - */ - public void notifyPersonDeleted(Person person) { - eventPublisher.publish(new PersonsDeletedEvent(Collections.singletonList(person))); - } - /** * Adds a report to the case. * @@ -1966,7 +1906,7 @@ public class Case { throw new TskCoreException(errorMsg, ex); } hasData = true; - + Report report = this.caseDb.addReport(normalizedLocalPath, srcModuleName, reportName, parent); eventPublisher.publish(new ReportAddedEvent(report)); return report; @@ -1996,16 +1936,16 @@ public class Case { for (Report report : reports) { this.caseDb.deleteReport(report); } - + try { hasData = dbHasData(); } catch (TskCoreException ex) { logger.log(Level.SEVERE, "Unable to retrieve the hasData status from the db", ex); } - + for (Report report : reports) { eventPublisher.publish(new AutopsyEvent(Events.REPORT_DELETED.toString(), report, null)); - } + } } /** @@ -3538,17 +3478,17 @@ public class Case { } } - + /** - * Initialize the hasData and hasDataSource parameters by checking the + * Initialize the hasData and hasDataSource parameters by checking the * database. - * + * * hasDataSource will be true if any data Source exists the db. - * - * hasData will be true if hasDataSource is true or if there are entries - * in the tsk_object or tsk_host tables. - * - * @throws TskCoreException + * + * hasData will be true if hasDataSource is true or if there are entries in + * the tsk_object or tsk_host tables. + * + * @throws TskCoreException */ private void updateDataParameters() throws TskCoreException { hasDataSource = dbHasDataSource(); @@ -3559,13 +3499,13 @@ public class Case { hasData = true; } } - + /** * Returns true of there are any data sources in the case database. - * + * * @return True if this case as a data source. - * - * @throws TskCoreException + * + * @throws TskCoreException */ private boolean dbHasDataSource() throws TskCoreException { String query = "SELECT count(*) AS count FROM (SELECT * FROM data_source_info LIMIT 1)t"; @@ -3580,35 +3520,35 @@ public class Case { throw new TskCoreException("Error accessing case databse", ex); } } - + /** * Returns true if the case has data. A case has data if there is at least * one row in either the tsk_objects or tsk_hosts table. - * + * * @return True if there is data in this case. - * - * @throws TskCoreException + * + * @throws TskCoreException */ private boolean dbHasData() throws TskCoreException { // The LIMIT 1 in the subquery should limit the data returned and // make the overall query more efficent. String query = "SELECT SUM(cnt) total FROM " + "(SELECT COUNT(*) AS cnt FROM " - + "(SELECT * FROM tsk_objects LIMIT 1)t " + + "(SELECT * FROM tsk_objects LIMIT 1)t " + "UNION ALL " + "SELECT COUNT(*) AS cnt FROM " + "(SELECT * FROM tsk_hosts LIMIT 1)r) s"; try (SleuthkitCase.CaseDbQuery dbQuery = caseDb.executeQuery(query)) { ResultSet resultSet = dbQuery.getResultSet(); if (resultSet.next()) { - return resultSet.getLong("total") > 0; + return resultSet.getLong("total") > 0; } else { return false; } - } catch ( SQLException ex) { + } catch (SQLException ex) { logger.log(Level.SEVERE, "Error accessing case database", ex); //NON-NLS throw new TskCoreException("Error accessing case databse", ex); - } + } } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedEvent.java index c10b66face..f188c7d5a3 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedEvent.java @@ -23,17 +23,21 @@ import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.datamodel.Host; /** - * Event fired when new hosts are added. + * Application events published when hosts have been added to the Sleuth Kit + * data model for a case. */ -public class HostsAddedEvent extends HostsEvent { - +public final class HostsAddedEvent extends HostsEvent { + private static final long serialVersionUID = 1L; - + /** - * Main constructor. - * @param dataModelObjects The hosts that have been added. + * Constructs an application event published when hosts have been added to + * the Sleuth Kit data model for a case. + * + * @param hosts The hosts that have been added. */ - public HostsAddedEvent(List dataModelObjects) { - super(Case.Events.HOSTS_ADDED.name(), dataModelObjects); + public HostsAddedEvent(List hosts) { + super(Case.Events.HOSTS_ADDED.name(), hosts); } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedToPersonEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedToPersonEvent.java new file mode 100755 index 0000000000..fffb39d82c --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedToPersonEvent.java @@ -0,0 +1,92 @@ +/* + * 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.casemodule.events; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.datamodel.Host; +import org.sleuthkit.datamodel.Person; +import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * Application events published when one or more hosts have been added to a + * person. + */ +public final class HostsAddedToPersonEvent extends TskDataModelChangedEvent { + + private static final long serialVersionUID = 1L; + + /** + * Constructs an application event published when one or more hosts have + * been added to a person. + * + * @param person The person. + * @param hosts The hosts. + */ + public HostsAddedToPersonEvent(Person person, List hosts) { + super(Case.Events.HOSTS_ADDED_TO_PERSON.toString(), Collections.singletonList(person), Person::getPersonId, hosts, Host::getHostId); + } + + /** + * Gets the person. + * + * @return The person. + */ + public Person getPerson() { + return getOldValue().get(0); + } + + /** + * Gets the hosts. + * + * @return The hosts. + */ + public List getHosts() { + return getNewValue(); + } + + @Override + protected List getOldValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { + List persons = new ArrayList<>(); + for (Long id : ids) { + Optional person = caseDb.getPersonManager().getPerson(id); + if (person.isPresent()) { + persons.add(person.get()); + } + } + return persons; + } + + @Override + protected List getNewValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { + List hosts = new ArrayList<>(); + for (Long id : ids) { + Optional host = caseDb.getHostManager().getHostById(id); + if (host.isPresent()) { + hosts.add(host.get()); + } + } + return hosts; + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsRemovedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsDeletedEvent.java old mode 100644 new mode 100755 similarity index 56% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/HostsRemovedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/HostsDeletedEvent.java index 407b83c32a..24c2ae091b --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsRemovedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsDeletedEvent.java @@ -20,20 +20,32 @@ package org.sleuthkit.autopsy.casemodule.events; import java.util.List; import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.datamodel.Host; /** - * Event fired when hosts are removed. + * Application events published when hosts have been deleted from the Sleuth + * Kit data model for a case. */ -public class HostsRemovedEvent extends HostsEvent { - +public final class HostsDeletedEvent extends TskDataModelObjectsDeletedEvent { + private static final long serialVersionUID = 1L; - + /** - * Main constructor. - * @param dataModelObjects The list of hosts that have been deleted. + * Constructs an application event published when hosts have been deleted + * from the Sleuth Kit data model for a case. + * + * @param hostIds The host IDs of the deleted hosts. */ - public HostsRemovedEvent(List dataModelObjects) { - super(Case.Events.HOSTS_DELETED.name(), dataModelObjects); + public HostsDeletedEvent(List hostIds) { + super(Case.Events.HOSTS_DELETED.name(), hostIds); } + + /** + * Gets the host IDs of the hosts that have been deleted. + * + * @return The host IDs. + */ + public List getHostIds() { + return getOldValue(); + } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsEvent.java index 7c9a31f01e..465d265083 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsEvent.java @@ -19,71 +19,51 @@ package org.sleuthkit.autopsy.casemodule.events; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import org.sleuthkit.datamodel.Host; -import org.sleuthkit.datamodel.HostManager; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; /** - * Base event class for when something pertaining to hosts changes. + * A base class for application events published when hosts in the Sleuth Kit + * data model for a case have been added or updated. */ -public class HostsEvent extends TskDataModelChangeEvent { +public class HostsEvent extends TskDataModelChangedEvent { private static final long serialVersionUID = 1L; /** - * Retrieves a list of ids from a list of hosts. - * - * @param hosts The hosts. - * @return The list of ids. - */ - private static List getIds(List hosts) { - return getSafeList(hosts).stream() - .filter(h -> h != null) - .map(h -> h.getHostId()).collect(Collectors.toList()); - } - - /** - * Returns the hosts or an empty list. - * - * @param hosts The host list. - * @return The host list or an empty list if the parameter is null. - */ - private static List getSafeList(List hosts) { - return hosts == null ? Collections.emptyList() : hosts; - } - - /** - * Main constructor. + * Constructs the base class part of an application event published when + * hosts in the Sleuth Kit data model for a case have been added or updated. * * @param eventName The name of the Case.Events enum value for the event - * type. - * @param dataModelObjects The list of hosts for the event. + * type. + * @param hosts The hosts. */ - protected HostsEvent(String eventName, List dataModelObjects) { - super(eventName, getIds(dataModelObjects), new ArrayList<>(getSafeList(dataModelObjects))); + HostsEvent(String eventName, List hosts) { + super(eventName, null, null, hosts, Host::getHostId); + } + + /** + * Gets the hosts that have been added or updated. + * + * @return The hosts. + */ + public List getHosts() { + return getNewValue(); } @Override - protected List getDataModelObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { - HostManager hostManager = caseDb.getHostManager(); - List toRet = new ArrayList<>(); - if (ids != null) { - for (Long id : ids) { - if (id == null) { - continue; - } - - Optional thisHostOpt = hostManager.getHostById(id); - thisHostOpt.ifPresent((h) -> toRet.add(h)); + protected List getNewValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { + List hosts = new ArrayList<>(); + for (Long id : ids) { + Optional host = caseDb.getHostManager().getHostById(id); + if (host.isPresent()) { + hosts.add(host.get()); } } - - return toRet; + return hosts; } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsRemovedFromPersonEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsRemovedFromPersonEvent.java new file mode 100755 index 0000000000..e23ef786ee --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsRemovedFromPersonEvent.java @@ -0,0 +1,85 @@ +/* + * 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.casemodule.events; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.datamodel.Host; +import org.sleuthkit.datamodel.Person; +import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * Application events published when one or more hosts have been removed from a + * person. + */ +public class HostsRemovedFromPersonEvent extends TskDataModelChangedEvent { + + private static final long serialVersionUID = 1L; + + /** + * Constructs an application event published when one or more hosts have + * been removed from a person. + * + * @param person The person. + * @param hostIds The host IDs of the removed hosts. + */ + public HostsRemovedFromPersonEvent(Person person, List hostIds) { + super(Case.Events.HOSTS_REMOVED_FROM_PERSON.toString(), Collections.singletonList(person), Person::getPersonId, hostIds, (id -> id)); + } + + /** + * Gets the person. + * + * @return The person. + */ + public Person getPerson() { + return getOldValue().get(0); + } + + /** + * Gets the host IDs of the removed hosts. + * + * @return The host IDs. + */ + public List getHostIds() { + return getNewValue(); + } + + @Override + protected List getOldValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { + List persons = new ArrayList<>(); + for (Long id : ids) { + Optional person = caseDb.getPersonManager().getPerson(id); + if (person.isPresent()) { + persons.add(person.get()); + } + } + return persons; + } + + @Override + protected List getNewValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { + return ids; + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsChangedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsUpdatedEvent.java old mode 100644 new mode 100755 similarity index 68% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/HostsChangedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/HostsUpdatedEvent.java index a5b8692c03..ec00fc5ad6 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsChangedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsUpdatedEvent.java @@ -23,19 +23,21 @@ import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.datamodel.Host; /** - * Event fired when hosts are changed. + * Application events published when hosts in the Sleuth Kit data model for + * a case have been updated. */ -public class HostsChangedEvent extends HostsEvent { +public class HostsUpdatedEvent extends HostsEvent { private static final long serialVersionUID = 1L; /** - * Main constructor. + * Constructs an application event published when hosts in the Sleuth Kit + * data model for a case have been updated. * - * @param dataModelObjects The new values for the hosts that have been - * changed. + * @param hosts The updated persons. */ - public HostsChangedEvent(List dataModelObjects) { - super(Case.Events.HOSTS_CHANGED.name(), dataModelObjects); + public HostsUpdatedEvent(List hosts) { + super(Case.Events.HOSTS_UPDATED.name(), hosts); } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountDeletedEvent.java deleted file mode 100644 index adc726fca8..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountDeletedEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.casemodule.events; - -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.events.AutopsyEvent; - -/** - * Event published when an OsAccount is deleted. - * - * oldValue will contain the objectId of the account that was removed. newValue - * will be null. - */ -public final class OsAccountDeletedEvent extends AutopsyEvent { - - private static final long serialVersionUID = 1L; - - public OsAccountDeletedEvent(Long osAccountObjectId) { - super(Case.Events.OS_ACCOUNT_REMOVED.toString(), osAccountObjectId, null); - } -} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountEvent.java deleted file mode 100755 index d34da7822d..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountEvent.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.casemodule.events; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.sleuthkit.datamodel.OsAccount; -import org.sleuthkit.datamodel.SleuthkitCase; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Parent class for specific OsAccount event classes. - */ -class OsAccountEvent extends TskDataModelChangeEvent { - - private static final long serialVersionUID = 1L; - - /** - * Construct a new OsAccountEvent. - * - * @param eventName The name of the event. - * @param account The OsAccount the event applies to. - */ - OsAccountEvent(String eventName, OsAccount account) { - super(eventName, Stream.of(account.getId()).collect(Collectors.toList()), Stream.of(account).collect(Collectors.toList())); - } - - /** - * Returns the OsAccount that changed. - * - * @return The OsAccount that was changed. - */ - public OsAccount getOsAccount() { - List accounts = getNewValue(); - return accounts.get(0); - } - - @Override - protected List getDataModelObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { - Long id = ids.get(0); - OsAccount account = caseDb.getOsAccountManager().getOsAccountByObjectId(id); - List accounts = new ArrayList<>(); - accounts.add(account); - return accounts; - } -} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountChangedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsAddedEvent.java similarity index 58% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountChangedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsAddedEvent.java index 237373a8b9..f4273408c6 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountChangedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsAddedEvent.java @@ -18,17 +18,26 @@ */ package org.sleuthkit.autopsy.casemodule.events; -import org.sleuthkit.autopsy.casemodule.Case; +import java.util.List; +import static org.sleuthkit.autopsy.casemodule.Case.Events.OS_ACCOUNTS_ADDED; import org.sleuthkit.datamodel.OsAccount; /** - * Event published when an OsAccount is updated. + * An application event published when OS accounts are added to the Sleuth Kit + * data model for a case. */ -public final class OsAccountChangedEvent extends OsAccountEvent { +public final class OsAccountsAddedEvent extends OsAccountsEvent { private static final long serialVersionUID = 1L; - - public OsAccountChangedEvent(OsAccount account) { - super(Case.Events.OS_ACCOUNT_CHANGED.toString(), account); - } + + /** + * Constructs an application event published when OS accounts are added to + * the Sleuth Kit data model for a case. + * + * @param osAccounts The OS accounts that were added. + */ + public OsAccountsAddedEvent(List osAccounts) { + super(OS_ACCOUNTS_ADDED.toString(), osAccounts); + } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsDeletedEvent.java new file mode 100755 index 0000000000..f3f65a0aed --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsDeletedEvent.java @@ -0,0 +1,51 @@ +/* + * 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.casemodule.events; + +import java.util.List; +import org.sleuthkit.autopsy.casemodule.Case; + +/** + * An application event published when OS accounts have been deleted from the + * Sleuth Kit data model for a case. + */ +public final class OsAccountsDeletedEvent extends TskDataModelObjectsDeletedEvent { + + private static final long serialVersionUID = 1L; + + /** + * Constructs an application event published when OS accounts have been + * deleted from the Sleuth Kit data model for a case. + * + * @param osAccountObjectIds TSK object IDs of the deleted accounts. + */ + public OsAccountsDeletedEvent(List osAccountObjectIds) { + super(Case.Events.OS_ACCOUNTS_DELETED.toString(), osAccountObjectIds); + } + + /** + * Gets the Sleuth Kit object IDs of the deleted OS accounts. + * + * @return The object IDs. + */ + List getOsAccountObjectIds() { + return getOldValue(); + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsEvent.java new file mode 100755 index 0000000000..434d8c8f60 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsEvent.java @@ -0,0 +1,66 @@ +/* + * 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.casemodule.events; + +import java.util.ArrayList; +import java.util.List; +import org.sleuthkit.datamodel.OsAccount; +import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * A base class for application events published when OS accounts in the Sleuth + * Kit data model for a case have been added or updated. + */ +class OsAccountsEvent extends TskDataModelChangedEvent { + + private static final long serialVersionUID = 1L; + + /** + * Constructs the base class part of an application event published when + * OS accounts in the Sleuth Kit data model for a case have been added or + * updated. + * + * @param eventName The name of the Case.Events enum value for the event + * type. + * @param account The OS accounts. + */ + OsAccountsEvent(String eventName, List osAccounts) { + super(eventName, null, null, osAccounts, OsAccount::getId); + } + + /** + * Gets the OS accounts that have been added or updated. + * + * @return The OS accounts. + */ + public List getOsAccounts() { + return getNewValue(); + } + + @Override + protected List getNewValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { + List osAccounts = new ArrayList<>(); + for (Long id : ids) { + osAccounts.add(caseDb.getOsAccountManager().getOsAccountByObjectId(id)); + } + return osAccounts; + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsUpdatedEvent.java similarity index 61% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountAddedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsUpdatedEvent.java index c9f89903f4..65767ccdfc 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/OsAccountsUpdatedEvent.java @@ -18,18 +18,26 @@ */ package org.sleuthkit.autopsy.casemodule.events; +import java.util.List; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.datamodel.OsAccount; /** - * Event published when an OsAccount is added to a case. + * An application event published when OS accounts in the Sleuth Kit data model + * for a case have been updated. */ -public final class OsAccountAddedEvent extends OsAccountEvent { +public final class OsAccountsUpdatedEvent extends OsAccountsEvent { private static final long serialVersionUID = 1L; - - public OsAccountAddedEvent(OsAccount account) { - super(Case.Events.OS_ACCOUNT_ADDED.toString(), account); - } + /** + * Constructs an application event published when OS accounts in the Sleuth + * Kit data model for a case have been updated. + * + * @param osAccounts The OS accounts that were updated. + */ + public OsAccountsUpdatedEvent(List osAccounts) { + super(Case.Events.OS_ACCOUNTS_UPDATED.toString(), osAccounts); + } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsAddedEvent.java index e2a8a7aabd..afd101eac3 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsAddedEvent.java @@ -23,17 +23,21 @@ import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.datamodel.Person; /** - * Event fired when new persons are added. + * An application event published when persons have been added to the Sleuth Kit + * data model for a case. */ public class PersonsAddedEvent extends PersonsEvent { - + private static final long serialVersionUID = 1L; - + /** - * Main constructor. - * @param dataModelObjects The persons that have been added. + * Constructs an application event published when persons have been added to + * the Sleuth Kit data model for a case. + * + * @param persons The persons that have been added. */ - public PersonsAddedEvent(List dataModelObjects) { - super(Case.Events.PERSONS_ADDED.name(), dataModelObjects); + public PersonsAddedEvent(List persons) { + super(Case.Events.PERSONS_ADDED.name(), persons); } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsDeletedEvent.java index a63fef32cb..46c024b7dd 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsDeletedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsDeletedEvent.java @@ -20,20 +20,32 @@ package org.sleuthkit.autopsy.casemodule.events; import java.util.List; import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.datamodel.Person; /** - * Event fired when persons are removed. + * Application events published when persons have been deleted from the Sleuth + * Kit data model for a case. */ -public class PersonsDeletedEvent extends PersonsEvent { - +public class PersonsDeletedEvent extends TskDataModelObjectsDeletedEvent { + private static final long serialVersionUID = 1L; - + /** - * Main constructor. - * @param dataModelObjects The list of persons that have been deleted. + * Constructs an application event published when persons have been deleted + * from the Sleuth Kit data model for a case. + * + * @param personIds The IDs of the persons that have been deleted. */ - public PersonsDeletedEvent(List dataModelObjects) { - super(Case.Events.PERSONS_DELETED.name(), dataModelObjects); + public PersonsDeletedEvent(List personIds) { + super(Case.Events.PERSONS_DELETED.name(), personIds); } + + /** + * Gets the person IDs of the persons that have been deleted. + * + * @return The person IDs. + */ + List getPersonIds() { + return getOldValue(); + } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsEvent.java index e3f584d58a..2d3b322ea7 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsEvent.java @@ -19,69 +19,52 @@ package org.sleuthkit.autopsy.casemodule.events; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import org.sleuthkit.datamodel.Person; -import org.sleuthkit.datamodel.PersonManager; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; /** - * Base event class for when something pertaining to persons changes. + * A base class for application events published when persons in the Sleuth Kit + * data model for a case have been added or updated. */ -public class PersonsEvent extends TskDataModelChangeEvent { +public class PersonsEvent extends TskDataModelChangedEvent { + + private static final long serialVersionUID = 1L; /** - * Retrieves a list of ids from a list of persons. - * - * @param persons The persons. - * @return The list of ids. - */ - private static List getIds(List persons) { - return getSafeList(persons).stream() - .filter(h -> h != null) - .map(h -> h.getPersonId()).collect(Collectors.toList()); - } - - /** - * Returns the persons or an empty list. - * - * @param persons The person list. - * @return The person list or an empty list if the parameter is null. - */ - private static List getSafeList(List persons) { - return persons == null ? Collections.emptyList() : persons; - } - - /** - * Main constructor. + * Constructs the base class part of an application event published when + * persons in the Sleuth Kit data model for a case have been added or + * updated. * * @param eventName The name of the Case.Events enum value for the event - * type. - * @param dataModelObjects The list of persons for the event. + * type. + * @param persons The persons. */ - protected PersonsEvent(String eventName, List dataModelObjects) { - super(eventName, getIds(dataModelObjects), new ArrayList<>(getSafeList(dataModelObjects))); + PersonsEvent(String eventName, List persons) { + super(eventName, null, null, persons, Person::getPersonId); + } + + /** + * Gets the persons that have been added or updated. + * + * @return The persons. + */ + public List getPersons() { + return getNewValue(); } @Override - protected List getDataModelObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { - PersonManager personManager = caseDb.getPersonManager(); - List toRet = new ArrayList<>(); - if (ids != null) { - for (Long id : ids) { - if (id == null) { - continue; - } - - Optional thisPersonOpt = personManager.getPerson(id); - thisPersonOpt.ifPresent((h) -> toRet.add(h)); + protected List getNewValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { + List persons = new ArrayList<>(); + for (Long id : ids) { + Optional person = caseDb.getPersonManager().getPerson(id); + if (person.isPresent()) { + persons.add(person.get()); } } - - return toRet; + return persons; } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsChangedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsUpdatedEvent.java old mode 100644 new mode 100755 similarity index 67% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsChangedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsUpdatedEvent.java index f375a125bb..572b832688 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsChangedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsUpdatedEvent.java @@ -23,19 +23,21 @@ import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.datamodel.Person; /** - * Event fired when persons are changed. + * Application events published when persons in the Sleuth Kit data model for + * a case have been updated. */ -public class PersonsChangedEvent extends PersonsEvent { +public class PersonsUpdatedEvent extends PersonsEvent { private static final long serialVersionUID = 1L; /** - * Main constructor. + * Constructs an application event published when persons in the Sleuth Kit + * data model for a case have been updated. * - * @param dataModelObjects The new values for the persons that have been - * changed. + * @param persons The updated persons. */ - public PersonsChangedEvent(List dataModelObjects) { - super(Case.Events.PERSONS_CHANGED.name(), dataModelObjects); + public PersonsUpdatedEvent(List persons) { + super(Case.Events.PERSONS_UPDATED.name(), persons); } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/ReportAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/ReportAddedEvent.java index bb4145c804..9da76a4366 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/ReportAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/ReportAddedEvent.java @@ -28,33 +28,38 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; /** - * Event published when a report is added to a case. + * An application event published when a report is added to a case. */ -public final class ReportAddedEvent extends TskDataModelChangeEvent { +public final class ReportAddedEvent extends TskDataModelChangedEvent { private static final long serialVersionUID = 1L; /** - * Constructs an event published when a report is added to a case. + * Constructs an application event published when a report is added to a + * case. * - * @param report The data source that was added. + * @param report The report that was added. */ public ReportAddedEvent(Report report) { - super(Case.Events.REPORT_ADDED.toString(), Stream.of(report.getId()).collect(Collectors.toList()), Stream.of(report).collect(Collectors.toList())); + super(Case.Events.REPORT_ADDED.toString(), null, null, Stream.of(report).collect(Collectors.toList()), Report::getId); } + /** + * Gets the reoprt that was added to the case. + * + * @return The report. + */ public Report getReport() { List reports = getNewValue(); return reports.get(0); } - + @Override - protected List getDataModelObjects(SleuthkitCase caseD, List ids) throws TskCoreException { + protected List getNewValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { Long id = ids.get(0); - Report report = caseD.getReportById(id); List reports = new ArrayList<>(); - reports.add(report); + reports.add(caseDb.getReportById(id)); return reports; } - + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/TskDataModelChangeEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/TskDataModelChangeEvent.java deleted file mode 100755 index 1bd9fd81ac..0000000000 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/TskDataModelChangeEvent.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * 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.casemodule.events; - -import java.util.Collections; -import java.util.List; -import java.util.logging.Level; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.events.AutopsyEvent; -import org.sleuthkit.datamodel.SleuthkitCase; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * An application event generic used as a superclass for events published when - * something changes in the Sleuth Kit Data Model for a case. - * - * @param A Sleuth Kit Data Model object type. - */ -public abstract class TskDataModelChangeEvent extends AutopsyEvent { - - private static final long serialVersionUID = 1L; - private static final Logger logger = Logger.getLogger(TskDataModelChangeEvent.class.getName()); - private final List dataModelObjectIds; - private transient List dataModelObjects; - - /** - * Constructs an application event generic used as a superclass for events - * published when something changes in the Sleuth Kit Data Model for a case. - * - * @param eventName The event name. - * @param dataModelObjectIds The unique numeric IDs (TSK object IDs, case - * database row IDs, etc.) of the Sleuth Kit Data - * Model objects associated with this application - * event. - * @param dataModelObjects The Sleuth Kit Data Model objects associated - * with this application event - */ - protected TskDataModelChangeEvent(String eventName, List dataModelObjectIds, List dataModelObjects) { - super(eventName, null, null); - this.dataModelObjectIds = dataModelObjectIds; - this.dataModelObjects = dataModelObjects; - if (eventName == null) { - throw new IllegalArgumentException("eventName is null"); - } - if (dataModelObjectIds == null) { - throw new IllegalArgumentException("dataModelObjectIds is null"); - } - if (dataModelObjects == null) { - throw new IllegalArgumentException("dataModelObjects is null"); - } - } - - /** - * Gets the unique numeric IDs (TSK object IDs, case database row IDs, etc.) - * of the Sleuth Kit Data Model objects associated with this application - * event. - * - * @return The unique IDs. - */ - public final List getDataModelObjectIds() { - return Collections.unmodifiableList(dataModelObjectIds); - } - - /** - * Gets the Sleuth Kit Data Model objects associated with this application - * event. - * - * @return The objects. - */ - @Override - public List getNewValue() { - /* - * If this event came from another host collaborating on a multi-user - * case, the transient list of Sleuth Kit Data Model objects will be - * null and will need to be reconstructed on the current host. - */ - if (dataModelObjects == null) { - try { - Case currentCase = Case.getCurrentCaseThrows(); - SleuthkitCase caseDb = currentCase.getSleuthkitCase(); - dataModelObjects = getDataModelObjects(caseDb, dataModelObjectIds); - } catch (NoCurrentCaseException | TskCoreException ex) { - logger.log(Level.SEVERE, String.format("Error geting TSK Data Model objects for %s event (%s)", getPropertyName(), getSourceType()), ex); - return Collections.emptyList(); - } - } - return Collections.unmodifiableList(dataModelObjects); - } - - /** - * Gets the Sleuth Kit Data Model objects associated with this application - * event. - * - * @param caseDb The case database. - * @param ids The unique, numeric IDs (TSK object IDs, case database row - * IDs, etc.) of the Sleuth Kit Data Model objects. - * - * @return The objects. - * - * @throws org.sleuthkit.datamodel.TskCoreException If there is an error - * getting the Sleuth Kit - * Data Model objects. - */ - abstract protected List getDataModelObjects(SleuthkitCase caseDb, List ids) throws TskCoreException; - -} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/TskDataModelChangedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/TskDataModelChangedEvent.java new file mode 100755 index 0000000000..83ced035fc --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/TskDataModelChangedEvent.java @@ -0,0 +1,205 @@ +/* + * 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.casemodule.events; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.stream.Collectors; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.events.AutopsyEvent; +import org.sleuthkit.datamodel.SleuthkitCase; +import org.sleuthkit.datamodel.TskCoreException; + +/** + * An abstract base class for application events published when one or more + * Sleuth Kit Data Model objects for a case change in some way. + * + * This class extends AutopsyEvent. The AutopsyEvent class extends + * PropertyChangeEvent to integrate with legacy use of JavaBeans + * PropertyChangeEvents and PropertyChangeListeners as an application event + * publisher-subcriber mechanism. Subclasses need to decide what constitutes + * "old" and "new" objects for them and are encouraged to provide getters for + * these values that do not require clients to cast the return values. + * + * The AutopsyEvent class implements Serializable to allow local event instances + * to be published to other Autopsy nodes over a network in serialized form. TSK + * Data Model objects are generally not serializable because they encapsulate a + * reference to a SleuthkitCase object that represents the case database and + * which has local JDBC Connection objects. For this reason, this class supports + * serialization of the unique numeric IDs (TSK object IDs, case database row + * IDs, etc.) of the subject TSK Data Model objects and the "reconstruction" of + * those objects on other Autopsy nodes by querying the case database by unique + * ID. + * + * @param The Sleuth Kit Data Model object type of the "old" data model + * objects. + * @param The Sleuth Kit Data Model object type of the "new" data model + * objects. + */ +public abstract class TskDataModelChangedEvent extends AutopsyEvent { + + private static final long serialVersionUID = 1L; + private static final Logger logger = Logger.getLogger(TskDataModelChangedEvent.class.getName()); + private final boolean hasOldValue; + private final List oldValueIds; + private transient List oldValueObjects; + private final boolean hasNewValue; + private final List newValueIds; + private transient List newValueObjects; + + /** + * Constructs the base class part for application events published when one + * or more Sleuth Kit Data Model objects for a case change in some way. + * + * @param eventName The event name. + * @param oldValueObjects A list of he Data Model objects that have been + * designated as the "old" objects in the event. + * May be null. + * @param oldValueGetIdMethod A method that can be applied to the "old" data + * model objects to get their unique numeric IDs + * (TSK object IDs, case database row IDs, etc.). + * May be null if there are no "old" objects. + * @param newValueObjects A list of he Data Model objects that have been + * designated as the "new" objects in the event. + * May be null. + * @param newValueGetIdMethod A method that can be applied to the "new" data + * model objects to get their unique numeric IDs + * (TSK object IDs, case database row IDs, etc.). + * May be null if there are no "new" objects. + */ + protected TskDataModelChangedEvent(String eventName, List oldValueObjects, Function oldValueGetIdMethod, List newValueObjects, Function newValueGetIdMethod) { + super(eventName, null, null); + oldValueIds = new ArrayList<>(); + this.oldValueObjects = new ArrayList<>(); + if (oldValueObjects != null) { + hasOldValue = true; + oldValueIds.addAll(oldValueObjects.stream() + .map(o -> oldValueGetIdMethod.apply(o)) + .collect(Collectors.toList())); + this.oldValueObjects.addAll(oldValueObjects); + } else { + hasOldValue = false; + } + newValueIds = new ArrayList<>(); + this.newValueObjects = new ArrayList<>(); + if (newValueObjects != null) { + hasNewValue = true; + newValueIds.addAll(newValueObjects.stream() + .map(o -> newValueGetIdMethod.apply(o)) + .collect(Collectors.toList())); + this.newValueObjects.addAll(newValueObjects); + } else { + hasNewValue = false; + } + } + + /** + * Gets a list of the Data Model objects that have been designated as the + * "old" objects in the event. + * + * @return The list of the "old" data model objects. May be empty. + */ + @Override + public List getOldValue() { + if (hasOldValue) { + if (oldValueObjects == null) { + try { + Case currentCase = Case.getCurrentCaseThrows(); + SleuthkitCase caseDb = currentCase.getSleuthkitCase(); + oldValueObjects = getOldValueObjects(caseDb, oldValueIds); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.SEVERE, String.format("Error getting oldValue() TSK Data Model objects for %s event (%s)", getPropertyName(), getSourceType()), ex); + return Collections.emptyList(); + } + } + return Collections.unmodifiableList(oldValueObjects); + } else { + return Collections.emptyList(); + } + } + + /** + * Gets a list of the Data Model objects that have been designated as the + * "new" objects in the event. + * + * @return The list of the "new" data model objects. May be empty. + */ + @Override + public List getNewValue() { + if (hasNewValue) { + if (newValueObjects == null) { + try { + Case currentCase = Case.getCurrentCaseThrows(); + SleuthkitCase caseDb = currentCase.getSleuthkitCase(); + newValueObjects = getNewValueObjects(caseDb, newValueIds); + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.SEVERE, String.format("Error getting newValue() TSK Data Model objects for %s event (%s)", getPropertyName(), getSourceType()), ex); + return Collections.emptyList(); + } + } + return Collections.unmodifiableList(newValueObjects); + } else { + return Collections.emptyList(); + } + } + + /** + * Reconstructs the "old" Sleuth Kit Data Model objects associated with this + * application event, if any, using the given unique numeric IDs (TSK object + * IDs, case database row IDs, etc.) to query the given case database. + * + * @param caseDb The case database. + * @param ids The unique, numeric IDs (TSK object IDs, case database row + * IDs, etc.) of the Sleuth Kit Data Model objects. + * + * @return The objects. + * + * @throws org.sleuthkit.datamodel.TskCoreException If there is an error + * getting the Sleuth Kit + * Data Model objects. + */ + protected List getOldValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { + return Collections.emptyList(); + } + + /** + * Reconstructs the "new" Sleuth Kit Data Model objects associated with this + * application event, if any, using the given unique numeric IDs (TSK object + * IDs, case database row IDs, etc.) to query the given case database. + * + * @param caseDb The case database. + * @param ids The unique, numeric IDs (TSK object IDs, case database row + * IDs, etc.) of the Sleuth Kit Data Model objects. + * + * @return The objects. + * + * @throws org.sleuthkit.datamodel.TskCoreException If there is an error + * getting the Sleuth Kit + * Data Model objects. + */ + protected List getNewValueObjects(SleuthkitCase caseDb, List ids) throws TskCoreException { + return Collections.emptyList(); + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/TskDataModelObjectsDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/TskDataModelObjectsDeletedEvent.java new file mode 100755 index 0000000000..7e5929e4a1 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/TskDataModelObjectsDeletedEvent.java @@ -0,0 +1,60 @@ +/* + * 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.casemodule.events; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.sleuthkit.autopsy.events.AutopsyEvent; + +/** + * An abstract base class for application events published when one or more + * Sleuth Kit Data Model objects for a case have been deleted. + * + * This class extends AutopsyEvent. The AutopsyEvent class extends + * PropertyChangeEvent to integrate with legacy use of JavaBeans + * PropertyChangeEvents and PropertyChangeListeners as an application event + * publisher-subcriber mechanism. Subclasses need to decide what constitutes + * "old" and "new" objects for them. + * + * For this class the "old" values are the unique numeric IDs (TSK object IDs, + * case database row IDs, etc.) of the deleted TSK Data Model objects. There are + * no "new" values. Subclasses are encouraged to provide less generic getters + * with descriptive names for the unique IDs than the override of the inherited + * getOldValue() method below. These getters can be implemented by delegating to + * getOldValue(). + */ +public class TskDataModelObjectsDeletedEvent extends AutopsyEvent { + + private static final long serialVersionUID = 1L; + + private final List deletedObjectIds; + + protected TskDataModelObjectsDeletedEvent(String eventName, List deletedObjectIds) { + super(eventName, null, null); + this.deletedObjectIds = new ArrayList<>(); + this.deletedObjectIds.addAll(deletedObjectIds); + } + + @Override + public List getOldValue() { + return Collections.unmodifiableList(deletedObjectIds); + } + +} diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED index b4f7f835ef..b2320b5408 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/Bundle.properties-MERGED @@ -5,10 +5,7 @@ CentralRepoCommentDialog.title.addEditCentralRepoComment=Add/Edit Central Reposi OpenIDE-Module-Name=Central Repository OpenIDE-Module-Display-Category=Ingest Module OpenIDE-Module-Short-Description=Central Repository Ingest Module -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. +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. CentralRepoCommentDialog.commentLabel.text=Comment: CentralRepoCommentDialog.okButton.text=&OK CentralRepoCommentDialog.cancelButton.text=C&ancel diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java index 21fb6ecd2f..c215d2ec63 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/eventlisteners/IngestEventsListener.java @@ -63,7 +63,7 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository; import org.sleuthkit.datamodel.Score; -import org.sleuthkit.datamodel.Score.MethodCategory; +import org.sleuthkit.datamodel.Score.Priority; import org.sleuthkit.datamodel.Score.Significance; /** @@ -72,7 +72,7 @@ import org.sleuthkit.datamodel.Score.Significance; */ @NbBundle.Messages({"IngestEventsListener.ingestmodule.name=Central Repository"}) public class IngestEventsListener { - private static final Score LIKELY_NOTABLE_SCORE = new Score(Significance.LIKELY_NOTABLE, MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Significance.LIKELY_NOTABLE, Priority.NORMAL); private static final Logger LOGGER = Logger.getLogger(CorrelationAttributeInstance.class.getName()); private static final Set INGEST_JOB_EVENTS_OF_INTEREST = EnumSet.of(IngestManager.IngestJobEvent.DATA_SOURCE_ANALYSIS_COMPLETED); private static final Set INGEST_MODULE_EVENTS_OF_INTEREST = EnumSet.of(DATA_ADDED); diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/CentralRepoIngestModule.java b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/CentralRepoIngestModule.java index 4a492d9af6..2ea1d4a5a6 100644 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/CentralRepoIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/ingestmodule/CentralRepoIngestModule.java @@ -67,7 +67,7 @@ import org.sleuthkit.datamodel.Score; final class CentralRepoIngestModule implements FileIngestModule { private static final String MODULE_NAME = CentralRepoIngestModuleFactory.getModuleName(); - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); static final boolean DEFAULT_FLAG_TAGGED_NOTABLE_ITEMS = false; static final boolean DEFAULT_FLAG_PREVIOUS_DEVICES = false; static final boolean DEFAULT_CREATE_CR_PROPERTIES = true; diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED index dacd037aaa..53aaacb575 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED @@ -181,837 +181,776 @@ 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}\n\ - The 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}\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.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.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.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.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.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.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} +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} ## 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} \n\ - becuase it is either not a supported file type or \n\ - because 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} \nbecuase it is either not a supported file type or \nbecause 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\ -\n\ -Check the ICEpdf web site for the latest news:\n\ -http://www.icepdf.org/ \n\n +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 ## 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},\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.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.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.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.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})\n\ - Recreate it ? +manager.properties.deleted=Property file has been deleted\n({0})\nRecreate it ? -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.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.saveError = Impossible to save property file.\n\ -Encountered the folowing error :\n\ -{0} +manager.properties.saveError=Impossible to save property file.\nEncountered the folowing error :\n{0} -manager.properties.lafError =\ - Look&Feel {0} given in the default properties is unsupported.\n\ - Using system default. +manager.properties.lafError=Look&Feel {0} given in the default properties is unsupported.\nUsing 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 1d50092e80..51f1208f61 100755 --- a/Core/src/org/sleuthkit/autopsy/core/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/core/Bundle.properties-MERGED @@ -3,13 +3,7 @@ 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\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-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-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 0636340b0b..609d68bcd1 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 a0d535f8e6..18e279dd2c 100755 --- a/Core/src/org/sleuthkit/autopsy/coreutils/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/coreutils/Bundle.properties-MERGED @@ -30,9 +30,7 @@ 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}\n\ -Process Virtual Memory: {2} +PlatformUtil.getAllMemUsageInfo.usageText={0}\n{1}\nProcess 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/AutopsyTreeChildFactory.java b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyTreeChildFactory.java index aa481b021e..282ed83418 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyTreeChildFactory.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyTreeChildFactory.java @@ -1,15 +1,15 @@ /* * Autopsy Forensic Browser - * - * Copyright 2018 Basis Technology Corp. + * + * Copyright 2018-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. @@ -43,34 +43,40 @@ import org.sleuthkit.datamodel.SleuthkitVisitableItem; import org.sleuthkit.datamodel.TskCoreException; /** - * Child factory to create the top level children of the autopsy tree - * + * A child factory to create the top level nodes in the main tree view. These + * nodes are the child nodes of the invisible root node of the tree. The child + * nodes that are created vary with the view option selected by the user: group + * by data type or group by person/host. */ public final class AutopsyTreeChildFactory extends ChildFactory.Detachable { - private static final Set LISTENING_EVENTS = EnumSet.of( - Case.Events.DATA_SOURCE_ADDED, + private static final Set EVENTS_OF_INTEREST = EnumSet.of(Case.Events.DATA_SOURCE_ADDED, Case.Events.HOSTS_ADDED, Case.Events.HOSTS_DELETED, Case.Events.PERSONS_ADDED, Case.Events.PERSONS_DELETED, - Case.Events.PERSONS_CHANGED + Case.Events.HOSTS_ADDED_TO_PERSON, + Case.Events.HOSTS_REMOVED_FROM_PERSON ); - private static final Set LISTENING_EVENT_NAMES = LISTENING_EVENTS.stream() + private static final Set EVENTS_OF_INTEREST_NAMES = EVENTS_OF_INTEREST.stream() .map(evt -> evt.name()) .collect(Collectors.toSet()); private static final Logger logger = Logger.getLogger(AutopsyTreeChildFactory.class.getName()); /** - * Listener for handling DATA_SOURCE_ADDED events. + * Listener for application events published when persons and/or hosts are + * added to or deleted from the data model for the current case. If the user + * has selected the group by person/host option for the tree, these events + * mean that the top-level person/host nodes in the tree need to be + * refreshed to reflect the changes. */ private final PropertyChangeListener pcl = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - if (LISTENING_EVENT_NAMES.contains(eventType) + if (EVENTS_OF_INTEREST_NAMES.contains(eventType) && Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) { refreshChildren(); } @@ -80,20 +86,28 @@ public final class AutopsyTreeChildFactory extends ChildFactory.Detachable list) { @@ -101,6 +115,10 @@ public final class AutopsyTreeChildFactory extends ChildFactory.Detachable persons = personManager.getPersons(); // show persons level if there are persons to be shown @@ -118,8 +136,7 @@ public final class AutopsyTreeChildFactory extends ChildFactory.Detachable 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.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.EnumSet; +import java.util.List; +import java.util.logging.Level; +import org.openide.nodes.Children; +import org.openide.nodes.Sheet; +import org.openide.util.NbBundle; +import org.openide.util.lookup.Lookups; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.TskDataException; + +/** + * A structural node in the main tree view when the user has selected the group + * by persons/hosts option. Instances of this node appear as children of a node + * representing a data source association with a host, and as a parent of a data + * source node. For example: "Host X" -> "Data Source Y" -> "Data Source Files" + * -> "Data Source Y", where "Data Source Files" is an instance of this node. + */ +public class DataSourceFilesNode extends DisplayableItemNode { + + private static final String NAME = NbBundle.getMessage(DataSourceFilesNode.class, "DataSourcesNode.name"); + + /** + * @return The name used to identify the node of this type with a lookup. + */ + public static String getNameIdentifier() { + return NAME; + } + + private final String displayName; + + // NOTE: The images passed in via argument will be ignored. + @Deprecated + public DataSourceFilesNode(List images) { + this(0); + } + + public DataSourceFilesNode() { + this(0); + } + + public DataSourceFilesNode(long dsObjId) { + super(Children.create(new DataSourcesNodeChildren(dsObjId), false), Lookups.singleton(NAME)); + displayName = (dsObjId > 0) ? NbBundle.getMessage(DataSourceFilesNode.class, "DataSourcesNode.group_by_datasource.name") : NAME; + init(); + } + + private void init() { + setName(NAME); + setDisplayName(displayName); + this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/image.png"); //NON-NLS + } + + @Override + public String getItemType() { + return getClass().getName(); + } + + /* + * Custom Keys implementation that listens for new data sources being added. + */ + public static class DataSourcesNodeChildren extends AbstractContentChildren { + + private static final Logger logger = Logger.getLogger(DataSourcesNodeChildren.class.getName()); + private final long datasourceObjId; + + List currentKeys; + + public DataSourcesNodeChildren() { + this(0); + } + + public DataSourcesNodeChildren(long dsObjId) { + super("ds_" + Long.toString(dsObjId)); + this.currentKeys = new ArrayList<>(); + this.datasourceObjId = dsObjId; + } + + private final PropertyChangeListener pcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + if (eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { + refresh(true); + } + } + }; + + @Override + protected void onAdd() { + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); + } + + @Override + protected void onRemove() { + Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); + currentKeys.clear(); + } + + @Override + protected List makeKeys() { + try { + if (datasourceObjId == 0) { + currentKeys = Case.getCurrentCaseThrows().getDataSources(); + } else { + Content content = Case.getCurrentCaseThrows().getSleuthkitCase().getDataSource(datasourceObjId); + currentKeys = new ArrayList<>(Arrays.asList(content)); + } + + Collections.sort(currentKeys, new Comparator() { + @Override + public int compare(Content content1, Content content2) { + String content1Name = content1.getName().toLowerCase(); + String content2Name = content2.getName().toLowerCase(); + return content1Name.compareTo(content2Name); + } + + }); + + } catch (TskCoreException | NoCurrentCaseException | TskDataException ex) { + logger.log(Level.SEVERE, "Error getting data sources: {0}", ex.getMessage()); // NON-NLS + } + + return currentKeys; + } + } + + @Override + public boolean isLeafTypeNode() { + return false; + } + + @Override + public T accept(DisplayableItemNodeVisitor visitor) { + return visitor.visit(this); + } + + @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<>(NbBundle.getMessage(this.getClass(), "DataSourcesNode.createSheet.name.name"), + NbBundle.getMessage(this.getClass(), "DataSourcesNode.createSheet.name.displayName"), + NbBundle.getMessage(this.getClass(), "DataSourcesNode.createSheet.name.desc"), + NAME)); + return sheet; + } +} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSources.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSources.java index 52ca52e89f..4f23327401 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSources.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSources.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011 Basis Technology Corp. + * Copyright 2011-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,7 +19,7 @@ package org.sleuthkit.autopsy.datamodel; /** - * Root node to store the data sources in a case + * An "Autopsy visitable item" that supplies a */ public class DataSources implements AutopsyVisitableItem { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java deleted file mode 100644 index 1fab7774c7..0000000000 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesByTypeNode.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * 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.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.EnumSet; -import java.util.List; -import java.util.Set; -import java.util.logging.Level; -import java.util.stream.Collectors; -import org.openide.nodes.ChildFactory; -import org.openide.nodes.Children; -import org.openide.nodes.Node; -import org.openide.nodes.Sheet; -import org.openide.util.NbBundle; -import org.openide.util.NbBundle.Messages; -import org.openide.util.lookup.Lookups; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; -import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Root node for hosts displaying only data sources (no results, reports, etc.). - */ -@Messages({ - "DataSourcesHostsNode_name=Data Sources" -}) -public class DataSourcesByTypeNode extends DisplayableItemNode { - - /* - * Custom Keys implementation that listens for new data sources being added. - */ - public static class DataSourcesByTypeChildren extends ChildFactory.Detachable { - - private static final Set UPDATE_EVTS = EnumSet.of( - Case.Events.DATA_SOURCE_ADDED, - Case.Events.HOSTS_ADDED, - Case.Events.HOSTS_DELETED, - Case.Events.HOSTS_CHANGED); - - private static final Set UPDATE_EVT_STRS = UPDATE_EVTS.stream() - .map(evt -> evt.name()) - .collect(Collectors.toSet()); - - private static final Logger logger = Logger.getLogger(DataSourcesByTypeChildren.class.getName()); - - private final PropertyChangeListener pcl = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - String eventType = evt.getPropertyName(); - if (UPDATE_EVT_STRS.contains(eventType)) { - refresh(true); - } - } - }; - - @Override - protected void addNotify() { - Case.addEventTypeSubscriber(UPDATE_EVTS, pcl); - } - - @Override - protected void removeNotify() { - Case.removeEventTypeSubscriber(UPDATE_EVTS, pcl); - } - - @Override - protected boolean createKeys(List toPopulate) { - try { - Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().getAllHosts().stream() - .map(HostDataSources::new) - .sorted() - .forEach(toPopulate::add); - - } catch (TskCoreException | NoCurrentCaseException ex) { - logger.log(Level.SEVERE, "Error getting data sources: {0}", ex.getMessage()); // NON-NLS - } - - return true; - } - - @Override - protected Node createNodeForKey(HostDataSources key) { - return new HostNode(key); - } - - } - - private static final String NAME = Bundle.DataSourcesHostsNode_name(); - - /** - * @return The name used to identify the node of this type with a lookup. - */ - public static String getNameIdentifier() { - return NAME; - } - - /** - * Main constructor. - */ - DataSourcesByTypeNode() { - super(Children.create(new DataSourcesByTypeChildren(), false), Lookups.singleton(NAME)); - setName(NAME); - setDisplayName(NAME); - this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/image.png"); - } - - @Override - public String getItemType() { - return getClass().getName(); - } - - @Override - public boolean isLeafTypeNode() { - return false; - } - - @Override - public T accept(DisplayableItemNodeVisitor visitor) { - return visitor.visit(this); - } - - @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<>(NbBundle.getMessage(this.getClass(), "DataSourcesNode.createSheet.name.name"), - NbBundle.getMessage(this.getClass(), "DataSourcesNode.createSheet.name.displayName"), - NbBundle.getMessage(this.getClass(), "DataSourcesNode.createSheet.name.desc"), - NAME)); - return sheet; - } -} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java index 033f14fc04..c5fae53c03 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java @@ -1,15 +1,15 @@ /* * Autopsy Forensic Browser - * - * Copyright 2011-2018 Basis Technology Corp. + * + * 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. @@ -20,135 +20,117 @@ package org.sleuthkit.autopsy.datamodel; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.EnumSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; +import java.util.stream.Collectors; +import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; +import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; -import org.sleuthkit.datamodel.TskDataException; /** - * Nodes for the images + * A top-level structural node (child of the invisible root node) in the main + * tree view when the user has selected the group by data type option. It + * appears as the parent node of the "directory tree" nodes that are the roots + * of the file trees for the individual data sources in a case. For example: + * "Data Sources" -> "Data Source X", "Data Source Y", where "Data Sources" is + * an instance of this node. The siblings of this node are the "Views, "Analysis + * Results," "Os Accounts," "Tags," and "Reports" nodes. */ +@Messages({ + "DataSourcesHostsNode_name=Data Sources" +}) public class DataSourcesNode extends DisplayableItemNode { - private static final String NAME = NbBundle.getMessage(DataSourcesNode.class, "DataSourcesNode.name"); - - /** - * @return The name used to identify the node of this type with a lookup. - */ - public static String getNameIdentifier() { - return NAME; - } - - private final String displayName; - - // NOTE: The images passed in via argument will be ignored. - @Deprecated - public DataSourcesNode(List images) { - this(0); - } - - public DataSourcesNode() { - this(0); - } - - public DataSourcesNode(long dsObjId) { - super(Children.create(new DataSourcesNodeChildren(dsObjId), false), Lookups.singleton(NAME)); - displayName = (dsObjId > 0) ? NbBundle.getMessage(DataSourcesNode.class, "DataSourcesNode.group_by_datasource.name") : NAME; - init(); - } - - private void init() { - setName(NAME); - setDisplayName(displayName); - this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/image.png"); //NON-NLS - } - - @Override - public String getItemType() { - return getClass().getName(); - } - /* * Custom Keys implementation that listens for new data sources being added. */ - public static class DataSourcesNodeChildren extends AbstractContentChildren { + public static class DataSourcesByTypeChildren extends ChildFactory.Detachable { - private static final Logger logger = Logger.getLogger(DataSourcesNodeChildren.class.getName()); - private final long datasourceObjId; - - List currentKeys; + private static final Set UPDATE_EVTS = EnumSet.of(Case.Events.DATA_SOURCE_ADDED, + Case.Events.HOSTS_ADDED, + Case.Events.HOSTS_DELETED, + Case.Events.HOSTS_UPDATED); - public DataSourcesNodeChildren() { - this(0); - } + private static final Set UPDATE_EVT_STRS = UPDATE_EVTS.stream() + .map(evt -> evt.name()) + .collect(Collectors.toSet()); + + private static final Logger logger = Logger.getLogger(DataSourcesByTypeChildren.class.getName()); - public DataSourcesNodeChildren(long dsObjId) { - super("ds_" + Long.toString(dsObjId)); - this.currentKeys = new ArrayList<>(); - this.datasourceObjId = dsObjId; - } - private final PropertyChangeListener pcl = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - if (eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { + if (UPDATE_EVT_STRS.contains(eventType)) { refresh(true); } } }; @Override - protected void onAdd() { - Case.addEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); + protected void addNotify() { + Case.addEventTypeSubscriber(UPDATE_EVTS, pcl); } @Override - protected void onRemove() { - Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); - currentKeys.clear(); + protected void removeNotify() { + Case.removeEventTypeSubscriber(UPDATE_EVTS, pcl); } @Override - protected List makeKeys() { + protected boolean createKeys(List toPopulate) { try { - if (datasourceObjId == 0) { - currentKeys = Case.getCurrentCaseThrows().getDataSources(); - } - else { - Content content = Case.getCurrentCaseThrows().getSleuthkitCase().getDataSource(datasourceObjId); - currentKeys = new ArrayList<>(Arrays.asList(content)); - } - - Collections.sort(currentKeys, new Comparator() { - @Override - public int compare(Content content1, Content content2) { - String content1Name = content1.getName().toLowerCase(); - String content2Name = content2.getName().toLowerCase(); - return content1Name.compareTo(content2Name); - } + Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().getAllHosts().stream() + .map(HostDataSources::new) + .sorted() + .forEach(toPopulate::add); - }); - - } catch (TskCoreException | NoCurrentCaseException | TskDataException ex) { + } catch (TskCoreException | NoCurrentCaseException ex) { logger.log(Level.SEVERE, "Error getting data sources: {0}", ex.getMessage()); // NON-NLS } - - return currentKeys; + + return true; } + + @Override + protected Node createNodeForKey(HostDataSources key) { + return new HostNode(key); + } + + } + + private static final String NAME = Bundle.DataSourcesHostsNode_name(); + + /** + * @return The name used to identify the node of this type with a lookup. + */ + public static String getNameIdentifier() { + return NAME; + } + + /** + * Main constructor. + */ + DataSourcesNode() { + super(Children.create(new DataSourcesByTypeChildren(), false), Lookups.singleton(NAME)); + setName(NAME); + setDisplayName(NAME); + this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/image.png"); + } + + @Override + public String getItemType() { + return getClass().getName(); } @Override @@ -176,4 +158,4 @@ public class DataSourcesNode extends DisplayableItemNode { NAME)); return sheet; } -} \ No newline at end of file +} diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java index 715f9aecd9..5ee350da34 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java @@ -42,7 +42,7 @@ public interface DisplayableItemNodeVisitor { /* * Data Sources Area */ - T visit(DataSourcesNode in); + T visit(DataSourceFilesNode in); T visit(LayoutFileNode lfn); @@ -192,11 +192,11 @@ public interface DisplayableItemNodeVisitor { T visit(OsAccounts.OsAccountListNode node); - T visit(PersonGroupingNode node); + T visit(PersonNode node); T visit(HostNode node); - T visit(DataSourcesByTypeNode node); + T visit(DataSourcesNode node); /* * Unsupported node @@ -406,7 +406,7 @@ public interface DisplayableItemNodeVisitor { } @Override - public T visit(DataSourcesNode in) { + public T visit(DataSourceFilesNode in) { return defaultVisit(in); } @@ -561,12 +561,12 @@ public interface DisplayableItemNodeVisitor { } @Override - public T visit(DataSourcesByTypeNode node) { + public T visit(DataSourcesNode node) { return defaultVisit(node); } @Override - public T visit(PersonGroupingNode node) { + public T visit(PersonNode node) { return defaultVisit(node); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java index 94256255b9..08ce15cab6 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/HostNode.java @@ -39,7 +39,7 @@ import org.openide.util.WeakListeners; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; -import org.sleuthkit.autopsy.casemodule.events.HostsChangedEvent; +import org.sleuthkit.autopsy.casemodule.events.HostsUpdatedEvent; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.hosts.AssociatePersonsMenuAction; import org.sleuthkit.autopsy.datamodel.hosts.MergeHostMenuAction; @@ -178,8 +178,8 @@ public class HostNode extends DisplayableItemNode { @Override public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - if (hostId != null && eventType.equals(Case.Events.HOSTS_CHANGED.toString()) && evt instanceof HostsChangedEvent) { - ((HostsChangedEvent) evt).getNewValue().stream() + if (hostId != null && eventType.equals(Case.Events.HOSTS_UPDATED.toString()) && evt instanceof HostsUpdatedEvent) { + ((HostsUpdatedEvent) evt).getHosts().stream() .filter(h -> h != null && h.getHostId() == hostId) .findFirst() .ifPresent((newHost) -> { @@ -247,7 +247,7 @@ public class HostNode extends DisplayableItemNode { host == null ? Lookups.fixed(displayName) : Lookups.fixed(host, displayName)); hostId = host == null ? null : host.getHostId(); - Case.addEventTypeSubscriber(EnumSet.of(Case.Events.HOSTS_CHANGED), + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.HOSTS_UPDATED), WeakListeners.propertyChange(hostChangePcl, this)); super.setName(displayName); super.setDisplayName(displayName); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java index 9625254c6d..65875ef0ed 100755 --- a/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/OsAccounts.java @@ -39,7 +39,7 @@ import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.openide.util.WeakListeners; import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.casemodule.events.OsAccountChangedEvent; +import org.sleuthkit.autopsy.casemodule.events.OsAccountsUpdatedEvent; import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance; import org.sleuthkit.autopsy.corecomponents.DataResultViewerTable; import org.sleuthkit.autopsy.coreutils.Logger; @@ -125,8 +125,8 @@ 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()) - || eventType.equals(Case.Events.OS_ACCOUNT_REMOVED.toString())) { + if (eventType.equals(Case.Events.OS_ACCOUNTS_ADDED.toString()) + || eventType.equals(Case.Events.OS_ACCOUNTS_DELETED.toString())) { 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 @@ -140,13 +140,13 @@ 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.OS_ACCOUNTS_ADDED, Case.Events.OS_ACCOUNTS_DELETED), 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(Collections.singleton(Case.Events.OS_ACCOUNTS_ADDED), listener); Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), listener); } @@ -184,11 +184,14 @@ public final class OsAccounts implements AutopsyVisitableItem { private final PropertyChangeListener listener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - 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(); + if (evt.getPropertyName().equals(Case.Events.OS_ACCOUNTS_UPDATED.name())) { + OsAccountsUpdatedEvent updateEvent = (OsAccountsUpdatedEvent) evt; + for (OsAccount acct : updateEvent.getOsAccounts()) { + if (acct.getId() == account.getId()) { + account = acct; + updateSheet(); + break; + } } } else if (evt.getPropertyName().equals(REALM_DATA_AVAILABLE_EVENT)) { OsAccountRealm realm = (OsAccountRealm) evt.getNewValue(); @@ -222,7 +225,7 @@ public final class OsAccounts implements AutopsyVisitableItem { setDisplayName(account.getName()); setIconBaseWithExtension(ICON_PATH); - Case.addEventTypeSubscriber(Collections.singleton(Case.Events.OS_ACCOUNT_CHANGED), weakListener); + Case.addEventTypeSubscriber(Collections.singleton(Case.Events.OS_ACCOUNTS_UPDATED), weakListener); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/PersonGroupingNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/PersonNode.java similarity index 74% rename from Core/src/org/sleuthkit/autopsy/datamodel/PersonGroupingNode.java rename to Core/src/org/sleuthkit/autopsy/datamodel/PersonNode.java index 27c5b9f555..99db59211b 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/PersonGroupingNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/PersonNode.java @@ -1,15 +1,15 @@ /* * 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. @@ -36,7 +36,7 @@ import org.openide.util.WeakListeners; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; -import org.sleuthkit.autopsy.casemodule.events.PersonsChangedEvent; +import org.sleuthkit.autopsy.casemodule.events.PersonsUpdatedEvent; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.persons.DeletePersonAction; import org.sleuthkit.autopsy.datamodel.persons.EditPersonAction; @@ -45,16 +45,21 @@ import org.sleuthkit.datamodel.Person; import org.sleuthkit.datamodel.TskCoreException; /** - * A node to be displayed in the UI tree for a person and persons grouped in - * this host. + * A main tree view node that represents a person in a case. Its child nodes, if + * any, represent hosts in the case. There must be at least one person in a case + * for the person nodes layer to appear. If the persons layer is present, any + * hosts that are not associated with a person are grouped under an "Unknown + * Persons" person node. */ @NbBundle.Messages(value = {"PersonNode_unknownPersonNode_title=Unknown Persons"}) -public class PersonGroupingNode extends DisplayableItemNode { +public class PersonNode extends DisplayableItemNode { private static final String ICON_PATH = "org/sleuthkit/autopsy/images/person.png"; - + /** - * Returns the id of an unknown persons node. This can be used with a node lookup. + * Returns the id of an unknown persons node. This can be used with a node + * lookup. + * * @return The id of an unknown persons node. */ public static String getUnknownPersonId() { @@ -68,12 +73,13 @@ public class PersonGroupingNode extends DisplayableItemNode { private static final Logger logger = Logger.getLogger(PersonChildren.class.getName()); - private static final Set CHILD_EVENTS = EnumSet.of( - Case.Events.HOSTS_ADDED, - Case.Events.HOSTS_DELETED, - Case.Events.PERSONS_CHANGED); - - private static final Set CHILD_EVENTS_STR = CHILD_EVENTS.stream() + private static final Set HOST_EVENTS_OF_INTEREST = EnumSet.of(Case.Events.HOSTS_ADDED, + Case.Events.HOSTS_ADDED, + Case.Events.HOSTS_DELETED, + Case.Events.HOSTS_ADDED_TO_PERSON, + Case.Events.HOSTS_REMOVED_FROM_PERSON); + + private static final Set HOST_EVENTS_OF_INTEREST_NAMES = HOST_EVENTS_OF_INTEREST.stream() .map(ev -> ev.name()) .collect(Collectors.toSet()); @@ -89,13 +95,18 @@ public class PersonGroupingNode extends DisplayableItemNode { } /** - * Listener for handling adding and removing host events. + * Listener for application events that are published when hosts are + * added to or deleted from a case, and for events published when the + * associations between persons and hosts change. If the user has + * selected the group by person/host option for the main tree view, + * these events mean that person nodes in the tree need to be refreshed + * to reflect the structural changes. */ private final PropertyChangeListener hostAddedDeletedPcl = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - if (eventType != null && CHILD_EVENTS_STR.contains(eventType)) { + if (eventType != null && HOST_EVENTS_OF_INTEREST_NAMES.contains(eventType)) { refresh(true); } } @@ -103,12 +114,12 @@ public class PersonGroupingNode extends DisplayableItemNode { @Override protected void addNotify() { - Case.addEventTypeSubscriber(CHILD_EVENTS, hostAddedDeletedPcl); + Case.addEventTypeSubscriber(HOST_EVENTS_OF_INTEREST, hostAddedDeletedPcl); } @Override protected void removeNotify() { - Case.removeEventTypeSubscriber(CHILD_EVENTS, hostAddedDeletedPcl); + Case.removeEventTypeSubscriber(HOST_EVENTS_OF_INTEREST, hostAddedDeletedPcl); } @Override @@ -120,7 +131,12 @@ public class PersonGroupingNode extends DisplayableItemNode { protected boolean createKeys(List toPopulate) { List hosts = Collections.emptyList(); try { - hosts = Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().getHostsForPerson(this.person); + if (person != null) { + hosts = Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().getHostsForPerson(person); + } else { + // This is the "Unknown Persons" node, get the hosts that are not associated with a person. + hosts = Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().getHostsWithoutPersons(); + } } catch (NoCurrentCaseException | TskCoreException ex) { String personName = person == null || person.getName() == null ? "" : person.getName(); logger.log(Level.WARNING, String.format("Unable to get data sources for host: %s", personName), ex); @@ -139,14 +155,15 @@ public class PersonGroupingNode extends DisplayableItemNode { private final Long personId; /** - * Listener for handling person change events. + * Listener for application events that are published when the properties of + * persons in the case change. */ private final PropertyChangeListener personChangePcl = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - if (personId != null && eventType.equals(Case.Events.PERSONS_CHANGED.toString()) && evt instanceof PersonsChangedEvent) { - ((PersonsChangedEvent) evt).getNewValue().stream() + if (personId != null && eventType.equals(Case.Events.PERSONS_UPDATED.toString()) && evt instanceof PersonsUpdatedEvent) { + ((PersonsUpdatedEvent) evt).getNewValue().stream() .filter(p -> p != null && p.getPersonId() == personId) .findFirst() .ifPresent((newPerson) -> { @@ -161,6 +178,7 @@ public class PersonGroupingNode extends DisplayableItemNode { * Gets the display name for this person or "Unknown Persons". * * @param person The person. + * * @return The non-empty string for the display name. */ private static String getDisplayName(Person person) { @@ -174,17 +192,17 @@ public class PersonGroupingNode extends DisplayableItemNode { * * @param person The person record to be represented. */ - PersonGroupingNode(Person person) { + PersonNode(Person person) { this(person, getDisplayName(person)); } /** * Constructor. * - * @param person The person. + * @param person The person. * @param displayName The display name for the person. */ - private PersonGroupingNode(Person person, String displayName) { + private PersonNode(Person person, String displayName) { super(Children.create(new PersonChildren(person), false), person == null ? Lookups.fixed(displayName) : Lookups.fixed(person, displayName)); super.setName(displayName); @@ -192,7 +210,7 @@ public class PersonGroupingNode extends DisplayableItemNode { this.setIconBaseWithExtension(ICON_PATH); this.person = person; this.personId = person == null ? null : person.getPersonId(); - Case.addEventTypeSubscriber(EnumSet.of(Case.Events.PERSONS_CHANGED), + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.PERSONS_UPDATED), WeakListeners.propertyChange(personChangePcl, this)); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java index 24d077b5fa..694d583cdf 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/RootContentChildren.java @@ -130,7 +130,7 @@ public class RootContentChildren extends Children.Keys { @Override public AbstractNode visit(DataSources i) { - return new DataSourcesNode(i.filteringDataSourceObjId()); + return new DataSourceFilesNode(i.filteringDataSourceObjId()); } @Override @@ -177,7 +177,7 @@ public class RootContentChildren extends Children.Keys { @Override public AbstractNode visit(PersonGrouping personGrouping) { - return new PersonGroupingNode(personGrouping.getPerson()); + return new PersonNode(personGrouping.getPerson()); } @Override @@ -192,7 +192,7 @@ public class RootContentChildren extends Children.Keys { @Override public AbstractNode visit(DataSourcesByType dataSourceHosts) { - return new DataSourcesByTypeNode(); + return new DataSourcesNode(); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AssociateNewPersonAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AssociateNewPersonAction.java index 2cb89995c6..ff86ea65db 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AssociateNewPersonAction.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AssociateNewPersonAction.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.datamodel.hosts; import java.awt.Frame; import java.awt.event.ActionEvent; +import java.util.Collections; import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.JOptionPane; @@ -66,7 +67,7 @@ public class AssociateNewPersonAction extends AbstractAction { newPersonName = getAddDialogName(); if (StringUtils.isNotBlank(newPersonName)) { Person person = Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().newPerson(newPersonName); - Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().setPerson(host, person); + Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().addHostsToPerson(person, Collections.singletonList(host)); } } catch (NoCurrentCaseException | TskCoreException ex) { String hostName = this.host == null || this.host.getName() == null ? "" : this.host.getName(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AssociatePersonAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AssociatePersonAction.java index 70b31a1ac7..e9ca92791e 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AssociatePersonAction.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AssociatePersonAction.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.datamodel.hosts; import java.awt.event.ActionEvent; +import java.util.Collections; import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.JOptionPane; @@ -65,7 +66,7 @@ public class AssociatePersonAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { try { - Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().setPerson(host, person); + Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().addHostsToPerson(person, Collections.singletonList(host)); } catch (NoCurrentCaseException | TskCoreException ex) { String hostName = this.host == null || this.host.getName() == null ? "" : this.host.getName(); String personName = this.person == null || this.person.getName() == null ? "" : this.person.getName(); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/RemoveParentPersonAction.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/RemoveParentPersonAction.java index c8ae974bb0..f83d3bd874 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/RemoveParentPersonAction.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/RemoveParentPersonAction.java @@ -19,6 +19,7 @@ package org.sleuthkit.autopsy.datamodel.hosts; import java.awt.event.ActionEvent; +import java.util.Collections; import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.JOptionPane; @@ -46,6 +47,7 @@ public class RemoveParentPersonAction extends AbstractAction { private static final Logger logger = Logger.getLogger(RemoveParentPersonAction.class.getName()); + private final Person person; private final Host host; /** @@ -59,12 +61,13 @@ public class RemoveParentPersonAction extends AbstractAction { person == null || person.getName() == null ? Bundle.RemoveParentPersonAction_unknownPerson() : person.getName())); this.host = host; + this.person = person; } @Override public void actionPerformed(ActionEvent e) { try { - Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().setPerson(host, null); + Case.getCurrentCaseThrows().getSleuthkitCase().getPersonManager().removeHostsFromPerson(person, Collections.singletonList(host)); } catch (NoCurrentCaseException | TskCoreException ex) { String hostName = this.host == null || this.host.getName() == null ? "" : this.host.getName(); logger.log(Level.WARNING, String.format("Unable to remove parent from host: %s", hostName), ex); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index 3d3aa4939a..26e4518cea 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -85,7 +85,7 @@ import org.sleuthkit.autopsy.datamodel.InterestingHits; import org.sleuthkit.autopsy.datamodel.KeywordHits; import org.sleuthkit.autopsy.datamodel.AutopsyTreeChildFactory; import org.sleuthkit.autopsy.datamodel.DataArtifacts; -import org.sleuthkit.autopsy.datamodel.PersonGroupingNode; +import org.sleuthkit.autopsy.datamodel.PersonNode; import org.sleuthkit.autopsy.datamodel.Tags; import org.sleuthkit.autopsy.datamodel.ViewsNode; import org.sleuthkit.autopsy.datamodel.accounts.Accounts; @@ -240,7 +240,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat if (node == null) { return Collections.emptyList(); } else if (node.getLookup().lookup(Person.class) != null - || PersonGroupingNode.getUnknownPersonId().equals(node.getLookup().lookup(String.class))) { + || PersonNode.getUnknownPersonId().equals(node.getLookup().lookup(String.class))) { Children children = node.getChildren(); Node[] childNodes = children == null ? null : children.getNodes(); if (childNodes != null) { @@ -1192,7 +1192,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat return Optional.empty(); } else if (node.getLookup().lookup(Host.class) != null || node.getLookup().lookup(Person.class) != null - || PersonGroupingNode.getUnknownPersonId().equals(node.getLookup().lookup(String.class))) { + || PersonNode.getUnknownPersonId().equals(node.getLookup().lookup(String.class))) { // if host or person node, recurse until we find correct data source node. Children children = node.getChildren(); diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java b/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java index 6fb134ceec..c8f5848243 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/ViewContextAction.java @@ -46,10 +46,10 @@ import org.sleuthkit.autopsy.datamodel.AbstractAbstractFileNode; import org.sleuthkit.autopsy.datamodel.AbstractFsContentNode; import org.sleuthkit.autopsy.datamodel.BlackboardArtifactNode; import org.sleuthkit.autopsy.datamodel.ContentNodeSelectionInfo; -import org.sleuthkit.autopsy.datamodel.DataSourcesByTypeNode; import org.sleuthkit.autopsy.datamodel.DataSourcesNode; +import org.sleuthkit.autopsy.datamodel.DataSourceFilesNode; import org.sleuthkit.autopsy.datamodel.DisplayableItemNode; -import org.sleuthkit.autopsy.datamodel.PersonGroupingNode; +import org.sleuthkit.autopsy.datamodel.PersonNode; import org.sleuthkit.autopsy.datamodel.RootContentChildren; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; @@ -227,7 +227,7 @@ public class ViewContextAction extends AbstractAction { } // for this data source, get the "Data Sources" child node - Node datasourceGroupingNode = treeNode.getChildren().findChild(DataSourcesNode.getNameIdentifier()); + Node datasourceGroupingNode = treeNode.getChildren().findChild(DataSourceFilesNode.getNameIdentifier()); // check whether this is the data source we are looking for parentTreeViewNode = findParentNodeInTree(parentContent, datasourceGroupingNode); @@ -243,7 +243,7 @@ public class ViewContextAction extends AbstractAction { Node datasourceGroupingNode = rootChildren.findChild(dsname); if (!Objects.isNull(datasourceGroupingNode)) { Children dsChildren = datasourceGroupingNode.getChildren(); - parentTreeViewNode = dsChildren.findChild(DataSourcesNode.getNameIdentifier()); + parentTreeViewNode = dsChildren.findChild(DataSourceFilesNode.getNameIdentifier()); } } @@ -260,7 +260,7 @@ public class ViewContextAction extends AbstractAction { } else { // Classic view // Start the search at the DataSourcesNode Children rootChildren = treeViewExplorerMgr.getRootContext().getChildren(); - Node rootDsNode = rootChildren == null ? null : rootChildren.findChild(DataSourcesByTypeNode.getNameIdentifier()); + Node rootDsNode = rootChildren == null ? null : rootChildren.findChild(DataSourcesNode.getNameIdentifier()); if (rootDsNode != null) { for (Node dataSourceLevelNode : getDataSourceLevelNodes(rootDsNode)) { DataSource dataSource = dataSourceLevelNode.getLookup().lookup(DataSource.class); @@ -329,8 +329,8 @@ public class ViewContextAction extends AbstractAction { return Collections.emptyList(); } else if (node.getLookup().lookup(Host.class) != null || node.getLookup().lookup(Person.class) != null || - DataSourcesByTypeNode.getNameIdentifier().equals(node.getLookup().lookup(String.class)) || - PersonGroupingNode.getUnknownPersonId().equals(node.getLookup().lookup(String.class))) { + DataSourcesNode.getNameIdentifier().equals(node.getLookup().lookup(String.class)) || + PersonNode.getUnknownPersonId().equals(node.getLookup().lookup(String.class))) { Children children = node.getChildren(); Node[] childNodes = children == null ? null : children.getNodes(); if (childNodes == null) { diff --git a/Core/src/org/sleuthkit/autopsy/events/AutopsyEvent.java b/Core/src/org/sleuthkit/autopsy/events/AutopsyEvent.java index c329a03549..7c3a16e5a3 100644 --- a/Core/src/org/sleuthkit/autopsy/events/AutopsyEvent.java +++ b/Core/src/org/sleuthkit/autopsy/events/AutopsyEvent.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015 Basis Technology Corp. + * Copyright 2015-2021 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -22,12 +22,18 @@ import java.beans.PropertyChangeEvent; import java.io.Serializable; /** - * A base class for events to be published to registered subscribers on both - * this Autopsy node and other Autopsy nodes. The class extends - * PropertyChangeEvent to integrate with legacy use of JavaBeans - * PropertyChangeEvents and PropertyChangeListeners as an application event - * system, and implements Serializable to allow it to be published over a - * network in serialized form. + * A base class for application events that can be published to registered + * subscribers on both this Autopsy node and other Autopsy nodes. + * + * The class extends PropertyChangeEvent to integrate with legacy use of + * JavaBeans PropertyChangeEvents and PropertyChangeListeners as an application + * event publisher-subcriber mechanism. Subclasses need to decide what + * constitutes "old" and "new" objects for them and are encouraged to provide + * getters for these values that do not require clients to cast the return + * values. + * + * This class implements Serializable to allow it to be published over a network + * in serialized form. */ public class AutopsyEvent extends PropertyChangeEvent implements Serializable { @@ -36,17 +42,22 @@ public class AutopsyEvent extends PropertyChangeEvent implements Serializable { /** * Events have a source field set to local or remote to allow event - * subscribers to filter events by source type. + * subscribers to filter events by source type. For a multi-user case, a + * local event has happened on this Autopsy node, and a remote event has + * happened on another Autopsy node. + * + * Events are local by default and are changed to remote events by the event + * publishers on other Autopsy nodes upon event receipt. */ public enum SourceType { - LOCAL, REMOTE }; /** - * Constructs an event that can be published to registered subscribers on - * both this Autopsy node and other Autopsy nodes. + * Constructs the base class part of an application event that can be + * published to registered subscribers on both this Autopsy node and other + * Autopsy nodes. * * @param eventName The event name. * @param oldValue The "old" value to associate with the event. May be @@ -60,7 +71,7 @@ public class AutopsyEvent extends PropertyChangeEvent implements Serializable { } /** - * Gets the source type (local or remote). + * Gets the event source type (local or remote). * * @return SourceType The source type of the event, local or remote. */ @@ -69,12 +80,9 @@ public class AutopsyEvent extends PropertyChangeEvent implements Serializable { } /** - * Gets the source type (local or remote) as a string. This is for clients - * that do not have access to the AutopsyEvent type, and is necessary - * because the events package is not currently a public package within the - * Autopsy-Core NetBeans Module (NBM). + * Gets the event source type (local or remote) as a string. * - * @return A string, either "LOCAL" or "REMOTE", as an Object. + * @return A string, either "LOCAL" or "REMOTE." */ @Override public Object getSource() { @@ -82,10 +90,10 @@ public class AutopsyEvent extends PropertyChangeEvent implements Serializable { } /** - * Sets the source type (local or remote). This field is mutable in this way - * to allow an event to be published both locally and remotely without - * requiring the construction of two separate objects. It is for use by the - * event publishing classes within this package only. + * Sets the source type (local or remote). This field is mutable to allow an + * event to be published both locally and remotely without requiring the + * construction of two separate objects. It is for use by the event + * publishing classes within this package only. * * @param sourceType The source type of the event, local or remote. */ diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle.properties-MERGED index 93c5ed7987..4f0fdfbb56 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 65d3ba064d..621713dfdf 100755 --- a/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/ingest/Bundle.properties-MERGED @@ -142,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/logicalimager/dsp/AddLogicalImageTask.java b/Core/src/org/sleuthkit/autopsy/logicalimager/dsp/AddLogicalImageTask.java index f8dc1730e2..0c112e4114 100644 --- a/Core/src/org/sleuthkit/autopsy/logicalimager/dsp/AddLogicalImageTask.java +++ b/Core/src/org/sleuthkit/autopsy/logicalimager/dsp/AddLogicalImageTask.java @@ -100,7 +100,7 @@ final class AddLogicalImageTask implements Runnable { } } - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); private final static Logger LOGGER = Logger.getLogger(AddLogicalImageTask.class.getName()); private final static String SEARCH_RESULTS_TXT = "SearchResults.txt"; //NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/DataSourceIntegrityIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/DataSourceIntegrityIngestModule.java index d03a4db965..a3107f8774 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/DataSourceIntegrityIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/DataSourceIntegrityIngestModule.java @@ -51,7 +51,7 @@ import org.sleuthkit.datamodel.TskDataException; */ public class DataSourceIntegrityIngestModule implements DataSourceIngestModule { - private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.MethodCategory.AUTO); + private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.Priority.NORMAL); private static final Logger logger = Logger.getLogger(DataSourceIntegrityIngestModule.class.getName()); private static final long DEFAULT_CHUNK_SIZE = 32 * 1024; private static final IngestServices services = IngestServices.getInstance(); 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 efee783e8f..e8411caa04 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties-MERGED @@ -12,12 +12,7 @@ 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).\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-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-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/embeddedfileextractor/SevenZipExtractor.java b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java index 51763e8a08..47db124ed9 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java @@ -89,8 +89,8 @@ class SevenZipExtractor { private static final Logger logger = Logger.getLogger(SevenZipExtractor.class.getName()); private static final String MODULE_NAME = EmbeddedFileExtractorModuleFactory.getModuleName(); - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); - private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); + private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.Priority.NORMAL); //encryption type strings private static final String ENCRYPTION_FILE_LEVEL = NbBundle.getMessage(EmbeddedFileExtractorIngestModule.class, diff --git a/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/EncryptionDetectionDataSourceIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/EncryptionDetectionDataSourceIngestModule.java index 19c3001bb3..d3e57b8ae7 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/EncryptionDetectionDataSourceIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/EncryptionDetectionDataSourceIngestModule.java @@ -47,8 +47,8 @@ import org.sleuthkit.datamodel.VolumeSystem; */ final class EncryptionDetectionDataSourceIngestModule implements DataSourceIngestModule { - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); - private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); + private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.Priority.NORMAL); private final IngestServices services = IngestServices.getInstance(); private final Logger logger = services.getLogger(EncryptionDetectionModuleFactory.getModuleName()); private Blackboard blackboard; diff --git a/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/EncryptionDetectionFileIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/EncryptionDetectionFileIngestModule.java index 96811833f5..0dd5dfdc56 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/EncryptionDetectionFileIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/EncryptionDetectionFileIngestModule.java @@ -64,8 +64,8 @@ import org.xml.sax.SAXException; final class EncryptionDetectionFileIngestModule extends FileIngestModuleAdapter { private static final int FILE_SIZE_MODULUS = 512; - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); - private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); + private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.Priority.NORMAL); private static final String DATABASE_FILE_EXTENSION = "db"; private static final int MINIMUM_DATABASE_FILE_SIZE = 65536; //64 KB 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 cfaadf1635..5063bd55fa 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/fileextmismatch/FileExtMismatchIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java index 214b4ce3a6..b6d83cf5b2 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java @@ -53,7 +53,7 @@ import org.sleuthkit.datamodel.TskException; "FileExtMismatchIngestModule.readError.message=Could not read settings." }) public class FileExtMismatchIngestModule implements FileIngestModule { - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); private static final Logger logger = Logger.getLogger(FileExtMismatchIngestModule.class.getName()); private final IngestServices services = IngestServices.getInstance(); diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java index 9249a50750..88f6ac709f 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdIngestModule.java @@ -49,7 +49,7 @@ import org.sleuthkit.datamodel.TskCoreException; */ @NbBundle.Messages({"CannotRunFileTypeDetection=Unable to run file type detection."}) public class FileTypeIdIngestModule implements FileIngestModule { - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); private static final Logger logger = Logger.getLogger(FileTypeIdIngestModule.class.getName()); private static final HashMap totalsForIngestJobs = new HashMap<>(); 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 dd5aa258cc..8dbb55e35f 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties-MERGED @@ -61,10 +61,7 @@ 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\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-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-Name=HashDatabases OptionsCategory_Name_HashDatabase=Hash Sets OptionsCategory_Keywords_HashDatabase=Hash Sets @@ -191,10 +188,7 @@ 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. \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.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.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/hashdatabase/HashDbIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java index bd3e55e8a2..dfe6b1d018 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbIngestModule.java @@ -511,9 +511,9 @@ public class HashDbIngestModule implements FileIngestModule { } switch (knownFilesType) { case KNOWN: - return new Score(Significance.NONE, Score.MethodCategory.AUTO); + return new Score(Significance.NONE, Score.Priority.NORMAL); case KNOWN_BAD: - return new Score(Significance.NOTABLE, Score.MethodCategory.AUTO); + return new Score(Significance.NOTABLE, Score.Priority.NORMAL); default: case NO_CHANGE: return Score.SCORE_UNKNOWN; 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 6fb258f014..cccbcc1b57 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties-MERGED @@ -2,7 +2,6 @@ FilesIdentifierIngestJobSettingsPanel.getError=Error getting interesting files s FilesIdentifierIngestJobSettingsPanel.updateError=Error updating interesting files sets settings file. FilesIdentifierIngestModule.getFilesError=Error getting interesting files sets from file. FilesIdentifierIngestModule.indexError.message=Failed to index interesting file hit artifact for keyword search. -# {0} - daysIncluded FilesSet.rule.dateRule.toString=(modified within {0} day(s)) FilesSetDefsPanel.bytes=Bytes FilesSetDefsPanel.cancelImportMsg=Cancel import @@ -122,8 +121,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/interestingitems/FilesIdentifierIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestModule.java index be5aabb7fd..2fb291e755 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestModule.java @@ -53,7 +53,7 @@ import org.sleuthkit.datamodel.TskData; */ @NbBundle.Messages({"FilesIdentifierIngestModule.getFilesError=Error getting interesting files sets from file."}) final class FilesIdentifierIngestModule implements FileIngestModule { - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); private static final Object sharedResourcesLock = new Object(); private static final Logger logger = Logger.getLogger(FilesIdentifierIngestModule.class.getName()); 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 1d07988e4c..f5dd54dc50 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/modules/yara/YaraIngestHelper.java b/Core/src/org/sleuthkit/autopsy/modules/yara/YaraIngestHelper.java index 6d75cac051..68bee46ac1 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/yara/YaraIngestHelper.java +++ b/Core/src/org/sleuthkit/autopsy/modules/yara/YaraIngestHelper.java @@ -46,7 +46,7 @@ import org.sleuthkit.datamodel.TskCoreException; */ final class YaraIngestHelper { - private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.MethodCategory.AUTO); + private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.Priority.NORMAL); private static final String YARA_DIR = "yara"; private static final String YARA_C_EXE = "yarac64.exe"; private static final String MODULE_NAME = YaraIngestModuleFactory.getModuleName(); 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 3db1b822ea..fce93671b3 100755 --- a/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle.properties-MERGED @@ -5,8 +5,8 @@ ReportHTML.getName.text=HTML Report ReportHTML.getDesc.text=A report about results and tagged items in HTML format. ReportHTML.writeIndex.title=for case {0} ReportHTML.writeIndex.noFrames.msg=Your browser is not compatible with our frame setup. -ReportHTML.writeIndex.noFrames.seeNav=Please see the navigation page for artifact links, -ReportHTML.writeIndex.seeSum=and the summary page for a case summary. +ReportHTML.writeIndex.noFrames.seeNav=Please see the navigation page for artifact links, +ReportHTML.writeIndex.seeSum=and the summary page for a case summary. ReportHTML.writeNav.title=Report Navigation ReportHTML.writeNav.h1=Report Navigation ReportHTML.writeNav.summary=Case Summary @@ -16,7 +16,7 @@ ReportHTML.writeSum.caseNumber=Case Number: ReportHTML.writeSum.caseNumImages=Number of data sources in case: ReportHTML.writeSum.examiner=Examiner: ReportHTML.writeSum.title=Case Summary -ReportHTML.writeSum.warningMsg=Warning, this report was run before ingest services completed\! +ReportHTML.writeSum.warningMsg=Warning, this report was run before ingest services completed! # # autopsy/test/scripts/regression.py._html_report_diff() uses reportGenOn.text, caseName, caseNum, # examiner as a regex signature to skip report.html and summary.html diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/stix/StixArtifactData.java b/Core/src/org/sleuthkit/autopsy/report/modules/stix/StixArtifactData.java index 108f1e5ac6..4b4d205f65 100644 --- a/Core/src/org/sleuthkit/autopsy/report/modules/stix/StixArtifactData.java +++ b/Core/src/org/sleuthkit/autopsy/report/modules/stix/StixArtifactData.java @@ -42,7 +42,7 @@ import org.sleuthkit.datamodel.TskCoreException; * */ class StixArtifactData { - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); private static final String MODULE_NAME = "Stix"; private AbstractFile file; diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED index d74f98b5a7..4447162072 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED @@ -206,7 +206,9 @@ DeleteCaseTask.progress.parsingManifest=Parsing manifest file {0}... DeleteCaseTask.progress.releasingManifestLock=Releasing lock on the manifest file {0}... DeleteCaseTask.progress.startMessage=Starting deletion... DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes +# {0} - item count DeleteOrphanCaseNodesDialog.additionalInit.lblNodeCount.text=Znodes found: {0} +# {0} - item count DeleteOrphanCaseNodesDialog.additionalInit.znodesTextArea.countMessage=ZNODES FOUND: {0} DeleteOrphanCaseNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service # {0} - node path diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/VolatilityProcessor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/VolatilityProcessor.java index 6ed8437bdc..f1fdf10e59 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/VolatilityProcessor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/volatilityDSP/VolatilityProcessor.java @@ -56,7 +56,7 @@ import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM; * artifacts. */ class VolatilityProcessor { - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); private static final Logger logger = Logger.getLogger(VolatilityProcessor.class.getName()); private static final String VOLATILITY = "Volatility"; //NON-NLS diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED index c60c34bade..2839859347 100755 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED @@ -5,6 +5,7 @@ AccountsText.nextPage.exception.msg=No next page. AccountsText.previousItem.exception.msg=No previous item. AccountsText.previousPage.exception.msg=No previous page. CannotRunFileTypeDetection=Unable to run file type detection. +Collection.unableToIndexData.error=Unable to add data to text index. All future text indexing for the current case will be skipped. DropdownListSearchPanel.selected=Ad Hoc Search data source filter is selected DropdownSingleTermSearchPanel.selected=Ad Hoc Search data source filter is selected DropdownSingleTermSearchPanel.warning.text=Boundary characters ^ and $ do not match word boundaries. Consider\nreplacing with an explicit list of boundary characters, such as [ \\.,] diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java index f146b15f7f..4458ab3433 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/LuceneQuery.java @@ -61,7 +61,7 @@ class LuceneQuery implements KeywordSearchQuery { static final int SNIPPET_LENGTH = 50; static final String HIGHLIGHT_FIELD = Server.Schema.TEXT.toString(); - private static final Score KEYWORD_SEARCH_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); + private static final Score KEYWORD_SEARCH_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); private static final boolean DEBUG = (Version.getBuildType() == Version.Type.DEVELOPMENT); /** diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java index 234cc9ee69..ef5e171b4c 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/RegexQuery.java @@ -72,7 +72,7 @@ import org.sleuthkit.datamodel.TskData; final class RegexQuery implements KeywordSearchQuery { public static final Logger LOGGER = Logger.getLogger(RegexQuery.class.getName()); - private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.MethodCategory.AUTO); + private static final Score LIKELY_NOTABLE_SCORE = new Score(Score.Significance.LIKELY_NOTABLE, Score.Priority.NORMAL); /** * Lucene regular expressions do not support the following Java predefined diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java index c777e4cb81..900dd1876a 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Chromium.java @@ -69,7 +69,7 @@ import org.sleuthkit.datamodel.blackboardutils.WebBrowserArtifactsHelper; * Chromium recent activity extraction */ class Chromium extends Extract { - private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.MethodCategory.AUTO); + private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.Priority.NORMAL); private static final String HISTORY_QUERY = "SELECT urls.url, urls.title, urls.visit_count, urls.typed_count, " //NON-NLS + "last_visit_time, urls.hidden, visits.visit_time, (SELECT urls.url FROM urls WHERE urls.id=visits.url) AS from_visit, visits.transition FROM urls, visits WHERE urls.id = visits.url"; //NON-NLS diff --git a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties index c2df473fe0..d1961563c4 100644 --- a/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties +++ b/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties @@ -1,5 +1,5 @@ #Updated by build script -#Mon, 25 Jan 2021 12:41:22 -0500 +#Wed, 02 Jun 2021 10:31:03 -0400 LBL_splash_window_title=Starting Autopsy SPLASH_HEIGHT=314 SPLASH_WIDTH=538 diff --git a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties index d519362703..e71aa34b66 100644 --- a/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties @@ -1,4 +1,4 @@ #Updated by build script -#Mon, 25 Jan 2021 12:41:22 -0500 +#Wed, 02 Jun 2021 10:31:04 -0400 CTL_MainWindow_Title=Autopsy 4.18.0 CTL_MainWindow_Title_No_Project=Autopsy 4.18.0 diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java index 9bdec139b4..6bb305c5ed 100644 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/ThunderbirdMboxFileIngestModule.java @@ -75,7 +75,7 @@ import org.sleuthkit.datamodel.blackboardutils.attributes.MessageAttachments.Fil * structure and metadata. */ public final class ThunderbirdMboxFileIngestModule implements FileIngestModule { - private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.MethodCategory.AUTO); + private static final Score NOTABLE_SCORE = new Score(Score.Significance.NOTABLE, Score.Priority.NORMAL); private static final Logger logger = Logger.getLogger(ThunderbirdMboxFileIngestModule.class.getName()); private final IngestServices services = IngestServices.getInstance();