diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED index b56e46b377..f5c18a1640 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Bundle.properties-MERGED @@ -55,6 +55,10 @@ Case.exceptionMessage.unsupportedSchemaVersionMessage=Unsupported case database Case.lockingException.couldNotAcquireExclusiveLock=Failed to get a exclusive lock on the case. Case.lockingException.couldNotAcquireSharedLock=Failed to get an shared lock on the case. Case.open.exception.multiUserCaseNotEnabled=Cannot open a multi-user case if multi-user cases are not enabled. See Tools, Options, Multi-User. +# {0} - image +Case.openFileSystems.openingImage=Opening all filesystems for image: {0}... +# {0} - case +Case.openFileSystems.retrievingImages=Retrieving images for case: {0}... Case.progressIndicatorCancelButton.label=Cancel Case.progressIndicatorTitle.closingCase=Closing Case Case.progressIndicatorTitle.creatingCase=Creating Case @@ -186,7 +190,6 @@ NewCaseVisualPanel1.caseNameLabel.text_1=Case Name: NewCaseVisualPanel1.caseDirLabel.text=Base Directory: NewCaseVisualPanel1.caseDirBrowseButton.text=Browse NewCaseVisualPanel1.caseNameTextField.text_1= -NewCaseVisualPanel1.jLabel2.text_1=Case data will be stored in the following directory: NewCaseVisualPanel1.caseParentDirTextField.text= NewCaseVisualPanel1.caseDirTextField.text_1= CueBannerPanel.autopsyLogo.text= @@ -467,3 +470,4 @@ UnpackagePortableCaseProgressDialog.okButton.text=OK UnpackagePortableCaseProgressDialog.resultLabel.text=resultLabel UnpackagePortableCaseDialog.extractLabel.text=Folder to extract to: UnpackagePortableCaseDialog.caseLabel.text=Portable Case: +NewCaseVisualPanel1.caseDataStoredLabel.text_1=Case data will be stored in the following directory: diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index 5a703a4ea9..6c6e102dac 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -1555,7 +1555,19 @@ public class Case { * @param newTag new ContentTag added */ public void notifyContentTagAdded(ContentTag newTag) { - eventPublisher.publish(new ContentTagAddedEvent(newTag)); + notifyContentTagAdded(newTag, null); + } + + /** + * Notifies case event subscribers that a content tag has been added. + * + * This should not be called from the event dispatch thread (EDT) + * + * @param newTag new ContentTag added + * @param deletedTag Removed ContentTag + */ + public void notifyContentTagAdded(ContentTag newTag, ContentTag deletedTag) { + eventPublisher.publish(new ContentTagAddedEvent(newTag, deletedTag)); } /** @@ -1607,7 +1619,19 @@ public class Case { * @param newTag new BlackboardArtifactTag added */ public void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag) { - eventPublisher.publish(new BlackBoardArtifactTagAddedEvent(newTag)); + notifyBlackBoardArtifactTagAdded(newTag, null); + } + + /** + * Notifies case event subscribers that an artifact tag has been added. + * + * This should not be called from the event dispatch thread (EDT) + * + * @param newTag new BlackboardArtifactTag added + * @param removedTag The BlackboardArtifactTag that was removed. + */ + public void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag, BlackboardArtifactTag removedTag) { + eventPublisher.publish(new BlackBoardArtifactTagAddedEvent(newTag, removedTag)); } /** @@ -2006,7 +2030,7 @@ public class Case { /** * Starts a background task that reads a sector from each file system of - * each image of a case to do an eager open of the filesystems in the case. + * each image of a case to do an eager open of the filesystems in the case. * If this method is called before another background file system read has * finished the earlier one will be cancelled. * diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java index 8c2a2d6dfa..45068164c1 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/BlackBoardArtifactTagAddedEvent.java @@ -22,6 +22,7 @@ import java.io.Serializable; import javax.annotation.concurrent.Immutable; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent.DeletedBlackboardArtifactTagInfo; import org.sleuthkit.datamodel.BlackboardArtifactTag; import org.sleuthkit.datamodel.TskCoreException; @@ -37,6 +38,10 @@ public class BlackBoardArtifactTagAddedEvent extends TagAddedEvent implements S public ContentTagAddedEvent(ContentTag newTag) { super(Case.Events.CONTENT_TAG_ADDED.toString(), newTag); } + + public ContentTagAddedEvent(ContentTag newTag, ContentTag deletedTag) { + super(Case.Events.CONTENT_TAG_ADDED.toString(), newTag, (deletedTag != null ? new DeletedContentTagInfo(deletedTag) : null)); + } /** * get the ContentTag that was added by its id diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java index 406ef58a0b..4a1a240ca4 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/ContentTagDeletedEvent.java @@ -58,7 +58,7 @@ public class ContentTagDeletedEvent extends TagDeletedEvent implemen private final long beginByteOffset; private final long endByteOffset; - private DeletedContentTagInfo(ContentTag deletedTag) { + DeletedContentTagInfo(ContentTag deletedTag) { super(deletedTag); beginByteOffset = deletedTag.getBeginByteOffset(); endByteOffset = deletedTag.getEndByteOffset(); diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java index 6d7ebb4f9c..ab737d7004 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/TagAddedEvent.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.casemodule.events; import java.io.Serializable; import java.util.logging.Level; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.casemodule.events.TagDeletedEvent.DeletedTagInfo; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.events.AutopsyEvent; import org.sleuthkit.datamodel.Tag; @@ -46,7 +47,11 @@ abstract class TagAddedEvent extends AutopsyEvent implements Seri private final Long tagID; TagAddedEvent(String propertyName, T addedTag) { - super(propertyName, null, null); + this(propertyName, addedTag, null); + } + + TagAddedEvent(String propertyName, T addedTag, DeletedTagInfo deletedTagInfo) { + super(propertyName, deletedTagInfo, null); tag = addedTag; tagID = addedTag.getId(); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties b/Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java old mode 100644 new mode 100755 index 33e8f29237..2e70d407a0 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java @@ -20,19 +20,22 @@ package org.sleuthkit.autopsy.casemodule.services; import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedHashSet; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.logging.Level; import javax.annotation.concurrent.Immutable; -import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.datamodel.TagName; -import org.sleuthkit.autopsy.datamodel.DhsImageCategory; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; @@ -44,22 +47,42 @@ import org.sleuthkit.datamodel.TskData; final class TagNameDefinition implements Comparable { private static final Logger LOGGER = Logger.getLogger(TagNameDefinition.class.getName()); - @NbBundle.Messages({"TagNameDefinition.predefTagNames.bookmark.text=Bookmark", + @Messages({ + "TagNameDefinition.predefTagNames.bookmark.text=Bookmark", "TagNameDefinition.predefTagNames.followUp.text=Follow Up", - "TagNameDefinition.predefTagNames.notableItem.text=Notable Item"}) - private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS - private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS + "TagNameDefinition.predefTagNames.notableItem.text=Notable Item",}) + + private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS + private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS + private static final String TAG_SETTING_VERSION_KEY = "CustomTagNameVersion"; + private static final int TAG_SETTINGS_VERSION = 1; + + private static final String CATEGORY_ONE_NAME = "CAT-1: Child Exploitation (Illegal)"; + private static final String CATEGORY_TWO_NAME = "CAT-2: Child Exploitation (Non-Illegal/Age Difficult)"; + private static final String CATEGORY_THREE_NAME = "CAT-3: CGI/Animation (Child Exploitive)"; + private static final String CATEGORY_FOUR_NAME = "CAT-4: Exemplar/Comparison (Internal Use Only)"; + private static final String CATEGORY_FIVE_NAME = "CAT-5: Non-pertinent"; - private static final List STANDARD_NOTABLE_TAG_DISPLAY_NAMES = Arrays.asList(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), DhsImageCategory.ONE.getDisplayName(), DhsImageCategory.TWO.getDisplayName(), DhsImageCategory.THREE.getDisplayName()); // NON-NLS - private static final List STANDARD_TAG_DISPLAY_NAMES = Arrays.asList(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), Bundle.TagNameDefinition_predefTagNames_followUp_text(), - Bundle.TagNameDefinition_predefTagNames_notableItem_text(), DhsImageCategory.ONE.getDisplayName(), - DhsImageCategory.TWO.getDisplayName(), DhsImageCategory.THREE.getDisplayName(), - DhsImageCategory.FOUR.getDisplayName(), DhsImageCategory.FIVE.getDisplayName(), DhsImageCategory.ZERO.getDisplayName()); private final String displayName; private final String description; private final TagName.HTML_COLOR color; private final TskData.FileKnown knownStatus; + private static final Map STANDARD_TAGS_DEFINITIONS = new HashMap<>(); + private static final Map PROJECT_VIC_TAG_DEFINITIONS = new HashMap<>(); + + static { + STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); + STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_followUp_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_followUp_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); + STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD)); + + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_ONE_NAME, new TagNameDefinition(CATEGORY_ONE_NAME, "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD)); + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_TWO_NAME, new TagNameDefinition(CATEGORY_TWO_NAME, "", TagName.HTML_COLOR.LIME, TskData.FileKnown.BAD)); + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_THREE_NAME, new TagNameDefinition(CATEGORY_THREE_NAME, "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD)); + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_FOUR_NAME, new TagNameDefinition(CATEGORY_FOUR_NAME, "", TagName.HTML_COLOR.PURPLE, TskData.FileKnown.UNKNOWN)); + PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_FIVE_NAME, new TagNameDefinition(CATEGORY_FIVE_NAME, "", TagName.HTML_COLOR.SILVER, TskData.FileKnown.UNKNOWN)); + } + /** * Constructs a tag name definition consisting of a display name, * description, color and knownStatus. @@ -76,8 +99,20 @@ final class TagNameDefinition implements Comparable { this.knownStatus = status; } + static Collection getProjectVICDefaultDefinitions() { + return Collections.unmodifiableCollection(PROJECT_VIC_TAG_DEFINITIONS.values()); + } + + static Collection getStandardTagNameDefinitions() { + return Collections.unmodifiableCollection(STANDARD_TAGS_DEFINITIONS.values()); + } + static List getStandardTagNames() { - return STANDARD_TAG_DISPLAY_NAMES; + List strList = new ArrayList<>(); + strList.addAll(STANDARD_TAGS_DEFINITIONS.keySet()); + strList.addAll(PROJECT_VIC_TAG_DEFINITIONS.keySet()); + + return strList; } /** @@ -194,94 +229,41 @@ final class TagNameDefinition implements Comparable { * Gets tag name definitions from the tag settings file as well as the * default tag name definitions. * + * The currently custom tags properties are stored in one string property + * value separated by ;. The properties of an individual tag are comma + * separated in the format of: + * tag_name,tag_description,tag_color,known_status + * + * In prior versions of autopsy the known_status was stored in the central + * repository, therefore the properties file only had three values. + * * @return A set of tag name definition objects. */ static synchronized Set getTagNameDefinitions() { - Set tagNames = new LinkedHashSet<>(); - //modifiable copy of default tags list for us to keep track of which default tags have already been created - Set standardTags = new LinkedHashSet<>(STANDARD_TAG_DISPLAY_NAMES); - String setting = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); - if (null != setting && !setting.isEmpty()) { - List tagNameTuples = Arrays.asList(setting.split(";")); - int numberOfAttributes = 0; - if (tagNameTuples.size() > 0) { - // Determine if Tags.properties file needs to be upgraded - numberOfAttributes = tagNameTuples.get(0).split(",").length; - } - if (numberOfAttributes == 3) { - // Upgrade Tags.Properties with the settings in Central Repository Settings if necessary - tagNames.addAll(upgradeTagPropertiesFile(tagNameTuples, standardTags)); - } else if (numberOfAttributes == 4) { - // if the Tags.Properties file is up to date parse it - tagNames.addAll(readCurrentTagPropertiesFile(tagNameTuples, standardTags)); - } + if (needsVersionUpdate()) { + updateTagDefinitions(); } - //create standard tags which should always exist which were not already created for whatever reason, such as upgrade - for (String standardTagName : standardTags) { - if (STANDARD_NOTABLE_TAG_DISPLAY_NAMES.contains(standardTagName)) { - tagNames.add(new TagNameDefinition(standardTagName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD)); - } else { - tagNames.add(new TagNameDefinition(standardTagName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN)); - } - } - return tagNames; - } + String tagsProperty = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); + if (tagsProperty == null || tagsProperty.isEmpty()) { + return new HashSet<>(); + } - /** - * Read the central repository properties file to get any knownStatus - * related tag settings that may exist in it. - * - * @param tagProperties the list of comma seperated tags in the - * Tags.properties file - * @param standardTagsToBeCreated the list of standard tags which have yet - * to be created - * - * @return tagNames a list of TagNameDefinitions - */ - private static Set upgradeTagPropertiesFile(List tagProperties, Set standardTagsToBeCreated) { - Set tagNames = new LinkedHashSet<>(); - List legacyNotableTags = new ArrayList<>(); - String badTagsStr = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS - if (badTagsStr == null || badTagsStr.isEmpty()) { //if there were no bad tags in the central repo properties file use the default list - legacyNotableTags.addAll(STANDARD_NOTABLE_TAG_DISPLAY_NAMES); - } else { //otherwise use the list that was in the central repository properties file - legacyNotableTags.addAll(Arrays.asList(badTagsStr.split(","))); - } - for (String tagNameTuple : tagProperties) { - String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes - standardTagsToBeCreated.remove(tagNameAttributes[0]); //remove the tag from the list of standard tags which have not been created - if (legacyNotableTags.contains(tagNameAttributes[0])) { //if tag should be notable mark create it as such - tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.BAD)); - } else { //otherwise create it as unknown - tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.UNKNOWN)); //add the default value for that tag - } - } - return tagNames; - } + List individualTags = Arrays.asList(tagsProperty.split(";")); - /** - * Read the Tags.properties file to get the TagNameDefinitions that are - * preserved accross cases. - * - * @param tagProperties the list of comma seperated tags in the - * Tags.properties file - * @param standardTagsToBeCreated the list of standard tags which have yet - * to be created - * - * @return tagNames a list of TagNameDefinitions - */ - private static Set readCurrentTagPropertiesFile(List tagProperties, Set standardTagsToBeCreated) { - Set tagNames = new LinkedHashSet<>(); - for (String tagNameTuple : tagProperties) { - String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes - standardTagsToBeCreated.remove(tagNameAttributes[0]); //remove the tag from the list of standard tags which have not been created - tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1], - TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.valueOf(tagNameAttributes[3]))); + if (individualTags == null || individualTags.isEmpty()) { + return new HashSet<>(); } - return tagNames; + + Set definitions = new HashSet<>(); + for (String tagProps : individualTags) { + String[] attributes = tagProps.split(","); + + definitions.add(new TagNameDefinition(attributes[0], attributes[1], + TagName.HTML_COLOR.valueOf(attributes[2]), TskData.FileKnown.valueOf(attributes[3]))); + } + + return definitions; } /** @@ -303,7 +285,113 @@ final class TagNameDefinition implements Comparable { LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex); } } + + ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION)); ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, setting.toString()); } + /** + * Updates the Tag Definition file to the current format. + */ + private static void updateTagDefinitions() { + Integer version = getPropertyFileVersion(); + List definitions = new ArrayList<>(); + + if (version == null) { + String tagsProperty = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); + if (tagsProperty == null || tagsProperty.isEmpty()) { + return; + } + + List individualTags = Arrays.asList(tagsProperty.split(";")); + + if (individualTags == null || individualTags.isEmpty()) { + return; + } + + List notableTagList = null; + for (String tagProps : individualTags) { + String[] attributes = tagProps.split(","); + TskData.FileKnown fileKnown = TskData.FileKnown.UNKNOWN; + if (attributes.length == 3) { + // If notableTagList is null load it from the CR. + if (notableTagList == null) { + notableTagList = getCRNotableList(); + } else { + if (notableTagList.contains(attributes[0])) { + fileKnown = TskData.FileKnown.BAD; + } + } + } else { + fileKnown = TskData.FileKnown.valueOf(attributes[3]); + } + + definitions.add(new TagNameDefinition(attributes[0], attributes[1], + TagName.HTML_COLOR.valueOf(attributes[2]), fileKnown)); + } + } + + if (definitions.isEmpty()) { + return; + } + + // Remove the standard and Project VIC tags from the list + List tagStrings = new ArrayList<>(); + List standardTags = getStandardTagNames(); + for (TagNameDefinition def : definitions) { + if (!standardTags.contains(def.getDisplayName())) { + tagStrings.add(def.toSettingsFormat()); + } + } + + // Write out the version and the new tag list. + ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION)); + ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, String.join(";", tagStrings)); + } + + /** + * Returns a list notable tag names from the CR bagTag list. + * + * @return A list of tag names, or empty list if none were found. + */ + private static List getCRNotableList() { + String notableTagsProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS + if (notableTagsProp != null && !notableTagsProp.isEmpty()) { + return Arrays.asList(notableTagsProp.split(",")); + } + + return new ArrayList<>(); + } + + /** + * Based on the version in the Tags property file, returns whether or not + * the file needs updating. + * + * @return + */ + private static boolean needsVersionUpdate() { + Integer version = getPropertyFileVersion(); + return version == null || version < TAG_SETTINGS_VERSION; + } + + /** + * Returns the Tags property file version. + * + * @return The current version of tags property file, or null if no version + * was found. + */ + private static Integer getPropertyFileVersion() { + String version = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY); + if (version == null || version.isEmpty()) { + return null; + } + + try { + return Integer.parseInt(version); + } catch (NumberFormatException ex) { + // The version is not an integer + return null; + } + } + } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java old mode 100644 new mode 100755 diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java old mode 100644 new mode 100755 index 4b3aba82a7..2ef9869adc --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java @@ -446,8 +446,7 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel { boolean isSelected = tagNamesList.getSelectedIndex() != -1; boolean enableEdit = !ingestIsRunning && isSelected; editTagNameButton.setEnabled(enableEdit); - boolean enableDelete = enableEdit && !TagNameDefinition.getStandardTagNames().contains(tagNamesList.getSelectedValue().getDisplayName()); - deleteTagNameButton.setEnabled(enableDelete); + deleteTagNameButton.setEnabled(enableEdit); if (isSelected) { descriptionTextArea.setText(tagNamesList.getSelectedValue().getDescription()); if (tagNamesList.getSelectedValue().getKnownStatus() == TskData.FileKnown.BAD) { diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java old mode 100644 new mode 100755 index 40597e9af3..5bdb2dc64e --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java @@ -40,6 +40,8 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.ContentTag; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TagName; +import org.sleuthkit.datamodel.TagSet; +import org.sleuthkit.datamodel.TaggingManager; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; import org.sleuthkit.datamodel.TskData.DbType; @@ -52,9 +54,12 @@ public class TagsManager implements Closeable { private static final Logger LOGGER = Logger.getLogger(TagsManager.class.getName()); private final SleuthkitCase caseDb; - + + static String DEFAULT_TAG_SET_NAME = "Project VIC (United States)"; + static { - //Create the contentviewer tags table (beta) if the current case does not + + //Create the contentviewer tags table if the current case does not //have the table present Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), evt -> { if (evt.getNewValue() != null) { @@ -64,7 +69,7 @@ public class TagsManager implements Closeable { if (caseDb.tableExists(ContentViewerTagManager.TABLE_NAME)) { return; } - + if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.SQLITE)) { caseDb.createTable(ContentViewerTagManager.TABLE_NAME, ContentViewerTagManager.TABLE_SCHEMA_SQLITE); } else if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) { @@ -168,6 +173,28 @@ public class TagsManager implements Closeable { */ TagsManager(SleuthkitCase caseDb) { this.caseDb = caseDb; + + // Add standard tags and the Project VIC default tag set and tags. + TaggingManager taggingMgr = caseDb.getTaggingManager(); + try { + List setList = taggingMgr.getTagSets(); + if (setList.isEmpty()) { + //Assume new case and add Project VIC tags. + + List tagNameList = new ArrayList<>(); + for (TagNameDefinition def : TagNameDefinition.getProjectVICDefaultDefinitions()) { + tagNameList.add(caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus())); + } + taggingMgr.addTagSet(DEFAULT_TAG_SET_NAME, tagNameList); + + for (TagNameDefinition def : TagNameDefinition.getStandardTagNameDefinitions()) { + caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()); + } + } + } catch (TskCoreException ex) { + LOGGER.log(Level.SEVERE, "Error updating non-file object ", ex); + } + for (TagNameDefinition tagName : TagNameDefinition.getTagNameDefinitions()) { tagName.saveToCase(caseDb); } @@ -242,7 +269,8 @@ public class TagsManager implements Closeable { /** * Selects all of the rows from the tag_names table in the case database for * which there is at least one matching row in the content_tags or - * blackboard_artifact_tags tables, for the given data source object id and user. + * blackboard_artifact_tags tables, for the given data source object id and + * user. * * @param dsObjId data source object id * @param userName - the user name that you want to get tags for @@ -449,14 +477,16 @@ public class TagsManager implements Closeable { * database. */ public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws TskCoreException { - ContentTag tag; - tag = caseDb.addContentTag(content, tagName, comment, beginByteOffset, endByteOffset); + TaggingManager.ContentTagChange tagChange = caseDb.getTaggingManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset); try { - Case.getCurrentCaseThrows().notifyContentTagAdded(tag); + Case currentCase = Case.getCurrentCaseThrows(); + + currentCase.notifyContentTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags().get(0)); + } catch (NoCurrentCaseException ex) { throw new TskCoreException("Added a tag to a closed case", ex); } - return tag; + return tagChange.getAddedTag(); } /** @@ -668,13 +698,14 @@ public class TagsManager implements Closeable { * database. */ public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException { - BlackboardArtifactTag tag = caseDb.addBlackboardArtifactTag(artifact, tagName, comment); + TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment); try { - Case.getCurrentCaseThrows().notifyBlackBoardArtifactTagAdded(tag); + Case currentCase = Case.getCurrentCaseThrows(); + currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags().get(0)); } catch (NoCurrentCaseException ex) { throw new TskCoreException("Added a tag to a closed case", ex); } - return tag; + return tagChange.getAddedTag(); } /** diff --git a/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java b/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java index ef751d262c..95c2d43bbb 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java +++ b/Core/src/org/sleuthkit/autopsy/communications/AbstractCVTAction.java @@ -19,11 +19,13 @@ package org.sleuthkit.autopsy.communications; import java.util.Collection; +import java.util.stream.Collectors; import javax.swing.AbstractAction; import javax.swing.ImageIcon; import javax.swing.JMenuItem; import org.openide.util.Utilities; import org.openide.util.actions.Presenter; +import org.sleuthkit.datamodel.AccountDeviceInstance; /** * Base class for actions that act on the selected AccountDeviceInstanceKeys. @@ -37,8 +39,11 @@ abstract class AbstractCVTAction extends AbstractAction implements Presenter.Pop * * @return The selected accounts */ - Collection getSelectedAccounts() { - return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstanceKey.class); + Collection getSelectedAccounts() { + return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstanceKey.class) + .stream() + .map((adiKey -> adiKey.getAccountDeviceInstance())) + .collect(Collectors.toSet()); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/communications/CVTEvents.java b/Core/src/org/sleuthkit/autopsy/communications/CVTEvents.java index ee7224b673..ae3735e30f 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CVTEvents.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CVTEvents.java @@ -24,6 +24,7 @@ import java.util.Collection; import org.sleuthkit.autopsy.communications.FiltersPanel.DateControlState; import org.sleuthkit.datamodel.CommunicationsFilter; import org.sleuthkit.autopsy.communications.StateManager.CommunicationsState; +import org.sleuthkit.datamodel.AccountDeviceInstance; /** * Provide the singleton EventBus. @@ -73,19 +74,19 @@ final class CVTEvents { */ static final class PinAccountsEvent { - private final ImmutableSet accountDeviceInstances; + private final ImmutableSet accounInstances; private final boolean replace; public boolean isReplace() { return replace; } - ImmutableSet getAccountDeviceInstances() { - return accountDeviceInstances; + ImmutableSet getAccountDeviceInstances() { + return accounInstances; } - PinAccountsEvent(Collection accountDeviceInstances, boolean replace) { - this.accountDeviceInstances = ImmutableSet.copyOf(accountDeviceInstances); + PinAccountsEvent(Collection accountDeviceInstances, boolean replace) { + this.accounInstances = ImmutableSet.copyOf(accountDeviceInstances); this.replace = replace; } } @@ -95,14 +96,14 @@ final class CVTEvents { */ static final class UnpinAccountsEvent { - private final ImmutableSet accountDeviceInstances; + private final ImmutableSet accountInstances; - public ImmutableSet getAccountDeviceInstances() { - return accountDeviceInstances; + public ImmutableSet getAccountDeviceInstances() { + return accountInstances; } - UnpinAccountsEvent(Collection accountDeviceInstances) { - this.accountDeviceInstances = ImmutableSet.copyOf(accountDeviceInstances); + UnpinAccountsEvent(Collection accountDeviceInstances) { + this.accountInstances = ImmutableSet.copyOf(accountDeviceInstances); } } diff --git a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java index 716d00656c..f07d4d52ab 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java +++ b/Core/src/org/sleuthkit/autopsy/communications/CommunicationsGraph.java @@ -32,6 +32,7 @@ import java.io.InputStreamReader; import java.io.StringWriter; import java.net.URL; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -147,7 +148,7 @@ final class CommunicationsGraph extends mxGraph { scopes.put("accountName", adiKey.getAccountDeviceInstance().getAccount().getTypeSpecificID()); scopes.put("size", Math.round(Math.log(adiKey.getMessageCount()) + 5)); scopes.put("iconFileName", CommunicationsGraph.class.getResource(Utils.getIconFilePath(adiKey.getAccountDeviceInstance().getAccount().getAccountType()))); - scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey)); + scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance())); scopes.put("MARKER_PIN_URL", MARKER_PIN_URL); scopes.put("locked", lockedVertexModel.isVertexLocked((mxCell) cell)); scopes.put("LOCK_URL", LOCK_URL); @@ -172,7 +173,7 @@ final class CommunicationsGraph extends mxGraph { scopes.put("accountName", adiKey.getAccountDeviceInstance().getAccount().getTypeSpecificID()); scopes.put("relationships", 12);// Math.round(Math.log(adiKey.getMessageCount()) + 5)); scopes.put("iconFileName", CommunicationsGraph.class.getResource(Utils.getIconFilePath(adiKey.getAccountDeviceInstance().getAccount().getAccountType()))); - scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey)); + scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance())); scopes.put("MARKER_PIN_URL", MARKER_PIN_URL); scopes.put("locked", lockedVertexModel.isVertexLocked((mxCell) cell)); scopes.put("LOCK_URL", LOCK_URL); @@ -199,16 +200,24 @@ final class CommunicationsGraph extends mxGraph { lockedVertexModel.clear(); } - private mxCell getOrCreateVertex(AccountDeviceInstanceKey accountDeviceInstanceKey) { - final AccountDeviceInstance accountDeviceInstance = accountDeviceInstanceKey.getAccountDeviceInstance(); + private mxCell getOrCreateVertex(AccountDeviceInstance adi, CommunicationsManager commsManager, CommunicationsFilter currentFilter) { + final AccountDeviceInstance accountDeviceInstance = adi; final String name = accountDeviceInstance.getAccount().getTypeSpecificID(); final mxCell vertex = nodeMap.computeIfAbsent(name + accountDeviceInstance.getDeviceId(), vertexName -> { - double size = Math.sqrt(accountDeviceInstanceKey.getMessageCount()) + 10; - + long adiRelationshipsCount = 1; + try { + adiRelationshipsCount = commsManager.getRelationshipSourcesCount(accountDeviceInstance, currentFilter); + } catch (TskCoreException tskCoreException) { + logger.log(Level.SEVERE, "There was an error fetching relationships for the node: " + accountDeviceInstance, tskCoreException); + } + + double size = Math.sqrt(adiRelationshipsCount) + 10; + AccountDeviceInstanceKey adiKey = new AccountDeviceInstanceKey(adi, currentFilter, adiRelationshipsCount); + mxCell newVertex = (mxCell) insertVertex( getDefaultParent(), - name, accountDeviceInstanceKey, + name, adiKey, Math.random() * 400, Math.random() * 400, size, @@ -219,9 +228,11 @@ final class CommunicationsGraph extends mxGraph { } @SuppressWarnings("unchecked") - private mxCell addOrUpdateEdge(long relSources, AccountDeviceInstanceKey account1, AccountDeviceInstanceKey account2) { - mxCell vertex1 = getOrCreateVertex(account1); - mxCell vertex2 = getOrCreateVertex(account2); + private mxCell addOrUpdateEdge(long relSources, + AccountDeviceInstance account1, AccountDeviceInstance account2, + CommunicationsManager commsManager, CommunicationsFilter currentFilter) { + mxCell vertex1 = getOrCreateVertex(account1, commsManager, currentFilter); + mxCell vertex2 = getOrCreateVertex(account2, commsManager, currentFilter); Object[] edgesBetween = getEdgesBetween(vertex1, vertex2); mxCell edge; if (edgesBetween.length == 0) { @@ -260,28 +271,24 @@ final class CommunicationsGraph extends mxGraph { /** * set to keep track of accounts related to pinned accounts */ - final Map relatedAccounts = new HashMap<>(); - for (final AccountDeviceInstanceKey adiKey : pinnedAccountModel.getPinnedAccounts()) { + final Set relatedAccounts = new HashSet<>(); + for (final AccountDeviceInstance adi : pinnedAccountModel.getPinnedAccounts()) { if (isCancelled()) { break; } //get accounts related to pinned account final List relatedAccountDeviceInstances - = commsManager.getRelatedAccountDeviceInstances(adiKey.getAccountDeviceInstance(), currentFilter); - relatedAccounts.put(adiKey.getAccountDeviceInstance(), adiKey); - getOrCreateVertex(adiKey); + = commsManager.getRelatedAccountDeviceInstances(adi, currentFilter); + relatedAccounts.add(adi); + getOrCreateVertex(adi, commsManager, currentFilter); + + for (final AccountDeviceInstance relatedADI : relatedAccountDeviceInstances) + relatedAccounts.add(relatedADI); - for (final AccountDeviceInstance relatedADI : relatedAccountDeviceInstances) { - final long adiRelationshipsCount = commsManager.getRelationshipSourcesCount(relatedADI, currentFilter); - final AccountDeviceInstanceKey relatedADIKey = new AccountDeviceInstanceKey(relatedADI, currentFilter, adiRelationshipsCount); - relatedAccounts.put(relatedADI, relatedADIKey); //store related accounts - } progressIndicator.progress(++progressCounter); } - Set accounts = relatedAccounts.keySet(); - - Map relationshipCounts = commsManager.getRelationshipCountsPairwise(accounts, currentFilter); + Map relationshipCounts = commsManager.getRelationshipCountsPairwise(relatedAccounts, currentFilter); int total = relationshipCounts.size(); int progress = 0; @@ -290,12 +297,12 @@ final class CommunicationsGraph extends mxGraph { for (Map.Entry entry : relationshipCounts.entrySet()) { Long count = entry.getValue(); AccountPair relationshipKey = entry.getKey(); - AccountDeviceInstanceKey account1 = relatedAccounts.get(relationshipKey.getFirst()); - AccountDeviceInstanceKey account2 = relatedAccounts.get(relationshipKey.getSecond()); + AccountDeviceInstance account1 = relationshipKey.getFirst(); + AccountDeviceInstance account2 = relationshipKey.getSecond(); if (pinnedAccountModel.isAccountPinned(account1) || pinnedAccountModel.isAccountPinned(account2)) { - mxCell addEdge = addOrUpdateEdge(count, account1, account2); + mxCell addEdge = addOrUpdateEdge(count, account1, account2, commsManager, currentFilter); progressText = addEdge.getId(); } progressIndicator.progress(progressText, progress++); diff --git a/Core/src/org/sleuthkit/autopsy/communications/PinnedAccountModel.java b/Core/src/org/sleuthkit/autopsy/communications/PinnedAccountModel.java index c9fe899c3f..9221a487cb 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/PinnedAccountModel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/PinnedAccountModel.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.EventBus; import java.util.HashSet; import java.util.Set; +import org.sleuthkit.datamodel.AccountDeviceInstance; /** * Model of what accounts are pinned to a visualization. @@ -34,7 +35,7 @@ class PinnedAccountModel { * to pinned accounts and pass the filters are show. Pinning accounts is the * primary way to populate the graph. */ - private final Set pinnedAccountDevices = new HashSet<>(); + private final Set pinnedAccountDevices = new HashSet<>(); private final EventBus eventBus = new EventBus(); @@ -46,7 +47,7 @@ class PinnedAccountModel { eventBus.unregister(handler); } - boolean isAccountPinned(AccountDeviceInstanceKey account) { + boolean isAccountPinned(AccountDeviceInstance account) { return pinnedAccountDevices.contains(account); } @@ -57,7 +58,7 @@ class PinnedAccountModel { * * @param accountDeviceInstances The accounts to unpin. */ - void unpinAccount(Set accountDeviceInstances) { + void unpinAccount(Set accountDeviceInstances) { pinnedAccountDevices.removeAll(accountDeviceInstances); } @@ -68,7 +69,7 @@ class PinnedAccountModel { * * @param accountDeviceInstances The accounts to pin. */ - void pinAccount(Set accountDeviceInstances) { + void pinAccount(Set accountDeviceInstances) { pinnedAccountDevices.addAll(accountDeviceInstances); } @@ -86,7 +87,7 @@ class PinnedAccountModel { pinnedAccountDevices.clear(); } - ImmutableSet getPinnedAccounts() { + ImmutableSet getPinnedAccounts() { return ImmutableSet.copyOf(pinnedAccountDevices); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/StateManager.java b/Core/src/org/sleuthkit/autopsy/communications/StateManager.java index c84a5beb79..3f24a98764 100755 --- a/Core/src/org/sleuthkit/autopsy/communications/StateManager.java +++ b/Core/src/org/sleuthkit/autopsy/communications/StateManager.java @@ -23,6 +23,7 @@ import java.util.HashSet; import java.util.Set; import org.sleuthkit.autopsy.communications.FiltersPanel.DateControlState; import org.sleuthkit.autopsy.coreutils.History; +import org.sleuthkit.datamodel.AccountDeviceInstance; import org.sleuthkit.datamodel.CommunicationsFilter; /** @@ -51,11 +52,11 @@ final class StateManager { @Subscribe void pinAccount(CVTEvents.PinAccountsEvent pinEvent) { if(pinEvent.isReplace()){ - HashSet pinnedList = new HashSet<>(); + HashSet pinnedList = new HashSet<>(); pinnedList.addAll(pinEvent.getAccountDeviceInstances()); historyManager.advance(new CommunicationsState(comFilter, pinnedList, -1, currentStartState, currentEndState)); } else { - HashSet pinnedList = new HashSet<>(); + HashSet pinnedList = new HashSet<>(); pinnedList.addAll(pinEvent.getAccountDeviceInstances()); pinnedList.addAll(pinModel.getPinnedAccounts()); @@ -74,7 +75,7 @@ final class StateManager { @Subscribe void unpinAccounts(CVTEvents.UnpinAccountsEvent pinEvent) { - HashSet pinnedList = new HashSet<>(); + HashSet pinnedList = new HashSet<>(); pinnedList.addAll(pinModel.getPinnedAccounts()); pinnedList.removeAll(pinEvent.getAccountDeviceInstances()); @@ -135,7 +136,7 @@ final class StateManager { */ final class CommunicationsState{ private final CommunicationsFilter communcationFilter; - private final Set pinnedList; + private final Set pinnedList; private final double zoomValue; private final DateControlState startDateState; private final DateControlState endDateState; @@ -149,7 +150,7 @@ final class StateManager { * @param zoomValue Double value of the current graph scale */ protected CommunicationsState(CommunicationsFilter communcationFilter, - Set pinnedList, double zoomValue, + Set pinnedList, double zoomValue, DateControlState startDateState, DateControlState endDateState){ this.pinnedList = pinnedList; this.communcationFilter = communcationFilter; @@ -172,7 +173,7 @@ final class StateManager { * * @return Set of AccountDeviceInstanceKey */ - public Set getPinnedList(){ + public Set getPinnedList(){ return pinnedList; } diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index 1799ebcb8d..51005878ec 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -1100,7 +1100,7 @@ final public class VisualizationPanel extends JPanel { } else { jPopupMenu.add(new JMenuItem(new LockAction(selectedVertices))); } - if (pinnedAccountModel.isAccountPinned(adiKey)) { + if (pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance())) { jPopupMenu.add(UnpinAccountsAction.getInstance().getPopupPresenter()); } else { jPopupMenu.add(PinAccountsAction.getInstance().getPopupPresenter()); diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties index cf07682e5d..ebc9a58e1a 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties @@ -1,3 +1,19 @@ +# Copyright 2014-2020 Basis Technology Corp. +# +# Copyright 2006-2017 ICEsoft Technologies Canada Corp. +# +# 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. +# FXVideoPanel.pauseButton.infoLabel.playbackErr=Unable to play video. FXVideoPanel.progress.bufferingCancelled=media buffering was canceled @@ -93,3 +109,848 @@ MediaPlayerPanel.playButton.text= MediaPlayerPanel.infoLabel.text=No Errors MediaPlayerPanel.VolumeIcon.text=Volume MediaPlayerPanel.playBackSpeedLabel.text=Speed: + +# The following message properties were taken from IcePDF 6.2.2 to allow +# for Japanese translation. +# + +##### +### This MessageBundle contains English text for ICEpdf View and Pilot RI's +## +# + + +## Window toolbar Title +viewer.window.title.default = ICEpdf Viewer +viewer.window.title.open.default = ICEpdf Viewer - [{0}] + +#status bar +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 + +## 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 + +## 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 + + +## 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 + +## 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 +## 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 + +## 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... + +## 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 +## 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... + +## 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}. + +## 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.openDocument.pdfException.title = ICEsoft ICEpdf - PDF Exception +viewer.dialog.openDocument.pdfException.msg = \ + ICEpdf could not open the specified file {0} \n\ + The file may be corrupt or not a supported file type. + +viewer.dialog.openDocument.pdfSecurityException.title = ICEsoft ICEpdf - PDF Security Exception +viewer.dialog.openDocument.pdfSecurityException.msg = \ + ICEpdf could not open the encrypted file at {0}\n\ + This may be the result of an invalid password or a missing JCE Security Provider.\n\n\ + Please refer to ICEpdf Developer's Guide for more information. + +viewer.dialog.openDocument.exception.title = ICEsoft ICEpdf - Exception +viewer.dialog.openDocument.exception.msg = \ + ICEpdf could not open the specified file at {0}\n\ + The file may be corrupt or not a supported file type. + +viewer.dialog.openURL.exception.title = ICEsoft ICEpdf - URL Exception +viewer.dialog.openURL.exception.msg = \ + ICEpdf could not open the specified file. {0} \n\ + at URL: {1} +viewer.dialog.openURL.downloading.msg = Downloading {0} + +## General error dialog +viewer.dialog.information.copyAll.title = ICEsoft ICEpdf - Information +viewer.dialog.information.copyAll.msg = \ + The document has more than {0} pages, please use\n\ + "Export text..." to extract document text. + +## 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 + + +## Open URL Dialog +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}? + +## 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. +# Text extraction output file +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 + +## 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. + +# Printing Progress bar +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) + + +## 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 + +## Go to Page Dialog +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 + +## 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. + +## Utility Pane Bookmarks Tab +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? + +## Utility Pane Thumbnails +viewer.utilityPane.thumbs.tab.title = Thumbnails + +## Layers Pane +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 + +## 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... +## Annotation Tab +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 + +## 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: +## 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: + +## 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: +## 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 + +## 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 + +## 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: +## 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: +## 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 +## 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 +## 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? +## uri action dialog test +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: +## 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 +# 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} + +## 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... +# 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 +# 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 +# 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 + +## 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} + +## 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... + +## 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... +# 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 + +## 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} +# 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 + +## Common Button Labels +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."; + +### +# General Error Messages + + +# Command Line Errors +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. + +# 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. + +### Properties Manager Errors +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.failedCreation = \ + ICEpdf Viewer directory to store user data can not be created:\n\ + {0}\n\ + ICEpdf Viewer will not save changes to its default setup. + +manager.properties.session.nolock = \ + Error creating the lock file :\n\ + {0}\n + +manager.properties.session.readError = \ + Error loading properties file: \n\ + {0} + +manager.properties.deleted = Property file has been deleted\n\ + ({0})\n\ + Recreate it ? + +manager.properties.modified = Property file has been modified since last update\n\ +({0,date,long})\n\ +Would 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.lafError =\ + Look&Feel {0} given in the default properties is unsupported.\n\ + Using system default. + +manager.properties.brokenProperty = Broken default property {0} value: {1} + +manager.properties.missingProperty = Missing default property {0} value: {1} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED index 0c33d92daf..fd9d2d345e 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/Bundle.properties-MERGED @@ -1,3 +1,19 @@ +# Copyright 2014-2020 Basis Technology Corp. +# +# Copyright 2006-2017 ICEsoft Technologies Canada Corp. +# +# 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. +# AnnotationsContentViewer.centralRepositoryEntryDataLabel.case=Case: AnnotationsContentViewer.centralRepositoryEntryDataLabel.comment=Comment: @@ -167,6 +183,17 @@ MediaPlayerPanel.playButton.text= MediaPlayerPanel.infoLabel.text=No Errors MediaPlayerPanel.VolumeIcon.text=Volume MediaPlayerPanel.playBackSpeedLabel.text=Speed: + +# The following message properties were taken from IcePDF 6.2.2 to allow +# for Japanese translation. +# + +##### +### This MessageBundle contains English text for ICEpdf View and Pilot RI's +## +# + + # {0} - tableName SQLiteViewer.readTable.errorText=Error getting rows for table: {0} # {0} - tableName @@ -175,3 +202,837 @@ TranslatablePanel.comboBoxOption.originalText=Original Text 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}] + +#status bar +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 + +## 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 + +## 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 + + +## 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 + +## 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 +## 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 + +## 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... + +## 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 +## 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... + +## 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}. + +## 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.openDocument.pdfException.title = ICEsoft ICEpdf - PDF Exception +viewer.dialog.openDocument.pdfException.msg = \ + ICEpdf could not open the specified file {0} \n\ + The file may be corrupt or not a supported file type. + +viewer.dialog.openDocument.pdfSecurityException.title = ICEsoft ICEpdf - PDF Security Exception +viewer.dialog.openDocument.pdfSecurityException.msg = \ + ICEpdf could not open the encrypted file at {0}\n\ + This may be the result of an invalid password or a missing JCE Security Provider.\n\n\ + Please refer to ICEpdf Developer's Guide for more information. + +viewer.dialog.openDocument.exception.title = ICEsoft ICEpdf - Exception +viewer.dialog.openDocument.exception.msg = \ + ICEpdf could not open the specified file at {0}\n\ + The file may be corrupt or not a supported file type. + +viewer.dialog.openURL.exception.title = ICEsoft ICEpdf - URL Exception +viewer.dialog.openURL.exception.msg = \ + ICEpdf could not open the specified file. {0} \n\ + at URL: {1} +viewer.dialog.openURL.downloading.msg = Downloading {0} + +## General error dialog +viewer.dialog.information.copyAll.title = ICEsoft ICEpdf - Information +viewer.dialog.information.copyAll.msg = \ + The document has more than {0} pages, please use\n\ + "Export text..." to extract document text. + +## 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 + + +## Open URL Dialog +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}? + +## 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. +# Text extraction output file +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 + +## 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. + +# Printing Progress bar +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) + + +## 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 + +## Go to Page Dialog +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 + +## 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. + +## Utility Pane Bookmarks Tab +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? + +## Utility Pane Thumbnails +viewer.utilityPane.thumbs.tab.title = Thumbnails + +## Layers Pane +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 + +## 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... +## Annotation Tab +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 + +## 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: +## 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: + +## 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: +## 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 + +## 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 + +## 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: +## 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: +## 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 +## 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 +## 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? +## uri action dialog test +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: +## 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 +# 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} + +## 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... +# 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 +# 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 +# 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 + +## 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} + +## 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... + +## 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... +# 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 + +## 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} +# 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 + +## Common Button Labels +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."; + +### +# General Error Messages + + +# Command Line Errors +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. + +# 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. + +### Properties Manager Errors +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.failedCreation = \ + ICEpdf Viewer directory to store user data can not be created:\n\ + {0}\n\ + ICEpdf Viewer will not save changes to its default setup. + +manager.properties.session.nolock = \ + Error creating the lock file :\n\ + {0}\n + +manager.properties.session.readError = \ + Error loading properties file: \n\ + {0} + +manager.properties.deleted = Property file has been deleted\n\ + ({0})\n\ + Recreate it ? + +manager.properties.modified = Property file has been modified since last update\n\ +({0,date,long})\n\ +Would 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.lafError =\ + Look&Feel {0} given in the default properties is unsupported.\n\ + Using system default. + +manager.properties.brokenProperty = Broken default property {0} value: {1} + +manager.properties.missingProperty = Missing default property {0} value: {1} diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java index 52c6a93558..b21a48a193 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/PDFViewer.java @@ -21,19 +21,24 @@ package org.sleuthkit.autopsy.contentviewers; import java.awt.BorderLayout; import java.awt.Component; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.ResourceBundle; import java.util.concurrent.ExecutionException; import java.util.logging.Level; + import javax.swing.JPanel; +import javax.swing.SwingUtilities; import javax.swing.SwingWorker; +import org.icepdf.core.SecurityCallback; import org.openide.util.NbBundle; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.ReadContentInputStream; + import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; @@ -42,6 +47,7 @@ import org.icepdf.core.exceptions.PDFSecurityException; import org.icepdf.core.pobjects.Document; import org.icepdf.ri.common.ComponentKeyBinding; +import org.icepdf.ri.common.MyGUISecurityCallback; import org.icepdf.ri.common.SwingController; import org.icepdf.ri.common.SwingViewBuilder; import org.icepdf.ri.common.views.DocumentViewControllerImpl; @@ -51,15 +57,17 @@ import org.icepdf.ri.util.PropertiesManager; /** * Application content viewer for PDF files. */ -public class PDFViewer implements FileTypeViewer { +final class PDFViewer implements FileTypeViewer { private static final Logger logger = Logger.getLogger(PDFViewer.class.getName()); private JPanel container; private final PropertiesManager propsManager; + private final ResourceBundle messagesBundle; - public PDFViewer() { + PDFViewer() { container = createNewContainer(); + messagesBundle = getMessagesBundle(); propsManager = getCustomProperties(); } @@ -71,7 +79,7 @@ public class PDFViewer implements FileTypeViewer { @Override public void setFile(AbstractFile file) { // The 'C' in IcePDFs MVC set up. - SwingController controller = new SwingController(); + SwingController controller = new SwingController(messagesBundle); // Builder for the 'V' in IcePDFs MVC set up SwingViewBuilder viewBuilder = new SwingViewBuilder(controller, propsManager); @@ -97,7 +105,13 @@ public class PDFViewer implements FileTypeViewer { protected Document doInBackground() throws PDFException, PDFSecurityException, IOException { ReadContentInputStream stream = new ReadContentInputStream(file); Document doc = new Document(); - // This will read the stream into memory. + + // Prompts the user for a password if the document is password + // protected. + doc.setSecurityCallback(createPasswordDialogCallback()); + + // This will read the stream into memory and invoke the + // security callback if needed. doc.setInputStream(stream, null); return doc; } @@ -169,9 +183,12 @@ public class PDFViewer implements FileTypeViewer { // This suppresses a pop-up, from IcePDF, that asks if you'd like to // save configuration changes to disk. props.setProperty("application.showLocalStorageDialogs", "false"); - - ResourceBundle defaultMessageBundle = ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE); - return new PropertiesManager(System.getProperties(), props, defaultMessageBundle); + + return new PropertiesManager(System.getProperties(), props, messagesBundle); + } + + private ResourceBundle getMessagesBundle() { + return NbBundle.getBundle(PDFViewer.class); } @NbBundle.Messages({ @@ -189,4 +206,27 @@ public class PDFViewer implements FileTypeViewer { private void showEncryptionDialog() { MessageNotifyUtil.Message.error(Bundle.PDFViewer_encryptedDialog()); } + + /** + * Creates a callback that will prompt the user for password input. + */ + private SecurityCallback createPasswordDialogCallback() { + // MyGUISecurityCallback is a reference implementation from IcePDF. + return new MyGUISecurityCallback(null, messagesBundle) { + private String password; + + @Override + public String requestPassword(Document document) { + try { + SwingUtilities.invokeAndWait(() -> { + // Show the password dialog on the EDT. + this.password = super.requestPassword(document); + }); + return this.password; + } catch (InterruptedException | InvocationTargetException ex) { + return null; + } + } + }; + } } diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java index 92615a5768..b45b3b6867 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/FileTypeUtils.java @@ -19,11 +19,13 @@ package org.sleuthkit.autopsy.coreutils; import com.google.common.collect.ImmutableSet; +import java.util.Arrays; import static java.util.Arrays.asList; import java.util.Collection; import java.util.Collections; import javax.imageio.ImageIO; import static org.apache.commons.collections4.ListUtils.removeAll; +import org.apache.commons.lang.StringUtils; import org.openide.util.NbBundle; /** @@ -33,7 +35,14 @@ public final class FileTypeUtils { private static final ImmutableSet IMAGE_MIME_TYPES = new ImmutableSet.Builder() - .addAll(removeAll(asList(ImageIO.getReaderMIMETypes()), + .addAll(removeAll( + asList( + // remove any empty mime types provided by ImageIO.getReaderMIMETypes() + // This prevents mime types added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) + Arrays.stream(ImageIO.getReaderMIMETypes()) + .filter((mimeType) -> StringUtils.isNotBlank(mimeType)) + .toArray(String[]::new)), asList("application/octet-stream"))) //this claims to be supported, but is not really an image. .add("image/bmp", //NON-NLS "image/gif", //NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java index c89ee7d4f7..5f1653bf7a 100644 --- a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java @@ -46,6 +46,8 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.logging.Level; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javafx.concurrent.Task; import javafx.embed.swing.SwingFXUtils; import javax.annotation.Nonnull; @@ -137,11 +139,25 @@ public class ImageUtils { } FFMPEG_LOADED = tempFfmpegLoaded; - SUPPORTED_IMAGE_EXTENSIONS.addAll(Arrays.asList(ImageIO.getReaderFileSuffixes())); + // remove any empty extension types provided by ImageIO.getReaderFileSuffixes() + // This prevents extensions added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) + List imageSuffixList = Arrays.stream(ImageIO.getReaderFileSuffixes()) + .filter((extension) -> StringUtils.isNotBlank(extension)) + .collect(Collectors.toList()); + + SUPPORTED_IMAGE_EXTENSIONS.addAll(imageSuffixList); SUPPORTED_IMAGE_EXTENSIONS.add("tec"); // Add JFIF .tec files SUPPORTED_IMAGE_EXTENSIONS.removeIf("db"::equals); // remove db files - SUPPORTED_IMAGE_MIME_TYPES = new TreeSet<>(Arrays.asList(ImageIO.getReaderMIMETypes())); + List mimeTypeList = Stream.of(ImageIO.getReaderMIMETypes()) + // remove any empty mime types provided by ImageIO.getReaderMIMETypes() + // This prevents mime types added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) + .filter((mimeType) -> StringUtils.isNotBlank(mimeType)) + .collect(Collectors.toList()); + + SUPPORTED_IMAGE_MIME_TYPES = new TreeSet<>(mimeTypeList); /* * special cases and variants that we support, but don't get registered * with ImageIO automatically diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java index f9d8fca38e..d8121e68a1 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java @@ -23,6 +23,8 @@ import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -38,9 +40,9 @@ import javax.swing.SwingWorker; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.datamodel.utils.IconsUtil; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; +import org.sleuthkit.datamodel.BlackboardAttribute; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; @@ -482,6 +484,54 @@ class GeoFilterPanel extends javax.swing.JPanel { return new Sources(validSources, atCountsTotal); } + /** + * Get a count of artifacts of the given type containing GPS data for + * the given data case and source. Does not include rejected artifacts. + * + * @param sleuthkitCase + * @param dataSource + * @param artifactType + * + * @return The artifacts count that match the criteria + * + * @throws TskCoreException + */ + private long getGPSDataCount(SleuthkitCase sleuthkitCase, + DataSource dataSource, BlackboardArtifact.ARTIFACT_TYPE artifactType) throws TskCoreException { + long count = 0; + String queryStr + = "SELECT count(DISTINCT artifact_id) AS count FROM" + + " (" + + " SELECT * FROM blackboard_artifacts as arts" + + " INNER JOIN blackboard_attributes as attrs" + + " ON attrs.artifact_id = arts.artifact_id" + + " WHERE arts.artifact_type_id = " + artifactType.getTypeID() + + " AND arts.data_source_obj_id = " + dataSource.getId() + + " AND arts.review_status_id != " + BlackboardArtifact.ReviewStatus.REJECTED.getID() + + " AND" + + " (" + + "attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID() + + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID() + + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_TRACKPOINTS.getTypeID() + + " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_WAYPOINTS.getTypeID() + + " )" + + " )"; + try (SleuthkitCase.CaseDbQuery queryResult = sleuthkitCase.executeQuery(queryStr); + ResultSet resultSet = queryResult.getResultSet()) { + if (resultSet.next()) { + count = resultSet.getLong("count"); + } + } catch (SQLException ex) { + Throwable cause = ex.getCause(); + if (cause != null) { + logger.log(Level.SEVERE, cause.getMessage(), cause); + } else { + logger.log(Level.SEVERE, ex.getMessage(), ex); + } + } + return count; + } + /** * Returns a Map representing the number of sources found for each * artifact type. If no data was found, an empty map is returned. @@ -496,7 +546,7 @@ class GeoFilterPanel extends javax.swing.JPanel { private Map getGPSDataSources(SleuthkitCase sleuthkitCase, DataSource dataSource) throws TskCoreException { HashMap ret = new HashMap<>(); for (BlackboardArtifact.ARTIFACT_TYPE type : GPS_ARTIFACT_TYPES) { - long count = sleuthkitCase.getBlackboardArtifactsTypeCount(type.getTypeID(), dataSource.getId()); + long count = getGPSDataCount(sleuthkitCase, dataSource, type); if (count > 0) { ret.put(type, count); } diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java index 44de21ff81..242d8e81d6 100755 --- a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java +++ b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java @@ -39,6 +39,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -83,9 +84,13 @@ import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; final public class MapPanel extends javax.swing.JPanel { static final String CURRENT_MOUSE_GEOPOSITION = "CURRENT_MOUSE_GEOPOSITION"; + private static final Logger logger = Logger.getLogger(MapPanel.class.getName()); private static final long serialVersionUID = 1L; + private static final Set DOT_WAYPOINT_TYPES = new HashSet<>(); + private static final int DOT_SIZE = 12; + private boolean zoomChanging; private KdTree waypointTree; private Set waypointSet; @@ -104,6 +109,12 @@ final public class MapPanel extends javax.swing.JPanel { private MapWaypoint currentlySelectedWaypoint; private Set currentlySelectedTrack; + static { + DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID()); + DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_TRACK.getTypeID()); + DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID()); + } + /** * Creates new form MapPanel */ @@ -486,14 +497,30 @@ final public class MapPanel extends javax.swing.JPanel { Iterator iterator = waypoints.iterator(); - // These maybe the points closest to lat/log was clicked but - // that doesn't mean they are close in terms of pixles. + // These may be the points closest to the lat/lon location that was + // clicked, but that doesn't mean they are close in terms of pixles. List closestPoints = new ArrayList<>(); while (iterator.hasNext()) { MapWaypoint nextWaypoint = iterator.next(); - Point2D point = mapViewer.convertGeoPositionToPoint(nextWaypoint.getPosition()); - Rectangle rect = new Rectangle((int) point.getX() - (whiteWaypointImage.getWidth() / 2), (int) point.getY() - whiteWaypointImage.getHeight(), whiteWaypointImage.getWidth(), whiteWaypointImage.getHeight()); + int pointX = (int) point.getX(); + int pointY = (int) point.getY(); + Rectangle rect; + if (DOT_WAYPOINT_TYPES.contains(nextWaypoint.getArtifactTypeID())) { + rect = new Rectangle( + pointX - (DOT_SIZE / 2), + pointY - (DOT_SIZE / 2), + DOT_SIZE, + DOT_SIZE + ); + } else { + rect = new Rectangle( + pointX - (whiteWaypointImage.getWidth() / 2), + pointY - whiteWaypointImage.getHeight(), + whiteWaypointImage.getWidth(), + whiteWaypointImage.getHeight() + ); + } if (rect.contains(clickPoint)) { closestPoints.add(nextWaypoint); @@ -689,6 +716,7 @@ final public class MapPanel extends javax.swing.JPanel { if (waypoints.size() > 0) { MapWaypoint selection = waypoints.get(0); currentlySelectedWaypoint = selection; + currentlySelectedTrack = null; for (Set track : tracks) { if (track.contains(selection)) { currentlySelectedTrack = track; @@ -751,17 +779,16 @@ final public class MapPanel extends javax.swing.JPanel { * @return the new dot image */ private BufferedImage createTrackDotImage(Color color) { - int w = 10; - int h = 10; + int s = DOT_SIZE; - BufferedImage ret = new BufferedImage(w + 2, h + 2, BufferedImage.TYPE_INT_ARGB); + BufferedImage ret = new BufferedImage(s, s, BufferedImage.TYPE_INT_ARGB); Graphics2D g = ret.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(color); - g.fillOval(1, 1, w, h); + g.fillOval(1, 1, s - 2, s - 2); g.setColor(Color.BLACK); g.setStroke(new BasicStroke(1)); - g.drawOval(1, 1, w, h); + g.drawOval(1, 1, s - 2, s - 2); g.dispose(); return ret; } @@ -794,14 +821,11 @@ final public class MapPanel extends javax.swing.JPanel { public void paintWaypoint(Graphics2D g, JXMapViewer map, MapWaypoint waypoint) { Color color = getColor(waypoint); BufferedImage image; - int artifactType = waypoint.getArtifactTypeID(); Point2D point = map.getTileFactory().geoToPixel(waypoint.getPosition(), map.getZoom()); int x = (int) point.getX(); int y = (int) point.getY(); - if (artifactType == ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID() - || artifactType == ARTIFACT_TYPE.TSK_GPS_TRACK.getTypeID() - || artifactType == ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID()) { + if (DOT_WAYPOINT_TYPES.contains(waypoint.getArtifactTypeID())) { image = dotImageCache.computeIfAbsent(color, k -> { return createTrackDotImage(color); }); diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java index 3715816801..99eecf50d2 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/AddHashValuesToDatabaseProgressDialog.java @@ -64,7 +64,7 @@ public class AddHashValuesToDatabaseProgressDialog extends javax.swing.JDialog { display(parent); this.hashes = new ArrayList<>(); this.invalidHashes = new ArrayList<>(); - this.md5Pattern = Pattern.compile("^[a-fA-F0-9]{32}$"); // NON-NLS + this.md5Pattern = Pattern.compile("^([a-fA-F0-9]{32})"); // NON-NLS this.parentRef = parent; this.hashDb = hashDb; this.text = text; @@ -162,9 +162,16 @@ public class AddHashValuesToDatabaseProgressDialog extends javax.swing.JDialog { for (String hashEntry : linesInTextArea) { hashEntry = hashEntry.trim(); Matcher m = md5Pattern.matcher(hashEntry); - if (m.find()) { - // more information can be added to the HashEntry - sha-1, sha-512, comment - hashes.add(new HashEntry(null, m.group(0), null, null, null)); + if (m.find()) { + // Is there any text left on this line? If so, treat it as a comment. + String comment = hashEntry.substring(m.end()).trim(); + if (comment.length() > 0) { + comment = (comment.charAt(0) == ',') ? comment.substring(1) : comment; + hashes.add(new HashEntry(null, m.group(0), null, null, comment)); + } else { + // more information can be added to the HashEntry - sha-1, sha-512, comment + hashes.add(new HashEntry(null, m.group(0), null, null, null)); + } } else { if (!hashEntry.isEmpty()) { invalidHashes.add(hashEntry); diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties index c6f840be32..8d6d7e88a1 100755 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties @@ -18,7 +18,7 @@ PortableCaseInterestingItemsListPanel.selectButton.text=Select All PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets: PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results -ReportVisualPanel2.advancedButton.text=Result Types +ReportVisualPanel2.advancedButton.text=Choose Result Types... ReportVisualPanel2.deselectAllButton.text=Deselect All ReportVisualPanel2.selectAllButton.text=Select All ReportVisualPanel2.dataLabel.text=Select which data to report on: diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED index c3bca8db45..7a9c14627a 100755 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle.properties-MERGED @@ -33,7 +33,7 @@ PortableCaseInterestingItemsListPanel.selectButton.text=Select All PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets: PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results -ReportVisualPanel2.advancedButton.text=Result Types +ReportVisualPanel2.advancedButton.text=Choose Result Types... ReportVisualPanel2.deselectAllButton.text=Deselect All ReportVisualPanel2.selectAllButton.text=Select All ReportVisualPanel2.dataLabel.text=Select which data to report on: diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form index 039ef97c70..b54495fb20 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.form @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ - + @@ -33,7 +33,6 @@ - @@ -44,8 +43,9 @@ + - + @@ -64,17 +64,20 @@ - - + + - - + + + + + + + - - diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java index e804f0384f..c7dbcfd5b1 100644 --- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java @@ -321,7 +321,7 @@ final class ReportVisualPanel2 extends JPanel { advancedButton = new javax.swing.JButton(); allTaggedResultsRadioButton = new javax.swing.JRadioButton(); - setPreferredSize(new java.awt.Dimension(650, 250)); + setPreferredSize(new java.awt.Dimension(650, 275)); optionsButtonGroup.add(specificTaggedResultsRadioButton); org.openide.awt.Mnemonics.setLocalizedText(specificTaggedResultsRadioButton, org.openide.util.NbBundle.getMessage(ReportVisualPanel2.class, "ReportVisualPanel2.specificTaggedResultsRadioButton.text")); // NOI18N @@ -381,7 +381,6 @@ final class ReportVisualPanel2 extends JPanel { .addComponent(tagsScrollPane) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(advancedButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(deselectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(layout.createSequentialGroup() @@ -389,12 +388,13 @@ final class ReportVisualPanel2 extends JPanel { .addComponent(allTaggedResultsRadioButton) .addComponent(dataLabel) .addComponent(allResultsRadioButton) - .addComponent(specificTaggedResultsRadioButton)) - .addGap(0, 402, Short.MAX_VALUE))) + .addComponent(specificTaggedResultsRadioButton) + .addComponent(advancedButton)) + .addGap(0, 454, Short.MAX_VALUE))) .addContainerGap()) ); - layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {advancedButton, deselectAllButton, selectAllButton}); + layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deselectAllButton, selectAllButton}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -408,15 +408,17 @@ final class ReportVisualPanel2 extends JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(specificTaggedResultsRadioButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() .addComponent(selectAllButton) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(deselectAllButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(advancedButton)) - .addComponent(tagsScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) + .addGap(136, 136, 136)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(tagsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(5, 5, 5) + .addComponent(advancedButton) + .addContainerGap()))) ); }// //GEN-END:initComponents diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form index 18cd9b97af..c7efa80e28 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.form @@ -190,20 +190,16 @@ - + - - - + - + - - diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java index 621aec9d2a..04e978dfa9 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/BingTranslatorSettingsPanel.java @@ -32,6 +32,10 @@ import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import java.awt.Desktop; +import java.net.URISyntaxException; import org.apache.commons.lang3.StringUtils; import org.openide.util.NbBundle.Messages; @@ -75,6 +79,23 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { populateComboBox(); selectLanguageByCode(code); targetLanguageCode = code; + + instructionsTextArea.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + // Try to display the URL in the user's browswer. + if(Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(e.getURL().toURI()); + } catch (IOException | URISyntaxException ex) { + logger.log(Level.WARNING, "Failed to display URL in external viewer", ex); + } + } + + } + } + }); } /** @@ -140,7 +161,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { testResultValueLabel = new javax.swing.JLabel(); authenticationKeyLabel = new javax.swing.JLabel(); instructionsScrollPane = new javax.swing.JScrollPane(); - instructionsTextArea = new javax.swing.JTextArea(); + instructionsTextArea = new javax.swing.JTextPane(); javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); setLayout(new java.awt.GridBagLayout()); @@ -265,12 +286,8 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { instructionsTextArea.setEditable(false); instructionsTextArea.setBackground(new java.awt.Color(240, 240, 240)); - instructionsTextArea.setColumns(20); - instructionsTextArea.setLineWrap(true); - instructionsTextArea.setRows(4); - instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.instructionsTextArea.text")); // NOI18N - instructionsTextArea.setWrapStyleWord(true); - instructionsTextArea.setCaretPosition(0); + instructionsTextArea.setContentType("text/html"); // NOI18N + instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.instructionsTextArea.text_1")); // NOI18N instructionsTextArea.setMaximumSize(new java.awt.Dimension(1000, 200)); instructionsTextArea.setPreferredSize(new java.awt.Dimension(164, 78)); instructionsScrollPane.setViewportView(instructionsTextArea); @@ -316,7 +333,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel { private javax.swing.JTextField authenticationKeyField; private javax.swing.JLabel authenticationKeyLabel; private javax.swing.JScrollPane instructionsScrollPane; - private javax.swing.JTextArea instructionsTextArea; + private javax.swing.JTextPane instructionsTextArea; private javax.swing.JLabel resultLabel; private javax.swing.JComboBox targetLanguageComboBox; private javax.swing.JLabel targetLanguageLabel; diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties index b09c2ae682..90f5311052 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties @@ -13,5 +13,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: GoogleTranslatorSettingsPanel.resultLabel.text=Result: GoogleTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key: -BingTranslatorSettingsPanel.instructionsTextArea.text=You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup -GoogleTranslatorSettingsPanel.instructionsTextArea.text=You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys +GoogleTranslatorSettingsPanel.instructionsTextArea.text=
You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys.
+BingTranslatorSettingsPanel.instructionsTextArea.text_1=
You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup.
diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED index 4c32b7abab..1f71c6f2c0 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties-MERGED @@ -26,5 +26,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated: GoogleTranslatorSettingsPanel.resultLabel.text=Result: GoogleTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key: -BingTranslatorSettingsPanel.instructionsTextArea.text=You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup -GoogleTranslatorSettingsPanel.instructionsTextArea.text=You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys +GoogleTranslatorSettingsPanel.instructionsTextArea.text=
You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys.
+BingTranslatorSettingsPanel.instructionsTextArea.text_1=
You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup.
diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties index 885df0f635..6ad3b7e741 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties @@ -26,5 +26,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=\u672a\u7ffb\u8a33: GoogleTranslatorSettingsPanel.resultLabel.text=\u7d50\u679c: GoogleTranslatorSettingsPanel.testResultValueLabel.text= BingTranslatorSettingsPanel.authenticationKeyLabel.text=\u8a8d\u8a3c\u30ad\u30fc: -BingTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eMicrosoft Translator\u30a2\u30ab\u30a6\u30f3\u30c8\u306bMicrosoft Translator\u8a8d\u8a3c\u30ad\u30fc\u3092\u63d0\u4f9b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30ad\u30fc\u306e\u53d6\u5f97\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u624b\u9806\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u307e\u3059: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup GoogleTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eGoogle\u7ffb\u8a33\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306b\u542b\u307e\u308c\u308bJSON\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306e\u4f5c\u6210\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u60c5\u5831\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u3042\u307e\u3059: https://cloud.google.com/iam/docs/creating-managing-service-account-keys +BingTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eMicrosoft Translator\u30a2\u30ab\u30a6\u30f3\u30c8\u306bMicrosoft Translator\u8a8d\u8a3c\u30ad\u30fc\u3092\u63d0\u4f9b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30ad\u30fc\u306e\u53d6\u5f97\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u624b\u9806\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u307e\u3059: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form index 67bf16ebf9..056479013d 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.form @@ -212,20 +212,16 @@ - + - - - + - - diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java index b9c6b852b1..f790a9541b 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/GoogleTranslatorSettingsPanel.java @@ -24,17 +24,21 @@ import com.google.cloud.translate.Language; import com.google.cloud.translate.Translate; import com.google.cloud.translate.TranslateOptions; import com.google.cloud.translate.Translation; +import java.awt.Desktop; import java.awt.event.ItemListener; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import org.sleuthkit.autopsy.coreutils.Logger; import javax.swing.JFileChooser; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; import javax.swing.filechooser.FileNameExtensionFilter; import org.apache.commons.lang3.StringUtils; import org.openide.util.NbBundle.Messages; @@ -59,6 +63,23 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { targetLanguageCode = languageCode; credentialsPathField.setText(credentialsPath); populateTargetLanguageComboBox(); + + instructionsTextArea.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + // Try to display the URL in the user's browswer. + if(Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(e.getURL().toURI()); + } catch (IOException | URISyntaxException ex) { + logger.log(Level.WARNING, "Failed to display URL in external viewer", ex); + } + } + + } + } + }); } /** @@ -198,7 +219,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { testUntranslatedTextField = new javax.swing.JTextField(); testButton = new javax.swing.JButton(); instructionsScrollPane = new javax.swing.JScrollPane(); - instructionsTextArea = new javax.swing.JTextArea(); + instructionsTextArea = new javax.swing.JTextPane(); javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); setLayout(new java.awt.GridBagLayout()); @@ -335,12 +356,8 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { instructionsTextArea.setEditable(false); instructionsTextArea.setBackground(new java.awt.Color(240, 240, 240)); - instructionsTextArea.setColumns(20); - instructionsTextArea.setLineWrap(true); - instructionsTextArea.setRows(4); + instructionsTextArea.setContentType("text/html"); // NOI18N instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.instructionsTextArea.text")); // NOI18N - instructionsTextArea.setWrapStyleWord(true); - instructionsTextArea.setCaretPosition(0); instructionsTextArea.setMaximumSize(new java.awt.Dimension(1000, 200)); instructionsTextArea.setPreferredSize(new java.awt.Dimension(164, 78)); instructionsScrollPane.setViewportView(instructionsTextArea); @@ -405,7 +422,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel { private javax.swing.JButton browseButton; private javax.swing.JTextField credentialsPathField; private javax.swing.JScrollPane instructionsScrollPane; - private javax.swing.JTextArea instructionsTextArea; + private javax.swing.JTextPane instructionsTextArea; private javax.swing.JLabel resultLabel; private javax.swing.JComboBox targetLanguageComboBox; private javax.swing.JButton testButton; diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java index fb8a4d47ec..675af9aea3 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java @@ -94,6 +94,10 @@ public enum FileTypeUtils { ImageIO.scanForPlugins(); //add all extension ImageIO claims to support imageExtensions.addAll(Stream.of(ImageIO.getReaderFileSuffixes()) + // remove any empty extension types provided by ImageIO.getReaderFileSuffixes() + // This prevents extensions added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) + .filter((extension) -> StringUtils.isNotBlank(extension)) .map(String::toLowerCase) .collect(Collectors.toList())); //add list of known image extensions @@ -144,8 +148,12 @@ public enum FileTypeUtils { * are not images) to show up in Image Gallery. * supportedMimeTypes.addAll(Arrays.asList("application/x-emf")); */ - //add list of mimetypes ImageIO claims to support + //add list of mimetypes ImageIO claims to support supportedMimeTypes.addAll(Stream.of(ImageIO.getReaderMIMETypes()) + // remove any empty mime types provided by ImageIO.getReaderMIMETypes() + // This prevents mime types added by SPI implementations from causing errors + // (i.e. 'jai-imageio' utilized with IcePDF) + .filter((mimeType) -> StringUtils.isNotBlank(mimeType)) .map(String::toLowerCase) .collect(Collectors.toList())); diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java index 3a9ae712b8..d2cdc484ce 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/DrawableTagsManager.java @@ -190,7 +190,7 @@ public final class DrawableTagsManager { returnTagName = autopsyTagsManager.getDisplayNamesToTagNamesMap().get(displayName); if (returnTagName != null) { return returnTagName; - } + } throw new TskCoreException("Tag name exists but an error occured in retrieving it", ex); } } diff --git a/Running_Linux_OSX.txt b/Running_Linux_OSX.txt index 60b81bc50a..0ada2fd44c 100644 --- a/Running_Linux_OSX.txt +++ b/Running_Linux_OSX.txt @@ -42,11 +42,12 @@ The following need to be done at least once. They do not need to be repeated for Autopsy depends on a specific version of The Sleuth Kit. You need the Java libraries of The Sleuth Kit installed, which is not part of all packages. -- Linux: Install the sleuthkit-java.deb file that you can download from github.com/sleuthkit/sleuthkit/releases. This will install libewf, etc. --- % sudo apt install ./sleuthkit-java_4.7.0-1_amd64.deb +- Linux: Install the sleuthkit-java.deb file that you can download from github.com/sleuthkit/sleuthkit/releases. This will install libewf, etc. For example: +-- % sudo apt install ./sleuthkit-java_4.8.0-1_amd64.deb -- OS X: Install The Sleuth Kit from brew. --- % brew install sleuthkit +- OS X: Build The Sleuth Kit from source. + See https://slo-sleuth.github.io/tools/InstallingAutopsyOnMacOS.html for a comprehensive write-up + on building The Sleuth Kit and getting Autopsy to run on Mac OS. * Install Autopsy * diff --git a/docs/doxygen-user/drone.dox b/docs/doxygen-user/drone.dox index e237f915e3..dac9bc4cf4 100755 --- a/docs/doxygen-user/drone.dox +++ b/docs/doxygen-user/drone.dox @@ -13,6 +13,8 @@ Currently, the Drone Analyzer module works on images obtained from the internal - Mavic Pro - Mavic Air +The module will find DAT files and process them using DatCon (https://datfile.net/DatCon/intro.html). + \section drone_config Running the Module To enable the Drone Analyzer ingest module select the checkbox in the \ref ingest_configure "Ingest Modules configuration screen". @@ -27,4 +29,4 @@ GPS results can also be seen in the \ref geolocation_page window and the KML Rep \image html geolocation_drone_path.png -*/ \ No newline at end of file +*/ diff --git a/docs/doxygen-user/machine_translation.dox b/docs/doxygen-user/machine_translation.dox index 0bce206700..ebcf6e069d 100644 --- a/docs/doxygen-user/machine_translation.dox +++ b/docs/doxygen-user/machine_translation.dox @@ -4,7 +4,11 @@ You can configure a machine translation service to use with Autopsy. If one is c \section mt_config Configuration -To set up a machine translation service, go to Options->Tools and then select the Machine Translation tab. Select the service you want to use from the drop down menu at the top. +To set up a machine translation service, go to Options->Tools and then select the Machine Translation tab. Select the service you want to use from the drop down menu at the top. You will have to set up an account with either Bing or Google and then enter account information. + \image html mt_config.png