diff --git a/BUILDING.txt b/BUILDING.txt index deba833a0f..6a53ff870a 100644 --- a/BUILDING.txt +++ b/BUILDING.txt @@ -56,7 +56,7 @@ the needed places (i.e. '/usr/local'). 3) For 32-bit targets, get GStreamer Setup. GStreamer is used to view video files. -You can either download it and install it or manually by unziping the +You can either download it and install it or manually by unzipping the version that is included in the 'thirdparty/gstreamer' folder. You will need the 'bin' and 'lib/gstreamer-1.0' folders to be in your Windows PATH environment variable. diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java index 7501cf052a..53d6229688 100755 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013-15 Basis Technology Corp. + * Copyright 2011-16 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,86 +37,66 @@ import org.sleuthkit.datamodel.TagName; import org.sleuthkit.datamodel.TskCoreException; /** - * A per case instance of this class functions as an Autopsy service that - * manages the creation, updating, and deletion of tags applied to content and - * blackboard artifacts by users. + * A per case Autopsy service that manages the creation, updating, and deletion + * of tags applied to content and blackboard artifacts by users. */ public class TagsManager implements Closeable { + private static final Logger logger = Logger.getLogger(TagsManager.class.getName()); private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS - private final SleuthkitCase tskCase; + private final SleuthkitCase caseDb; private final HashMap uniqueTagNames = new HashMap<>(); - private boolean tagNamesInitialized = false; // @@@ This is part of a work around to be removed when database access on the EDT is correctly synchronized. + private boolean tagNamesLoaded = false; /** - * Use this exception and the member hash map to manage uniqueness of hash - * names. This is deemed more proactive and informative than leaving this to - * the UNIQUE constraint on the display_name field of the tag_names table in - * the case database. - */ - public static class TagNameAlreadyExistsException extends Exception { - } - - /** - * Package-scope constructor for use of the Services class. An instance of - * TagsManager should be created for each case that is opened. + * Constructs a per case Autopsy service that manages the creation, + * updating, and deletion of tags applied to content and blackboard + * artifacts by users. * - * @param tskCase The SleuthkitCase object for the current case. + * @param caseDb The case database for the current case. */ - TagsManager(SleuthkitCase tskCase) { - this.tskCase = tskCase; - // @@@ The removal of this call is a work around until database access on the EDT is correctly synchronized. - // getExistingTagNames(); + TagsManager(SleuthkitCase caseDb) { + this.caseDb = caseDb; } /** * Gets a list of all tag names currently available for tagging content or - * blackboard artifacts. + * artifacts. * * @return A list, possibly empty, of TagName data transfer objects (DTOs). * - * @throws TskCoreException + * @throws TskCoreException If there is an error reading from the case + * database. */ public synchronized List getAllTagNames() throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getAllTagNames(); + lazyLoadExistingTagNames(); + return caseDb.getAllTagNames(); } /** - * Gets a list of all tag names currently used for tagging content or - * blackboard artifacts. + * Gets a list of all tag names currently in use for tagging content or + * artifacts. * * @return A list, possibly empty, of TagName data transfer objects (DTOs). * - * @throws TskCoreException + * @throws TskCoreException If there is an error reading from the case + * database. */ public synchronized List getTagNamesInUse() throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getTagNamesInUse(); + lazyLoadExistingTagNames(); + return caseDb.getTagNamesInUse(); } /** * Checks whether a tag name with a given display name exists. * - * @param tagDisplayName The display name for which to check. + * @param tagDisplayName The display name to check. * - * @return True if the tag name exists, false otherwise. + * @return True or false. */ public synchronized boolean tagNameExists(String tagDisplayName) { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - + lazyLoadExistingTagNames(); return uniqueTagNames.containsKey(tagDisplayName); } @@ -128,7 +108,10 @@ public class TagsManager implements Closeable { * @return A TagName data transfer object (DTO) representing the new tag * name. * - * @throws TagNameAlreadyExistsException, TskCoreException + * @throws TagNameAlreadyExistsException If the tag name would be a + * duplicate. + * @throws TskCoreException If there is an error adding the tag + * to the case database. */ public TagName addTagName(String displayName) throws TagNameAlreadyExistsException, TskCoreException { return addTagName(displayName, "", TagName.HTML_COLOR.NONE); @@ -143,7 +126,10 @@ public class TagsManager implements Closeable { * @return A TagName data transfer object (DTO) representing the new tag * name. * - * @throws TagNameAlreadyExistsException, TskCoreException + * @throws TagNameAlreadyExistsException If the tag name would be a + * duplicate. + * @throws TskCoreException If there is an error adding the tag + * to the case database. */ public TagName addTagName(String displayName, String description) throws TagNameAlreadyExistsException, TskCoreException { return addTagName(displayName, description, TagName.HTML_COLOR.NONE); @@ -159,22 +145,25 @@ public class TagsManager implements Closeable { * @return A TagName data transfer object (DTO) representing the new tag * name. * - * @throws TagNameAlreadyExistsException, TskCoreException + * @throws TagNameAlreadyExistsException If the tag name would be a + * duplicate. + * @throws TskCoreException If there is an error adding the tag + * to the case database. */ public synchronized TagName addTagName(String displayName, String description, TagName.HTML_COLOR color) throws TagNameAlreadyExistsException, TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - + lazyLoadExistingTagNames(); if (uniqueTagNames.containsKey(displayName)) { throw new TagNameAlreadyExistsException(); } - // Add the tag name to the case. - TagName newTagName = tskCase.addTagName(displayName, description, color); + /* + * Add the tag name to the case. + */ + TagName newTagName = caseDb.addTagName(displayName, description, color); - // Add the tag name to the tags settings. + /* + * Add the tag name to the tags settings. + */ uniqueTagNames.put(newTagName.getDisplayName(), newTagName); saveTagNamesToTagsSettings(); @@ -189,7 +178,8 @@ public class TagsManager implements Closeable { * * @return A ContentTag data transfer object (DTO) representing the new tag. * - * @throws TskCoreException + * @throws TskCoreException If there is an error adding the tag to the case + * database. */ public ContentTag addContentTag(Content content, TagName tagName) throws TskCoreException { return addContentTag(content, tagName, "", -1, -1); @@ -204,7 +194,8 @@ public class TagsManager implements Closeable { * * @return A ContentTag data transfer object (DTO) representing the new tag. * - * @throws TskCoreException + * @throws TskCoreException If there is an error adding the tag to the case + * database. */ public ContentTag addContentTag(Content content, TagName tagName, String comment) throws TskCoreException { return addContentTag(content, tagName, comment, -1, -1); @@ -221,39 +212,44 @@ public class TagsManager implements Closeable { * * @return A ContentTag data transfer object (DTO) representing the new tag. * - * @throws IllegalArgumentException, TskCoreException + * @throws IllegalArgumentException If a requested byte offset is out of + * range. + * @throws TskCoreException If there is an error adding the tag to + * the case database. */ - public synchronized ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws IllegalArgumentException, TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); + public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws IllegalArgumentException, TskCoreException { + ContentTag tag; + synchronized (this) { + lazyLoadExistingTagNames(); + + if (beginByteOffset >= 0 && endByteOffset >= 1) { + if (beginByteOffset > content.getSize() - 1) { + throw new IllegalArgumentException(NbBundle.getMessage(this.getClass(), + "TagsManager.addContentTag.exception.beginByteOffsetOOR.msg", + beginByteOffset, content.getSize() - 1)); + } + + if (endByteOffset > content.getSize() - 1) { + throw new IllegalArgumentException( + NbBundle.getMessage(this.getClass(), "TagsManager.addContentTag.exception.endByteOffsetOOR.msg", + endByteOffset, content.getSize() - 1)); + } + + if (endByteOffset < beginByteOffset) { + throw new IllegalArgumentException( + NbBundle.getMessage(this.getClass(), "TagsManager.addContentTag.exception.endLTbegin.msg")); + } + } + + tag = caseDb.addContentTag(content, tagName, comment, beginByteOffset, endByteOffset); } - if (beginByteOffset >= 0 && endByteOffset >= 1) { - if (beginByteOffset > content.getSize() - 1) { - throw new IllegalArgumentException(NbBundle.getMessage(this.getClass(), - "TagsManager.addContentTag.exception.beginByteOffsetOOR.msg", - beginByteOffset, content.getSize() - 1)); - } - - if (endByteOffset > content.getSize() - 1) { - throw new IllegalArgumentException( - NbBundle.getMessage(this.getClass(), "TagsManager.addContentTag.exception.endByteOffsetOOR.msg", - endByteOffset, content.getSize() - 1)); - } - - if (endByteOffset < beginByteOffset) { - throw new IllegalArgumentException( - NbBundle.getMessage(this.getClass(), "TagsManager.addContentTag.exception.endLTbegin.msg")); - } - } - final ContentTag newContentTag = tskCase.addContentTag(content, tagName, comment, beginByteOffset, endByteOffset); try { - Case.getCurrentCase().notifyContentTagAdded(newContentTag); + Case.getCurrentCase().notifyContentTagAdded(tag); } catch (IllegalStateException ex) { - Logger.getLogger(TagsManager.class.getName()).log(Level.WARNING, NbBundle.getMessage(TagsManager.class, "TagsManager.addContentTag.noCaseWarning")); + logger.log(Level.SEVERE, NbBundle.getMessage(TagsManager.class, "TagsManager.addContentTag.noCaseWarning"), ex); } - return newContentTag; + return tag; } /** @@ -261,19 +257,19 @@ public class TagsManager implements Closeable { * * @param tag The tag to delete. * - * @throws TskCoreException + * @throws TskCoreException If there is an error deleting the tag from the + * case database. */ - public synchronized void deleteContentTag(ContentTag tag) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); + public void deleteContentTag(ContentTag tag) throws TskCoreException { + synchronized (this) { + lazyLoadExistingTagNames(); + caseDb.deleteContentTag(tag); } - tskCase.deleteContentTag(tag); try { Case.getCurrentCase().notifyContentTagDeleted(tag); - } catch (IllegalStateException e) { - Logger.getLogger(TagsManager.class.getName()).log(Level.WARNING, NbBundle.getMessage(TagsManager.class, "TagsManager.deleteContentTag.noCaseWarning")); + } catch (IllegalStateException ex) { + logger.log(Level.SEVERE, NbBundle.getMessage(TagsManager.class, "TagsManager.deleteContentTag.noCaseWarning"), ex); } } @@ -282,15 +278,12 @@ public class TagsManager implements Closeable { * * @return A list, possibly empty, of content tags. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tags from the + * case database. */ - public List getAllContentTags() throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getAllContentTags(); + public synchronized List getAllContentTags() throws TskCoreException { + lazyLoadExistingTagNames(); + return caseDb.getAllContentTags(); } /** @@ -300,15 +293,12 @@ public class TagsManager implements Closeable { * * @return A count of the content tags with the specified tag name. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tags count from + * the case database. */ public synchronized long getContentTagsCountByTagName(TagName tagName) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getContentTagsCountByTagName(tagName); + lazyLoadExistingTagNames(); + return caseDb.getContentTagsCountByTagName(tagName); } /** @@ -316,17 +306,14 @@ public class TagsManager implements Closeable { * * @param tagID The tag id of interest. * - * @return the content tag with the specified tag id. + * @return The content tag with the specified tag id. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tag from the + * case database. */ public synchronized ContentTag getContentTagByTagID(long tagID) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getContentTagByID(tagID); + lazyLoadExistingTagNames(); + return caseDb.getContentTagByID(tagID); } /** @@ -337,15 +324,12 @@ public class TagsManager implements Closeable { * @return A list, possibly empty, of the content tags with the specified * tag name. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tags from the + * case database. */ public synchronized List getContentTagsByTagName(TagName tagName) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getContentTagsByTagName(tagName); + lazyLoadExistingTagNames(); + return caseDb.getContentTagsByTagName(tagName); } /** @@ -356,15 +340,12 @@ public class TagsManager implements Closeable { * @return A list, possibly empty, of the tags that have been applied to the * artifact. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tags from the + * case database. */ public synchronized List getContentTagsByContent(Content content) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getContentTagsByContent(content); + lazyLoadExistingTagNames(); + return caseDb.getContentTagsByContent(content); } /** @@ -376,7 +357,8 @@ public class TagsManager implements Closeable { * @return A BlackboardArtifactTag data transfer object (DTO) representing * the new tag. * - * @throws TskCoreException + * @throws TskCoreException If there is an error adding the tag to the case + * database. */ public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName) throws TskCoreException { return addBlackboardArtifactTag(artifact, tagName, ""); @@ -392,21 +374,22 @@ public class TagsManager implements Closeable { * @return A BlackboardArtifactTag data transfer object (DTO) representing * the new tag. * - * @throws TskCoreException + * @throws TskCoreException If there is an error adding the tag to the case + * database. */ - public synchronized BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); + public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException { + BlackboardArtifactTag tag; + synchronized (this) { + lazyLoadExistingTagNames(); + tag = caseDb.addBlackboardArtifactTag(artifact, tagName, comment); } - BlackboardArtifactTag addBlackboardArtifactTag = tskCase.addBlackboardArtifactTag(artifact, tagName, comment); try { - Case.getCurrentCase().notifyBlackBoardArtifactTagAdded(addBlackboardArtifactTag); - } catch (IllegalStateException e) { - Logger.getLogger(TagsManager.class.getName()).log(Level.WARNING, NbBundle.getMessage(TagsManager.class, "TagsManager.addBlackboardArtifactTag.noCaseWarning")); + Case.getCurrentCase().notifyBlackBoardArtifactTagAdded(tag); + } catch (IllegalStateException ex) { + logger.log(Level.SEVERE, NbBundle.getMessage(TagsManager.class, "TagsManager.addBlackboardArtifactTag.noCaseWarning"), ex); } - return addBlackboardArtifactTag; + return tag; } /** @@ -414,19 +397,19 @@ public class TagsManager implements Closeable { * * @param tag The tag to delete. * - * @throws TskCoreException + * @throws TskCoreException If there is an error deleting the tag from the + * case database. */ - public synchronized void deleteBlackboardArtifactTag(BlackboardArtifactTag tag) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); + public void deleteBlackboardArtifactTag(BlackboardArtifactTag tag) throws TskCoreException { + synchronized (this) { + lazyLoadExistingTagNames(); + caseDb.deleteBlackboardArtifactTag(tag); } - tskCase.deleteBlackboardArtifactTag(tag); try { Case.getCurrentCase().notifyBlackBoardArtifactTagDeleted(tag); - } catch (IllegalStateException e) { - Logger.getLogger(TagsManager.class.getName()).log(Level.WARNING, NbBundle.getMessage(TagsManager.class, "TagsManager.deleteBlackboardArtifactTag.noCaseWarning")); + } catch (IllegalStateException ex) { + logger.log(Level.WARNING, NbBundle.getMessage(TagsManager.class, "TagsManager.deleteBlackboardArtifactTag.noCaseWarning"), ex); } } @@ -435,15 +418,12 @@ public class TagsManager implements Closeable { * * @return A list, possibly empty, of blackboard artifact tags. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tags from the + * case database. */ - public List getAllBlackboardArtifactTags() throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getAllBlackboardArtifactTags(); + public synchronized List getAllBlackboardArtifactTags() throws TskCoreException { + lazyLoadExistingTagNames(); + return caseDb.getAllBlackboardArtifactTags(); } /** @@ -454,15 +434,12 @@ public class TagsManager implements Closeable { * @return A count of the blackboard artifact tags with the specified tag * name. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tags count from + * the case database. */ public synchronized long getBlackboardArtifactTagsCountByTagName(TagName tagName) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getBlackboardArtifactTagsCountByTagName(tagName); + lazyLoadExistingTagNames(); + return caseDb.getBlackboardArtifactTagsCountByTagName(tagName); } /** @@ -472,15 +449,12 @@ public class TagsManager implements Closeable { * * @return the blackboard artifact tag with the specified tag id. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tag from the + * case database. */ public synchronized BlackboardArtifactTag getBlackboardArtifactTagByTagID(long tagID) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getBlackboardArtifactTagByID(tagID); + lazyLoadExistingTagNames(); + return caseDb.getBlackboardArtifactTagByID(tagID); } /** @@ -491,15 +465,12 @@ public class TagsManager implements Closeable { * @return A list, possibly empty, of the blackboard artifact tags with the * specified tag name. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tags from the + * case database. */ public synchronized List getBlackboardArtifactTagsByTagName(TagName tagName) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getBlackboardArtifactTagsByTagName(tagName); + lazyLoadExistingTagNames(); + return caseDb.getBlackboardArtifactTagsByTagName(tagName); } /** @@ -510,33 +481,43 @@ public class TagsManager implements Closeable { * @return A list, possibly empty, of the tags that have been applied to the * artifact. * - * @throws TskCoreException + * @throws TskCoreException If there is an error getting the tags from the + * case database. */ public synchronized List getBlackboardArtifactTagsByArtifact(BlackboardArtifact artifact) throws TskCoreException { - // @@@ This is a work around to be removed when database access on the EDT is correctly synchronized. - if (!tagNamesInitialized) { - getExistingTagNames(); - } - - return tskCase.getBlackboardArtifactTagsByArtifact(artifact); + lazyLoadExistingTagNames(); + return caseDb.getBlackboardArtifactTagsByArtifact(artifact); } + /** + * Saves the avaialble tag names to secondary storage. + */ @Override - public void close() throws IOException { + public synchronized void close() throws IOException { saveTagNamesToTagsSettings(); } - private void getExistingTagNames() { - getTagNamesFromCurrentCase(); - getTagNamesFromTagsSettings(); - getPredefinedTagNames(); - saveTagNamesToTagsSettings(); - tagNamesInitialized = true; // @@@ This is part of a work around to be removed when database access on the EDT is correctly synchronized. + /** + * Populates the tag names collection and the tag names table in the case + * database with the existing tag names from all sources. + */ + private void lazyLoadExistingTagNames() { + if (!tagNamesLoaded) { + addTagNamesFromCurrentCase(); + addTagNamesFromTagsSettings(); + addPredefinedTagNames(); + saveTagNamesToTagsSettings(); + tagNamesLoaded = true; + } } - private void getTagNamesFromCurrentCase() { + /** + * Adds any tag names that are in the case database to the tag names + * collection. + */ + private void addTagNamesFromCurrentCase() { try { - List currentTagNames = tskCase.getAllTagNames(); + List currentTagNames = caseDb.getAllTagNames(); for (TagName tagName : currentTagNames) { uniqueTagNames.put(tagName.getDisplayName(), tagName); } @@ -545,7 +526,12 @@ public class TagsManager implements Closeable { } } - private void getTagNamesFromTagsSettings() { + /** + * Adds any tag names that are in the properties file to the tag names + * collection and to the case database. The properties file is used to make + * it possible to use tag names across cases. + */ + private void addTagNamesFromTagsSettings() { String setting = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY); if (null != setting && !setting.isEmpty()) { // Read the tag name setting and break it into tag name tuples. @@ -557,7 +543,7 @@ public class TagsManager implements Closeable { String[] tagNameAttributes = tagNameTuple.split(","); if (!uniqueTagNames.containsKey(tagNameAttributes[0])) { try { - TagName tagName = tskCase.addTagName(tagNameAttributes[0], tagNameAttributes[1], TagName.HTML_COLOR.getColorByName(tagNameAttributes[2])); + TagName tagName = caseDb.addTagName(tagNameAttributes[0], tagNameAttributes[1], TagName.HTML_COLOR.getColorByName(tagNameAttributes[2])); uniqueTagNames.put(tagName.getDisplayName(), tagName); } catch (TskCoreException ex) { Logger.getLogger(TagsManager.class.getName()).log(Level.SEVERE, "Failed to add saved tag name " + tagNameAttributes[0], ex); //NON-NLS @@ -567,18 +553,25 @@ public class TagsManager implements Closeable { } } - private void getPredefinedTagNames() { + /** + * Adds the standard tag names to the tag names collection. + */ + private void addPredefinedTagNames() { if (!uniqueTagNames.containsKey(NbBundle.getMessage(this.getClass(), "TagsManager.predefTagNames.bookmark.text"))) { try { - TagName tagName = tskCase.addTagName( + TagName tagName = caseDb.addTagName( NbBundle.getMessage(this.getClass(), "TagsManager.predefTagNames.bookmark.text"), "", TagName.HTML_COLOR.NONE); uniqueTagNames.put(tagName.getDisplayName(), tagName); } catch (TskCoreException ex) { - Logger.getLogger(TagsManager.class.getName()).log(Level.SEVERE, "Failed to add predefined 'Bookmark' tag name", ex); //NON-NLS + Logger.getLogger(TagsManager.class.getName()).log(Level.SEVERE, "Failed to add standard 'Bookmark' tag name to case database", ex); //NON-NLS } } } + /** + * Saves the tag names to a properties file. The properties file is used to + * make it possible to use tag names across cases. + */ private void saveTagNamesToTagsSettings() { if (!uniqueTagNames.isEmpty()) { StringBuilder setting = new StringBuilder(); @@ -593,4 +586,13 @@ public class TagsManager implements Closeable { ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, setting.toString()); } } + + /** + * Exception thrown if there is an attempt to add a duplicate tag name. + */ + public static class TagNameAlreadyExistsException extends Exception { + + private static final long serialVersionUID = 1L; + } + } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewVideoPanel.java b/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewVideoPanel.java index 7ceb31f697..a3dc773abb 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewVideoPanel.java +++ b/Core/src/org/sleuthkit/autopsy/corecomponents/MediaViewVideoPanel.java @@ -28,9 +28,7 @@ import java.util.TreeSet; import java.util.logging.Level; import javax.swing.JPanel; import org.sleuthkit.autopsy.coreutils.Logger; -import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector; import org.sleuthkit.datamodel.AbstractFile; -import org.sleuthkit.datamodel.TskCoreException; /** * Video viewer part of the Media View layered pane. Uses different engines @@ -133,23 +131,18 @@ public abstract class MediaViewVideoPanel extends JPanel implements FrameCapture @Override public boolean isSupported(AbstractFile file) { + /* + * TODO (AUT-2042): Is this the logic we want? + */ String extension = file.getNameExtension(); - //TODO: is this what we want, to require both extension and mimetype support? if (AUDIO_EXTENSIONS.contains("." + extension) || getExtensionsList().contains("." + extension)) { SortedSet mimeTypes = new TreeSet<>(getMimeTypes()); - try { - String mimeType = new FileTypeDetector().getFileType(file); - if (nonNull(mimeType)) { - return mimeTypes.contains(mimeType); - } - } catch (FileTypeDetector.FileTypeDetectorInitException | TskCoreException ex) { - logger.log(Level.WARNING, "Failed to look up mimetype for " + file.getName() + " using FileTypeDetector. Fallingback on AbstractFile.isMimeType", ex); - if (!mimeTypes.isEmpty() && file.isMimeType(mimeTypes) == AbstractFile.MimeMatchEnum.TRUE) { - return true; - } + String mimeType = file.getMIMEType(); + if (nonNull(mimeType)) { + return mimeTypes.contains(mimeType); + } else { + return getExtensionsList().contains("." + extension); } - - return getExtensionsList().contains("." + extension); } return false; } diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java index 4e627ea09d..f6e87d22e5 100755 --- a/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java +++ b/Core/src/org/sleuthkit/autopsy/coreutils/ImageUtils.java @@ -149,8 +149,8 @@ public class ImageUtils { /** * thread that saves generated thumbnails to disk in the background */ - private static final Executor imageSaver = - Executors.newSingleThreadExecutor(new BasicThreadFactory.Builder() + private static final Executor imageSaver + = Executors.newSingleThreadExecutor(new BasicThreadFactory.Builder() .namingPattern("icon saver-%d").build()); //NOI18N NON-NLS public static List getSupportedImageExtensions() { @@ -223,40 +223,19 @@ public class ImageUtils { } /** - * Does the image have a GIF mimetype. + * Checks the MIME type of a file to determine whether it is a GIF. If the + * MIME type is not known, checks for a "gif" extension. * - * @param file + * @param file The file to be checked. * - * @return true if the given file has a GIF mimetype + * @return True or false */ public static boolean isGIF(AbstractFile file) { - try { - final FileTypeDetector myFileTypeDetector = getFileTypeDetector(); - if (nonNull(myFileTypeDetector)) { - String fileType = myFileTypeDetector.getFileType(file); - return IMAGE_GIF_MIME.equalsIgnoreCase(fileType); - } - } catch (FileTypeDetectorInitException ex) { - LOGGER.log(Level.WARNING, "Failed to initialize FileTypeDetector.", ex); //NOI18N NON-NLS - } catch (TskCoreException ex) { - if (ex.getMessage().contains("An SQLException was provoked by the following failure: java.lang.InterruptedException")) { //NON-NLS - LOGGER.log(Level.WARNING, "Mime type look up with FileTypeDetector was interupted."); //NOI18N} NON-NLS - return "gif".equalsIgnoreCase(file.getNameExtension()); //NOI18N - } else { - LOGGER.log(Level.SEVERE, "Failed to get mime type of " + getContentPathSafe(file) + " with FileTypeDetector.", ex); //NOI18N} NON-NLS - } - } - LOGGER.log(Level.WARNING, "Falling back on direct mime type check for {0}.", getContentPathSafe(file)); //NOI18N NON-NLS - switch (file.isMimeType(GIF_MIME_SET)) { - - case TRUE: - return true; - case UNDEFINED: - LOGGER.log(Level.WARNING, "Falling back on extension check."); //NOI18N NON-NLS - return "gif".equalsIgnoreCase(file.getNameExtension()); //NOI18N - case FALSE: - default: - return false; + String mimeType = file.getMIMEType(); + if (nonNull(mimeType)) { + return IMAGE_GIF_MIME.equalsIgnoreCase(mimeType); + } else { + return "gif".equalsIgnoreCase(file.getNameExtension()); //NOI18N } } @@ -283,25 +262,15 @@ public class ImageUtils { if (file.getSize() == 0) { return false; } - final String extension = file.getNameExtension(); - try { - String mimeType = getFileTypeDetector().getFileType(file); - if (Objects.nonNull(mimeType)) { - return supportedMimeTypes.contains(mimeType) - || (conditionalMimes.contains(mimeType.toLowerCase()) && supportedExtension.contains(extension)); - } - } catch (FileTypeDetector.FileTypeDetectorInitException | TskCoreException ex) { - LOGGER.log(Level.WARNING, "Failed to look up mimetype for {0} using FileTypeDetector:{1}", new Object[]{getContentPathSafe(file), ex.toString()}); //NOI18N NON-NLS - LOGGER.log(Level.INFO, "Falling back on AbstractFile.isMimeType"); //NOI18N NON-NLS - AbstractFile.MimeMatchEnum mimeMatch = file.isMimeType(supportedMimeTypes); - if (mimeMatch == AbstractFile.MimeMatchEnum.TRUE) { - return true; - } else if (mimeMatch == AbstractFile.MimeMatchEnum.FALSE) { - return false; - } + String mimeType = file.getMIMEType(); + String extension = file.getNameExtension(); + if (nonNull(mimeType)) { + return supportedMimeTypes.contains(mimeType) + || (conditionalMimes.contains(mimeType.toLowerCase()) + && supportedExtension.contains(extension)); + } else { + return StringUtils.isNotBlank(extension) && supportedExtension.contains(extension); } - // if we have an extension, check it - return StringUtils.isNotBlank(extension) && supportedExtension.contains(extension); } /** @@ -934,7 +903,7 @@ public class ImageUtils { * * @return */ - static String getContentPathSafe(Content content) { + static String getContentPathSafe(Content content) { try { return content.getUniquePath(); } catch (TskCoreException tskCoreException) { diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java index 7101b3c023..afeacb9a46 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -286,25 +286,19 @@ public class BlackboardArtifactNode extends DisplayableItemNode { * are put * @param artifact to extract properties from */ - @SuppressWarnings("deprecation") // TODO: Remove this when TSK_TAGGED_ARTIFACT rows are removed in a database upgrade. + @SuppressWarnings("deprecation") private void fillPropertyMap(Map map, BlackboardArtifact artifact) { try { for (BlackboardAttribute attribute : artifact.getAttributes()) { - final int attributeTypeID = attribute.getAttributeTypeID(); + final int attributeTypeID = attribute.getAttributeType().getTypeID(); //skip some internal attributes that user shouldn't see if (attributeTypeID == ATTRIBUTE_TYPE.TSK_PATH_ID.getTypeID() || attributeTypeID == ATTRIBUTE_TYPE.TSK_TAGGED_ARTIFACT.getTypeID() || attributeTypeID == ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT.getTypeID() || attributeTypeID == ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID()) { - } else if (attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID() - || attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED.getTypeID() - || attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME_CREATED.getTypeID() - || attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME_MODIFIED.getTypeID() - || attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME_RCVD.getTypeID() - || attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME_SENT.getTypeID() - || attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME_START.getTypeID() - || attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME_END.getTypeID()) { - map.put(attribute.getAttributeTypeDisplayName(), ContentUtils.getStringTime(attribute.getValueLong(), associated)); + continue; + } else if (attribute.getAttributeType().getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) { + map.put(attribute.getAttributeType().getDisplayName(), ContentUtils.getStringTime(attribute.getValueLong(), associated)); } else if (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getTypeID() && attributeTypeID == ATTRIBUTE_TYPE.TSK_TEXT.getTypeID()) { /* @@ -318,9 +312,9 @@ public class BlackboardArtifactNode extends DisplayableItemNode { if (value.length() > 512) { value = value.substring(0, 512); } - map.put(attribute.getAttributeTypeDisplayName(), value); + map.put(attribute.getAttributeType().getDisplayName(), value); } else { - map.put(attribute.getAttributeTypeDisplayName(), attribute.getDisplayString()); + map.put(attribute.getAttributeType().getDisplayName(), attribute.getDisplayString()); } } } catch (TskException ex) { diff --git a/Core/src/org/sleuthkit/autopsy/events/MessageServiceConnectionInfo.java b/Core/src/org/sleuthkit/autopsy/events/MessageServiceConnectionInfo.java index 9db745b09b..f7cf28096d 100644 --- a/Core/src/org/sleuthkit/autopsy/events/MessageServiceConnectionInfo.java +++ b/Core/src/org/sleuthkit/autopsy/events/MessageServiceConnectionInfo.java @@ -144,7 +144,7 @@ public final class MessageServiceConnectionInfo { } catch (JMSException ex) { String result; Throwable cause = ex.getCause(); - if (cause != null) { + if (null != cause && null != cause.getMessage()) { // there is more information from another exception String msg = cause.getMessage(); if (msg.startsWith(CONNECTION_TIMED_OUT)) { diff --git a/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/Bundle.properties deleted file mode 100755 index fb927c8e40..0000000000 --- a/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/Bundle.properties +++ /dev/null @@ -1,2 +0,0 @@ -UserArtifactIngestModuleFactory.moduleName=Custom Artifact Adder -UserArtifactIngestModuleFactory.moduleDescription=Adds custom artifact types \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/Bundle_ja.properties deleted file mode 100644 index 990fd0aa8c..0000000000 --- a/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/Bundle_ja.properties +++ /dev/null @@ -1,2 +0,0 @@ -UserArtifactIngestModuleFactory.moduleName=\u30AB\u30B9\u30BF\u30E0\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u8FFD\u52A0\u30C4\u30FC\u30EB -UserArtifactIngestModuleFactory.moduleDescription=\u30AB\u30B9\u30BF\u30E0\u306E\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u30BF\u30A4\u30D7\u3092\u8FFD\u52A0 \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/UserArtifactIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/UserArtifactIngestModule.java deleted file mode 100755 index 5b510519ed..0000000000 --- a/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/UserArtifactIngestModule.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2011-2016 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.modules.UserArtifacts; - -import com.sun.media.jfxmedia.logging.Logger; -import java.util.List; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.casemodule.services.Blackboard.BlackboardException; -import org.sleuthkit.autopsy.casemodule.services.FileManager; -import org.sleuthkit.autopsy.ingest.DataSourceIngestModule; -import org.sleuthkit.autopsy.ingest.DataSourceIngestModuleProgress; -import org.sleuthkit.autopsy.ingest.IngestJobContext; -import org.sleuthkit.autopsy.ingest.IngestMessage; -import org.sleuthkit.autopsy.ingest.IngestServices; -import org.sleuthkit.datamodel.AbstractFile; -import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.BlackboardAttribute; -import org.sleuthkit.datamodel.BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE; -import org.sleuthkit.datamodel.Content; -import org.sleuthkit.datamodel.TskCoreException; - -/** - * Test module that creates new artifact and attribute types. - */ -public class UserArtifactIngestModule implements DataSourceIngestModule { - - private BlackboardArtifact.Type type1, type2; - - @Override - public ProcessResult process(Content dataSource, DataSourceIngestModuleProgress progressBar) { - progressBar.switchToDeterminate(2); - try { - FileManager manager = Case.getCurrentCase().getServices().getFileManager(); - List file1 = manager.findFiles("Sunset.jpg"); //NON-NLS - List file2 = manager.findFiles("Winter.jpg"); //NON-NLS - BlackboardArtifact art1; - BlackboardArtifact art2; - if (!file1.isEmpty()) { - art1 = file1.get(0).newArtifact(type1.getTypeID()); - } else { - art1 = dataSource.newArtifact(type1.getTypeID()); - } - if (!file2.isEmpty()) { - art2 = file2.get(0).newArtifact(type2.getTypeID()); - } else { - art2 = dataSource.newArtifact(type2.getTypeID()); - } - BlackboardAttribute.Type attributeType = Case.getCurrentCase().getServices().getBlackboard().addAttributeType("Test", TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.LONG, "2"); //NON-NLS - BlackboardAttribute.Type attributeType2 = Case.getCurrentCase().getServices().getBlackboard().addAttributeType("Test2", TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.BYTE, "3"); //NON-NLS - art1.addAttribute(new BlackboardAttribute(attributeType, - UserArtifactIngestModuleFactory.getModuleName(), -1L)); - progressBar.progress(1); - art2.addAttribute(new BlackboardAttribute(attributeType2, - UserArtifactIngestModuleFactory.getModuleName(), new byte[7])); - progressBar.progress(1); - IngestServices.getInstance().postMessage(IngestMessage.createDataMessage( - "name", // NON-NLS - UserArtifactIngestModuleFactory.getModuleName(), - "Test Results", //NON-NLS - "Test", //NON-NLS - art1)); - return ProcessResult.OK; - } catch (TskCoreException | BlackboardException ex) { - return ProcessResult.ERROR; - } - } - - @Override - public void startUp(IngestJobContext context) throws IngestModuleException { - try { - type1 = Case.getCurrentCase().getServices().getBlackboard().addArtifactType("This is", "a test"); //NON-NLS - type2 = Case.getCurrentCase().getServices().getBlackboard().addArtifactType("Another", "kinda test"); //NON-NLS - } catch (BlackboardException ex) { - Logger.logMsg(Logger.ERROR, "Startup failed"); //NON-NLS - } - } -} diff --git a/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/UserArtifactIngestModuleFactory.java b/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/UserArtifactIngestModuleFactory.java deleted file mode 100755 index b63d9f928a..0000000000 --- a/Core/src/org/sleuthkit/autopsy/modules/UserArtifacts/UserArtifactIngestModuleFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2011-2016 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.autopsy.modules.UserArtifacts; - -import org.openide.util.NbBundle; -import org.python.apache.xmlcommons.Version; -import org.sleuthkit.autopsy.ingest.DataSourceIngestModule; -import org.sleuthkit.autopsy.ingest.IngestModuleFactoryAdapter; -import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; - -/** - * Factory for test module that creates new artifact and attribute types. - */ -//@ServiceProvider(service = IngestModuleFactory.class) -public class UserArtifactIngestModuleFactory extends IngestModuleFactoryAdapter { - - static String getModuleName() { - return NbBundle.getMessage(UserArtifactIngestModuleFactory.class, "UserArtifactIngestModuleFactory.moduleName"); - } - - @Override - public String getModuleDisplayName() { - return getModuleName(); - } - - @Override - public String getModuleDescription() { - return NbBundle.getMessage(UserArtifactIngestModuleFactory.class, "UserArtifactIngestModuleFactory.moduleDescription"); - } - - @Override - public String getModuleVersionNumber() { - return Version.getVersion(); - } - - @Override - public DataSourceIngestModule createDataSourceIngestModule(IngestModuleIngestJobSettings ingestOptions) { - return new UserArtifactIngestModule(); - } - - @Override - public boolean isDataSourceIngestModuleFactory() { - return true; - } -} diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties index 06b5b5a44f..e2e029d495 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle.properties @@ -35,6 +35,7 @@ EmbeddedFileExtractorIngestModule.ImageExtractor.pptContainer.init.err=Ppt conta EmbeddedFileExtractorIngestModule.ImageExtractor.pptxContainer.init.err=Pptx container could not be initialized while reading: {0} EmbeddedFileExtractorIngestModule.ImageExtractor.xlsContainer.init.err=Xls container could not be initialized while reading: {0} EmbeddedFileExtractorIngestModule.ImageExtractor.xlsxContainer.init.err=Xlsx container could not be initialized while reading: {0} +EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err=Embedded File Extractor is unable to read content of {0} EmbeddedFileExtractorIngestModule.ImageExtractor.extractImage.addToDB.exception.msg=Unable to add the derived files to the database. EmbeddedFileExtractorIngestModule.ImageExtractor.getOutputFolderPath.exception.msg=Could not get path for image extraction from Abstract File\: {0} EmbeddedFileExtractorIngestModule.ImageExtractor.getOutputFolderPath.exception.msg=Could not get path for image extraction from Abstract File: {0} diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/ImageExtractor.java b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/ImageExtractor.java index c916aa7f55..cb601c62a7 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/ImageExtractor.java +++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/ImageExtractor.java @@ -25,7 +25,6 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; -import org.apache.poi.OldFileFormatException; import org.apache.poi.hslf.model.Picture; import org.apache.poi.hslf.usermodel.PictureData; import org.apache.poi.hslf.usermodel.SlideShow; @@ -210,13 +209,23 @@ class ImageExtractor { HWPFDocument doc = null; try { doc = new HWPFDocument(new ReadContentInputStream(af)); - } catch (Throwable ex) { + } catch (Throwable ignore) { // instantiating POI containers throw RuntimeExceptions logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.docContainer.init.err", af.getName())); //NON-NLS return null; } - PicturesTable pictureTable = doc.getPicturesTable(); - List listOfAllPictures = pictureTable.getAllPictures(); + + PicturesTable pictureTable = null; + List listOfAllPictures = null; + try { + pictureTable = doc.getPicturesTable(); + listOfAllPictures = pictureTable.getAllPictures(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } + String outputFolderPath; if (listOfAllPictures.isEmpty()) { return null; @@ -227,9 +236,17 @@ class ImageExtractor { return null; } listOfExtractedImages = new ArrayList<>(); + byte[] data = null; for (org.apache.poi.hwpf.usermodel.Picture picture : listOfAllPictures) { String fileName = picture.suggestFullFileName(); - writeExtractedImage(Paths.get(outputFolderPath, fileName).toString(), picture.getContent()); + try { + data = picture.getContent(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } + writeExtractedImage(Paths.get(outputFolderPath, fileName).toString(), data); // TODO Extract more info from the Picture viz ctime, crtime, atime, mtime listOfExtractedImages.add(new ExtractedImage(fileName, getFileRelativePath(fileName), picture.getSize(), af)); } @@ -250,12 +267,19 @@ class ImageExtractor { XWPFDocument docx = null; try { docx = new XWPFDocument(new ReadContentInputStream(af)); - } catch (Throwable ex) { + } catch (Throwable ignore) { // instantiating POI containers throw RuntimeExceptions logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.docxContainer.init.err", af.getName())); //NON-NLS return null; } - List listOfAllPictures = docx.getAllPictures(); + List listOfAllPictures = null; + try { + listOfAllPictures = docx.getAllPictures(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } // if no images are extracted from the PPT, return null, else initialize // the output folder for image extraction. @@ -270,9 +294,17 @@ class ImageExtractor { return null; } listOfExtractedImages = new ArrayList<>(); + byte[] data = null; for (XWPFPictureData xwpfPicture : listOfAllPictures) { String fileName = xwpfPicture.getFileName(); - writeExtractedImage(Paths.get(outputFolderPath, fileName).toString(), xwpfPicture.getData()); + try { + data = xwpfPicture.getData(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } + writeExtractedImage(Paths.get(outputFolderPath, fileName).toString(), data); listOfExtractedImages.add(new ExtractedImage(fileName, getFileRelativePath(fileName), xwpfPicture.getData().length, af)); } return listOfExtractedImages; @@ -291,14 +323,21 @@ class ImageExtractor { SlideShow ppt = null; try { ppt = new SlideShow(new ReadContentInputStream(af)); - } catch (Throwable ex) { + } catch (Throwable ignore) { // instantiating POI containers throw RuntimeExceptions logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.pptContainer.init.err", af.getName())); //NON-NLS return null; } //extract all pictures contained in the presentation - PictureData[] listOfAllPictures = ppt.getPictureData(); + PictureData[] listOfAllPictures = null; + try { + listOfAllPictures = ppt.getPictureData(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } // if no images are extracted from the PPT, return null, else initialize // the output folder for image extraction. @@ -317,6 +356,7 @@ class ImageExtractor { // extraction path - outputFolder/image_number.ext int i = 0; listOfExtractedImages = new ArrayList<>(); + byte[] data = null; for (PictureData pictureData : listOfAllPictures) { // Get image extension, generate image name, write image to the module @@ -343,7 +383,14 @@ class ImageExtractor { continue; } String imageName = UNKNOWN_NAME_PREFIX + i + ext; //NON-NLS - writeExtractedImage(Paths.get(outputFolderPath, imageName).toString(), pictureData.getData()); + try { + data = pictureData.getData(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } + writeExtractedImage(Paths.get(outputFolderPath, imageName).toString(), data); listOfExtractedImages.add(new ExtractedImage(imageName, getFileRelativePath(imageName), pictureData.getData().length, af)); i++; } @@ -363,12 +410,19 @@ class ImageExtractor { XMLSlideShow pptx; try { pptx = new XMLSlideShow(new ReadContentInputStream(af)); - } catch (Throwable ex) { + } catch (Throwable ignore) { // instantiating POI containers throw RuntimeExceptions logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.pptxContainer.init.err", af.getName())); //NON-NLS return null; } - List listOfAllPictures = pptx.getAllPictures(); + List listOfAllPictures = null; + try { + listOfAllPictures = pptx.getAllPictures(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } // if no images are extracted from the PPT, return null, else initialize // the output folder for image extraction. @@ -384,12 +438,20 @@ class ImageExtractor { } listOfExtractedImages = new ArrayList<>(); + byte[] data = null; for (XSLFPictureData xslsPicture : listOfAllPictures) { // get image file name, write it to the module outputFolder, and add // it to the listOfExtractedImageAbstractFiles. String fileName = xslsPicture.getFileName(); - writeExtractedImage(Paths.get(outputFolderPath, fileName).toString(), xslsPicture.getData()); + try { + data = xslsPicture.getData(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } + writeExtractedImage(Paths.get(outputFolderPath, fileName).toString(), data); listOfExtractedImages.add(new ExtractedImage(fileName, getFileRelativePath(fileName), xslsPicture.getData().length, af)); } @@ -412,13 +474,21 @@ class ImageExtractor { Workbook xls; try { xls = new HSSFWorkbook(new ReadContentInputStream(af)); - } catch (Throwable ex) { + } catch (Throwable ignore) { // instantiating POI containers throw RuntimeExceptions - logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.xlsContainer.init.err", af.getName()) + af.getName()); //NON-NLS + logger.log(Level.WARNING, "{0}{1}", new Object[]{NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.xlsContainer.init.err", af.getName()), af.getName()}); //NON-NLS return null; } - List listOfAllPictures = xls.getAllPictures(); + List listOfAllPictures = null; + try { + listOfAllPictures = xls.getAllPictures(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } + // if no images are extracted from the PPT, return null, else initialize // the output folder for image extraction. String outputFolderPath; @@ -434,9 +504,17 @@ class ImageExtractor { int i = 0; listOfExtractedImages = new ArrayList<>(); + byte[] data = null; for (org.apache.poi.ss.usermodel.PictureData pictureData : listOfAllPictures) { String imageName = UNKNOWN_NAME_PREFIX + i + "." + pictureData.suggestFileExtension(); //NON-NLS - writeExtractedImage(Paths.get(outputFolderPath, imageName).toString(), pictureData.getData()); + try { + data = pictureData.getData(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } + writeExtractedImage(Paths.get(outputFolderPath, imageName).toString(), data); listOfExtractedImages.add(new ExtractedImage(imageName, getFileRelativePath(imageName), pictureData.getData().length, af)); i++; } @@ -457,13 +535,21 @@ class ImageExtractor { Workbook xlsx; try { xlsx = new XSSFWorkbook(new ReadContentInputStream(af)); - } catch (Throwable ex) { + } catch (Throwable ignore) { // instantiating POI containers throw RuntimeExceptions logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.xlsxContainer.init.err", af.getName())); //NON-NLS return null; } - List listOfAllPictures = xlsx.getAllPictures(); + List listOfAllPictures = null; + try { + listOfAllPictures = xlsx.getAllPictures(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } + // if no images are extracted from the PPT, return null, else initialize // the output folder for image extraction. String outputFolderPath; @@ -479,9 +565,17 @@ class ImageExtractor { int i = 0; listOfExtractedImages = new ArrayList<>(); + byte[] data = null; for (org.apache.poi.ss.usermodel.PictureData pictureData : listOfAllPictures) { String imageName = UNKNOWN_NAME_PREFIX + i + "." + pictureData.suggestFileExtension(); - writeExtractedImage(Paths.get(outputFolderPath, imageName).toString(), pictureData.getData()); + try { + data = pictureData.getData(); + } catch (Exception ignore) { + // log internal Java and Apache errors as WARNING + logger.log(Level.WARNING, NbBundle.getMessage(this.getClass(), "EmbeddedFileExtractorIngestModule.ImageExtractor.processing.err", af.getName())); //NON-NLS + return null; + } + writeExtractedImage(Paths.get(outputFolderPath, imageName).toString(), data); listOfExtractedImages.add(new ExtractedImage(imageName, getFileRelativePath(imageName), pictureData.getData().length, af)); i++; } diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties index 7c63074fbe..c85ead90b1 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle.properties @@ -4,7 +4,6 @@ OptionsCategory_FileExtMismatch=File Extension Mismatch AddFileExtensionAction.msgDlg.msg=Writing XML configuration file failed. AddFileExtensionAction.msgDlg.title=Add Mismatch Extension Error AddFileExtensionAction.extHeaderLbl.text=Allowed Extensions for -FileExtMismatchConfigPanel.name.text=Advanced File Extension Mismatch Configuration FileExtMismatchConfigPanel.addExtButton.errLabel.empty=Extension text is empty\! FileExtMismatchConfigPanel.addExtButton.errLabel.noMimeType=No MIME type selected\! FileExtMismatchConfigPanel.addExtButton.errLabel.extExists=Extension already exists\! @@ -52,3 +51,4 @@ FileExtMismatchSettingsPanel.removeExtButton.text=Remove Selected Extension FileExtMismatchSettingsPanel.userTypeTextField.text= FileExtMismatchDetectorModuleFactory.getIngestJobSettingsPanel.exception.msg=Expected settings argument to be instanceof FileExtMismatchDetectorModuleSettings FileExtMismatchDetectorModuleFactory.createFileIngestModule.exception.msg=Expected settings argument to be instanceof FileExtMismatchDetectorModuleSettings +FileExtMismatchModuleSettingsPanel.skipKnownFiles.text=Skip known files diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties index 06cbd4336f..82aa0220c3 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties @@ -1,47 +1,46 @@ -OpenIDE-Module-Name=\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u5B50\u4E0D\u4E00\u81F4 -OptionsCategory_Name_FileExtMismatchOptions=\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u5B50\u4E0D\u4E00\u81F4 -OptionsCategory_FileExtMismatch=\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u5B50\u4E0D\u4E00\u81F4 -AddFileExtensionAction.msgDlg.msg=XML\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304F\u306E\u3092\u5931\u6557\u3057\u307E\u3057\u305F\u3002 -AddFileExtensionAction.msgDlg.title=\u4E0D\u4E00\u81F4\u62E1\u5F35\u5B50\u306E\u30A8\u30E9\u30FC\u3092\u8FFD\u52A0 -FileExtMismatchConfigPanel.name.text=\u30A2\u30C9\u30D0\u30F3\u30B9\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u5B50\u4E0D\u4E00\u81F4\u306E\u8A2D\u5B9A -FileExtMismatchConfigPanel.addExtButton.errLabel.empty=\u62E1\u5F35\u5B50\u30C6\u30AD\u30B9\u30C8\u304C\u7A7A\u767D\u3067\u3059\uFF01 -FileExtMismatchConfigPanel.addExtButton.errLabel.noMimeType=MIME\u30BF\u30A4\u30D7\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF01 -FileExtMismatchConfigPanel.addExtButton.errLabel.extExists=\u62E1\u5F35\u5B50\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059\uFF01 -FileExtMismatchConfigPanel.addExtButton.errLabel.extAdded=\u62E1\u5F35\u5B50{0}\u304C\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\u3002 -FileExtMismatchConfigPanel.addTypeButton.empty=MIME\u30BF\u30A4\u30D7\u30C6\u30AD\u30B9\u30C8\u304C\u7A7A\u767D\u3067\u3059\uFF01 -FileExtMismatchConfigPanel.addTypeButton.mimeTypeNotSupported=MIME\u30BF\u30A4\u30D7\u304C\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF01 -FileExtMismatchConfigPanel.addTypeButton.mimeTypeExists=MIME\u30BF\u30A4\u30D7\u304C\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059\uFF01 -FileExtMismatchConfigPanel.addTypeButton.mimeTypeNotDetectable=MIME\u30BF\u30A4\u30D7\u304C\u3053\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u3067\u306F\u691C\u51FA\u3067\u304D\u307E\u305B\u3093\u3002 -FileExtMismatchConfigPanel.addTypeButton.mimeTypeAdded=MIME\u30BF\u30A4\u30D7{0}\u304C\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\u3002 -FileExtMismatchConfigPanel.removeTypeButton.noneSelected=MIME\u30BF\u30A4\u30D7\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF01 -FileExtMismatchConfigPanel.remoteTypeButton.deleted=MIME\u30BF\u30A4\u30D7{0}\u304C\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002 -FileExtMismatchConfigPanel.removeExtButton.noneSelected=\u62E1\u5F35\u5B50\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF01 -FileExtMismatchConfigPanel.removeExtButton.noMimeTypeSelected=MIME\u30BF\u30A4\u30D7\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF01 -FileExtMismatchConfigPanel.removeExtButton.deleted=\u62E1\u5F35\u5B50{0}\u304C\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002 -FileExtMismatchConfigPanel.store.msg=\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F\u3002 -FileExtMismatchConfigPanel.store.msgDlg.msg=XML\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304F\u306E\u3092\u5931\u6557\u3057\u307E\u3057\u305F\u3002 -FileExtMismatchConfigPanel.save.msgDlg.title=\u4FDD\u5B58\u30A8\u30E9\u30FC -FileExtMismatchConfigPanel.ok.confDlg.msg=\u8A2D\u5B9A\u5909\u66F4\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F -FileExtMismatchConfigPanel.confDlg.title=\u4FDD\u5B58\u3055\u308C\u3066\u3044\u306A\u3044\u5909\u66F4 -FileExtMismatchConfigPanel.mimeTableModel.colName=MIME\u30BF\u30A4\u30D7 -FileExtMismatchConfigPanel.extTableModel.colName=\u62E1\u5F35\u5B50 -FileExtMismatchContextMenuActionsProvider.menuItemStr=\u62E1\u5F35\u5B50{0}\u3092MIME\u30BF\u30A4\u30D7{1}\u306E\u4E00\u81F4\u3068\u3057\u3066\u8FFD\u52A0 -FileExtMismatchIngestModule.moduleName=\u62E1\u5F35\u5B50\u4E0D\u4E00\u81F4\u30C7\u30A3\u30C6\u30AF\u30BF\u30FC -FileExtMismatchIngestModule.moduleDesc.text=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u306B\u57FA\u3065\u3044\u3066\u3001\u6A19\u6E96\u7684\u3067\u306F\u306A\u3044\u62E1\u5F35\u5B50\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u30D5\u30E9\u30B0\u3057\u307E\u3059\u3002d -FileExtMismatchIngestModule.complete.totalProcTime=\u5408\u8A08\u51E6\u7406\u6642\u9593 -FileExtMismatchIngestModule.complete.totalFiles=\u5408\u8A08\u51E6\u7406\u30D5\u30A1\u30A4\u30EB\u6570 -FileExtMismatchIngestModule.complete.svcMsg.text=\u30D5\u30A1\u30A4\u30EB\u62E1\u5F35\u5B50\u4E0D\u4E00\u81F4\u7D50\u679C -FileExtMismatchOptionsPanelController.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -FileExtMismatchOptionsPanelController.moduleErr.msg=FileExtMismatchOptionsPanelController\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u306E\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -AddFileExtensionAction.extHeaderLbl.text=\u4E0B\u8A18\u7528\u306B\u8A31\u53EF\u3059\u308B\u62E1\u5F35\u5B50 -FileExtMismatchModuleSettingsPanel.skipTextPlain.text=\u30C6\u30AD\u30B9\u30C8\u30D5\u30A1\u30A4\u30EB\u3092\u30B9\u30AD\u30C3\u30D7 -FileExtMismatchModuleSettingsPanel.skipNoExtCheckBox.text=\u62E1\u5F35\u5B50\u306E\u7121\u3044\u30D5\u30A1\u30A4\u30EB\u3092\u30B9\u30AD\u30C3\u30D7 -FileExtMismatchSettingsPanel.addTypeButton.text=\u30BF\u30A4\u30D7\u3092\u8FFD\u52A0 -FileExtMismatchSettingsPanel.extHeaderLabel.text=\u8A31\u53EF\u3059\u308B\u62E1\u5F35\u5B50\uFF1A -FileExtMismatchSettingsPanel.removeTypeButton.text=\u9078\u629E\u3057\u305F\u30BF\u30A4\u30D7\u3092\u524A\u9664 -FileExtMismatchSettingsPanel.saveButton.text=\u8A2D\u5B9A\u3092\u4FDD\u5B58 -FileExtMismatchSettingsPanel.jLabel1.text=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\uFF1A -FileExtMismatchSettingsPanel.addExtButton.text=\u62E1\u5F35\u5B50\u3092\u8FFD\u52A0 -FileExtMismatchSettingsPanel.removeExtButton.text=\u9078\u629E\u3057\u305F\u62E1\u5F35\u5B50\u3092\u524A\u9664 -FileExtMismatchDetectorModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof FileExtMismatchDetectorModuleSettings\u3067\u3059\u3002 -FileExtMismatchDetectorModuleFactory.createFileIngestModule.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof FileExtMismatchDetectorModuleSettings\u3067\u3059\u3002 +OpenIDE-Module-Name=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4 +OptionsCategory_Name_FileExtMismatchOptions=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4 +OptionsCategory_FileExtMismatch=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4 +AddFileExtensionAction.msgDlg.msg=XML\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304f\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f\u3002 +AddFileExtensionAction.msgDlg.title=\u4e0d\u4e00\u81f4\u62e1\u5f35\u5b50\u306e\u30a8\u30e9\u30fc\u3092\u8ffd\u52a0 +FileExtMismatchConfigPanel.addExtButton.errLabel.empty=\u62e1\u5f35\u5b50\u30c6\u30ad\u30b9\u30c8\u304c\u7a7a\u767d\u3067\u3059\uff01 +FileExtMismatchConfigPanel.addExtButton.errLabel.noMimeType=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01 +FileExtMismatchConfigPanel.addExtButton.errLabel.extExists=\u62e1\u5f35\u5b50\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\uff01 +FileExtMismatchConfigPanel.addExtButton.errLabel.extAdded=\u62e1\u5f35\u5b50{0}\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 +FileExtMismatchConfigPanel.addTypeButton.empty=MIME\u30bf\u30a4\u30d7\u30c6\u30ad\u30b9\u30c8\u304c\u7a7a\u767d\u3067\u3059\uff01 +FileExtMismatchConfigPanel.addTypeButton.mimeTypeNotSupported=MIME\u30bf\u30a4\u30d7\u304c\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01 +FileExtMismatchConfigPanel.addTypeButton.mimeTypeExists=MIME\u30bf\u30a4\u30d7\u304c\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\uff01 +FileExtMismatchConfigPanel.addTypeButton.mimeTypeNotDetectable=MIME\u30bf\u30a4\u30d7\u304c\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u306f\u691c\u51fa\u3067\u304d\u307e\u305b\u3093\u3002 +FileExtMismatchConfigPanel.addTypeButton.mimeTypeAdded=MIME\u30bf\u30a4\u30d7{0}\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 +FileExtMismatchConfigPanel.removeTypeButton.noneSelected=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01 +FileExtMismatchConfigPanel.remoteTypeButton.deleted=MIME\u30bf\u30a4\u30d7{0}\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +FileExtMismatchConfigPanel.removeExtButton.noneSelected=\u62e1\u5f35\u5b50\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01 +FileExtMismatchConfigPanel.removeExtButton.noMimeTypeSelected=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01 +FileExtMismatchConfigPanel.removeExtButton.deleted=\u62e1\u5f35\u5b50{0}\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 +FileExtMismatchConfigPanel.store.msg=\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002 +FileExtMismatchConfigPanel.store.msgDlg.msg=XML\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304f\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f\u3002 +FileExtMismatchConfigPanel.save.msgDlg.title=\u4fdd\u5b58\u30a8\u30e9\u30fc +FileExtMismatchConfigPanel.ok.confDlg.msg=\u8a2d\u5b9a\u5909\u66f4\u3092\u4fdd\u5b58\u3057\u307e\u3059\u304b\uff1f +FileExtMismatchConfigPanel.confDlg.title=\u4fdd\u5b58\u3055\u308c\u3066\u3044\u306a\u3044\u5909\u66f4 +FileExtMismatchConfigPanel.mimeTableModel.colName=MIME\u30bf\u30a4\u30d7 +FileExtMismatchConfigPanel.extTableModel.colName=\u62e1\u5f35\u5b50 +FileExtMismatchContextMenuActionsProvider.menuItemStr=\u62e1\u5f35\u5b50{0}\u3092MIME\u30bf\u30a4\u30d7{1}\u306e\u4e00\u81f4\u3068\u3057\u3066\u8ffd\u52a0 +FileExtMismatchIngestModule.moduleName=\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4\u30c7\u30a3\u30c6\u30af\u30bf\u30fc +FileExtMismatchIngestModule.moduleDesc.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306b\u57fa\u3065\u3044\u3066\u3001\u6a19\u6e96\u7684\u3067\u306f\u306a\u3044\u62e1\u5f35\u5b50\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u30d5\u30e9\u30b0\u3057\u307e\u3059\u3002d +FileExtMismatchIngestModule.complete.totalProcTime=\u5408\u8a08\u51e6\u7406\u6642\u9593 +FileExtMismatchIngestModule.complete.totalFiles=\u5408\u8a08\u51e6\u7406\u30d5\u30a1\u30a4\u30eb\u6570 +FileExtMismatchIngestModule.complete.svcMsg.text=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4\u7d50\u679c +FileExtMismatchOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +FileExtMismatchOptionsPanelController.moduleErr.msg=FileExtMismatchOptionsPanelController\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u306e\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +AddFileExtensionAction.extHeaderLbl.text=\u4e0b\u8a18\u7528\u306b\u8a31\u53ef\u3059\u308b\u62e1\u5f35\u5b50 +FileExtMismatchModuleSettingsPanel.skipTextPlain.text=\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u30b9\u30ad\u30c3\u30d7 +FileExtMismatchModuleSettingsPanel.skipNoExtCheckBox.text=\u62e1\u5f35\u5b50\u306e\u7121\u3044\u30d5\u30a1\u30a4\u30eb\u3092\u30b9\u30ad\u30c3\u30d7 +FileExtMismatchSettingsPanel.addTypeButton.text=\u30bf\u30a4\u30d7\u3092\u8ffd\u52a0 +FileExtMismatchSettingsPanel.extHeaderLabel.text=\u8a31\u53ef\u3059\u308b\u62e1\u5f35\u5b50\uff1a +FileExtMismatchSettingsPanel.removeTypeButton.text=\u9078\u629e\u3057\u305f\u30bf\u30a4\u30d7\u3092\u524a\u9664 +FileExtMismatchSettingsPanel.saveButton.text=\u8a2d\u5b9a\u3092\u4fdd\u5b58 +FileExtMismatchSettingsPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\uff1a +FileExtMismatchSettingsPanel.addExtButton.text=\u62e1\u5f35\u5b50\u3092\u8ffd\u52a0 +FileExtMismatchSettingsPanel.removeExtButton.text=\u9078\u629e\u3057\u305f\u62e1\u5f35\u5b50\u3092\u524a\u9664 +FileExtMismatchDetectorModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof FileExtMismatchDetectorModuleSettings\u3067\u3059\u3002 +FileExtMismatchDetectorModuleFactory.createFileIngestModule.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof FileExtMismatchDetectorModuleSettings\u3067\u3059\u3002 diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java index 22074222a5..0efbd24db8 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchDetectorModuleSettings.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2014 Basis Technology Corp. + * Copyright 2011-2016 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.modules.fileextmismatch; +import java.io.IOException; +import java.io.ObjectInputStream; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; /** @@ -26,15 +28,21 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; final class FileExtMismatchDetectorModuleSettings implements IngestModuleIngestJobSettings { private static final long serialVersionUID = 1L; - private boolean skipFilesWithNoExtension = true; - private boolean skipFilesWithTextPlainMimeType = true; + private long versionNumber; + private boolean skipFilesWithNoExtension; + private boolean skipFilesWithTextPlainMimeType; + private boolean skipKnownFiles; FileExtMismatchDetectorModuleSettings() { + this.skipFilesWithNoExtension = true; + this.skipFilesWithTextPlainMimeType = true; + this.skipKnownFiles = true; } FileExtMismatchDetectorModuleSettings(boolean skipKnownFiles, boolean skipFilesWithNoExtension, boolean skipFilesWithTextPlainMimeType) { this.skipFilesWithNoExtension = skipFilesWithNoExtension; this.skipFilesWithTextPlainMimeType = skipFilesWithTextPlainMimeType; + this.skipKnownFiles = skipKnownFiles; } @Override @@ -42,19 +50,41 @@ final class FileExtMismatchDetectorModuleSettings implements IngestModuleIngestJ return serialVersionUID; } - void setSkipFilesWithNoExtension(boolean enabled) { - skipFilesWithNoExtension = enabled; + void setSkipFilesWithNoExtension(boolean skipFilesWithNoExtension) { + this.skipFilesWithNoExtension = skipFilesWithNoExtension; } boolean skipFilesWithNoExtension() { return skipFilesWithNoExtension; } - void setSkipFilesWithTextPlainMimeType(boolean enabled) { - skipFilesWithTextPlainMimeType = enabled; + void setSkipFilesWithTextPlainMimeType(boolean skipFilesWithTextPlainMimeType) { + this.skipFilesWithTextPlainMimeType = skipFilesWithTextPlainMimeType; } boolean skipFilesWithTextPlainMimeType() { return skipFilesWithTextPlainMimeType; } + + boolean skipKnownFiles() { + return skipKnownFiles; + } + + void setSkipKnownFiles(boolean skipKnownFiles) { + this.skipKnownFiles = skipKnownFiles; + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + if (0L == versionNumber) { + /* + * If the version number is set to the Java field default value of + * zero, then skipKnownFiles is a new field. Change this to the + * desired default value of true. + */ + skipKnownFiles = true; + } + versionNumber = 1; + } + } diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java index c579c69014..a3b54e8d41 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchIngestModule.java @@ -40,6 +40,7 @@ import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; +import org.sleuthkit.datamodel.TskData.FileKnown; import org.sleuthkit.datamodel.TskException; /** @@ -103,6 +104,9 @@ public class FileExtMismatchIngestModule implements FileIngestModule { @Override public ProcessResult process(AbstractFile abstractFile) { blackboard = Case.getCurrentCase().getServices().getBlackboard(); + if(this.settings.skipKnownFiles() && (abstractFile.getKnown() == FileKnown.KNOWN)) { + return ProcessResult.OK; + } // skip non-files if ((abstractFile.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS) diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.form index be70dbe504..4974e318bd 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.form @@ -21,6 +21,7 @@ + @@ -32,7 +33,9 @@ - + + + @@ -62,5 +65,16 @@ + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.java index de619e3510..4ecde417ce 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchModuleSettingsPanel.java @@ -38,6 +38,7 @@ final class FileExtMismatchModuleSettingsPanel extends IngestModuleIngestJobSett private void customizeComponents() { skipNoExtCheckBox.setSelected(settings.skipFilesWithNoExtension()); skipTextPlain.setSelected(settings.skipFilesWithTextPlainMimeType()); + skipKnownFiles.setSelected(settings.skipKnownFiles()); } @Override @@ -56,6 +57,7 @@ final class FileExtMismatchModuleSettingsPanel extends IngestModuleIngestJobSett skipNoExtCheckBox = new javax.swing.JCheckBox(); skipTextPlain = new javax.swing.JCheckBox(); + skipKnownFiles = new javax.swing.JCheckBox(); skipNoExtCheckBox.setSelected(true); skipNoExtCheckBox.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchModuleSettingsPanel.class, "FileExtMismatchModuleSettingsPanel.skipNoExtCheckBox.text")); // NOI18N @@ -73,6 +75,14 @@ final class FileExtMismatchModuleSettingsPanel extends IngestModuleIngestJobSett } }); + skipKnownFiles.setSelected(true); + skipKnownFiles.setText(org.openide.util.NbBundle.getMessage(FileExtMismatchModuleSettingsPanel.class, "FileExtMismatchModuleSettingsPanel.skipKnownFiles.text")); // NOI18N + skipKnownFiles.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + skipKnownFilesActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -81,7 +91,8 @@ final class FileExtMismatchModuleSettingsPanel extends IngestModuleIngestJobSett .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(skipTextPlain) - .addComponent(skipNoExtCheckBox)) + .addComponent(skipNoExtCheckBox) + .addComponent(skipKnownFiles)) .addGap(0, 138, Short.MAX_VALUE)) ); layout.setVerticalGroup( @@ -90,7 +101,9 @@ final class FileExtMismatchModuleSettingsPanel extends IngestModuleIngestJobSett .addComponent(skipNoExtCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(skipTextPlain) - .addContainerGap(51, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(skipKnownFiles) + .addContainerGap(28, Short.MAX_VALUE)) ); }// //GEN-END:initComponents @@ -102,7 +115,12 @@ final class FileExtMismatchModuleSettingsPanel extends IngestModuleIngestJobSett settings.setSkipFilesWithTextPlainMimeType(skipTextPlain.isSelected()); }//GEN-LAST:event_skipTextPlainActionPerformed + private void skipKnownFilesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_skipKnownFilesActionPerformed + settings.setSkipKnownFiles(skipKnownFiles.isSelected()); + }//GEN-LAST:event_skipKnownFilesActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox skipKnownFiles; private javax.swing.JCheckBox skipNoExtCheckBox; private javax.swing.JCheckBox skipTextPlain; // End of variables declaration//GEN-END:variables diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java index fa0a090fdc..1de79557bc 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/FileExtMismatchSettingsPanel.java @@ -69,8 +69,9 @@ final class FileExtMismatchSettingsPanel extends IngestModuleGlobalSettingsPanel customizeComponents(); } + @NbBundle.Messages({"FileExtMismatchSettingsPanel.Title=Global File Extension Mismatch Identification Settings"}) private void customizeComponents() { - setName(NbBundle.getMessage(this.getClass(), "FileExtMismatchConfigPanel.name.text")); + setName(Bundle.FileExtMismatchSettingsPanel_Title()); // Handle selections on the left table lsm = mimeTable.getSelectionModel(); diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties index bf6adc0de3..ccc1bd0aff 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle.properties @@ -44,9 +44,8 @@ FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text=Cannot make changes UserDefinedFileTypesManager.loadFileTypes.errorMessage=Failed to load existing file type definitions. UserDefinedFileTypesManager.saveFileTypes.errorMessage=Failed to save file type definitions. FileTypeIdGlobalSettingsPanel.newTypeButton.text=New -FileTypeIdGlobalSettingsPanel.jLabel1.text=Custom File Types -FileTypeIdGlobalSettingsPanel.jLabel2.text=MIME Types: +FileTypeIdGlobalSettingsPanel.jLabel2.text=Custom MIME Types: FileTypeIdGlobalSettingsPanel.jLabel3.text=Autopsy can automatically detect many file types. Add your custom file types here. FileTypeIdGlobalSettingsPanel.startUp.fileTypeDetectorInitializationException.msg=Error initializing the file type detector. FileTypeIdIngestModule.startUp.fileTypeDetectorInitializationException.msg=Error initializing the file type detector. -FileTypeIdGlobalSettingsPanel.offsetRelativeToLabel.text=Offset is relative to +FileTypeIdGlobalSettingsPanel.offsetRelativeToLabel.text=Offset is relative to diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties index dd67259dae..a5f9b02e62 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties @@ -1,47 +1,46 @@ -OpenIDE-Module-Name=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7ID -FileTypeIdIngestModule.moduleName.text=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u306E\u7279\u5B9A -FileTypeIdIngestModule.moduleDesc.text=\u30D0\u30A4\u30CA\u30EA\u30B7\u30B0\u30CD\u30C1\u30E3\u306B\u57FA\u3065\u3044\u3066\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u3092\u4E00\u81F4\u3057\u307E\u3059\u3002 -FileTypeIdIngestModule.complete.totalProcTime=\u5408\u8A08\u51E6\u7406\u6642\u9593 -FileTypeIdIngestModule.complete.totalFiles=\u5408\u8A08\u51E6\u7406\u30D5\u30A1\u30A4\u30EB\u6570 -FileTypeIdIngestModule.complete.srvMsg.text=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7ID\u306E\u7D50\u679C -FileTypeIdModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof FileTypeIdModuleSettings\u3067\u3059\u3002 -FileTypeIdModuleFactory.createFileIngestModule.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof FileTypeIdModuleSettings\u3067\u3059\u3002 -FileTypeIdIngestJobSettingsPanel.skipKnownCheckBox.toolTipText=\u65E2\u77E5\u306E\u30CF\u30C3\u30B7\u30E5\u5024\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u6570\u306B\u3088\u3063\u3066\u306F\u3001\u3053\u306E\u30DC\u30C3\u30AF\u30B9\u3092\u9078\u629E\u3059\u308B\u3053\u3068\u306B\u3088\u308A\u3001\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u306E\u7279\u5B9A\u3092\u52A0\u901F\u3057\u307E\u3059\u3002 -FileTypeIdIngestJobSettingsPanel.skipKnownCheckBox.text=\u65E2\u77E5\u30D5\u30A1\u30A4\u30EB\uFF08NSRL\uFF09\u3092\u30B9\u30AD\u30C3\u30D7 -FileTypeIdGlobalSettingsPanel.deleteTypeButton.text=\u524A\u9664 -FileTypeIdGlobalSettingsPanel.filesSetNameLabel.text=\u30BB\u30C3\u30C8\u540D -FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u5B9F\u884C\u4E2D\u306B\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u5B9A\u7FA9\u3092\u5909\u66F4\u3067\u304D\u307E\u305B\u3093\uFF01 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.title=\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u30BB\u30C3\u30C8\u540D\u304C\u6B20\u3051\u3066\u3044\u307E\u3059 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.message=MIME\u30BF\u30A4\u30D7\u304C\u5FC5\u8981\u3067\u3059\u3002 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.title=MIME\u30BF\u30A4\u30D7\u304C\u6B20\u3051\u3066\u3044\u307E\u3059 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.message=\u30AA\u30D5\u30BB\u30C3\u30C8\u306F\u6B63\u6574\u6570\u3067\u306A\u3051\u308C\u3070\u3044\u3051\u307E\u305B\u3093\u3002 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title=\u7121\u52B9\u306A\u30AA\u30D5\u30BB\u30C3\u30C8 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidRawSignatureBytes.message=\u3053\u306E\u30B7\u30B0\u30CD\u30C1\u30E3\u306B\u4E00\u3064\u4EE5\u4E0A\u306E\u7121\u52B9\u306A16\u9032\u6570\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.message=\u30B7\u30B0\u30CD\u30C1\u30E3\u304C\u5FC5\u8981\u3067\u3059\u3002 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.title=\u30B7\u30B0\u30CD\u30C1\u30E3\u304C\u6B20\u3051\u3066\u3044\u307E\u3059 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignatureBytes.title=\u30B7\u30B0\u30CD\u30C1\u30E3\u304C\u7121\u52B9\u3067\u3059 -FileTypeIdGlobalSettingsPanel.JOptionPane.loadFailed.title=\u8AAD\u307F\u8FBC\u307F\u304C\u5931\u6557\u3057\u307E\u3057\u305F -FileTypeIdGlobalSettingsPanel.JOptionPane.storeFailed.title=\u4FDD\u5B58\u304C\u5931\u6557\u3057\u307E\u3057\u305F -FileTypeIdGlobalSettingsPanel.mimeTypeLabel.text=MIME\u30BF\u30A4\u30D7 -FileTypeIdGlobalSettingsPanel.newTypeButton.text=\u65B0\u898F\u30BF\u30A4\u30D7 -FileTypeIdGlobalSettingsPanel.offsetLabel.text=\u30D0\u30A4\u30C8\u30AA\u30D5\u30BB\u30C3\u30C8 -FileTypeIdGlobalSettingsPanel.postHitCheckBox.text=\u767A\u898B\u3057\u305F\u969B\u306B\u300C\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u300D\u3068\u8B66\u544A -FileTypeIdGlobalSettingsPanel.saveTypeButton.text=\u4FDD\u5B58\u30BF\u30A4\u30D7 -FileTypeIdGlobalSettingsPanel.signatureComboBox.asciiItem=\u30B9\u30C8\u30EA\u30F3\u30B0\uFF08ASCII\uFF09 -FileTypeIdGlobalSettingsPanel.signatureComboBox.rawItem=\u30D0\u30A4\u30C8\uFF08HEX\uFF09 -FileTypeIdGlobalSettingsPanel.signatureLabel.text=\u30B7\u30B0\u30CD\u30C1\u30E3 -FileTypeIdGlobalSettingsPanel.signatureTypeLabel.text=\u30B7\u30B0\u30CD\u30C1\u30E3\u30BF\u30A4\u30D7 -OptionsCategory_Keywords_FileTypeId=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7ID -OptionsCategory_Name_FileTypeId=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7 -UserDefinedFileTypesManager.loadFileTypes.errorMessage=\u65E2\u5B58\u306E\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u5B9A\u7FA9\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F -UserDefinedFileTypesManager.saveFileTypes.errorMessage=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u5B9A\u7FA9\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.message=\u30A2\u30E9\u30FC\u30C8\u3092\u8A2D\u5B9A\u3059\u308B\u306B\u306F\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u30BB\u30C3\u30C8\u540D\u304C\u5FC5\u8981\u3067\u3059\u3002 -FileTypeIdGlobalSettingsPanel.offsetComboBox.startItem=\u958B\u59CB -FileTypeIdGlobalSettingsPanel.offsetComboBox.endItem=\u505C\u6B62 -FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.length=\u30AA\u30D5\u30BB\u30C3\u30C8\u306F\u30B7\u30B0\u30CD\u30C1\u30E3\u30B5\u30A4\u30BA\u3088\u308A\u5C0F\u3055\u304F\u3066\u306F\u3044\u3051\u307E\u305B\u3093\u3002 -FileTypeIdGlobalSettingsPanel.jLabel1.text=\u30AB\u30B9\u30BF\u30E0\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7 -FileTypeIdGlobalSettingsPanel.jLabel2.text=MIME\u30BF\u30A4\u30D7\uFF1A -FileTypeIdGlobalSettingsPanel.jLabel3.text=Autopsy\u306F\u81EA\u52D5\u7684\u306B\u591A\u304F\u306E\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u3092\u691C\u77E5\u3067\u304D\u307E\u3059\u3002\u3053\u3053\u306B\u306F\u3042\u306A\u305F\u306E\u30AB\u30B9\u30BF\u30E0\u306E\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002 -FileTypeIdGlobalSettingsPanel.startUp.fileTypeDetectorInitializationException.msg=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u30C7\u30A3\u30C6\u30AF\u30BF\u3092\u8D77\u52D5\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -FileTypeIdIngestModule.startUp.fileTypeDetectorInitializationException.msg=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u30C7\u30A3\u30C6\u30AF\u30BF\u3092\u8D77\u52D5\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -FileTypeIdGlobalSettingsPanel.offsetRelativeToLabel.text=\u30AA\u30D5\u30BB\u30C3\u30C8\u306F\u6B21\u3068\u76F8\u5BFE\u7684 +OpenIDE-Module-Name=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7ID +FileTypeIdIngestModule.moduleName.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306e\u7279\u5b9a +FileTypeIdIngestModule.moduleDesc.text=\u30d0\u30a4\u30ca\u30ea\u30b7\u30b0\u30cd\u30c1\u30e3\u306b\u57fa\u3065\u3044\u3066\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u4e00\u81f4\u3057\u307e\u3059\u3002 +FileTypeIdIngestModule.complete.totalProcTime=\u5408\u8a08\u51e6\u7406\u6642\u9593 +FileTypeIdIngestModule.complete.totalFiles=\u5408\u8a08\u51e6\u7406\u30d5\u30a1\u30a4\u30eb\u6570 +FileTypeIdIngestModule.complete.srvMsg.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7ID\u306e\u7d50\u679c +FileTypeIdModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof FileTypeIdModuleSettings\u3067\u3059\u3002 +FileTypeIdModuleFactory.createFileIngestModule.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof FileTypeIdModuleSettings\u3067\u3059\u3002 +FileTypeIdIngestJobSettingsPanel.skipKnownCheckBox.toolTipText=\u65e2\u77e5\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u6570\u306b\u3088\u3063\u3066\u306f\u3001\u3053\u306e\u30dc\u30c3\u30af\u30b9\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306e\u7279\u5b9a\u3092\u52a0\u901f\u3057\u307e\u3059\u3002 +FileTypeIdIngestJobSettingsPanel.skipKnownCheckBox.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\uff08NSRL\uff09\u3092\u30b9\u30ad\u30c3\u30d7 +FileTypeIdGlobalSettingsPanel.deleteTypeButton.text=\u524a\u9664 +FileTypeIdGlobalSettingsPanel.filesSetNameLabel.text=\u30bb\u30c3\u30c8\u540d +FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u4e2d\u306b\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u5b9a\u7fa9\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\uff01 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.title=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u540d\u304c\u6b20\u3051\u3066\u3044\u307e\u3059 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.message=MIME\u30bf\u30a4\u30d7\u304c\u5fc5\u8981\u3067\u3059\u3002 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.title=MIME\u30bf\u30a4\u30d7\u304c\u6b20\u3051\u3066\u3044\u307e\u3059 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.message=\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u6b63\u6574\u6570\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title=\u7121\u52b9\u306a\u30aa\u30d5\u30bb\u30c3\u30c8 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidRawSignatureBytes.message=\u3053\u306e\u30b7\u30b0\u30cd\u30c1\u30e3\u306b\u4e00\u3064\u4ee5\u4e0a\u306e\u7121\u52b9\u306a16\u9032\u6570\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.message=\u30b7\u30b0\u30cd\u30c1\u30e3\u304c\u5fc5\u8981\u3067\u3059\u3002 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.title=\u30b7\u30b0\u30cd\u30c1\u30e3\u304c\u6b20\u3051\u3066\u3044\u307e\u3059 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignatureBytes.title=\u30b7\u30b0\u30cd\u30c1\u30e3\u304c\u7121\u52b9\u3067\u3059 +FileTypeIdGlobalSettingsPanel.JOptionPane.loadFailed.title=\u8aad\u307f\u8fbc\u307f\u304c\u5931\u6557\u3057\u307e\u3057\u305f +FileTypeIdGlobalSettingsPanel.JOptionPane.storeFailed.title=\u4fdd\u5b58\u304c\u5931\u6557\u3057\u307e\u3057\u305f +FileTypeIdGlobalSettingsPanel.mimeTypeLabel.text=MIME\u30bf\u30a4\u30d7 +FileTypeIdGlobalSettingsPanel.newTypeButton.text=\u65b0\u898f\u30bf\u30a4\u30d7 +FileTypeIdGlobalSettingsPanel.offsetLabel.text=\u30d0\u30a4\u30c8\u30aa\u30d5\u30bb\u30c3\u30c8 +FileTypeIdGlobalSettingsPanel.postHitCheckBox.text=\u767a\u898b\u3057\u305f\u969b\u306b\u300c\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u300d\u3068\u8b66\u544a +FileTypeIdGlobalSettingsPanel.saveTypeButton.text=\u4fdd\u5b58\u30bf\u30a4\u30d7 +FileTypeIdGlobalSettingsPanel.signatureComboBox.asciiItem=\u30b9\u30c8\u30ea\u30f3\u30b0\uff08ASCII\uff09 +FileTypeIdGlobalSettingsPanel.signatureComboBox.rawItem=\u30d0\u30a4\u30c8\uff08HEX\uff09 +FileTypeIdGlobalSettingsPanel.signatureLabel.text=\u30b7\u30b0\u30cd\u30c1\u30e3 +FileTypeIdGlobalSettingsPanel.signatureTypeLabel.text=\u30b7\u30b0\u30cd\u30c1\u30e3\u30bf\u30a4\u30d7 +OptionsCategory_Keywords_FileTypeId=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7ID +OptionsCategory_Name_FileTypeId=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7 +UserDefinedFileTypesManager.loadFileTypes.errorMessage=\u65e2\u5b58\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u5b9a\u7fa9\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f +UserDefinedFileTypesManager.saveFileTypes.errorMessage=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u5b9a\u7fa9\u306e\u4fdd\u5b58\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.message=\u30a2\u30e9\u30fc\u30c8\u3092\u8a2d\u5b9a\u3059\u308b\u306b\u306f\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u540d\u304c\u5fc5\u8981\u3067\u3059\u3002 +FileTypeIdGlobalSettingsPanel.offsetComboBox.startItem=\u958b\u59cb +FileTypeIdGlobalSettingsPanel.offsetComboBox.endItem=\u505c\u6b62 +FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.length=\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u30b7\u30b0\u30cd\u30c1\u30e3\u30b5\u30a4\u30ba\u3088\u308a\u5c0f\u3055\u304f\u3066\u306f\u3044\u3051\u307e\u305b\u3093\u3002 +FileTypeIdGlobalSettingsPanel.jLabel2.text=MIME\u30bf\u30a4\u30d7\uff1a +FileTypeIdGlobalSettingsPanel.jLabel3.text=Autopsy\u306f\u81ea\u52d5\u7684\u306b\u591a\u304f\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u691c\u77e5\u3067\u304d\u307e\u3059\u3002\u3053\u3053\u306b\u306f\u3042\u306a\u305f\u306e\u30ab\u30b9\u30bf\u30e0\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +FileTypeIdGlobalSettingsPanel.startUp.fileTypeDetectorInitializationException.msg=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u30c7\u30a3\u30c6\u30af\u30bf\u3092\u8d77\u52d5\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +FileTypeIdIngestModule.startUp.fileTypeDetectorInitializationException.msg=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u30c7\u30a3\u30c6\u30af\u30bf\u3092\u8d77\u52d5\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +FileTypeIdGlobalSettingsPanel.offsetRelativeToLabel.text=\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u6b21\u3068\u76f8\u5bfe\u7684 diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java index fdcf90eae5..e6e8269ac9 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2014-2016 Basis Technology Corp. + * Copyright 2011-2016 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -82,11 +82,12 @@ public class FileTypeDetector { } /** - * Determines whether or not a given MIME type is detectable. + * Determines whether or not a given MIME type is detectable by this + * detector. * * @param mimeType The MIME type name (e.g., "text/html"). * - * @return True if the given MIME type is detectable. + * @return True or false. */ public boolean isDetectable(String mimeType) { return isDetectableAsUserDefinedType(mimeType) || isDetectableByTika(mimeType); @@ -94,11 +95,11 @@ public class FileTypeDetector { /** * Determines whether or not a given MIME type is detectable as a - * user-defined MIME type. + * user-defined MIME type by this detector. * * @param mimeType The MIME type name (e.g., "text/html"). * - * @return True if the given MIME type is detectable. + * @return True or false. */ private boolean isDetectableAsUserDefinedType(String mimeType) { for (FileType fileType : userDefinedFileTypes) { @@ -114,7 +115,7 @@ public class FileTypeDetector { * * @param mimeType The MIME type name (e.g., "text/html"). * - * @return True if the given MIME type is detectable. + * @return True or false. */ private boolean isDetectableByTika(String mimeType) { String[] split = mimeType.split("/"); @@ -132,6 +133,10 @@ public class FileTypeDetector { * Gets the MIME type of a file, detecting it if it is not already known. If * detection is necessary, the result is added to the case database. * + * IMPORTANT: This method should not be called except by ingest modules; all + * other clients should call AbstractFile.getMIMEType, and may call + * FileTypeDetector.detect, if AbstractFile.getMIMEType returns null. + * * @param file The file. * * @return A MIME type name. @@ -154,6 +159,16 @@ public class FileTypeDetector { * no property change is fired for this blackboard posting because * general info artifacts are different from other artifacts, e.g., they * are not displayed in the results tree. + * + * SPECIAL NOTE: Adding a file type attribute to the general info + * artifact is meant to be replaced by the use of the MIME type field of + * the AbstractFile class (tsk_files.mime_type in the case database). + * The attribute is still added here to support backward compatibility, + * but it introduces a check-then-act race condition that can lead to + * duplicate attributes. Various mitigation strategies were considered. + * It was decided to go with the policy that this method would not be + * called outside of ingest (see note in method docs), at least until + * such time as the attribute is no longer created. */ BlackboardArtifact getInfoArt = file.getGenInfoArtifact(); BlackboardAttribute batt = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_FILE_TYPE_SIG, FileTypeIdModuleFactory.getModuleName(), mimeType); @@ -168,16 +183,16 @@ public class FileTypeDetector { * * @param file The file to test. * - * @return The MIME type name if detection was successful, null otherwise. + * @return A MIME type name. If file type could not be detected or results + * were uncertain, octet-stream is returned. * * @throws TskCoreException */ public String detect(AbstractFile file) throws TskCoreException { /* - * Consistently mark non-regular files (refer to - * TskData.TSK_FS_META_TYPE_ENUM), zero-sized files, unallocated space, - * and unused blocks (refer to TskData.TSK_DB_FILES_TYPE_ENUM) as - * octet-stream. + * Mark non-regular files (refer to TskData.TSK_FS_META_TYPE_ENUM), + * zero-sized files, unallocated space, and unused blocks (refer to + * TskData.TSK_DB_FILES_TYPE_ENUM) as octet-stream. */ if (!file.isFile() || file.getSize() <= 0 || (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS) @@ -186,8 +201,15 @@ public class FileTypeDetector { return MimeTypes.OCTET_STREAM; } + /* + * Give precedence to user-defined types. + */ String mimeType = detectUserDefinedType(file); if (null == mimeType) { + /* + * The file does not match a user-defined type. Send the initial + * bytes to Tika. + */ try { byte buf[]; int len = file.read(buffer, 0, BUFFER_SIZE); @@ -197,11 +219,10 @@ public class FileTypeDetector { } else { buf = buffer; } - String tikaType = tika.detect(buf, file.getName()); - /** - * Strip out any Tika enhancements to the MIME type name. + /* + * Remove the Tika suffix from the MIME type name. */ mimeType = tikaType.replace("tika-", ""); //NON-NLS @@ -210,7 +231,7 @@ public class FileTypeDetector { * This exception is swallowed and not logged rather than * propagated because files in data sources are not always * consistent with their file system metadata, making for read - * errors, and Tika can be a bit flaky at times, making this a + * errors. Also, Tika can be a bit flaky at times, making this a * best effort endeavor. Default to octet-stream. */ mimeType = MimeTypes.OCTET_STREAM; @@ -235,21 +256,26 @@ public class FileTypeDetector { for (FileType fileType : userDefinedFileTypes) { if (fileType.matches(file)) { if (fileType.alertOnMatch()) { + /* + * Create an interesting file hit artifact. + */ BlackboardArtifact artifact; artifact = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT); BlackboardAttribute setNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, FileTypeIdModuleFactory.getModuleName(), fileType.getFilesSetName()); artifact.addAttribute(setNameAttribute); /* - * Use the MIME type as the category, i.e., the rule that - * determined this file belongs to the interesting files - * set. + * Use the MIME type as the category attribute, i.e., the + * rule that determined this file belongs to the interesting + * files set. */ BlackboardAttribute ruleNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY, FileTypeIdModuleFactory.getModuleName(), fileType.getMimeType()); artifact.addAttribute(ruleNameAttribute); + /* + * Index the artifact for keyword search. + */ try { - // index the artifact for keyword search Case.getCurrentCase().getServices().getBlackboard().indexArtifact(artifact); } catch (Blackboard.BlackboardException | IllegalStateException ex) { logger.log(Level.SEVERE, String.format("Unable to index blackboard artifact %d", artifact.getArtifactID()), ex); //NON-NLS @@ -263,17 +289,35 @@ public class FileTypeDetector { return null; } + /* + * Exception thrown when a file type detector experiences an error + * condition. + */ public static class FileTypeDetectorInitException extends Exception { private static final long serialVersionUID = 1L; + /** + * Constructs an exception to throw when a file type detector + * experiences an error condition. + * + * @param message The exception message, + */ FileTypeDetectorInitException(String message) { super(message); } + /** + * Constructs an exception to throw when a file type detector + * experiences an error condition. + * + * @param message The exception message, + * @param throwable The underlying cause of the exception. + */ FileTypeDetectorInitException(String message, Throwable throwable) { super(message, throwable); } + } /** diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.form index 91181f984d..7e8b342a16 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.form @@ -95,10 +95,9 @@ - - + @@ -107,7 +106,6 @@ - @@ -167,7 +165,7 @@ - + @@ -426,18 +424,6 @@ - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.java index ef174b3155..ee5e9720bf 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdGlobalSettingsPanel.java @@ -84,7 +84,9 @@ final class FileTypeIdGlobalSettingsPanel extends IngestModuleGlobalSettingsPane * Does child component initialization in addition to that done by the * Matisse generated code. */ + @NbBundle.Messages({"FileTypeIdGlobalSettingsPanel.Title=Global File Type Identification Settings"}) private void customizeComponents() { + setName(Bundle.FileTypeIdGlobalSettingsPanel_Title()); setFileTypesListModel(); setSignatureTypeComboBoxModel(); setOffsetRealtiveToComboBoxModel(); @@ -352,7 +354,7 @@ final class FileTypeIdGlobalSettingsPanel extends IngestModuleGlobalSettingsPane private void initComponents() { typesScrollPane = new javax.swing.JScrollPane(); - typesList = new javax.swing.JList<>(); + typesList = new javax.swing.JList(); separator = new javax.swing.JSeparator(); mimeTypeLabel = new javax.swing.JLabel(); mimeTypeTextField = new javax.swing.JTextField(); @@ -364,16 +366,15 @@ final class FileTypeIdGlobalSettingsPanel extends IngestModuleGlobalSettingsPane deleteTypeButton = new javax.swing.JButton(); saveTypeButton = new javax.swing.JButton(); hexPrefixLabel = new javax.swing.JLabel(); - signatureTypeComboBox = new javax.swing.JComboBox<>(); + signatureTypeComboBox = new javax.swing.JComboBox(); signatureLabel = new javax.swing.JLabel(); postHitCheckBox = new javax.swing.JCheckBox(); filesSetNameLabel = new javax.swing.JLabel(); filesSetNameTextField = new javax.swing.JTextField(); ingestRunningWarningLabel = new javax.swing.JLabel(); - jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); - offsetRelativeToComboBox = new javax.swing.JComboBox<>(); + offsetRelativeToComboBox = new javax.swing.JComboBox(); offsetRelativeToLabel = new javax.swing.JLabel(); setMaximumSize(new java.awt.Dimension(500, 300)); @@ -464,9 +465,6 @@ final class FileTypeIdGlobalSettingsPanel extends IngestModuleGlobalSettingsPane ingestRunningWarningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/modules/filetypeid/warning16.png"))); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(ingestRunningWarningLabel, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text")); // NOI18N - jLabel1.setFont(jLabel1.getFont().deriveFont(jLabel1.getFont().getStyle() | java.awt.Font.BOLD, 11)); - org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.jLabel1.text")); // NOI18N - jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(FileTypeIdGlobalSettingsPanel.class, "FileTypeIdGlobalSettingsPanel.jLabel2.text")); // NOI18N @@ -538,15 +536,13 @@ final class FileTypeIdGlobalSettingsPanel extends IngestModuleGlobalSettingsPane .addComponent(offsetRelativeToLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(offsetRelativeToComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) - .addComponent(jLabel1) .addComponent(jLabel3)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addContainerGap(28, Short.MAX_VALUE)))) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(jLabel1) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addContainerGap() .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -594,7 +590,7 @@ final class FileTypeIdGlobalSettingsPanel extends IngestModuleGlobalSettingsPane .addComponent(filesSetNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(saveTypeButton) - .addGap(0, 0, Short.MAX_VALUE)))) + .addGap(0, 21, Short.MAX_VALUE)))) ); layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {deleteTypeButton, newTypeButton, saveTypeButton}); @@ -735,7 +731,6 @@ final class FileTypeIdGlobalSettingsPanel extends IngestModuleGlobalSettingsPane private javax.swing.JTextField filesSetNameTextField; private javax.swing.JLabel hexPrefixLabel; private javax.swing.JLabel ingestRunningWarningLabel; - private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel mimeTypeLabel; diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/UserDefinedFileTypesManager.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/UserDefinedFileTypesManager.java index fd8b019d5a..8f2dbaabca 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/UserDefinedFileTypesManager.java +++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/UserDefinedFileTypesManager.java @@ -438,7 +438,7 @@ final class UserDefinedFileTypesManager { List fileTypes = new ArrayList<>(); /* * RC: Commenting out the loadDocument overload that validates - * agaisnt the XSD is a temp fix for a failure to provide an upgrade + * against the XSD is a temp fix for a failure to provide an upgrade * path when the RelativeToStart attribute was added to the * Signature element. The upgrade path can be supplied, but the plan * is to replace the use of XML with object serialization for the diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties index 6143caecc7..9a43e5cd1a 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle.properties @@ -56,7 +56,6 @@ HashDatabaseOptionsPanelController.moduleErrMsg=A module caused an error listeni HashDbConfigPanel.noSelectionText=No database selected HashDbConfigPanel.errorGettingPathText=Error occurred getting path HashDbConfigPanel.errorGettingIndexStatusText=Error occurred getting status -HashDbConfigPanel.setName.hashSetConfig=Hash Set Configuration HashDbConfigPanel.indexButtonText.index=Index HashDbConfigPanel.indexButtonText.indexing=Indexing HashDbConfigPanel.indexStatusText.indexGen=Index is currently being generated diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties index b53420e4ee..bc5324fdf9 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties @@ -1,213 +1,212 @@ -OpenIDE-Module-Display-Category=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB +OpenIDE-Module-Display-Category=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb OpenIDE-Module-Long-Description=\ - \u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB \n\n\ - \u30C7\u30A3\u30B9\u30AF\u30A4\u30E1\u30FC\u30B8\u306B\u3042\u308B\u30D5\u30A1\u30A4\u30EB\u3092\u89E3\u6790\u3057\u3001\u300C\u65E2\u77E5\u300D\uFF08NSRL\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u300C\u65E2\u77E5\u300D\u30D5\u30A1\u30A4\u30EB\u30EB\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u57FA\u306B\uFF09\u307E\u305F\u306F\u300C\u60AA\u8CEA\uFF0F\u7591\u308F\u3057\u3044\u300D\uFF08\u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F\u5358\u6570\u307E\u305F\u306F\u8907\u6570\u306E\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u57FA\u306B\uFF09\u3068\u30DE\u30FC\u30AF\u3057\u307E\u3059\u3002\n\n\ - \u30CF\u30C3\u30B7\u30E5\u3084\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u8A2D\u5B9A\u306B\u57FA\u3065\u3044\u305F\u30D5\u30A1\u30A4\u30EB\u30EB\u30C3\u30AF\u30A2\u30C3\u30D7\u306A\u3069\u3001\u3053\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u306FGUI\u306B\u9023\u643A\u3057\u3066\u3044\u308B\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3057\u306A\u3044\u3001\u8FFD\u52A0\u306E\u30C4\u30FC\u30EB\u304C\u542B\u307E\u308C\u307E\u3059\u3002 -OpenIDE-Module-Name=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9 -HashDbSearchPanel.hashTable.columnModel.title0=MD5\u30CF\u30C3\u30B7\u30E5 -HashDbSearchPanel.addButton.text=\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0 -HashDbSearchPanel.hashLabel.text=MD5\u30CF\u30C3\u30B7\u30E5\uFF1A -HashDbSearchPanel.searchButton.text=\u691C\u7D22 -HashDbSearchPanel.removeButton.text=\u9078\u629E\u3057\u305F\u3082\u306E\u3092\u524A\u9664 -HashDbSearchPanel.titleLabel.text=\u6B21\u306EMD5\u30CF\u30C3\u30B7\u30E5\u4ED8\u304D\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\uFF1A -HashDbSearchPanel.errorField.text=\u30A8\u30E9\u30FC\uFF1A\u5168\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u30CF\u30C3\u30B7\u30E5\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -HashDbSearchPanel.saveBox.text=\u30CF\u30C3\u30B7\u30E5\u3092\u8A18\u61B6 -HashDbSearchPanel.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB -OpenIDE-Module-Short-Description=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u304A\u3088\u3073\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30C4\u30FC\u30EB -HashDbImportDatabaseDialog.jLabel1.text=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u540D\uFF1A -HashDbImportDatabaseDialog.knownBadRadioButton.text=\u65E2\u77E5\u306E\u60AA\u8CEA -HashDbImportDatabaseDialog.jLabel2.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30BF\u30A4\u30D7\uFF1A + \u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb \n\n\ + \u30c7\u30a3\u30b9\u30af\u30a4\u30e1\u30fc\u30b8\u306b\u3042\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u6790\u3057\u3001\u300c\u65e2\u77e5\u300d\uff08NSRL\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u300c\u65e2\u77e5\u300d\u30d5\u30a1\u30a4\u30eb\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u57fa\u306b\uff09\u307e\u305f\u306f\u300c\u60aa\u8cea\uff0f\u7591\u308f\u3057\u3044\u300d\uff08\u30e6\u30fc\u30b6\u30fc\u304c\u6307\u5b9a\u3057\u305f\u5358\u6570\u307e\u305f\u306f\u8907\u6570\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u57fa\u306b\uff09\u3068\u30de\u30fc\u30af\u3057\u307e\u3059\u3002\n\n\ + \u30cf\u30c3\u30b7\u30e5\u3084\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u5b9a\u306b\u57fa\u3065\u3044\u305f\u30d5\u30a1\u30a4\u30eb\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u306a\u3069\u3001\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306fGUI\u306b\u9023\u643a\u3057\u3066\u3044\u308b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3057\u306a\u3044\u3001\u8ffd\u52a0\u306e\u30c4\u30fc\u30eb\u304c\u542b\u307e\u308c\u307e\u3059\u3002 +OpenIDE-Module-Name=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 +HashDbSearchPanel.hashTable.columnModel.title0=MD5\u30cf\u30c3\u30b7\u30e5 +HashDbSearchPanel.addButton.text=\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0 +HashDbSearchPanel.hashLabel.text=MD5\u30cf\u30c3\u30b7\u30e5\uff1a +HashDbSearchPanel.searchButton.text=\u691c\u7d22 +HashDbSearchPanel.removeButton.text=\u9078\u629e\u3057\u305f\u3082\u306e\u3092\u524a\u9664 +HashDbSearchPanel.titleLabel.text=\u6b21\u306eMD5\u30cf\u30c3\u30b7\u30e5\u4ed8\u304d\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\uff1a +HashDbSearchPanel.errorField.text=\u30a8\u30e9\u30fc\uff1a\u5168\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u30cf\u30c3\u30b7\u30e5\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +HashDbSearchPanel.saveBox.text=\u30cf\u30c3\u30b7\u30e5\u3092\u8a18\u61b6 +HashDbSearchPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb +OpenIDE-Module-Short-Description=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u304a\u3088\u3073\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30c4\u30fc\u30eb +HashDbImportDatabaseDialog.jLabel1.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\uff1a +HashDbImportDatabaseDialog.knownBadRadioButton.text=\u65e2\u77e5\u306e\u60aa\u8cea +HashDbImportDatabaseDialog.jLabel2.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30bf\u30a4\u30d7\uff1a HashDbImportDatabaseDialog.okButton.text=OK -HashDbImportDatabaseDialog.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB -HashDbCreateDatabaseDialog.jLabel2.text=\u30BF\u30A4\u30D7\uFF1A -HashDbCreateDatabaseDialog.knownBadRadioButton.text=\u65E2\u77E5\u306E\u60AA\u8CEA -HashDbCreateDatabaseDialog.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB -ModalNoButtons.CURRENTLYON_LABEL.text=y\u306Ex\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D -ModalNoButtons.GO_GET_COFFEE_LABEL.text=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D\u3067\u3059\u3002\u6642\u9593\u304C\u304B\u304B\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\u3002 -ModalNoButtons.CANCEL_BUTTON.text=\u30AD\u30E3\u30F3\u30BB\u30EB -HashDbImportDatabaseDialog.knownRadioButton.text=\u65E2\u77E5\uFF08NSRL\u307E\u305F\u306F\u305D\u306E\u4ED6\uFF09 -HashDbCreateDatabaseDialog.knownRadioButton.text=\u65E2\u77E5 -HashDbCreateDatabaseDialog.jLabel1.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D1\u30B9\uFF1A -HashDbCreateDatabaseDialog.saveAsButton.text=\u540D\u524D\u3092\u3064\u3051\u3066\u4FDD\u5B58\u2026 -HashDbImportDatabaseDialog.jLabel3.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D1\u30B9\uFF1A -HashDbCreateDatabaseDialog.sendIngestMessagesCheckbox.text=\u30D2\u30C3\u30C8\u6BCE\u306B\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u308B -HashDbImportDatabaseDialog.sendIngestMessagesCheckbox.text=\u30D2\u30C3\u30C8\u6BCE\u306B\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u308B -HashDbImportDatabaseDialog.openButton.text=\u958B\u304F... -HashDbCreateDatabaseDialog.jLabel3.text=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u540D\uFF1A +HashDbImportDatabaseDialog.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb +HashDbCreateDatabaseDialog.jLabel2.text=\u30bf\u30a4\u30d7\uff1a +HashDbCreateDatabaseDialog.knownBadRadioButton.text=\u65e2\u77e5\u306e\u60aa\u8cea +HashDbCreateDatabaseDialog.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb +ModalNoButtons.CURRENTLYON_LABEL.text=y\u306ex\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d +ModalNoButtons.GO_GET_COFFEE_LABEL.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d\u3067\u3059\u3002\u6642\u9593\u304c\u304b\u304b\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002 +ModalNoButtons.CANCEL_BUTTON.text=\u30ad\u30e3\u30f3\u30bb\u30eb +HashDbImportDatabaseDialog.knownRadioButton.text=\u65e2\u77e5\uff08NSRL\u307e\u305f\u306f\u305d\u306e\u4ed6\uff09 +HashDbCreateDatabaseDialog.knownRadioButton.text=\u65e2\u77e5 +HashDbCreateDatabaseDialog.jLabel1.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a +HashDbCreateDatabaseDialog.saveAsButton.text=\u540d\u524d\u3092\u3064\u3051\u3066\u4fdd\u5b58\u2026 +HashDbImportDatabaseDialog.jLabel3.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a +HashDbCreateDatabaseDialog.sendIngestMessagesCheckbox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b +HashDbImportDatabaseDialog.sendIngestMessagesCheckbox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b +HashDbImportDatabaseDialog.openButton.text=\u958b\u304f... +HashDbCreateDatabaseDialog.jLabel3.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\uff1a HashDbCreateDatabaseDialog.okButton.text=OK -AddContentToHashDbAction.ContentMenu.noHashDbsConfigd=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -AddContentToHashDbAction.ContentMenu.createDbItem=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u4F5C\u6210... -AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr1.text=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30A8\u30E9\u30FC\u306B\u8FFD\u52A0 -AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr2.text=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30A8\u30E9\u30FC\u306B\u8FFD\u52A0 -AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr3.text=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30A8\u30E9\u30FC\u306B\u8FFD\u52A0 -AddContentToHashDbAction.addFilesToHashSet.unableToAddFileMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B{0}\u3092\u8FFD\u52A0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -AddContentToHashDbAction.addFilesToHashSet.unableToAddFileSzMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B{0}\u3092\u8FFD\u52A0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30CF\u30C3\u30B7\u30E5\u304C\u8A08\u7B97\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u9069\u5207\u306A\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u8A2D\u5B9A\u3057\u3001\u5B9F\u884C\u3057\u3066\u4E0B\u3055\u3044\u3002 -HashDatabaseOptionsPanelController.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -HashDatabaseOptionsPanelController.moduleErrMsg=HashDatabaseOptionsPanelController\u306E\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u5B8C\u5168\u3067\u306A\u3044\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002 -HashDbConfigPanel.noSelectionText=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -HashDbConfigPanel.errorGettingPathText=\u30D1\u30B9\u306E\u53D6\u5F97\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -HashDbConfigPanel.errorGettingIndexStatusText=\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u78BA\u8A8D\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -HashDbConfigPanel.setName.hashSetConfig=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u8A2D\u5B9A -HashDbConfigPanel.indexButtonText.index=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9 -HashDbConfigPanel.indexButtonText.indexing=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D -HashDbConfigPanel.indexStatusText.indexGen=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u4F5C\u6210\u4E2D\u3067\u3059 -HashDbConfigPanel.indexStatusText.indexOnly=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u307F -HashDbConfigPanel.indexStatusText.indexed=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u6E08\u307F -HashDbConfigPanel.indexButtonText.reIndex=\u518D\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9 -HashDbConfigPanel.indexStatusText.noIndex=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u7121\u3057 -HashDbConfigPanel.dbsNotIndexedMsg=\u6B21\u306E\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306F\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3057\u307E\u3059\u304B\uFF1F\n {0} -HashDbConfigPanel.unindexedDbsMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u3066\u3044\u306A\u3044\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9 -HashDbConfigPanel.allUnindexedDbsRmFromListMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u3066\u3044\u306A\u3044\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306F\u30EA\u30B9\u30C8\u304B\u3089\u524A\u9664\u3055\u308C\u307E\u3059 -HashDbConfigPanel.nameColLbl=\u540D\u524D -HashDbConfigPanel.editingCellsNotSupportedMsg=\u30BB\u30EB\u306F\u7DE8\u96C6\u4E0D\u53EF\u3067\u3059 -HashDbConfigPanel.deleteDbActionConfirmMsg=\u5168\u3066\u306E\u30B1\u30FC\u30B9\u306B\u304A\u3051\u308B\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u524A\u9664\u3057\u307E\u3059\u3002\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F -HashDbConfigPanel.deleteDbActionMsg=\u8A2D\u5B9A\u304B\u3089\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u524A\u9664 -HashDbCreateDatabaseDialog.createHashDbMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u4F5C\u6210 -HashDbCreateDatabaseDialog.hashDbMustHaveFileExtensionMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u306F .{0} \u306E\u62E1\u5F35\u5B50\u304C\u5FC5\u8981\u3067\u3059\u3002 -HashDbCreateDatabaseDialog.fileNameErr=\u30D5\u30A1\u30A4\u30EB\u540D\u30A8\u30E9\u30FC -HashDbCreateDatabaseDialog.fileNameAlreadyExistsMsg=\u540C\u540D\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\u5225\u306E\u30D5\u30A1\u30A4\u30EB\u540D\u3092\u8A2D\u5B9A\u3057\u3066\u4E0B\u3055\u3044\u3002 -HashDbCreateDatabaseDialog.fileExistsErr=\u30D5\u30A1\u30A4\u30EB\u304C\u65E2\u306B\u5B58\u5728\u3057\u3066\u3044\u308B\u30A8\u30E9\u30FC -HashDbCreateDatabaseDialog.mustEnterHashSetNameMsg=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u540D\u306E\u5165\u529B\u304C\u5FC5\u8981\u3067\u3059 -HashDbCreateDatabaseDialog.createHashDbErr=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u4F5C\u6210\u30A8\u30E9\u30FC -HashDbCreateDatabaseDialog.mustEnterHashDbPathMsg=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D1\u30B9\u306E\u5165\u529B\u304C\u5FC5\u8981\u3067\u3059\u3002 -HashDbCreateDatabaseDialog.errMsg.hashDbCreationErr=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u4F5C\u6210\u30A8\u30E9\u30FC -HashDbCreateDatabaseDialog.cannotCreateFileAtLocMsg=\u6307\u5B9A\u3055\u308C\u305F\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u3067\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3002 -HashDbCreateDatabaseDialog.failedToCreateHashDbMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002 -HashDbImportDatabaseDialog.importHashDbMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30DD\u30FC\u30C8 -HashDbImportDatabaseDialog.fileNameExtFilter.text=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB -HashDbImportDatabaseDialog.failedToGetDbPathMsg=\u9078\u629E\u3057\u305F\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30D1\u30B9\u306E\u5165\u624B\u3092\u5931\u6557\u3057\u307E\u3057\u305F\u3002 -HashDbImportDatabaseDialog.importHashDbErr=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A8\u30E9\u30FC\u3092\u30A4\u30F3\u30DD\u30FC\u30C8 -HashDbImportDatabaseDialog.mustSelectHashDbFilePathMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\u306E\u9078\u629E\u304C\u5FC5\u8981\u3067\u3059\u3002 -HashDbImportDatabaseDialog.hashDbDoesNotExistMsg=\u9078\u629E\u3055\u308C\u305F\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002 -HashDbImportDatabaseDialog.errorMessage.failedToOpenHashDbMsg={0}\u3067\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u958B\u304F\u306E\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002 -HashDbIngestModule.moduleName=\u30CF\u30C3\u30B7\u30E5\u30EB\u30C3\u30AF\u30A2\u30C3\u30D7 -HashDbIngestModule.moduleDescription=\u6A19\u6E96\u306ENSRL\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306A\u3069\u3001\u63D0\u4F9B\u3055\u308C\u305F\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u5229\u7528\u3057\u3066\u3001\u65E2\u77E5\u307E\u305F\u306F\u7591\u308F\u3057\u3044\u3082\u306E\u3092\u691C\u77E5\u3057\u307E\u3059\u3002 -HashDbIngestModule.noKnownHashDbSetMsg=\u65E2\u77E5\u306E\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002 -HashDbIngestModule.knownFileSearchWillNotExecuteWarn=\u65E2\u77E5\u306E\u30D5\u30A1\u30A4\u30EB\u691C\u7D22\u304C\u5B9F\u884C\u3055\u308C\u307E\u305B\u3093\u3002 -HashDbIngestModule.noKnownBadHashDbSetMsg=\u65E2\u77E5\u306E\u60AA\u8CEA\u306A\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30BB\u30C3\u30C8\u306F\u3042\u308A\u307E\u305B\u3093\u3002 -HashDbConfigPanel.dbNotIndexedMsg=\u6B21\u306E\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306F\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3057\u307E\u3059\u304B\uFF1F\n{0} -HashDbIngestModule.knownBadFileSearchWillNotExecuteWarn=\u65E2\u77E5\u306E\u60AA\u8CEA\u30D5\u30A1\u30A4\u30EB\u691C\u7D22\u306F\u5B9F\u884C\u3055\u308C\u307E\u305B\u3093\u3002 -HashDbIngestModule.fileReadErrorMsg=\u8AAD\u307F\u8FBC\u307F\u30A8\u30E9\u30FC\uFF1A {0} -HashDbIngestModule.calcHashValueErr={0}\u306E\u30CF\u30C3\u30B7\u30E5\u5024\u3092\u8A08\u7B97\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -HashDbIngestModule.hashLookupErrorMsg=\u30CF\u30C3\u30B7\u30E5\u30EB\u30C3\u30AF\u30A2\u30C3\u30D7\u30A8\u30E9\u30FC\uFF1A {0} -HashDbIngestModule.settingKnownBadStateErr={0}\u306E\u65E2\u77E5\u306E\u60AA\u8CEA\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u8A2D\u5B9A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -HashDbIngestModule.lookingUpKnownBadHashValueErr={0}\u306E\u65E2\u77E5\u306E\u60AA\u8CEA\u30CF\u30C3\u30B7\u30E5\u5024\u3092\u30EB\u30C3\u30AF\u30A2\u30C3\u30D7\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -HashDbIngestModule.lookingUpKnownHashValueErr={0}\u306E\u65E2\u77E5\u306E\u30CF\u30C3\u30B7\u30E5\u5024\u3092\u30EB\u30C3\u30AF\u30A2\u30C3\u30D7\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -HashDbIngestModule.postToBB.fileName=\u30D5\u30A1\u30A4\u30EB\u540D -HashDbIngestModule.postToBB.md5Hash=MD5\u30CF\u30C3\u30B7\u30E5 -HashDbIngestModule.postToBB.hashsetName=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u540D -HashDbIngestModule.postToBB.knownBadMsg=\u65E2\u77E5\u306E\u60AA\u8CEA\: {0} -HashDbIngestModule.complete.knownBadsFound=\u767A\u898B\u3055\u308C\u305F\u65E2\u77E5\u306E\u60AA\u8CEA\uFF1A -HashDbIngestModule.complete.totalCalcTime=\u8A08\u7B97\u6642\u9593\u306E\u5408\u8A08 -HashDbIngestModule.complete.totalLookupTime=\u30EB\u30C3\u30AF\u30A2\u30C3\u30D7\u6642\u9593\u306E\u5408\u8A08 -HashDbIngestModule.complete.databasesUsed=\u5229\u7528\u3057\u305F\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\uFF1A -HashDbIngestModule.complete.hashLookupResults=\u30CF\u30C3\u30B7\u30E5\u30EB\u30C3\u30AF\u30A2\u30C3\u30D7\u7D50\u679C -HashDbManager.moduleErrorListeningToUpdatesMsg=HashDbManager\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u539F\u56E0\u306A\u306E\u304B\u3092\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u5B8C\u5168\u3067\u306A\u3044\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002 -HashDbManager.replacingDuplicateHashsetNameMsg=\u91CD\u8907\u306E\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u540D {0} \u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002\n {1}\u306B\u66F8\u304D\u63DB\u3048\u307E\u3059\u3002 -HashDbManager.openHashDbErr=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u958B\u304F\u30A8\u30E9\u30FC -HashDbManager.unableToOpenHashDbMsg=\ {0} \u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u958B\u3051\u307E\u305B\u3093\u3002 -HashDbManager.savedBackupOfOldConfigMsg={0}\n\u53E4\u3044\u8A2D\u5B9A\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u30B3\u30D4\u30FC\u304C\u6B21\u306E\u901A\u308A\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F\u3002\n{1} -HashDbManager.baseMessage.updatedFormatHashDbConfig=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u306E\u5F62\u5F0F\u304C\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F\u3002 -HashDbManager.msgBoxTitle.confFileFmtChanged=\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u5F62\u5F0F\u306E\u5909\u66F4\u5B8C\u4E86 -HashDbManager.dlgMsg.dbNotFoundAtLoc=\ {0} \u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306F\u6B21\u306E\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u306B\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\n {1}\n \u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3057\u307E\u3059\u304B\uFF1F -HashDbManager.dlgTitle.MissingDb=\u6B20\u843D\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9 -HashDbManager.progress.indexingHashSet=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D {0} -HashDbManager.dlgMsg.errorIndexingHashSet=\ {0} \u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D\u306E\u30A8\u30E9\u30FC -HashDbManager.hashDbIndexingErr=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D\u306E\u30A8\u30E9\u30FC -HashDbPanelSearchAction.actionName=MD5\u30CF\u30C3\u30B7\u30E5\u306B\u57FA\u3065\u304F\u30D5\u30A1\u30A4\u30EB\u691C\u7D22 -HashDbSearchAction.dlgMsg.noFilesHaveMD5Calculated=MD5\u30CF\u30C3\u30B7\u30E5\u304C\u8A08\u7B97\u3055\u308C\u3066\u3044\u308B\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u307E\u305A\u306FHashDB\u3092\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3057\u3066\u4E0B\u3055\u3044\u3002 -HashDbSearchManager.MD5HashSearch=MD5\u30CF\u30C3\u30B7\u30E5\u691C\u7D22 -HashDbSearchManager.noResultsFoundMsg=\u4E00\u81F4\u3059\u308B\u3082\u306E\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -HashDbSearchPanel.titleText.ingestOngoing=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\uFF1B\u5B8C\u4E86\u3059\u308B\u307E\u3067\u3053\u306E\u30B5\u30FC\u30D3\u30B9\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002 -HashDbSearchPanel.noFilesHaveMD5HashMsg=MD5\u30CF\u30C3\u30B7\u30E5\u4ED8\u304D\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -HashDbSearchPanel.errorText.noHashesAddedMsg=\u30A8\u30E9\u30FC\uFF1A\u30CF\u30C3\u30B7\u30E5\u304C\u8FFD\u52A0\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 -HashDbSearchPanel.errorText.hashAlreadyAddedMsg=\u30A8\u30E9\u30FC\uFF1A\u30CF\u30C3\u30B7\u30E5\u304C\u65E2\u306B\u8FFD\u52A0\u3055\u308C\u3066\u3044\u307E\u3059\u3002 -HashDbSearchPanel.errorText.invalidMD5HashMsg=\u30A8\u30E9\u30FC\uFF1A\u6709\u52B9\u306AMD5\u30CF\u30C3\u30B7\u30E5\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 -HashDbSearchThread.progress.cancellingSearch={0}\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09 -HashDbSearchThread.name.searching=\u691C\u7D22\u4E2D -HashDbSearchThread.noMoreFilesWithMD5Msg=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u4ED8\u304D\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u4ED6\u306B\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -ModalNoButtons.indexingDbsTitle=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D -ModalNoButtons.indexingDbTitle=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D -ModalNoButtons.exitHashDbIndexingMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3092\u4E2D\u6B62\u3057\u307E\u3059\u3002\n\ -\u4F5C\u6210\u3055\u308C\u305F\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306F\u5229\u7528\u4E0D\u53EF\u3068\u306A\u308A\u307E\u3059\u3002\u7D9A\u884C\u3059\u308B\u5834\u5408\u306F\n\ -\u30CF\u30C3\u30B7\u30E5\u30D5\u30A9\u30EB\u30C0\u5185\u306B\u3042\u308B\u3001\u5BFE\u5FDC\u3059\u308B-md5.idx \u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u3066\u4E0B\u3055\u3044\u3002\n\ -\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3092\u4E2D\u6B62\u3057\u307E\u3059\u304B\uFF1F -ModalNoButtons.dlgTitle.unfinishedIndexing=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u672A\u5B8C\u4E86 -ModalNoButtons.indexThis.currentlyIndexing1Db=\uFF11\u3064\u306E\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D -ModalNoButtons.indexThese.currentlyIndexing1OfNDbs=\uFF11\uFF0F {0}\u3064\u76EE\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D -ModalNoButtons.propChg.currentlyIndexingXofN={0}\uFF0F {1}\u3064\u76EE\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u4E2D -HashDbManager.duplicateHashSetNameExceptionMsg=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u540D''{0}''\u306F\u65E2\u306B\u5225\u306E\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u4F7F\u308F\u308C\u3066\u3044\u307E\u3059\u3002 -HashDbManager.hashDbDoesNotExistExceptionMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u6B21\u3067\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\n{0} -HashDbManager.hashDbFileExistsExceptionMsg=\u65E2\u306B\u30D5\u30A1\u30A4\u30EB\u304C\u6B21\u306B\u5B58\u5728\u3057\u307E\u3059\n{0} -HashDbManager.hashDbAlreadyAddedExceptionMsg=\u6B21\u306E\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\n{0}\n\u306F\u65E2\u306B\u4F5C\u6210\u307E\u305F\u306F\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u3059\u3002 -HashDbManager.illegalHashDbFileNameExtensionMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB\u540D\u306F.{0}\u306E\u62E1\u5F35\u5B50\u304C\u5FC5\u8981\u3067\u3059\u3002 -HashDbManager.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -HashDbManager.knownBad.text=\u65E2\u77E5\u306E\u60AA\u8CEA -HashDbManager.known.text=\u65E2\u77E5 -HashDbManager.fileNameExtensionFilter.title=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D5\u30A1\u30A4\u30EB -HashDbSearchAction.dlgMsg.title=MD5\u30CF\u30C3\u30B7\u30E5\u306B\u57FA\u3065\u3044\u305F\u30D5\u30A1\u30A4\u30EB\u691C\u7D22 -HashDbSearchAction.getName.text=\u30CF\u30C3\u30B7\u30E5\u691C\u7D22 -HashDbSearchPanel.dlgMsg.title=MD5\u30CF\u30C3\u30B7\u30E5\u306B\u57FA\u3065\u304F\u30D5\u30A1\u30A4\u30EB\u691C\u7D22 -AddContentToHashDbAction.singleSelectionName=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30D5\u30A1\u30A4\u30EB\u3092\u8FFD\u52A0 -AddContentToHashDbAction.multipleSelectionName=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30D5\u30A1\u30A4\u30EB\u3092\u8FFD\u52A0 -OptionsCategory_Name_HashDatabase=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9 -OptionsCategory_Keywords_HashDatabase=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9 -HashDbManager.ingestRunningExceptionMsg=\u51E6\u7406\u4E2D\uFF1B\u5B8C\u4E86\u3059\u308B\u307E\u3067\u3053\u306E\u30B5\u30FC\u30D3\u30B9\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002 -ModalNoButtons.CURRENTDB_LABEL.text=\uFF08\u73FE\u5728\u306E\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\uFF09 -HashDbCreateDatabaseDialog.defaultFileName=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8 -HashDbManager.saveErrorExceptionMsg=\u30CF\u30C3\u30B7\u30E5\u8A2D\u5B9A\u306E\u4FDD\u5B58\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -AddContentToHashDbAction.addFilesToHashSet.files=\u30D5\u30A1\u30A4\u30EB -AddContentToHashDbAction.addFilesToHashSet.file=\u30D5\u30A1\u30A4\u30EB -HashDbManager.errCreatingIndex.title=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -HashDbManager.errCreatingIndex.msg=\u6B21\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0} +AddContentToHashDbAction.ContentMenu.noHashDbsConfigd=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +AddContentToHashDbAction.ContentMenu.createDbItem=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210... +AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr1.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a8\u30e9\u30fc\u306b\u8ffd\u52a0 +AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr2.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a8\u30e9\u30fc\u306b\u8ffd\u52a0 +AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr3.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a8\u30e9\u30fc\u306b\u8ffd\u52a0 +AddContentToHashDbAction.addFilesToHashSet.unableToAddFileMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b{0}\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +AddContentToHashDbAction.addFilesToHashSet.unableToAddFileSzMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b{0}\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30cf\u30c3\u30b7\u30e5\u304c\u8a08\u7b97\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u9069\u5207\u306a\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8a2d\u5b9a\u3057\u3001\u5b9f\u884c\u3057\u3066\u4e0b\u3055\u3044\u3002 +HashDatabaseOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +HashDatabaseOptionsPanelController.moduleErrMsg=HashDatabaseOptionsPanelController\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u5b8c\u5168\u3067\u306a\u3044\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002 +HashDbConfigPanel.noSelectionText=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +HashDbConfigPanel.errorGettingPathText=\u30d1\u30b9\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +HashDbConfigPanel.errorGettingIndexStatusText=\u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u78ba\u8a8d\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +HashDbConfigPanel.indexButtonText.index=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9 +HashDbConfigPanel.indexButtonText.indexing=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d +HashDbConfigPanel.indexStatusText.indexGen=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4f5c\u6210\u4e2d\u3067\u3059 +HashDbConfigPanel.indexStatusText.indexOnly=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u307f +HashDbConfigPanel.indexStatusText.indexed=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6e08\u307f +HashDbConfigPanel.indexButtonText.reIndex=\u518d\u30a4\u30f3\u30c7\u30c3\u30af\u30b9 +HashDbConfigPanel.indexStatusText.noIndex=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u7121\u3057 +HashDbConfigPanel.dbsNotIndexedMsg=\u6b21\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3057\u307e\u3059\u304b\uff1f\n {0} +HashDbConfigPanel.unindexedDbsMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u3066\u3044\u306a\u3044\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 +HashDbConfigPanel.allUnindexedDbsRmFromListMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u3066\u3044\u306a\u3044\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u30ea\u30b9\u30c8\u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3059 +HashDbConfigPanel.nameColLbl=\u540d\u524d +HashDbConfigPanel.editingCellsNotSupportedMsg=\u30bb\u30eb\u306f\u7de8\u96c6\u4e0d\u53ef\u3067\u3059 +HashDbConfigPanel.deleteDbActionConfirmMsg=\u5168\u3066\u306e\u30b1\u30fc\u30b9\u306b\u304a\u3051\u308b\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u524a\u9664\u3057\u307e\u3059\u3002\u5b9f\u884c\u3057\u307e\u3059\u304b\uff1f +HashDbConfigPanel.deleteDbActionMsg=\u8a2d\u5b9a\u304b\u3089\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u524a\u9664 +HashDbCreateDatabaseDialog.createHashDbMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210 +HashDbCreateDatabaseDialog.hashDbMustHaveFileExtensionMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u306f .{0} \u306e\u62e1\u5f35\u5b50\u304c\u5fc5\u8981\u3067\u3059\u3002 +HashDbCreateDatabaseDialog.fileNameErr=\u30d5\u30a1\u30a4\u30eb\u540d\u30a8\u30e9\u30fc +HashDbCreateDatabaseDialog.fileNameAlreadyExistsMsg=\u540c\u540d\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u5225\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u8a2d\u5b9a\u3057\u3066\u4e0b\u3055\u3044\u3002 +HashDbCreateDatabaseDialog.fileExistsErr=\u30d5\u30a1\u30a4\u30eb\u304c\u65e2\u306b\u5b58\u5728\u3057\u3066\u3044\u308b\u30a8\u30e9\u30fc +HashDbCreateDatabaseDialog.mustEnterHashSetNameMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\u306e\u5165\u529b\u304c\u5fc5\u8981\u3067\u3059 +HashDbCreateDatabaseDialog.createHashDbErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u4f5c\u6210\u30a8\u30e9\u30fc +HashDbCreateDatabaseDialog.mustEnterHashDbPathMsg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\u306e\u5165\u529b\u304c\u5fc5\u8981\u3067\u3059\u3002 +HashDbCreateDatabaseDialog.errMsg.hashDbCreationErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u4f5c\u6210\u30a8\u30e9\u30fc +HashDbCreateDatabaseDialog.cannotCreateFileAtLocMsg=\u6307\u5b9a\u3055\u308c\u305f\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002 +HashDbCreateDatabaseDialog.failedToCreateHashDbMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u4f5c\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002 +HashDbImportDatabaseDialog.importHashDbMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8 +HashDbImportDatabaseDialog.fileNameExtFilter.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb +HashDbImportDatabaseDialog.failedToGetDbPathMsg=\u9078\u629e\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d1\u30b9\u306e\u5165\u624b\u3092\u5931\u6557\u3057\u307e\u3057\u305f\u3002 +HashDbImportDatabaseDialog.importHashDbErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a8\u30e9\u30fc\u3092\u30a4\u30f3\u30dd\u30fc\u30c8 +HashDbImportDatabaseDialog.mustSelectHashDbFilePathMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u306e\u9078\u629e\u304c\u5fc5\u8981\u3067\u3059\u3002 +HashDbImportDatabaseDialog.hashDbDoesNotExistMsg=\u9078\u629e\u3055\u308c\u305f\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 +HashDbImportDatabaseDialog.errorMessage.failedToOpenHashDbMsg={0}\u3067\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u958b\u304f\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002 +HashDbIngestModule.moduleName=\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7 +HashDbIngestModule.moduleDescription=\u6a19\u6e96\u306eNSRL\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306a\u3069\u3001\u63d0\u4f9b\u3055\u308c\u305f\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u5229\u7528\u3057\u3066\u3001\u65e2\u77e5\u307e\u305f\u306f\u7591\u308f\u3057\u3044\u3082\u306e\u3092\u691c\u77e5\u3057\u307e\u3059\u3002 +HashDbIngestModule.noKnownHashDbSetMsg=\u65e2\u77e5\u306e\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 +HashDbIngestModule.knownFileSearchWillNotExecuteWarn=\u65e2\u77e5\u306e\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u304c\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093\u3002 +HashDbIngestModule.noKnownBadHashDbSetMsg=\u65e2\u77e5\u306e\u60aa\u8cea\u306a\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30bb\u30c3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +HashDbConfigPanel.dbNotIndexedMsg=\u6b21\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3057\u307e\u3059\u304b\uff1f\n{0} +HashDbIngestModule.knownBadFileSearchWillNotExecuteWarn=\u65e2\u77e5\u306e\u60aa\u8cea\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u306f\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093\u3002 +HashDbIngestModule.fileReadErrorMsg=\u8aad\u307f\u8fbc\u307f\u30a8\u30e9\u30fc\uff1a {0} +HashDbIngestModule.calcHashValueErr={0}\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u8a08\u7b97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +HashDbIngestModule.hashLookupErrorMsg=\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u30a8\u30e9\u30fc\uff1a {0} +HashDbIngestModule.settingKnownBadStateErr={0}\u306e\u65e2\u77e5\u306e\u60aa\u8cea\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u8a2d\u5b9a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +HashDbIngestModule.lookingUpKnownBadHashValueErr={0}\u306e\u65e2\u77e5\u306e\u60aa\u8cea\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +HashDbIngestModule.lookingUpKnownHashValueErr={0}\u306e\u65e2\u77e5\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +HashDbIngestModule.postToBB.fileName=\u30d5\u30a1\u30a4\u30eb\u540d +HashDbIngestModule.postToBB.md5Hash=MD5\u30cf\u30c3\u30b7\u30e5 +HashDbIngestModule.postToBB.hashsetName=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d +HashDbIngestModule.postToBB.knownBadMsg=\u65e2\u77e5\u306e\u60aa\u8cea\: {0} +HashDbIngestModule.complete.knownBadsFound=\u767a\u898b\u3055\u308c\u305f\u65e2\u77e5\u306e\u60aa\u8cea\uff1a +HashDbIngestModule.complete.totalCalcTime=\u8a08\u7b97\u6642\u9593\u306e\u5408\u8a08 +HashDbIngestModule.complete.totalLookupTime=\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u6642\u9593\u306e\u5408\u8a08 +HashDbIngestModule.complete.databasesUsed=\u5229\u7528\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\uff1a +HashDbIngestModule.complete.hashLookupResults=\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u7d50\u679c +HashDbManager.moduleErrorListeningToUpdatesMsg=HashDbManager\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u539f\u56e0\u306a\u306e\u304b\u3092\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u5b8c\u5168\u3067\u306a\u3044\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002 +HashDbManager.replacingDuplicateHashsetNameMsg=\u91cd\u8907\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d {0} \u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\n {1}\u306b\u66f8\u304d\u63db\u3048\u307e\u3059\u3002 +HashDbManager.openHashDbErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u958b\u304f\u30a8\u30e9\u30fc +HashDbManager.unableToOpenHashDbMsg=\ {0} \u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u958b\u3051\u307e\u305b\u3093\u3002 +HashDbManager.savedBackupOfOldConfigMsg={0}\n\u53e4\u3044\u8a2d\u5b9a\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30b3\u30d4\u30fc\u304c\u6b21\u306e\u901a\u308a\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002\n{1} +HashDbManager.baseMessage.updatedFormatHashDbConfig=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u5f62\u5f0f\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002 +HashDbManager.msgBoxTitle.confFileFmtChanged=\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u306e\u5909\u66f4\u5b8c\u4e86 +HashDbManager.dlgMsg.dbNotFoundAtLoc=\ {0} \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u6b21\u306e\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\n {1}\n \u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\u3057\u307e\u3059\u304b\uff1f +HashDbManager.dlgTitle.MissingDb=\u6b20\u843d\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 +HashDbManager.progress.indexingHashSet=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d {0} +HashDbManager.dlgMsg.errorIndexingHashSet=\ {0} \u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d\u306e\u30a8\u30e9\u30fc +HashDbManager.hashDbIndexingErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d\u306e\u30a8\u30e9\u30fc +HashDbPanelSearchAction.actionName=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u57fa\u3065\u304f\u30d5\u30a1\u30a4\u30eb\u691c\u7d22 +HashDbSearchAction.dlgMsg.noFilesHaveMD5Calculated=MD5\u30cf\u30c3\u30b7\u30e5\u304c\u8a08\u7b97\u3055\u308c\u3066\u3044\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u307e\u305a\u306fHashDB\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3057\u3066\u4e0b\u3055\u3044\u3002 +HashDbSearchManager.MD5HashSearch=MD5\u30cf\u30c3\u30b7\u30e5\u691c\u7d22 +HashDbSearchManager.noResultsFoundMsg=\u4e00\u81f4\u3059\u308b\u3082\u306e\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +HashDbSearchPanel.titleText.ingestOngoing=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\uff1b\u5b8c\u4e86\u3059\u308b\u307e\u3067\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002 +HashDbSearchPanel.noFilesHaveMD5HashMsg=MD5\u30cf\u30c3\u30b7\u30e5\u4ed8\u304d\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +HashDbSearchPanel.errorText.noHashesAddedMsg=\u30a8\u30e9\u30fc\uff1a\u30cf\u30c3\u30b7\u30e5\u304c\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +HashDbSearchPanel.errorText.hashAlreadyAddedMsg=\u30a8\u30e9\u30fc\uff1a\u30cf\u30c3\u30b7\u30e5\u304c\u65e2\u306b\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u3059\u3002 +HashDbSearchPanel.errorText.invalidMD5HashMsg=\u30a8\u30e9\u30fc\uff1a\u6709\u52b9\u306aMD5\u30cf\u30c3\u30b7\u30e5\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +HashDbSearchThread.progress.cancellingSearch={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09 +HashDbSearchThread.name.searching=\u691c\u7d22\u4e2d +HashDbSearchThread.noMoreFilesWithMD5Msg=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u4ed8\u304d\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u4ed6\u306b\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +ModalNoButtons.indexingDbsTitle=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d +ModalNoButtons.indexingDbTitle=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d +ModalNoButtons.exitHashDbIndexingMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3092\u4e2d\u6b62\u3057\u307e\u3059\u3002\n\ +\u4f5c\u6210\u3055\u308c\u305f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306f\u5229\u7528\u4e0d\u53ef\u3068\u306a\u308a\u307e\u3059\u3002\u7d9a\u884c\u3059\u308b\u5834\u5408\u306f\n\ +\u30cf\u30c3\u30b7\u30e5\u30d5\u30a9\u30eb\u30c0\u5185\u306b\u3042\u308b\u3001\u5bfe\u5fdc\u3059\u308b-md5.idx \u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3057\u3066\u4e0b\u3055\u3044\u3002\n\ +\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3092\u4e2d\u6b62\u3057\u307e\u3059\u304b\uff1f +ModalNoButtons.dlgTitle.unfinishedIndexing=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u672a\u5b8c\u4e86 +ModalNoButtons.indexThis.currentlyIndexing1Db=\uff11\u3064\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d +ModalNoButtons.indexThese.currentlyIndexing1OfNDbs=\uff11\uff0f {0}\u3064\u76ee\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d +ModalNoButtons.propChg.currentlyIndexingXofN={0}\uff0f {1}\u3064\u76ee\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d +HashDbManager.duplicateHashSetNameExceptionMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d''{0}''\u306f\u65e2\u306b\u5225\u306e\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4f7f\u308f\u308c\u3066\u3044\u307e\u3059\u3002 +HashDbManager.hashDbDoesNotExistExceptionMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u6b21\u3067\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\n{0} +HashDbManager.hashDbFileExistsExceptionMsg=\u65e2\u306b\u30d5\u30a1\u30a4\u30eb\u304c\u6b21\u306b\u5b58\u5728\u3057\u307e\u3059\n{0} +HashDbManager.hashDbAlreadyAddedExceptionMsg=\u6b21\u306e\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\n{0}\n\u306f\u65e2\u306b\u4f5c\u6210\u307e\u305f\u306f\u30a4\u30f3\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u3002 +HashDbManager.illegalHashDbFileNameExtensionMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u540d\u306f.{0}\u306e\u62e1\u5f35\u5b50\u304c\u5fc5\u8981\u3067\u3059\u3002 +HashDbManager.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +HashDbManager.knownBad.text=\u65e2\u77e5\u306e\u60aa\u8cea +HashDbManager.known.text=\u65e2\u77e5 +HashDbManager.fileNameExtensionFilter.title=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb +HashDbSearchAction.dlgMsg.title=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u57fa\u3065\u3044\u305f\u30d5\u30a1\u30a4\u30eb\u691c\u7d22 +HashDbSearchAction.getName.text=\u30cf\u30c3\u30b7\u30e5\u691c\u7d22 +HashDbSearchPanel.dlgMsg.title=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u57fa\u3065\u304f\u30d5\u30a1\u30a4\u30eb\u691c\u7d22 +AddContentToHashDbAction.singleSelectionName=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0 +AddContentToHashDbAction.multipleSelectionName=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0 +OptionsCategory_Name_HashDatabase=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 +OptionsCategory_Keywords_HashDatabase=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9 +HashDbManager.ingestRunningExceptionMsg=\u51e6\u7406\u4e2d\uff1b\u5b8c\u4e86\u3059\u308b\u307e\u3067\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002 +ModalNoButtons.CURRENTDB_LABEL.text=\uff08\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\uff09 +HashDbCreateDatabaseDialog.defaultFileName=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8 +HashDbManager.saveErrorExceptionMsg=\u30cf\u30c3\u30b7\u30e5\u8a2d\u5b9a\u306e\u4fdd\u5b58\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +AddContentToHashDbAction.addFilesToHashSet.files=\u30d5\u30a1\u30a4\u30eb +AddContentToHashDbAction.addFilesToHashSet.file=\u30d5\u30a1\u30a4\u30eb +HashDbManager.errCreatingIndex.title=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +HashDbManager.errCreatingIndex.msg=\u6b21\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0} -HashLookupSettingsPanel.optionsLabel.text=\u30AA\u30D7\u30B7\u30E7\u30F3 -HashLookupSettingsPanel.jButton3.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30DD\u30FC\u30C8 -HashLookupSettingsPanel.indexPathLabelLabel.text=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30D1\u30B9\uFF1A -HashLookupSettingsPanel.createDatabaseButton.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u4F5C\u6210 -HashLookupSettingsPanel.jLabel6.text=\u30BF\u30A4\u30D7\uFF1A -HashLookupSettingsPanel.jLabel4.text=\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\uFF1A -HashLookupSettingsPanel.jLabel2.text=\u540D\u524D\uFF1A -HashLookupSettingsPanel.indexPathLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -HashLookupSettingsPanel.ingestWarningLabel.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u3067\u3059\u3002\u5B8C\u4E86\u3059\u308B\u307E\u3067\u4E00\u90E8\u306E\u8A2D\u5B9A\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002 -HashLookupSettingsPanel.deleteDatabaseButton.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u524A\u9664 -HashLookupSettingsPanel.importDatabaseButton.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30DD\u30FC\u30C8 -HashLookupSettingsPanel.hashDatabasesLabel.text=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\uFF1A -HashLookupSettingsPanel.nameLabel.text=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u540D\uFF1A -HashLookupSettingsPanel.informationLabel.text=\u60C5\u5831 -HashLookupSettingsPanel.sendIngestMessagesCheckBox.text=\u30D2\u30C3\u30C8\u6BCE\u306B\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u308B -HashLookupSettingsPanel.hashDbLocationLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -HashLookupSettingsPanel.hashDbNameLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -HashLookupSettingsPanel.typeLabel.text=\u30BF\u30A4\u30D7\uFF1A -HashLookupSettingsPanel.locationLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D1\u30B9\uFF1A -HashLookupSettingsPanel.hashDbIndexStatusLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -HashLookupSettingsPanel.hashDbTypeLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -HashLookupSettingsPanel.indexButton.text=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9 -HashLookupSettingsPanel.indexLabel.text=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B9\u30C6\u30FC\u30BF\u30B9\uFF1A -HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.text=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u306A\u304F\u3066\u3082\u3001MD5\u3092\u8A08\u7B97 -HashLookupModuleSettingsPanel.knownHashDbsLabel.text=\u5229\u7528\u3059\u308B\u65E2\u77E5\u306E\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u9078\u629E\uFF1A -HashLookupModuleSettingsPanel.knownBadHashDbsLabel.text=\u51E6\u7406\u306B\u5229\u7528\u3059\u308B\u65E2\u77E5\u306E\u60AA\u8CEA\u306A\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u9078\u629E\uFF1A -HashLookupModuleFactory.createFileIngestModule.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof HashLookupModuleSettings\u3067\u3059\u3002 -HashLookupModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof HashLookupModuleSettings\u3067\u3059\u3002 -HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.toolTipText=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u306A\u304F\u3066\u3082\u3001MD5\u3092\u8A08\u7B97 -HashDbSearchPanel.hashTable.defaultModel.title.text=MD5\u30CF\u30C3\u30B7\u30E5 -AddContentToHashDbAction.addFilesToHashSet.unableToAddFileEmptyMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B{0}\u3092\u8FFD\u52A0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30D5\u30A1\u30A4\u30EB\u306B\u30B3\u30F3\u30C6\u30F3\u30C4\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -AddHashValuesToDatabaseDialog.JDialog.Title=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0\ -HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0 -AddHashValuesToDatabaseDialog.instructionLabel.text_1=\u4E0B\u8A18\u306BMD5\u306E\u30CF\u30C3\u30B7\u30E5\u5024\u3092\u8CBC\u308A\u4ED8\u3051\u308B\uFF08\u30E9\u30A4\u30F3\u3054\u3068\u306B\u4E00\u3064\u305A\u3064\uFF09\uFF1A -AddHashValuesToDatabaseDialog.cancelButton.text_2=\u30AD\u30E3\u30F3\u30BB\u30EB -AddHashValuesToDatabaseDialog.AddValuesToHashDatabaseButton.text_2=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0 -AddHashValuesToDatabaseDialog.pasteFromClipboardButton.text_2=\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u304B\u3089\u8CBC\u308A\u4ED8\u3051\u308B +HashLookupSettingsPanel.optionsLabel.text=\u30aa\u30d7\u30b7\u30e7\u30f3 +HashLookupSettingsPanel.jButton3.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8 +HashLookupSettingsPanel.indexPathLabelLabel.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30d1\u30b9\uff1a +HashLookupSettingsPanel.createDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210 +HashLookupSettingsPanel.jLabel6.text=\u30bf\u30a4\u30d7\uff1a +HashLookupSettingsPanel.jLabel4.text=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\uff1a +HashLookupSettingsPanel.jLabel2.text=\u540d\u524d\uff1a +HashLookupSettingsPanel.indexPathLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +HashLookupSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u3067\u3059\u3002\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002 +HashLookupSettingsPanel.deleteDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u524a\u9664 +HashLookupSettingsPanel.importDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8 +HashLookupSettingsPanel.hashDatabasesLabel.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\uff1a +HashLookupSettingsPanel.nameLabel.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\uff1a +HashLookupSettingsPanel.informationLabel.text=\u60c5\u5831 +HashLookupSettingsPanel.sendIngestMessagesCheckBox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b +HashLookupSettingsPanel.hashDbLocationLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +HashLookupSettingsPanel.hashDbNameLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +HashLookupSettingsPanel.typeLabel.text=\u30bf\u30a4\u30d7\uff1a +HashLookupSettingsPanel.locationLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a +HashLookupSettingsPanel.hashDbIndexStatusLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +HashLookupSettingsPanel.hashDbTypeLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +HashLookupSettingsPanel.indexButton.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9 +HashLookupSettingsPanel.indexLabel.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b9\u30c6\u30fc\u30bf\u30b9\uff1a +HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u306a\u304f\u3066\u3082\u3001MD5\u3092\u8a08\u7b97 +HashLookupModuleSettingsPanel.knownHashDbsLabel.text=\u5229\u7528\u3059\u308b\u65e2\u77e5\u306e\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u9078\u629e\uff1a +HashLookupModuleSettingsPanel.knownBadHashDbsLabel.text=\u51e6\u7406\u306b\u5229\u7528\u3059\u308b\u65e2\u77e5\u306e\u60aa\u8cea\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u9078\u629e\uff1a +HashLookupModuleFactory.createFileIngestModule.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof HashLookupModuleSettings\u3067\u3059\u3002 +HashLookupModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof HashLookupModuleSettings\u3067\u3059\u3002 +HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.toolTipText=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u306a\u304f\u3066\u3082\u3001MD5\u3092\u8a08\u7b97 +HashDbSearchPanel.hashTable.defaultModel.title.text=MD5\u30cf\u30c3\u30b7\u30e5 +AddContentToHashDbAction.addFilesToHashSet.unableToAddFileEmptyMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b{0}\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30d5\u30a1\u30a4\u30eb\u306b\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +AddHashValuesToDatabaseDialog.JDialog.Title=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0\ +HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0 +AddHashValuesToDatabaseDialog.instructionLabel.text_1=\u4e0b\u8a18\u306bMD5\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u8cbc\u308a\u4ed8\u3051\u308b\uff08\u30e9\u30a4\u30f3\u3054\u3068\u306b\u4e00\u3064\u305a\u3064\uff09\uff1a +AddHashValuesToDatabaseDialog.cancelButton.text_2=\u30ad\u30e3\u30f3\u30bb\u30eb +AddHashValuesToDatabaseDialog.AddValuesToHashDatabaseButton.text_2=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0 +AddHashValuesToDatabaseDialog.pasteFromClipboardButton.text_2=\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u304b\u3089\u8cbc\u308a\u4ed8\u3051\u308b AddHashValuesToDatabaseProgressDialog.okButton.text=OK -AddHashValuesToDatabaseProgressDialog.statusLabel.text=\u30B9\u30C6\u30FC\u30BF\u30B9 -AddHashValuesToDatabaseProgressDialog.title=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D7\u30ED\u30B0\u30EC\u30B9\u306B\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0 -AddHashValuesToDatabaseDialog.title=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0 -AddHashValuesToDatabaseProgressDialog.showErrorsButton.text=\u30A8\u30E9\u30FC\u3092\u8868\u793A -AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.parsing=MD5\u30CF\u30C3\u30B7\u30E5\u306B\u30C6\u30AD\u30B9\u30C8\u3092\u30D1\u30FC\u30B9\u4E2D... -AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.invalidHash=\u30A4\u30F3\u30D7\u30C3\u30C8\u306B\u7121\u52B9\u306A\u30CF\u30C3\u30B7\u30E5\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 -AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.invaliHash.msg=\u7121\u52B9\u306A\u30CF\u30C3\u30B7\u30E5\uFF1A -AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.noHashesToAdd=\u8FFD\u52A0\u3059\u308B\u30CF\u30C3\u30B7\u30E5\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.success={0}\u30CF\u30C3\u30B7\u30E5\u304C\u6B63\u3057\u304F\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\u3002 -AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash=\u6709\u52B9\u306A\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash.msg=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u6709\u52B9\u306A\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306B\u30CF\u30C3\u30B7\u30E5\u3092\u8FFD\u52A0 +AddHashValuesToDatabaseProgressDialog.statusLabel.text=\u30b9\u30c6\u30fc\u30bf\u30b9 +AddHashValuesToDatabaseProgressDialog.title=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d7\u30ed\u30b0\u30ec\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0 +AddHashValuesToDatabaseDialog.title=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0 +AddHashValuesToDatabaseProgressDialog.showErrorsButton.text=\u30a8\u30e9\u30fc\u3092\u8868\u793a +AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.parsing=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u30c6\u30ad\u30b9\u30c8\u3092\u30d1\u30fc\u30b9\u4e2d... +AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.invalidHash=\u30a4\u30f3\u30d7\u30c3\u30c8\u306b\u7121\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002 +AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.invaliHash.msg=\u7121\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\uff1a +AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.noHashesToAdd=\u8ffd\u52a0\u3059\u308b\u30cf\u30c3\u30b7\u30e5\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.success={0}\u30cf\u30c3\u30b7\u30e5\u304c\u6b63\u3057\u304f\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 +AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash=\u6709\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash.msg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u6709\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0 diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java index 7ceea59224..b544e41120 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbCreateDatabaseDialog.java @@ -30,6 +30,7 @@ import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JFrame; import org.apache.commons.io.FilenameUtils; +import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb.KnownFilesType; @@ -46,6 +47,7 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { .getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.defaultFileName"); private JFileChooser fileChooser = null; private HashDb newHashDb = null; + private final static String LAST_FILE_PATH_KEY = "HashDbCreate_Path"; /** * Displays a dialog that allows a user to create a new hash database and @@ -273,17 +275,23 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { private void saveAsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveAsButtonActionPerformed try { + String lastBaseDirectory = ""; + if (ModuleSettings.settingExists(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY)) { + lastBaseDirectory = ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY); + } StringBuilder path = new StringBuilder(); + path.append(lastBaseDirectory); if (!hashSetNameTextField.getText().isEmpty()) { - path.append(hashSetNameTextField.getText()); + path.append(File.separator).append(hashSetNameTextField.getText()); } else { - path.append(DEFAULT_FILE_NAME); + path.append(File.separator).append(DEFAULT_FILE_NAME); } path.append(".").append(HashDbManager.getHashDatabaseFileExtension()); fileChooser.setSelectedFile(new File(path.toString())); if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) { File databaseFile = fileChooser.getSelectedFile(); databasePathTextField.setText(databaseFile.getCanonicalPath()); + ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY, databaseFile.getParent()); } } catch (IOException ex) { Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, "Couldn't get selected file path.", ex); //NON-NLS diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java index 24b389e398..43205b7f6b 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashDbImportDatabaseDialog.java @@ -32,6 +32,7 @@ import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.JFrame; import org.sleuthkit.datamodel.TskCoreException; import org.apache.commons.io.FilenameUtils; +import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb.KnownFilesType; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDb; import org.sleuthkit.autopsy.modules.hashdatabase.HashDbManager.HashDbManagerException; @@ -46,6 +47,7 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog { private JFileChooser fileChooser = new JFileChooser(); private String selectedFilePath = ""; private HashDb selectedHashDb = null; + private final static String LAST_FILE_PATH_KEY = "HashDbImport_Path"; /** * Displays a dialog that allows a user to select an existing hash database @@ -249,6 +251,9 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog { }// //GEN-END:initComponents private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openButtonActionPerformed + if (ModuleSettings.settingExists(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY)) { + fileChooser.setCurrentDirectory(new File(ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY))); + } if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { File databaseFile = fileChooser.getSelectedFile(); try { @@ -259,6 +264,7 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog { knownRadioButton.setSelected(true); knownRadioButtonActionPerformed(null); } + ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, LAST_FILE_PATH_KEY, databaseFile.getParent()); } catch (IOException ex) { Logger.getLogger(HashDbImportDatabaseDialog.class.getName()).log(Level.SEVERE, "Failed to get path of selected database", ex); //NON-NLS JOptionPane.showMessageDialog(this, diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java index b422ae048e..73c7b089c7 100644 --- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupSettingsPanel.java @@ -82,8 +82,9 @@ public final class HashLookupSettingsPanel extends IngestModuleGlobalSettingsPan }); } + @NbBundle.Messages({"HashLookupSettingsPanel.Title=Global Hash Lookup Settings"}) private void customizeComponents() { - setName(NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.setName.hashSetConfig")); + setName(Bundle.HashLookupSettingsPanel_Title()); this.ingestWarningLabel.setVisible(false); this.hashSetTable.setModel(hashSetTableModel); this.hashSetTable.setTableHeader(null); diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties index 10dbc8140e..3a1ced09a3 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle.properties @@ -6,14 +6,6 @@ OptionsCategory_Name_InterestingItemDefinitions=Interesting Files OptionsCategory_Keywords_InterestingItemDefinitions=InterestingItemDefinitions InterestingItemsIdentifierIngestModule.moduleName=Interesting Files Identifier InterestingItemsIdentifierIngestModule.moduleDescription=Identifies interesting items as defined by interesting item rule sets. -InterestingItemDefsPanel.newSetButton.text=New Set -InterestingItemDefsPanel.editSetButton.text=Edit Set -InterestingItemDefsPanel.deleteSetButton.text=Delete Set -InterestingItemDefsPanel.newRuleButton.text=New Rule -InterestingItemDefsPanel.editRuleButton.text=Edit Rule -InterestingItemDefsPanel.deleteRuleButton.text=Delete Rule -InterestingItemDefsPanel.setsListLabel.text=Rule Sets -InterestingItemDefsPanel.rulesListLabel.text=Rules: FilesSetPanel.title=Interesting Files Set FilesSetPanel.messages.filesSetsMustBeNamed=Interesting files sets must be named. FilesSetPanel.ignoreKnownFilesCheckbox.text=Ignore Known Files @@ -28,37 +20,48 @@ FilesSetRulePanel.fullNameRadioButton.text=Full Name FilesSetRulePanel.nameRegexCheckbox.text=Regex FilesSetRulePanel.ruleNameTextField.text= FilesSetRulePanel.nameTextField.text= -FilesSetRulePanel.ruleNameLabel.text=Rule Name: -FilesSetRulePanel.messages.emptyNameFilter=You must specify a name pattern for this rule. +FilesSetRulePanel.ruleNameLabel.text=Rule Name (Optional): +FilesSetRulePanel.messages.emptyNameCondition=You must specify a name pattern for this rule. FilesSetRulePanel.messages.invalidNameRegex=The name regular expression is not valid:\n\n{0} FilesSetRulePanel.messages.invalidCharInName=The name cannot contain \\, /, :, *, ?, \", <, or > unless it is a regular expression. FilesSetRulePanel.messages.invalidCharInPath=The path cannot contain \\, :, *, ?, \", <, or > unless it is a regular expression. FilesSetRulePanel.messages.invalidPathRegex=The path regular expression is not valid:\n\n{0} -FilesSetRulePanel.dirsRadioButton.text=Directories -FilesSetRulePanel.filesRadioButton.text=Files -InterestingItemDefsPanel.bothRadioButton.text=Files and Directories -InterestingItemDefsPanel.dirsRadioButton.text=Directories -InterestingItemDefsPanel.filesRadioButton.text=Files -InterestingItemDefsPanel.fileNameRegexCheckbox.text=Regex -InterestingItemDefsPanel.fileNameExtensionRadioButton.text=Extension Only -InterestingItemDefsPanel.fileNameTextField.text= -InterestingItemDefsPanel.fileNameRadioButton.text=File Name InterestingItemDefsPanel.doFileSetsDialog.duplicateRuleSet.text=Rule set with name {0} already exists. FilesSetRulePanel.pathSeparatorInfoLabel.text=Use / as path separator -FilesSetRulePanel.filesAndDirsRadioButton.text=Files and Directories -InterestingItemDefsPanel.rulePathFilterTextField.text= -InterestingItemDefsPanel.rulePathFilterRegexCheckBox.text=Regex -InterestingItemDefsPanel.ignoreKnownFilesCheckbox.text=Ignore Known Files FilesIdentifierIngestJobSettingsPanel.border.title=Select interesting files sets to enable during ingest: -InterestingItemDefsPanel.jLabel1.text=Rule Details -InterestingItemDefsPanel.jLabel2.text=File Type: -InterestingItemDefsPanel.jLabel3.text=Name Pattern -InterestingItemDefsPanel.jLabel4.text=Path Pattern: -InterestingItemDefsPanel.jLabel5.text=Description: -InterestingItemDefsPanel.jLabel6.text=Set Details -FilesSetRulePanel.jLabel1.text=Type*\: -FilesSetRulePanel.jLabel2.text=Name Pattern*: -FilesSetRulePanel.jLabel3.text=Path Pattern: -InterestingItemDefsPanel.jTextArea1.text=This module allows you to find files that match specified criteria. Each set has a list of rules, which will match on file name and parent path patterns. -FilesSetRulePanel.jLabel4.text=* Required +FilesSetRulePanel.jLabel1.text=Type: FilesSetRulePanel.jLabel5.text=Enter information about files that you want to find. +InterestingItemDefsPanel.jLabel6.text=Set Details +InterestingItemDefsPanel.jLabel8.text=File Size: +InterestingItemDefsPanel.jLabel7.text=MIME Type: +InterestingItemDefsPanel.jTextArea1.text=This module allows you to find files that match specified criteria. Each set has a list of rules, which will match on file name and parent path patterns. +InterestingItemDefsPanel.jLabel4.text=Path Pattern: +InterestingItemDefsPanel.jLabel1.text=Rule Details +InterestingItemDefsPanel.dirsRadioButton.text=Directories +InterestingItemDefsPanel.jLabel2.text=File Type: +InterestingItemDefsPanel.newSetButton.text=New Set +InterestingItemDefsPanel.deleteRuleButton.text=Delete Rule +InterestingItemDefsPanel.deleteSetButton.text=Delete Set +InterestingItemDefsPanel.bothRadioButton.text=Files and Directories +InterestingItemDefsPanel.setsListLabel.text=Rule Sets +InterestingItemDefsPanel.fileNameRegexCheckbox.text=Regex +InterestingItemDefsPanel.ignoreKnownFilesCheckbox.text=Ignore Known Files +InterestingItemDefsPanel.fileNameRadioButton.text=File Name +InterestingItemDefsPanel.jLabel5.text=Description: +InterestingItemDefsPanel.fileNameTextField.text= +InterestingItemDefsPanel.jLabel3.text=Name Pattern: +InterestingItemDefsPanel.fileNameExtensionRadioButton.text=Extension Only +InterestingItemDefsPanel.editSetButton.text=Edit Set +InterestingItemDefsPanel.rulesListLabel.text=Rules: +InterestingItemDefsPanel.editRuleButton.text=Edit Rule +InterestingItemDefsPanel.filesRadioButton.text=Files +InterestingItemDefsPanel.newRuleButton.text=New Rule +InterestingItemDefsPanel.rulePathConditionTextField.text= +InterestingItemDefsPanel.rulePathConditionRegexCheckBox.text=Regex +FilesSetRulePanel.nameCheck.text=Name Pattern: +FilesSetRulePanel.pathCheck.text=Path Pattern: +FilesSetRulePanel.mimeCheck.text=MIME Type: +FilesSetRulePanel.fileSizeCheck.text=File Size: +FilesSetRulePanel.filesRadioButton.text=Files +FilesSetRulePanel.dirsRadioButton.text=Directories +FilesSetRulePanel.filesAndDirsRadioButton.text=Files and Directories diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle_ja.properties index 90c0f44998..487925a7b4 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle_ja.properties +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle_ja.properties @@ -1,59 +1,74 @@ -FilesIdentifierIngestJobSettingsPanel.border.title=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306B\u6709\u52B9\u306B\u3059\u308B\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u30BB\u30C3\u30C8\u3092\u9078\u629E\uFF1A +FilesIdentifierIngestJobSettingsPanel.border.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306b\u6709\u52b9\u306b\u3059\u308b\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u3092\u9078\u629e\uff1a FilesSetPanel.descPanel.border.title=\u6982\u8981 FilesSetPanel.descriptionPanel.border.title=\u6982\u8981 -FilesSetPanel.ignoreKnownFilesCheckbox.text=\u65E2\u77E5\u30D5\u30A1\u30A4\u30EB\u3092\u7121\u8996 -FilesSetPanel.messages.filesSetsMustBeNamed=\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u30BB\u30C3\u30C8\u306F\u540D\u524D\u304C\u5FC5\u8981\u3067\u3059\u3002 -FilesSetPanel.nameLabel.text=\u30BB\u30C3\u30C8\u540D\uFF1A -FilesSetPanel.title=\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u30BB\u30C3\u30C8 -FilesSetRulePanel.dirsRadioButton.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA -FilesSetRulePanel.extensionRadioButton.text=\u62E1\u5F35\u5B50\u306E\u307F -FilesSetRulePanel.filesAndDirsRadioButton.text=\u30D5\u30A1\u30A4\u30EB\u304A\u3088\u3073\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA -FilesSetRulePanel.filesRadioButton.text=\u30D5\u30A1\u30A4\u30EB -FilesSetRulePanel.fullNameRadioButton.text=\u30D5\u30EB\u30CD\u30FC\u30E0 -FilesSetRulePanel.jLabel1.text=\u30BF\u30A4\u30D7*\uFF1A -FilesSetRulePanel.jLabel2.text=\u30CD\u30FC\u30E0\u30D1\u30BF\u30FC\u30F3*\uFF1A -FilesSetRulePanel.jLabel3.text=\u30D1\u30B9\u30D1\u30BF\u30FC\u30F3\uFF1A -FilesSetRulePanel.messages.emptyNameFilter=\u3053\u306E\u30EB\u30FC\u30EB\u306F\u30CD\u30FC\u30E0\u30D1\u30BF\u30FC\u30F3\u3092\u7279\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 -FilesSetRulePanel.messages.invalidCharInName=\u6B63\u898F\u8868\u73FE\u4EE5\u5916\u306F\\\u3001/\u3001\:\u3001*\u3001?\u3001"\u3001<\u3001>\u3092\u540D\u524D\u306B\u542B\u3081\u307E\u305B\u3093\u3002 -FilesSetRulePanel.messages.invalidCharInPath=\u6B63\u898F\u8868\u73FE\u4EE5\u5916\u306F\\\u3001\:\u3001*\u3001?\u3001"\u3001<\u3001>\u3092\u30D1\u30B9\u306B\u542B\u3081\u307E\u305B\u3093\u3002 -FilesSetRulePanel.messages.invalidNameRegex=\u6B63\u898F\u8868\u73FE\u306F\u6709\u52B9\u306A\u540D\u524D\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF1A\n\n{0} -FilesSetRulePanel.messages.invalidPathRegex=\u6B63\u898F\u8868\u73FE\u306F\u6709\u52B9\u306A\u30D1\u30B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF1A\n\n{0} -FilesSetRulePanel.nameRegexCheckbox.text=\u6B63\u898F\u8868\u73FE -FilesSetRulePanel.pathRegexCheckBox.text=\u6B63\u898F\u8868\u73FE -FilesSetRulePanel.pathSeparatorInfoLabel.text=/\u3092\u30D1\u30B9\u533A\u5207\u308A\u6587\u5B57\u3068\u3057\u3066\u5229\u7528 -FilesSetRulePanel.ruleNameLabel.text=\u30EB\u30FC\u30EB\u540D\uFF1A -FilesSetRulePanel.title=\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u30BB\u30C3\u30C8\u30EB\u30FC\u30EB -InterestingItemDefsPanel.bothRadioButton.text=\u30D5\u30A1\u30A4\u30EB\u304A\u3088\u3073\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA -InterestingItemDefsPanel.deleteRuleButton.text=\u30EB\u30FC\u30EB\u3092\u524A\u9664 -InterestingItemDefsPanel.deleteSetButton.text=\u30BB\u30C3\u30C8\u3092\u524A\u9664 -InterestingItemDefsPanel.dirsRadioButton.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA -InterestingItemDefsPanel.editRuleButton.text=\u30EB\u30FC\u30EB\u3092\u7DE8\u96C6 -InterestingItemDefsPanel.editSetButton.text=\u30BB\u30C3\u30C8\u3092\u7DE8\u96C6 -InterestingItemDefsPanel.fileNameExtensionRadioButton.text=\u62E1\u5F35\u5B50\u306E\u307F -InterestingItemDefsPanel.fileNameRadioButton.text=\u30D5\u30A1\u30A4\u30EB\u540D -InterestingItemDefsPanel.fileNameRegexCheckbox.text=\u6B63\u898F\u8868\u73FE -InterestingItemDefsPanel.filesRadioButton.text=\u30D5\u30A1\u30A4\u30EB -InterestingItemDefsPanel.ignoreKnownFilesCheckbox.text=\u65E2\u77E5\u30D5\u30A1\u30A4\u30EB\u3092\u7121\u8996 -InterestingItemDefsPanel.jLabel1.text=\u30EB\u30FC\u30EB\u8A73\u7D30 -InterestingItemDefsPanel.jLabel2.text=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\uFF1A -InterestingItemDefsPanel.jLabel3.text=\u30CD\u30FC\u30E0\u30D1\u30BF\u30FC\u30F3 -InterestingItemDefsPanel.jLabel4.text=\u30D1\u30B9\u30D1\u30BF\u30FC\u30F3\uFF1A -InterestingItemDefsPanel.jLabel5.text=\u6982\u8981\uFF1A -InterestingItemDefsPanel.jLabel6.text=\u30BB\u30C3\u30C8\u8A73\u7D30 -InterestingItemDefsPanel.jTextArea1.text=\u6307\u5B9A\u3055\u308C\u305F\u6761\u4EF6\u3068\u4E00\u81F4\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u306E\u304C\u53EF\u80FD\u306A\u30E2\u30B8\u30E5\u30FC\u30EB\u3067\u3059\u3002\u5404\u30BB\u30C3\u30C8\u306B\u306F\u30D5\u30A1\u30A4\u30EB\u540D\u304A\u3088\u3073\u30DA\u30A2\u30EC\u30F3\u30C8\u30D1\u30B9\u30D1\u30BF\u30FC\u30F3\u3092\u3082\u3068\u306B\u4E00\u81F4\u3059\u308B\u3001\u30EB\u30FC\u30EB\u30EA\u30B9\u30C8\u304C\u3042\u308A\u307E\u3059\u3002 -InterestingItemDefsPanel.newRuleButton.text=\u65B0\u898F\u30EB\u30FC\u30EB -InterestingItemDefsPanel.newSetButton.text=\u65B0\u898F\u30BB\u30C3\u30C8 -InterestingItemDefsPanel.rulePathFilterRegexCheckBox.text=\u6B63\u898F\u8868\u73FE -InterestingItemDefsPanel.rulesListLabel.text=\u30EB\u30FC\u30EB\uFF1A -InterestingItemDefsPanel.setsListLabel.text=\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8 -InterestingItemsIdentifierIngestModule.moduleDescription=\u7591\u308F\u3057\u3044\u30A2\u30A4\u30C6\u30E0\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u306E\u5B9A\u7FA9\u3092\u3082\u3068\u306B\u7591\u308F\u3057\u3044\u30A2\u30A4\u30C6\u30E0\u3092\u691C\u77E5\u3057\u307E\u3059\u3002 -InterestingItemsIdentifierIngestModule.moduleName=\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u691C\u77E5 -OpenIDE-Module-Display-Category=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB -OpenIDE-Module-Long-Description=\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u691C\u77E5\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3002\n\n\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u306E\u5B9A\u7FA9\u3092\u3082\u3068\u306B\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u77E5\u3057\u307E\u3059\u3002 -OpenIDE-Module-Name=\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u691C\u77E5 -OpenIDE-Module-Short-Description=\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB\u691C\u77E5\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB -OptionsCategory_Name_InterestingItemDefinitions=\u7591\u308F\u3057\u3044\u30D5\u30A1\u30A4\u30EB -OptionsCategory_Keywords_InterestingItemDefinitions=\u7591\u308F\u3057\u3044\u30A2\u30A4\u30C6\u30E0\u5B9A\u7FA9 -InterestingItemDefsPanel.doFileSetsDialog.duplicateRuleSet.text=\u540D\u524D\u304C{0}\u306E\u30EB\u30FC\u30EB\u30BB\u30C3\u30C8\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002 -FilesSetRulePanel.jLabel4.text=*\u5FC5\u9808 -FilesSetRulePanel.jLabel5.text=\u898B\u3064\u3051\u305F\u3044\u30D5\u30A1\u30A4\u30EB\u306E\u60C5\u5831\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002 \ No newline at end of file +FilesSetPanel.ignoreKnownFilesCheckbox.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\u3092\u7121\u8996 +FilesSetPanel.messages.filesSetsMustBeNamed=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306f\u540d\u524d\u304c\u5fc5\u8981\u3067\u3059\u3002 +FilesSetPanel.nameLabel.text=\u30bb\u30c3\u30c8\u540d\uff1a +FilesSetPanel.title=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8 +FilesSetRulePanel.extensionRadioButton.text=\u62e1\u5f35\u5b50\u306e\u307f +FilesSetRulePanel.fullNameRadioButton.text=\u30d5\u30eb\u30cd\u30fc\u30e0 +FilesSetRulePanel.jLabel1.text=\u30bf\u30a4\u30d7*\uff1a +FilesSetRulePanel.messages.emptyNameCondition=\u3053\u306e\u30eb\u30fc\u30eb\u306f\u30cd\u30fc\u30e0\u30d1\u30bf\u30fc\u30f3\u3092\u7279\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 +FilesSetRulePanel.messages.invalidCharInName=\u6b63\u898f\u8868\u73fe\u4ee5\u5916\u306f\\\u3001/\u3001\:\u3001*\u3001?\u3001"\u3001<\u3001>\u3092\u540d\u524d\u306b\u542b\u3081\u307e\u305b\u3093\u3002 +FilesSetRulePanel.messages.invalidCharInPath=\u6b63\u898f\u8868\u73fe\u4ee5\u5916\u306f\\\u3001\:\u3001*\u3001?\u3001"\u3001<\u3001>\u3092\u30d1\u30b9\u306b\u542b\u3081\u307e\u305b\u3093\u3002 +FilesSetRulePanel.messages.invalidNameRegex=\u6b63\u898f\u8868\u73fe\u306f\u6709\u52b9\u306a\u540d\u524d\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff1a\n\n{0} +FilesSetRulePanel.messages.invalidPathRegex=\u6b63\u898f\u8868\u73fe\u306f\u6709\u52b9\u306a\u30d1\u30b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff1a\n\n{0} +FilesSetRulePanel.nameRegexCheckbox.text=\u6b63\u898f\u8868\u73fe +FilesSetRulePanel.pathRegexCheckBox.text=\u6b63\u898f\u8868\u73fe +FilesSetRulePanel.pathSeparatorInfoLabel.text=/\u3092\u30d1\u30b9\u533a\u5207\u308a\u6587\u5b57\u3068\u3057\u3066\u5229\u7528 +FilesSetRulePanel.ruleNameLabel.text=\u30eb\u30fc\u30eb\u540d\uff1a +FilesSetRulePanel.title=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u30eb\u30fc\u30eb +InterestingItemsIdentifierIngestModule.moduleDescription=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u306e\u5b9a\u7fa9\u3092\u3082\u3068\u306b\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0\u3092\u691c\u77e5\u3057\u307e\u3059\u3002 +InterestingItemsIdentifierIngestModule.moduleName=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u691c\u77e5 +OpenIDE-Module-Display-Category=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb +OpenIDE-Module-Long-Description=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u691c\u77e5\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3002\n\n\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u306e\u5b9a\u7fa9\u3092\u3082\u3068\u306b\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u77e5\u3057\u307e\u3059\u3002 +OpenIDE-Module-Name=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u691c\u77e5 +OpenIDE-Module-Short-Description=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u691c\u77e5\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb +OptionsCategory_Name_InterestingItemDefinitions=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb +OptionsCategory_Keywords_InterestingItemDefinitions=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0\u5b9a\u7fa9 +InterestingItemDefsPanel.doFileSetsDialog.duplicateRuleSet.text=\u540d\u524d\u304c{0}\u306e\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002 +FilesSetRulePanel.jLabel5.text=\u898b\u3064\u3051\u305f\u3044\u30d5\u30a1\u30a4\u30eb\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +InterestingItemDefsPanel.jTextArea1.text=\u6307\u5b9a\u3055\u308c\u305f\u6761\u4ef6\u3068\u4e00\u81f4\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\u3059\u308b\u306e\u304c\u53ef\u80fd\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\u3002\u5404\u30bb\u30c3\u30c8\u306b\u306f\u30d5\u30a1\u30a4\u30eb\u540d\u304a\u3088\u3073\u30da\u30a2\u30ec\u30f3\u30c8\u30d1\u30b9\u30d1\u30bf\u30fc\u30f3\u3092\u3082\u3068\u306b\u4e00\u81f4\u3059\u308b\u3001\u30eb\u30fc\u30eb\u30ea\u30b9\u30c8\u304c\u3042\u308a\u307e\u3059\u3002 + +InterestingItemDefsPanel.jLabel4.text=\u30d1\u30b9\u30d1\u30bf\u30fc\u30f3\uff1a + +InterestingItemDefsPanel.jLabel1.text=\u30eb\u30fc\u30eb\u8a73\u7d30 + +InterestingItemDefsPanel.dirsRadioButton.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea + +InterestingItemDefsPanel.jLabel2.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\uff1a + +InterestingItemDefsPanel.newSetButton.text=\u65b0\u898f\u30bb\u30c3\u30c8 + +InterestingItemDefsPanel.deleteRuleButton.text=\u30eb\u30fc\u30eb\u3092\u524a\u9664 + +InterestingItemDefsPanel.deleteSetButton.text=\u30bb\u30c3\u30c8\u3092\u524a\u9664 + +InterestingItemDefsPanel.bothRadioButton.text=\u30d5\u30a1\u30a4\u30eb\u304a\u3088\u3073\u30c7\u30a3\u30ec\u30af\u30c8\u30ea + +InterestingItemDefsPanel.setsListLabel.text=\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8 + +InterestingItemDefsPanel.fileNameRegexCheckbox.text=\u6b63\u898f\u8868\u73fe + +InterestingItemDefsPanel.ignoreKnownFilesCheckbox.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\u3092\u7121\u8996 + +InterestingItemDefsPanel.fileNameRadioButton.text=\u30d5\u30a1\u30a4\u30eb\u540d + +InterestingItemDefsPanel.jLabel5.text=\u6982\u8981\uff1a + +InterestingItemDefsPanel.jLabel3.text=\u30cd\u30fc\u30e0\u30d1\u30bf\u30fc\u30f3 + +InterestingItemDefsPanel.fileNameExtensionRadioButton.text=\u62e1\u5f35\u5b50\u306e\u307f + +InterestingItemDefsPanel.editSetButton.text=\u30bb\u30c3\u30c8\u3092\u7de8\u96c6 + +InterestingItemDefsPanel.rulesListLabel.text=\u30eb\u30fc\u30eb\uff1a + +InterestingItemDefsPanel.editRuleButton.text=\u30eb\u30fc\u30eb\u3092\u7de8\u96c6 + +InterestingItemDefsPanel.filesRadioButton.text=\u30d5\u30a1\u30a4\u30eb + +InterestingItemDefsPanel.newRuleButton.text=\u65b0\u898f\u30eb\u30fc\u30eb + +InterestingItemDefsPanel.jLabel6.text=\u30bb\u30c3\u30c8\u8a73\u7d30 +InterestingItemDefsPanel.rulePathConditionRegexCheckBox.text=\u6b63\u898f\u8868\u73fe diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestJobSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestJobSettingsPanel.java index a9a17c984e..261b23a3da 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestJobSettingsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestJobSettingsPanel.java @@ -26,6 +26,9 @@ import java.util.TreeMap; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; +import org.openide.util.Exceptions; +import org.openide.util.NbBundle.Messages; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettings; import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel; @@ -33,6 +36,10 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel; * Ingest job settings panel for interesting files identifier ingest modules. */ final class FilesIdentifierIngestJobSettingsPanel extends IngestModuleIngestJobSettingsPanel implements Observer { + @Messages({ + "FilesIdentifierIngestJobSettingsPanel.updateError=Error updating interesting files sets settings file.", + "FilesIdentifierIngestJobSettingsPanel.getError=Error getting interesting files sets from settings file." + }) private final FilesSetsTableModel tableModel; @@ -75,7 +82,12 @@ final class FilesIdentifierIngestJobSettingsPanel extends IngestModuleIngestJobS * Observer.update(). */ List filesSetRows = new ArrayList<>(); - this.filesSetSnapshot = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets()); + try { + this.filesSetSnapshot = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets()); + } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) { + MessageNotifyUtil.Message.error(Bundle.FilesIdentifierIngestJobSettingsPanel_getError()); + this.filesSetSnapshot = new TreeMap<>(); + } for (FilesSet set : this.filesSetSnapshot.values()) { filesSetRows.add(new FilesSetRow(set, settings.interestingFilesSetIsEnabled(set.getName()))); } @@ -130,7 +142,13 @@ final class FilesIdentifierIngestJobSettingsPanel extends IngestModuleIngestJobS // Refresh the view of the interesting files set definitions. List rowModels = new ArrayList<>(); - TreeMap newFilesSetSnapshot = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets()); + TreeMap newFilesSetSnapshot; + try { + newFilesSetSnapshot = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets()); + } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) { + MessageNotifyUtil.Message.error(Bundle.FilesIdentifierIngestJobSettingsPanel_updateError()); + return; + } for (FilesSet set : newFilesSetSnapshot.values()) { if (this.filesSetSnapshot.keySet().contains(set.getName())) { // Preserve the current enabled/diabled state of the set. diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestModule.java index ae93cbbc74..03fb011e48 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestModule.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesIdentifierIngestModule.java @@ -24,7 +24,9 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; +import org.openide.util.Exceptions; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.services.Blackboard; import org.sleuthkit.autopsy.coreutils.Logger; @@ -44,6 +46,9 @@ import org.sleuthkit.datamodel.TskCoreException; * files that match interesting files set definitions. */ final class FilesIdentifierIngestModule implements FileIngestModule { + @Messages({ + "FilesIdentifierIngestModule.getFilesError=Error getting interesting files sets from file." + }) private static final Object sharedResourcesLock = new Object(); private static final Logger logger = Logger.getLogger(FilesIdentifierIngestModule.class.getName()); @@ -77,10 +82,14 @@ final class FilesIdentifierIngestModule implements FileIngestModule { // synchronized definitions manager method eliminates the need // to disable the interesting files set definition UI during ingest. List filesSets = new ArrayList<>(); - for (FilesSet set : InterestingItemDefsManager.getInstance().getInterestingFilesSets().values()) { - if (settings.interestingFilesSetIsEnabled(set.getName())) { - filesSets.add(set); + try { + for (FilesSet set : InterestingItemDefsManager.getInstance().getInterestingFilesSets().values()) { + if (settings.interestingFilesSetIsEnabled(set.getName())) { + filesSets.add(set); + } } + } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) { + throw new IngestModuleException(Bundle.FilesIdentifierIngestModule_getFilesError(), ex); } FilesIdentifierIngestModule.interestingFileSetsByJob.put(context.getJobId(), filesSets); } diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSet.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSet.java index a1fb1fff66..f207e720d2 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSet.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSet.java @@ -18,6 +18,7 @@ */ package org.sleuthkit.autopsy.modules.interestingitems; +import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -35,8 +36,9 @@ import org.sleuthkit.datamodel.TskData; * Interesting files set definition objects are immutable, so they may be safely * published to multiple threads. */ -final class FilesSet { +final class FilesSet implements Serializable { + private static final long serialVersionUID = 1L; private final String name; private final String description; private final boolean ignoreKnownFiles; @@ -135,51 +137,65 @@ final class FilesSet { * A set membership rule for an interesting files set. The immutability of a * rule object allows it to be safely published to multiple threads. */ - static class Rule { + static class Rule implements Serializable { + private static final long serialVersionUID = 1L; private final String uuid; private final String ruleName; - private final FileNameFilter fileNameFilter; - private final MetaTypeFilter metaTypeFilter; - private final ParentPathFilter pathFilter; - private final List filters = new ArrayList<>(); + private final FileNameCondition fileNameCondition; + private final MetaTypeCondition metaTypeCondition; + private final ParentPathCondition pathCondition; + private final MimeTypeCondition mimeTypeCondition; + private final FileSizeCondition fileSizeCondition; + private final List conditions = new ArrayList<>(); /** * Construct an interesting files set membership rule. * - * @param ruleName The name of the rule. - * @param fileNameFilter A file name filter. - * @param metaTypeFilter A file meta-type filter. - * @param pathFilter A file path filter, may be null. + * @param ruleName The name of the rule. Can be empty string. + * @param fileNameCondition A file name condition, may be null. + * @param metaTypeCondition A file meta-type condition. + * @param pathCondition A file path condition, may be null. + * @param mimeTypeCondition A file mime type condition, may be null. + * @param fileSizeCondition A file size condition, may be null. */ - Rule(String ruleName, FileNameFilter fileNameFilter, MetaTypeFilter metaTypeFilter, ParentPathFilter pathFilter) { + Rule(String ruleName, FileNameCondition fileNameCondition, MetaTypeCondition metaTypeCondition, ParentPathCondition pathCondition, MimeTypeCondition mimeTypeCondition, FileSizeCondition fileSizeCondition) { // since ruleName is optional, ruleUUID can be used to uniquely identify a rule. this.uuid = UUID.randomUUID().toString(); + if (metaTypeCondition == null) { + throw new IllegalArgumentException("Interesting files set rule meta-type condition cannot be null"); + } + if (pathCondition == null && fileNameCondition == null && mimeTypeCondition == null && fileSizeCondition == null) { + throw new IllegalArgumentException("Must have at least one condition on rule."); + } - if (ruleName == null) { - throw new IllegalArgumentException("Interesting files set rule name cannot be null"); - } - if (fileNameFilter == null) { - throw new IllegalArgumentException("Interesting files set rule file name filter cannot be null"); - } - if (metaTypeFilter == null) { - throw new IllegalArgumentException("Interesting files set rule meta-type filter cannot be null"); - } this.ruleName = ruleName; /* * The rules are evaluated in the order added. MetaType check is * fastest, so do it first */ - this.metaTypeFilter = metaTypeFilter; - this.filters.add(this.metaTypeFilter); + this.metaTypeCondition = metaTypeCondition; + this.conditions.add(this.metaTypeCondition); - this.fileNameFilter = fileNameFilter; - this.filters.add(fileNameFilter); + this.fileSizeCondition = fileSizeCondition; + if (this.fileSizeCondition != null) { + this.conditions.add(this.fileSizeCondition); + } - this.pathFilter = pathFilter; - if (this.pathFilter != null) { - this.filters.add(this.pathFilter); + this.fileNameCondition = fileNameCondition; + if (this.fileNameCondition != null) { + this.conditions.add(fileNameCondition); + } + + this.mimeTypeCondition = mimeTypeCondition; + if (this.mimeTypeCondition != null) { + this.conditions.add(mimeTypeCondition); + } + + this.pathCondition = pathCondition; + if (this.pathCondition != null) { + this.conditions.add(this.pathCondition); } } @@ -193,30 +209,30 @@ final class FilesSet { } /** - * Get the file name filter for the rule. + * Get the file name condition for the rule. * - * @return A file name filter. + * @return A file name condition. Can be null. */ - FileNameFilter getFileNameFilter() { - return this.fileNameFilter; + FileNameCondition getFileNameCondition() { + return this.fileNameCondition; } /** - * Get the meta-type filter for the rule. + * Get the meta-type condition for the rule. * - * @return A meta-type filter. + * @return A meta-type condition. Can be null. */ - MetaTypeFilter getMetaTypeFilter() { - return this.metaTypeFilter; + MetaTypeCondition getMetaTypeCondition() { + return this.metaTypeCondition; } /** - * Get the path filter for the rule. + * Get the path condition for the rule. * - * @return A path filter, may be null. + * @return A path condition, may be null. */ - ParentPathFilter getPathFilter() { - return this.pathFilter; + ParentPathCondition getPathCondition() { + return this.pathCondition; } /** @@ -227,8 +243,8 @@ final class FilesSet { * @return True if the rule is satisfied, false otherwise. */ boolean isSatisfied(AbstractFile file) { - for (FileAttributeFilter filter : filters) { - if (!filter.passes(file)) { + for (FileAttributeCondition condition : conditions) { + if (!condition.passes(file)) { return false; } } @@ -242,7 +258,19 @@ final class FilesSet { public String toString() { // This override is designed to provide a display name for use with // javax.swing.DefaultListModel. - return this.ruleName + " (" + fileNameFilter.getTextToMatch() + ")"; + if (fileNameCondition != null) { + return this.ruleName + " (" + fileNameCondition.getTextToMatch() + ")"; + } else if (this.pathCondition != null) { + return this.ruleName + " (" + pathCondition.getTextToMatch() + ")"; + } else if (this.mimeTypeCondition != null) { + return this.ruleName + " (" + mimeTypeCondition.getMimeType() + ")"; + } else if (this.fileSizeCondition != null) { + return this.ruleName + " (" + fileSizeCondition.getComparator().getSymbol() + " " + fileSizeCondition.getSizeValue() + + " " + fileSizeCondition.getUnit().getName() + ")"; + } else { + return this.ruleName + " ()"; + } + } /** @@ -253,13 +281,27 @@ final class FilesSet { } /** - * An interface for the file attribute filters of which interesting + * @return the mime type condition. Can be null. + */ + MimeTypeCondition getMimeTypeCondition() { + return mimeTypeCondition; + } + + /** + * @return the file size condition. Can be null. + */ + FileSizeCondition getFileSizeCondition() { + return fileSizeCondition; + } + + /** + * An interface for the file attribute conditions of which interesting * files set membership rules are composed. */ - static interface FileAttributeFilter { + static interface FileAttributeCondition extends Serializable { /** - * Tests whether or not a file satisfies the conditions of a filter. + * Tests whether or not a file satisfies the condition. * * @param file The file to test. * @@ -269,11 +311,193 @@ final class FilesSet { } /** - * A file meta-type filter for an interesting files set membership rule. - * The immutability of a meta-type filter object allows it to be safely - * published to multiple threads. + * A class for checking files based upon their MIME types. */ - static final class MetaTypeFilter implements FileAttributeFilter { + static final class MimeTypeCondition implements FileAttributeCondition { + + private static final long serialVersionUID = 1L; + private final String mimeType; + + /** + * Constructs a MimeTypeCondition + * + * @param mimeType The mime type to condition for + */ + MimeTypeCondition(String mimeType) { + this.mimeType = mimeType; + } + + /** + * @inheritDoc + */ + @Override + public boolean passes(AbstractFile file) { + return this.mimeType.equals(file.getMIMEType()); + } + + /** + * Gets the mime type that is being checked + * + * @return the mime type + */ + String getMimeType() { + return this.mimeType; + } + + } + + /** + * A class for checking whether a file's size is within the + * specifications given (i.e. < N Bytes). + */ + static final class FileSizeCondition implements FileAttributeCondition { + + private static final long serialVersionUID = 1L; + + /** + * Represents a comparison item for file size + */ + static enum COMPARATOR { + + LESS_THAN("<"), + LESS_THAN_EQUAL("≤"), + EQUAL("="), + GREATER_THAN(">"), + GREATER_THAN_EQUAL("≥"); + + private String symbol; + + COMPARATOR(String symbol) { + this.symbol = symbol; + } + + public static COMPARATOR fromSymbol(String symbol) { + if (symbol.equals("<=") || symbol.equals("≤")) { + return LESS_THAN_EQUAL; + } else if (symbol.equals("<")) { + return LESS_THAN; + } else if (symbol.equals("==") || symbol.equals("=")) { + return EQUAL; + } else if (symbol.equals(">")) { + return GREATER_THAN; + } else if (symbol.equals(">=") || symbol.equals("≥")) { + return GREATER_THAN_EQUAL; + } else { + throw new IllegalArgumentException("Invalid symbol"); + } + } + + /** + * @return the symbol + */ + public String getSymbol() { + return symbol; + } + } + + /** + * Represents the units of size + */ + static enum SIZE_UNIT { + + BYTE(1, "Bytes"), + KILOBYTE(1024, "Kilobytes"), + MEGABYTE(1024 * 1024, "Megabytes"), + GIGABYTE(1024 * 1024 * 1024, "Gigabytes"); + private long size; + private String name; + + private SIZE_UNIT(long size, String name) { + this.size = size; + this.name = name; + } + + public long getSize() { + return this.size; + } + + public static SIZE_UNIT fromName(String name) { + for (SIZE_UNIT unit : SIZE_UNIT.values()) { + if (unit.getName().equals(name)) { + return unit; + } + } + throw new IllegalArgumentException("Invalid name for size unit."); + } + + /** + * @return the name + */ + public String getName() { + return name; + } + } + private final COMPARATOR comparator; + private final SIZE_UNIT unit; + private final int sizeValue; + + FileSizeCondition(COMPARATOR comparator, SIZE_UNIT unit, int sizeValue) { + this.comparator = comparator; + this.unit = unit; + this.sizeValue = sizeValue; + } + + /** + * Gets the comparator of this condition + * + * @return the comparator + */ + COMPARATOR getComparator() { + return comparator; + } + + /** + * Gets the unit for the size of this condition + * + * @return the unit + */ + SIZE_UNIT getUnit() { + return unit; + } + + /** + * Gets the size value of this condition + * + * @return the size value + */ + int getSizeValue() { + return sizeValue; + } + + @Override + public boolean passes(AbstractFile file) { + long fileSize = file.getSize(); + long conditionSize = this.getUnit().getSize() * this.getSizeValue(); + switch (this.getComparator()) { + case GREATER_THAN: + return fileSize > conditionSize; + case GREATER_THAN_EQUAL: + return fileSize >= conditionSize; + case LESS_THAN_EQUAL: + return fileSize <= conditionSize; + case LESS_THAN: + return fileSize < conditionSize; + default: + return fileSize == conditionSize; + + } + } + + } + + /** + * A file meta-type condition for an interesting files set membership + * rule. The immutability of a meta-type condition object allows it to + * be safely published to multiple threads. + */ + static final class MetaTypeCondition implements FileAttributeCondition { + + private static final long serialVersionUID = 1L; enum Type { @@ -285,11 +509,11 @@ final class FilesSet { private final Type type; /** - * Construct a meta-type filter. + * Construct a meta-type condition. * * @param metaType The meta-type to match, must. */ - MetaTypeFilter(Type type) { + MetaTypeCondition(Type type) { this.type = type; } @@ -310,9 +534,9 @@ final class FilesSet { } /** - * Gets the meta-type the filter matches. + * Gets the meta-type the condition matches. * - * @return A member of the MetaTypeFilter.Type enumeration. + * @return A member of the MetaTypeCondition.Type enumeration. */ Type getMetaType() { return this.type; @@ -320,20 +544,20 @@ final class FilesSet { } /** - * An interface for file attribute filters that do textual matching. + * An interface for file attribute conditions that do textual matching. */ - static interface TextFilter extends FileAttributeFilter { + static interface TextCondition extends FileAttributeCondition { /** - * Gets the text the filter matches. + * Gets the text the condition matches. * * @return The text. */ String getTextToMatch(); /** - * Queries whether or not the text the filter matches is a regular - * expression. + * Queries whether or not the text the condition matches is a + * regular expression. * * @return True if the text to be matched is a regular expression, * false otherwise. @@ -341,7 +565,7 @@ final class FilesSet { boolean isRegex(); /** - * Determines whether a string of text matches the filter. + * Determines whether a string of text matches the condition. * * @param textToMatch The text string. * @@ -352,19 +576,19 @@ final class FilesSet { } /** - * An abstract base class for file attribute filters that do textual + * An abstract base class for file attribute conditions that do textual * matching. */ - private static abstract class AbstractTextFilter implements TextFilter { + private static abstract class AbstractTextCondition implements TextCondition { private final TextMatcher textMatcher; /** - * Construct a case-insensitive text filter. + * Construct a case-insensitive text condition. * * @param text The text to be matched. */ - AbstractTextFilter(String text, Boolean partialMatch) { + AbstractTextCondition(String text, Boolean partialMatch) { if (partialMatch) { this.textMatcher = new FilesSet.Rule.CaseInsensitivePartialStringComparisionMatcher(text); } else { @@ -373,16 +597,16 @@ final class FilesSet { } /** - * Construct a regular expression text filter. + * Construct a regular expression text condition. * * @param regex The regular expression to be matched. */ - AbstractTextFilter(Pattern regex) { + AbstractTextCondition(Pattern regex) { this.textMatcher = new FilesSet.Rule.RegexMatcher(regex); } /** - * Get the text the filter matches. + * Get the text the condition matches. * * @return The text. */ @@ -392,8 +616,8 @@ final class FilesSet { } /** - * Queries whether or not the text the filter matches is a regular - * expression. + * Queries whether or not the text the condition matches is a + * regular expression. * * @return True if the text to be matched is a regular expression, * false otherwise. @@ -404,7 +628,7 @@ final class FilesSet { } /** - * Determines whether a string of text matches the filter. + * Determines whether a string of text matches the condition. * * @param textToMatch The text string. * @@ -424,27 +648,29 @@ final class FilesSet { } /** - * A file path filter for an interesting files set membership rule. The - * immutability of a path filter object allows it to be safely published - * to multiple threads. + * A file path condition for an interesting files set membership rule. + * The immutability of a path condition object allows it to be safely + * published to multiple threads. */ - static final class ParentPathFilter extends AbstractTextFilter { + static final class ParentPathCondition extends AbstractTextCondition { + + private static final long serialVersionUID = 1L; /** - * Construct a case-insensitive file path filter. + * Construct a case-insensitive file path condition. * * @param path The path to be matched. */ - ParentPathFilter(String path) { + ParentPathCondition(String path) { super(path, true); } /** - * Construct a file path regular expression filter. + * Construct a file path regular expression condition. * * @param path The path regular expression to be matched. */ - ParentPathFilter(Pattern path) { + ParentPathCondition(Pattern path) { super(path); } @@ -459,34 +685,37 @@ final class FilesSet { } /** - * A "tagging" interface to group name and extension filters separately - * from path filters for type safety when constructing rules. + * A "tagging" interface to group name and extension conditions + * separately from path conditions for type safety when constructing + * rules. */ - static interface FileNameFilter extends TextFilter { + static interface FileNameCondition extends TextCondition { } /** - * A file name filter for an interesting files set membership rule. The - * immutability of a file name filter object allows it to be safely - * published to multiple threads. + * A file name condition for an interesting files set membership rule. + * The immutability of a file name condition object allows it to be + * safely published to multiple threads. */ - static final class FullNameFilter extends AbstractTextFilter implements FileNameFilter { + static final class FullNameCondition extends AbstractTextCondition implements FileNameCondition { + + private static final long serialVersionUID = 1L; /** - * Construct a case-insensitive full file name filter. + * Construct a case-insensitive full file name condition. * * @param name The file name to be matched. */ - FullNameFilter(String name) { + FullNameCondition(String name) { super(name, false); } /** - * Construct a full file name regular expression filter. + * Construct a full file name regular expression condition. * * @param name The file name regular expression to be matched. */ - FullNameFilter(Pattern name) { + FullNameCondition(Pattern name) { super(name); } @@ -501,18 +730,20 @@ final class FilesSet { } /** - * A file name extension filter for an interesting files set membership - * rule. The immutability of a file name extension filter object allows - * it to be safely published to multiple threads. + * A file name extension condition for an interesting files set + * membership rule. The immutability of a file name extension condition + * object allows it to be safely published to multiple threads. */ - static final class ExtensionFilter extends AbstractTextFilter implements FileNameFilter { + static final class ExtensionCondition extends AbstractTextCondition implements FileNameCondition { + + private static final long serialVersionUID = 1L; /** - * Construct a case-insensitive file name extension filter. + * Construct a case-insensitive file name extension condition. * * @param extension The file name extension to be matched. */ - ExtensionFilter(String extension) { + ExtensionCondition(String extension) { // If there is a leading ".", strip it since // AbstractFile.getFileNameExtension() returns just the // extension chars and not the dot. @@ -520,12 +751,12 @@ final class FilesSet { } /** - * Construct a file name extension regular expression filter. + * Construct a file name extension regular expression condition. * * @param extension The file name extension regular expression to be * matched. */ - ExtensionFilter(Pattern extension) { + ExtensionCondition(Pattern extension) { super(extension.pattern(), false); } @@ -541,9 +772,9 @@ final class FilesSet { /** * An interface for objects that do textual matches, used to compose a - * text filter. + * text condition. */ - private static interface TextMatcher { + private static interface TextMatcher extends Serializable { /** * Get the text the matcher examines. @@ -577,6 +808,7 @@ final class FilesSet { */ private static class CaseInsensitiveStringComparisionMatcher implements TextMatcher { + private static final long serialVersionUID = 1L; private final String textToMatch; /** @@ -620,6 +852,7 @@ final class FilesSet { */ private static class CaseInsensitivePartialStringComparisionMatcher implements TextMatcher { + private static final long serialVersionUID = 1L; private final String textToMatch; private final Pattern pattern; @@ -664,6 +897,7 @@ final class FilesSet { */ private static class RegexMatcher implements TextMatcher { + private static final long serialVersionUID = 1L; private final Pattern regex; /** diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetRulePanel.form b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetRulePanel.form index dbc69c5ac9..72b506199a 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetRulePanel.form +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetRulePanel.form @@ -23,61 +23,82 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - + + - - + + + + + + + + + - - - - - - + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - + @@ -85,17 +106,17 @@ - + - + - + - + @@ -106,20 +127,31 @@ - + - + - + + + + + + + + + + + + + - @@ -138,6 +170,9 @@ + + + @@ -146,17 +181,167 @@ - + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -172,6 +357,19 @@ + + + + + + + + + + + + + @@ -185,91 +383,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetRulePanel.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetRulePanel.java index f45b4e8287..fba97d318b 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetRulePanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/FilesSetRulePanel.java @@ -18,14 +18,27 @@ */ package org.sleuthkit.autopsy.modules.interestingitems; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.SortedSet; import java.util.logging.Level; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import org.apache.tika.mime.MediaType; +import org.apache.tika.mime.MimeTypes; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.coreutils.Logger; +import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector; /** * A panel that allows a user to create and edit interesting files set @@ -33,17 +46,34 @@ import org.sleuthkit.autopsy.coreutils.Logger; */ final class FilesSetRulePanel extends javax.swing.JPanel { + @Messages({ + "FilesSetRulePanel.bytes=Bytes", + "FilesSetRulePanel.kiloBytes=Kilobytes", + "FilesSetRulePanel.megaBytes=Megabytes", + "FilesSetRulePanel.gigaBytes=Gigabytes", + "FilesSetRulePanel.NoConditionError=Must have at least one condition to make a rule.", + "FilesSetRulePanel.NoMimeTypeError=Please select a valid MIME type.", + "FilesSetRulePanel.NoNameError=Name cannot be empty", + "FilesSetRulePanel.NoPathError=Path cannot be empty", + "FilesSetRulePanel.ZeroFileSizeError=File size condition value must not be 0 (Unless = is selected)." + }) + + private static final SortedSet mediaTypes = MimeTypes.getDefaultMimeTypes().getMediaTypeRegistry().getTypes(); private static final Logger logger = Logger.getLogger(FilesSetRulePanel.class.getName()); private static final String SLEUTHKIT_PATH_SEPARATOR = "/"; // NON-NLS private static final List ILLEGAL_FILE_NAME_CHARS = InterestingItemDefsManager.getIllegalFileNameChars(); private static final List ILLEGAL_FILE_PATH_CHARS = InterestingItemDefsManager.getIllegalFilePathChars(); + private JButton okButton; + private JButton cancelButton; /** * Constructs a files set rule panel in create rule mode. */ - FilesSetRulePanel() { + FilesSetRulePanel(JButton okButton, JButton cancelButton) { initComponents(); + populateMimeTypesComboBox(); populateComponentsWithDefaultValues(); + this.setButtons(okButton, cancelButton); } /** @@ -51,12 +81,16 @@ final class FilesSetRulePanel extends javax.swing.JPanel { * * @param rule The files set rule to be edited. */ - FilesSetRulePanel(FilesSet.Rule rule) { + FilesSetRulePanel(FilesSet.Rule rule, JButton okButton, JButton cancelButton) { initComponents(); + populateMimeTypesComboBox(); populateRuleNameComponent(rule); - populateTypeFilterComponents(rule); - populateNameFilterComponents(rule); - populatePathFilterComponents(rule); + populateTypeConditionComponents(rule); + populateNameConditionComponents(rule); + populatePathConditionComponents(rule); + populateMimeConditionComponents(rule); + populateSizeConditionComponents(rule); + this.setButtons(okButton, cancelButton); } /** @@ -65,6 +99,40 @@ final class FilesSetRulePanel extends javax.swing.JPanel { private void populateComponentsWithDefaultValues() { this.filesRadioButton.setSelected(true); this.fullNameRadioButton.setSelected(true); + this.equalitySymbolComboBox.setSelectedItem(FilesSet.Rule.FileSizeCondition.COMPARATOR.GREATER_THAN_EQUAL.getSymbol()); + this.fileSizeComboBox.setSelectedItem(FilesSet.Rule.FileSizeCondition.SIZE_UNIT.KILOBYTE.getName()); + this.mimeTypeComboBox.setSelectedIndex(0); + } + + private void populateMimeTypesComboBox() { + Set fileTypesCollated = new HashSet<>(); + for (MediaType mediaType : mediaTypes) { + fileTypesCollated.add(mediaType.toString()); + } + + FileTypeDetector fileTypeDetector; + try { + fileTypeDetector = new FileTypeDetector(); + List userDefinedFileTypes = fileTypeDetector.getUserDefinedTypes(); + fileTypesCollated.addAll(userDefinedFileTypes); + + } catch (FileTypeDetector.FileTypeDetectorInitException ex) { + logger.log(Level.SEVERE, "Unable to get user defined file types", ex); + } + + List toSort = new ArrayList<>(fileTypesCollated); + toSort.sort((String string1, String string2) -> { + int result = String.CASE_INSENSITIVE_ORDER.compare(string1, string2); + if (result == 0) { + result = string1.compareTo(string2); + } + return result; + }); + + for (String file : toSort) { + mimeTypeComboBox.addItem(file); + } + this.setOkButton(); } /** @@ -76,14 +144,88 @@ final class FilesSetRulePanel extends javax.swing.JPanel { this.ruleNameTextField.setText(rule.getName()); } + private void populateMimeConditionComponents(FilesSet.Rule rule) { + FilesSet.Rule.MimeTypeCondition mimeTypeCondition = rule.getMimeTypeCondition(); + if (mimeTypeCondition != null) { + this.mimeCheck.setSelected(true); + this.mimeCheckActionPerformed(null); + this.mimeTypeComboBox.setSelectedItem(mimeTypeCondition.getMimeType()); + } + } + private void populateSizeConditionComponents(FilesSet.Rule rule) { + FilesSet.Rule.FileSizeCondition fileSizeCondition = rule.getFileSizeCondition(); + if (fileSizeCondition != null) { + this.fileSizeCheck.setSelected(true); + this.fileSizeCheckActionPerformed(null); + this.fileSizeSpinner.setValue(fileSizeCondition.getSizeValue()); + this.fileSizeComboBox.setSelectedItem(fileSizeCondition.getUnit().getName()); + this.equalitySymbolComboBox.setSelectedItem(fileSizeCondition.getComparator().getSymbol()); + } + } + /** - * Populates the UI components that display the meta-type filter for a rule. + * Sets whether or not the OK button should be enabled based upon other UI + * elements + */ + private void setOkButton() { + if (this.okButton != null) { + this.okButton.setEnabled(this.fileSizeCheck.isSelected() || this.mimeCheck.isSelected() + || this.nameCheck.isSelected() || this.pathCheck.isSelected()); + } + } + + /** + * Gets the JOptionPane that is used to contain this panel if there is one + * + * @param parent + * + * @return + */ + private JOptionPane getOptionPane(JComponent parent) { + JOptionPane pane = null; + if (!(parent instanceof JOptionPane)) { + pane = getOptionPane((JComponent) parent.getParent()); + } else { + pane = (JOptionPane) parent; + } + return pane; + } + + /** + * Sets the buttons for ending the panel + * + * @param ok The ok button + * @param cancel The cancel button + */ + private void setButtons(JButton ok, JButton cancel) { + this.okButton = ok; + this.cancelButton = cancel; + okButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JOptionPane pane = getOptionPane(okButton); + pane.setValue(okButton); + } + }); + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JOptionPane pane = getOptionPane(cancelButton); + pane.setValue(cancelButton); + } + }); + this.setOkButton(); + } + + /** + * Populates the UI components that display the meta-type condition for a + * rule. * * @param rule The files set rule to be edited. */ - private void populateTypeFilterComponents(FilesSet.Rule rule) { - FilesSet.Rule.MetaTypeFilter typeFilter = rule.getMetaTypeFilter(); - switch (typeFilter.getMetaType()) { + private void populateTypeConditionComponents(FilesSet.Rule rule) { + FilesSet.Rule.MetaTypeCondition typeCondition = rule.getMetaTypeCondition(); + switch (typeCondition.getMetaType()) { case FILES: this.filesRadioButton.setSelected(true); break; @@ -97,32 +239,38 @@ final class FilesSetRulePanel extends javax.swing.JPanel { } /** - * Populates the UI components that display the name filter for a rule. + * Populates the UI components that display the name condition for a rule. * * @param rule The files set rule to be edited. */ - private void populateNameFilterComponents(FilesSet.Rule rule) { - FilesSet.Rule.FileNameFilter nameFilter = rule.getFileNameFilter(); - this.nameTextField.setText(nameFilter.getTextToMatch()); - this.nameRegexCheckbox.setSelected(nameFilter.isRegex()); - if (nameFilter instanceof FilesSet.Rule.FullNameFilter) { - this.fullNameRadioButton.setSelected(true); - } else { - this.extensionRadioButton.setSelected(true); + private void populateNameConditionComponents(FilesSet.Rule rule) { + FilesSet.Rule.FileNameCondition nameCondition = rule.getFileNameCondition(); + if (nameCondition != null) { + this.nameCheck.setSelected(true); + this.nameCheckActionPerformed(null); + this.nameTextField.setText(nameCondition.getTextToMatch()); + this.nameRegexCheckbox.setSelected(nameCondition.isRegex()); + if (nameCondition instanceof FilesSet.Rule.FullNameCondition) { + this.fullNameRadioButton.setSelected(true); + } else { + this.extensionRadioButton.setSelected(true); + } } } /** - * Populates the UI components that display the optional path filter for a - * rule. + * Populates the UI components that display the optional path condition for + * a rule. * * @param rule The files set rule to be edited. */ - private void populatePathFilterComponents(FilesSet.Rule rule) { - FilesSet.Rule.ParentPathFilter pathFilter = rule.getPathFilter(); - if (pathFilter != null) { - this.pathTextField.setText(pathFilter.getTextToMatch()); - this.pathRegexCheckBox.setSelected(pathFilter.isRegex()); + private void populatePathConditionComponents(FilesSet.Rule rule) { + FilesSet.Rule.ParentPathCondition pathCondition = rule.getPathCondition(); + if (pathCondition != null) { + this.pathCheck.setSelected(true); + this.pathCheckActionPerformed(null); + this.pathTextField.setText(pathCondition.getTextToMatch()); + this.pathRegexCheckBox.setSelected(pathCondition.isRegex()); } } @@ -135,40 +283,55 @@ final class FilesSetRulePanel extends javax.swing.JPanel { */ boolean isValidRuleDefinition() { - // The rule must have name filter text. - if (this.nameTextField.getText().isEmpty()) { + if (!(this.mimeCheck.isSelected() || this.fileSizeCheck.isSelected() || this.pathCheck.isSelected() || this.nameCheck.isSelected())) { NotifyDescriptor notifyDesc = new NotifyDescriptor.Message( - NbBundle.getMessage(FilesSetPanel.class, "FilesSetRulePanel.messages.emptyNameFilter"), + Bundle.FilesSetRulePanel_NoConditionError(), NotifyDescriptor.WARNING_MESSAGE); DialogDisplayer.getDefault().notify(notifyDesc); return false; } - // The name filter must either be a regular expression that compiles or - // a string without illegal file name chars. - if (this.nameRegexCheckbox.isSelected()) { - try { - Pattern.compile(this.nameTextField.getText()); - } catch (PatternSyntaxException ex) { + if (this.nameCheck.isSelected()) { + // The name condition must either be a regular expression that compiles or + // a string without illegal file name chars. + if (this.nameTextField.getText().isEmpty()) { NotifyDescriptor notifyDesc = new NotifyDescriptor.Message( - NbBundle.getMessage(FilesSetPanel.class, "FilesSetRulePanel.messages.invalidNameRegex", ex.getLocalizedMessage()), + Bundle.FilesSetRulePanel_NoNameError(), NotifyDescriptor.WARNING_MESSAGE); DialogDisplayer.getDefault().notify(notifyDesc); return false; } - } else { - if (!FilesSetRulePanel.containsOnlyLegalChars(this.nameTextField.getText(), FilesSetRulePanel.ILLEGAL_FILE_NAME_CHARS)) { - NotifyDescriptor notifyDesc = new NotifyDescriptor.Message( - NbBundle.getMessage(FilesSetPanel.class, "FilesSetRulePanel.messages.invalidCharInName"), - NotifyDescriptor.WARNING_MESSAGE); - DialogDisplayer.getDefault().notify(notifyDesc); - return false; + if (this.nameRegexCheckbox.isSelected()) { + try { + Pattern.compile(this.nameTextField.getText()); + } catch (PatternSyntaxException ex) { + NotifyDescriptor notifyDesc = new NotifyDescriptor.Message( + NbBundle.getMessage(FilesSetPanel.class, "FilesSetRulePanel.messages.invalidNameRegex", ex.getLocalizedMessage()), + NotifyDescriptor.WARNING_MESSAGE); + DialogDisplayer.getDefault().notify(notifyDesc); + return false; + } + } else { + if (this.nameTextField.getText().isEmpty() || !FilesSetRulePanel.containsOnlyLegalChars(this.nameTextField.getText(), FilesSetRulePanel.ILLEGAL_FILE_NAME_CHARS)) { + NotifyDescriptor notifyDesc = new NotifyDescriptor.Message( + NbBundle.getMessage(FilesSetPanel.class, "FilesSetRulePanel.messages.invalidCharInName"), + NotifyDescriptor.WARNING_MESSAGE); + DialogDisplayer.getDefault().notify(notifyDesc); + return false; + } } } - // The path filter, if specified, must either be a regular expression - // that compiles or a string without illegal file path chars. - if (!this.pathTextField.getText().isEmpty()) { + // The path condition, if specified, must either be a regular expression + // that compiles or a string without illegal file path chars. + if (this.pathCheck.isSelected()) { + if (this.pathTextField.getText().isEmpty()) { + NotifyDescriptor notifyDesc = new NotifyDescriptor.Message( + Bundle.FilesSetRulePanel_NoPathError(), + NotifyDescriptor.WARNING_MESSAGE); + DialogDisplayer.getDefault().notify(notifyDesc); + return false; + } if (this.pathRegexCheckBox.isSelected()) { try { Pattern.compile(this.pathTextField.getText()); @@ -180,7 +343,7 @@ final class FilesSetRulePanel extends javax.swing.JPanel { return false; } } else { - if (!FilesSetRulePanel.containsOnlyLegalChars(this.pathTextField.getText(), FilesSetRulePanel.ILLEGAL_FILE_PATH_CHARS)) { + if (this.pathTextField.getText().isEmpty() || !FilesSetRulePanel.containsOnlyLegalChars(this.pathTextField.getText(), FilesSetRulePanel.ILLEGAL_FILE_PATH_CHARS)) { NotifyDescriptor notifyDesc = new NotifyDescriptor.Message( NbBundle.getMessage(FilesSetPanel.class, "FilesSetRulePanel.messages.invalidCharInPath"), NotifyDescriptor.WARNING_MESSAGE); @@ -189,6 +352,24 @@ final class FilesSetRulePanel extends javax.swing.JPanel { } } } + if (this.mimeCheck.isSelected()) { + if (this.mimeTypeComboBox.getSelectedIndex() == 0) { + NotifyDescriptor notifyDesc = new NotifyDescriptor.Message( + Bundle.FilesSetRulePanel_NoMimeTypeError(), + NotifyDescriptor.WARNING_MESSAGE); + DialogDisplayer.getDefault().notify(notifyDesc); + return false; + } + } + if (this.fileSizeCheck.isSelected()) { + if ((Integer) this.fileSizeSpinner.getValue() == 0 && !((String)this.equalitySymbolComboBox.getSelectedItem()).equals("=")) { + NotifyDescriptor notifyDesc = new NotifyDescriptor.Message( + Bundle.FilesSetRulePanel_ZeroFileSizeError(), + NotifyDescriptor.WARNING_MESSAGE); + DialogDisplayer.getDefault().notify(notifyDesc); + return false; + } + } return true; } @@ -203,76 +384,108 @@ final class FilesSetRulePanel extends javax.swing.JPanel { } /** - * Gets the name filter for the rule that was created or edited. Should only - * be called if isValidDefintion() returns true. + * Gets the name condition for the rule that was created or edited. Should + * only be called if isValidDefintion() returns true. * - * @return A name filter. + * @return A name condition. * - * @throws IllegalStateException if the specified name filter is not valid. + * @throws IllegalStateException if the specified name condition is not + * valid. */ - FilesSet.Rule.FileNameFilter getFileNameFilter() throws IllegalStateException { - FilesSet.Rule.FileNameFilter filter = null; + FilesSet.Rule.FileNameCondition getFileNameCondition() throws IllegalStateException { + FilesSet.Rule.FileNameCondition condition = null; if (!this.nameTextField.getText().isEmpty()) { if (this.nameRegexCheckbox.isSelected()) { try { Pattern pattern = Pattern.compile(this.nameTextField.getText()); if (this.fullNameRadioButton.isSelected()) { - filter = new FilesSet.Rule.FullNameFilter(pattern); + condition = new FilesSet.Rule.FullNameCondition(pattern); } else { - filter = new FilesSet.Rule.ExtensionFilter(pattern); + condition = new FilesSet.Rule.ExtensionCondition(pattern); } } catch (PatternSyntaxException ex) { - logger.log(Level.SEVERE, "Attempt to get regex name filter that does not compile", ex); // NON-NLS - throw new IllegalStateException("The files set rule panel name filter is not in a valid state"); // NON-NLS + logger.log(Level.SEVERE, "Attempt to get regex name condition that does not compile", ex); // NON-NLS + throw new IllegalStateException("The files set rule panel name condition is not in a valid state"); // NON-NLS } } else { if (FilesSetRulePanel.containsOnlyLegalChars(this.nameTextField.getText(), FilesSetRulePanel.ILLEGAL_FILE_NAME_CHARS)) { if (this.fullNameRadioButton.isSelected()) { - filter = new FilesSet.Rule.FullNameFilter(this.nameTextField.getText()); + condition = new FilesSet.Rule.FullNameCondition(this.nameTextField.getText()); } else { - filter = new FilesSet.Rule.ExtensionFilter(this.nameTextField.getText()); + condition = new FilesSet.Rule.ExtensionCondition(this.nameTextField.getText()); } } else { - logger.log(Level.SEVERE, "Attempt to get name filter with illegal chars"); // NON-NLS - throw new IllegalStateException("The files set rule panel name filter is not in a valid state"); // NON-NLS + logger.log(Level.SEVERE, "Attempt to get name condition with illegal chars"); // NON-NLS + throw new IllegalStateException("The files set rule panel name condition is not in a valid state"); // NON-NLS } } } - return filter; + return condition; } /** - * Gets the file meta-type filter for the rule that was created or edited. + * Gets the mime type condition based upon the panel input * - * @return A type filter. + * @return the mime type condition, null if no condition is specified */ - FilesSet.Rule.MetaTypeFilter getMetaTypeFilter() { + FilesSet.Rule.MimeTypeCondition getMimeTypeCondition() { + FilesSet.Rule.MimeTypeCondition condition = null; + if (!this.mimeTypeComboBox.getSelectedItem().equals("")) { + condition = new FilesSet.Rule.MimeTypeCondition((String) this.mimeTypeComboBox.getSelectedItem()); + } + return condition; + } + + /** + * Gets the file size condition created based upon the panel input + * + * @return the file size condition, null if no condition is specified + */ + FilesSet.Rule.FileSizeCondition getFileSizeCondition() { + FilesSet.Rule.FileSizeCondition condition = null; + if ((Integer) this.fileSizeSpinner.getValue() != 0 || ((String)this.equalitySymbolComboBox.getSelectedItem()).equals("=")) { + FilesSet.Rule.FileSizeCondition.COMPARATOR comparator = FilesSet.Rule.FileSizeCondition.COMPARATOR.fromSymbol((String) this.equalitySymbolComboBox.getSelectedItem()); + FilesSet.Rule.FileSizeCondition.SIZE_UNIT unit = FilesSet.Rule.FileSizeCondition.SIZE_UNIT.fromName((String) this.fileSizeComboBox.getSelectedItem()); + int fileSizeValue = (Integer) this.fileSizeSpinner.getValue(); + condition = new FilesSet.Rule.FileSizeCondition(comparator, unit, fileSizeValue); + } + return condition; + } + + /** + * Gets the file meta-type condition for the rule that was created or + * edited. + * + * @return A type condition. + */ + FilesSet.Rule.MetaTypeCondition getMetaTypeCondition() { if (this.filesRadioButton.isSelected()) { - return new FilesSet.Rule.MetaTypeFilter(FilesSet.Rule.MetaTypeFilter.Type.FILES); + return new FilesSet.Rule.MetaTypeCondition(FilesSet.Rule.MetaTypeCondition.Type.FILES); } else if (this.dirsRadioButton.isSelected()) { - return new FilesSet.Rule.MetaTypeFilter(FilesSet.Rule.MetaTypeFilter.Type.DIRECTORIES); + return new FilesSet.Rule.MetaTypeCondition(FilesSet.Rule.MetaTypeCondition.Type.DIRECTORIES); } else { - return new FilesSet.Rule.MetaTypeFilter(FilesSet.Rule.MetaTypeFilter.Type.FILES_AND_DIRECTORIES); + return new FilesSet.Rule.MetaTypeCondition(FilesSet.Rule.MetaTypeCondition.Type.FILES_AND_DIRECTORIES); } } /** - * Gets the optional path filter for the rule that was created or edited. + * Gets the optional path condition for the rule that was created or edited. * Should only be called if isValidDefintion() returns true. * - * @return A path filter or null if no path filter was specified. + * @return A path condition or null if no path condition was specified. * - * @throws IllegalStateException if the specified path filter is not valid. + * @throws IllegalStateException if the specified path condition is not + * valid. */ - FilesSet.Rule.ParentPathFilter getPathFilter() throws IllegalStateException { - FilesSet.Rule.ParentPathFilter filter = null; + FilesSet.Rule.ParentPathCondition getPathCondition() throws IllegalStateException { + FilesSet.Rule.ParentPathCondition condition = null; if (!this.pathTextField.getText().isEmpty()) { if (this.pathRegexCheckBox.isSelected()) { try { - filter = new FilesSet.Rule.ParentPathFilter(Pattern.compile(this.pathTextField.getText())); + condition = new FilesSet.Rule.ParentPathCondition(Pattern.compile(this.pathTextField.getText())); } catch (PatternSyntaxException ex) { - logger.log(Level.SEVERE, "Attempt to get malformed path filter", ex); // NON-NLS - throw new IllegalStateException("The files set rule panel path filter is not in a valid state"); // NON-NLS + logger.log(Level.SEVERE, "Attempt to get malformed path condition", ex); // NON-NLS + throw new IllegalStateException("The files set rule panel path condition is not in a valid state"); // NON-NLS } } else { String path = this.pathTextField.getText(); @@ -285,14 +498,14 @@ final class FilesSetRulePanel extends javax.swing.JPanel { if (!path.endsWith(FilesSetRulePanel.SLEUTHKIT_PATH_SEPARATOR)) { path += FilesSetRulePanel.SLEUTHKIT_PATH_SEPARATOR; } - filter = new FilesSet.Rule.ParentPathFilter(path); + condition = new FilesSet.Rule.ParentPathCondition(path); } else { - logger.log(Level.SEVERE, "Attempt to get path filter with illegal chars"); // NON-NLS - throw new IllegalStateException("The files set rule panel path filter is not in a valid state"); // NON-NLS + logger.log(Level.SEVERE, "Attempt to get path condition with illegal chars"); // NON-NLS + throw new IllegalStateException("The files set rule panel path condition is not in a valid state"); // NON-NLS } } } - return filter; + return condition; } /** @@ -314,15 +527,28 @@ final class FilesSetRulePanel extends javax.swing.JPanel { } /** - * Sets the state of the name filter UI components consistent with the state - * of the UI components in the type button group. + * Sets the state of the name condition UI components consistent with the + * state of the UI components in the type button group. */ private void setComponentsForSearchType() { if (!this.filesRadioButton.isSelected()) { this.fullNameRadioButton.setSelected(true); this.extensionRadioButton.setEnabled(false); + this.mimeTypeComboBox.setEnabled(false); + this.mimeTypeComboBox.setSelectedIndex(0); + this.equalitySymbolComboBox.setEnabled(false); + this.fileSizeComboBox.setEnabled(false); + this.fileSizeSpinner.setEnabled(false); + this.fileSizeSpinner.setValue(0); + this.fileSizeCheck.setEnabled(false); + this.fileSizeCheck.setSelected(false); + this.mimeCheck.setEnabled(false); + this.mimeCheck.setSelected(false); + } else { this.extensionRadioButton.setEnabled(true); + this.fileSizeCheck.setEnabled(true); + this.mimeCheck.setEnabled(true); } } @@ -340,32 +566,106 @@ final class FilesSetRulePanel extends javax.swing.JPanel { ruleNameLabel = new javax.swing.JLabel(); ruleNameTextField = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); - dirsRadioButton = new javax.swing.JRadioButton(); - filesRadioButton = new javax.swing.JRadioButton(); - filesAndDirsRadioButton = new javax.swing.JRadioButton(); - jLabel2 = new javax.swing.JLabel(); nameTextField = new javax.swing.JTextField(); fullNameRadioButton = new javax.swing.JRadioButton(); extensionRadioButton = new javax.swing.JRadioButton(); nameRegexCheckbox = new javax.swing.JCheckBox(); - jLabel3 = new javax.swing.JLabel(); pathTextField = new javax.swing.JTextField(); pathRegexCheckBox = new javax.swing.JCheckBox(); pathSeparatorInfoLabel = new javax.swing.JLabel(); - jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); + mimeTypeComboBox = new javax.swing.JComboBox(); + equalitySymbolComboBox = new javax.swing.JComboBox(); + fileSizeComboBox = new javax.swing.JComboBox(); + fileSizeSpinner = new javax.swing.JSpinner(); + nameCheck = new javax.swing.JCheckBox(); + pathCheck = new javax.swing.JCheckBox(); + mimeCheck = new javax.swing.JCheckBox(); + fileSizeCheck = new javax.swing.JCheckBox(); + filesRadioButton = new javax.swing.JRadioButton(); + dirsRadioButton = new javax.swing.JRadioButton(); + filesAndDirsRadioButton = new javax.swing.JRadioButton(); org.openide.awt.Mnemonics.setLocalizedText(ruleNameLabel, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.ruleNameLabel.text")); // NOI18N ruleNameTextField.setText(org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.ruleNameTextField.text")); // NOI18N + ruleNameTextField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ruleNameTextFieldActionPerformed(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.jLabel1.text")); // NOI18N - typeButtonGroup.add(dirsRadioButton); - org.openide.awt.Mnemonics.setLocalizedText(dirsRadioButton, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.dirsRadioButton.text")); // NOI18N - dirsRadioButton.addActionListener(new java.awt.event.ActionListener() { + nameTextField.setText(org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.nameTextField.text")); // NOI18N + nameTextField.setEnabled(false); + + nameButtonGroup.add(fullNameRadioButton); + org.openide.awt.Mnemonics.setLocalizedText(fullNameRadioButton, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.fullNameRadioButton.text")); // NOI18N + fullNameRadioButton.setEnabled(false); + fullNameRadioButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - dirsRadioButtonActionPerformed(evt); + fullNameRadioButtonActionPerformed(evt); + } + }); + + nameButtonGroup.add(extensionRadioButton); + org.openide.awt.Mnemonics.setLocalizedText(extensionRadioButton, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.extensionRadioButton.text")); // NOI18N + extensionRadioButton.setEnabled(false); + + org.openide.awt.Mnemonics.setLocalizedText(nameRegexCheckbox, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.nameRegexCheckbox.text")); // NOI18N + nameRegexCheckbox.setEnabled(false); + + pathTextField.setText(org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.pathTextField.text")); // NOI18N + pathTextField.setEnabled(false); + + org.openide.awt.Mnemonics.setLocalizedText(pathRegexCheckBox, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.pathRegexCheckBox.text")); // NOI18N + pathRegexCheckBox.setEnabled(false); + + pathSeparatorInfoLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/info-icon-16.png"))); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(pathSeparatorInfoLabel, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.pathSeparatorInfoLabel.text")); // NOI18N + pathSeparatorInfoLabel.setEnabled(false); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.jLabel5.text")); // NOI18N + + mimeTypeComboBox.setEditable(true); + mimeTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] {""})); + mimeTypeComboBox.setEnabled(false); + + equalitySymbolComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "=", ">", "≥", "<", "≤" })); + equalitySymbolComboBox.setEnabled(false); + + fileSizeComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { Bundle.FilesSetRulePanel_bytes(), Bundle.FilesSetRulePanel_kiloBytes(), Bundle.FilesSetRulePanel_megaBytes(), Bundle.FilesSetRulePanel_gigaBytes() })); + fileSizeComboBox.setEnabled(false); + + fileSizeSpinner.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(0), Integer.valueOf(0), null, Integer.valueOf(1))); + fileSizeSpinner.setEnabled(false); + + org.openide.awt.Mnemonics.setLocalizedText(nameCheck, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.nameCheck.text")); // NOI18N + nameCheck.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + nameCheckActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(pathCheck, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.pathCheck.text")); // NOI18N + pathCheck.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + pathCheckActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(mimeCheck, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.mimeCheck.text")); // NOI18N + mimeCheck.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + mimeCheckActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(fileSizeCheck, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.fileSizeCheck.text")); // NOI18N + fileSizeCheck.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + fileSizeCheckActionPerformed(evt); } }); @@ -377,6 +677,14 @@ final class FilesSetRulePanel extends javax.swing.JPanel { } }); + typeButtonGroup.add(dirsRadioButton); + org.openide.awt.Mnemonics.setLocalizedText(dirsRadioButton, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.dirsRadioButton.text")); // NOI18N + dirsRadioButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + dirsRadioButtonActionPerformed(evt); + } + }); + typeButtonGroup.add(filesAndDirsRadioButton); org.openide.awt.Mnemonics.setLocalizedText(filesAndDirsRadioButton, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.filesAndDirsRadioButton.text")); // NOI18N filesAndDirsRadioButton.addActionListener(new java.awt.event.ActionListener() { @@ -385,93 +693,85 @@ final class FilesSetRulePanel extends javax.swing.JPanel { } }); - org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.jLabel2.text")); // NOI18N - - nameTextField.setText(org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.nameTextField.text")); // NOI18N - - nameButtonGroup.add(fullNameRadioButton); - org.openide.awt.Mnemonics.setLocalizedText(fullNameRadioButton, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.fullNameRadioButton.text")); // NOI18N - - nameButtonGroup.add(extensionRadioButton); - org.openide.awt.Mnemonics.setLocalizedText(extensionRadioButton, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.extensionRadioButton.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(nameRegexCheckbox, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.nameRegexCheckbox.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.jLabel3.text")); // NOI18N - - pathTextField.setText(org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.pathTextField.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(pathRegexCheckBox, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.pathRegexCheckBox.text")); // NOI18N - - pathSeparatorInfoLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/info-icon-16.png"))); // NOI18N NON-NLS - org.openide.awt.Mnemonics.setLocalizedText(pathSeparatorInfoLabel, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.pathSeparatorInfoLabel.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.jLabel4.text")); // NOI18N - - org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.jLabel5.text")); // NOI18N - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() - .addComponent(jLabel3) - .addGap(18, 18, 18) + .addGap(8, 8, 8) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(ruleNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ruleNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel5) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1) + .addGap(65, 65, 65) + .addComponent(filesRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(dirsRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(filesAndDirsRadioButton))) + .addGap(0, 0, Short.MAX_VALUE)))) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(nameCheck) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(nameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 249, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(pathCheck) + .addGap(4, 4, 4) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(pathRegexCheckBox) - .addGap(45, 45, 45) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(pathSeparatorInfoLabel)) - .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(ruleNameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, 18)) + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() - .addComponent(jLabel1) - .addGap(27, 27, 27))) + .addComponent(fullNameRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(extensionRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(nameRegexCheckbox) + .addGap(0, 0, Short.MAX_VALUE)))) + .addGroup(layout.createSequentialGroup() + .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(mimeCheck) + .addComponent(fileSizeCheck)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() - .addComponent(filesRadioButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(dirsRadioButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(filesAndDirsRadioButton)) - .addComponent(ruleNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 248, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addComponent(jLabel2) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(nameTextField)) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() - .addGap(78, 78, 78) - .addComponent(fullNameRadioButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(extensionRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(nameRegexCheckbox))) - .addComponent(jLabel4) - .addComponent(jLabel5)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(equalitySymbolComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(fileSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(fileSizeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(mimeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel5) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, 19, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) - .addComponent(dirsRadioButton) .addComponent(filesRadioButton) + .addComponent(dirsRadioButton) .addComponent(filesAndDirsRadioButton)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGap(5, 5, 5) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel2) - .addComponent(nameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(nameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(nameCheck)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(fullNameRadioButton) @@ -480,46 +780,123 @@ final class FilesSetRulePanel extends javax.swing.JPanel { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(pathTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel3)) + .addComponent(pathCheck)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(pathSeparatorInfoLabel) - .addComponent(pathRegexCheckBox)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(pathRegexCheckBox) + .addComponent(pathSeparatorInfoLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 8, Short.MAX_VALUE) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(mimeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(mimeCheck)) + .addGap(11, 11, 11) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(equalitySymbolComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(fileSizeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(fileSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(fileSizeCheck)) + .addGap(15, 15, 15) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(ruleNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(ruleNameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel4)) + .addContainerGap()) ); }// //GEN-END:initComponents - private void filesAndDirsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_filesAndDirsRadioButtonActionPerformed - setComponentsForSearchType(); - }//GEN-LAST:event_filesAndDirsRadioButtonActionPerformed + private void ruleNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ruleNameTextFieldActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_ruleNameTextFieldActionPerformed - private void dirsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dirsRadioButtonActionPerformed - setComponentsForSearchType(); - }//GEN-LAST:event_dirsRadioButtonActionPerformed + private void nameCheckActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nameCheckActionPerformed + if (!this.nameCheck.isSelected()) { + this.nameTextField.setEnabled(false); + this.nameTextField.setText(""); + this.fullNameRadioButton.setEnabled(false); + this.extensionRadioButton.setEnabled(false); + this.nameRegexCheckbox.setEnabled(false); + } else { + this.nameTextField.setEnabled(true); + this.fullNameRadioButton.setEnabled(true); + this.extensionRadioButton.setEnabled(true); + this.nameRegexCheckbox.setEnabled(true); + } + this.setOkButton(); + }//GEN-LAST:event_nameCheckActionPerformed + + private void pathCheckActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pathCheckActionPerformed + if (!this.pathCheck.isSelected()) { + this.pathTextField.setEnabled(false); + this.pathTextField.setText(""); + this.pathRegexCheckBox.setEnabled(false); + this.pathSeparatorInfoLabel.setEnabled(false); + } else { + this.pathTextField.setEnabled(true); + this.pathRegexCheckBox.setEnabled(true); + this.pathSeparatorInfoLabel.setEnabled(true); + } + this.setOkButton(); + }//GEN-LAST:event_pathCheckActionPerformed + + private void mimeCheckActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mimeCheckActionPerformed + if (!this.mimeCheck.isSelected()) { + this.mimeTypeComboBox.setEnabled(false); + this.mimeTypeComboBox.setSelectedIndex(0); + } else { + this.mimeTypeComboBox.setEnabled(true); + } + this.setOkButton(); + }//GEN-LAST:event_mimeCheckActionPerformed + + private void fileSizeCheckActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileSizeCheckActionPerformed + if (!this.fileSizeCheck.isSelected()) { + this.fileSizeComboBox.setEnabled(false); + this.fileSizeSpinner.setEnabled(false); + this.fileSizeSpinner.setValue(0); + this.equalitySymbolComboBox.setEnabled(false); + } else { + this.fileSizeComboBox.setEnabled(true); + this.fileSizeSpinner.setEnabled(true); + this.equalitySymbolComboBox.setEnabled(true); + } + this.setOkButton(); + }//GEN-LAST:event_fileSizeCheckActionPerformed private void filesRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_filesRadioButtonActionPerformed - setComponentsForSearchType(); + + this.setComponentsForSearchType(); }//GEN-LAST:event_filesRadioButtonActionPerformed + private void dirsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dirsRadioButtonActionPerformed + this.setComponentsForSearchType(); + }//GEN-LAST:event_dirsRadioButtonActionPerformed + + private void filesAndDirsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_filesAndDirsRadioButtonActionPerformed + this.setComponentsForSearchType(); + }//GEN-LAST:event_filesAndDirsRadioButtonActionPerformed + + private void fullNameRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fullNameRadioButtonActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_fullNameRadioButtonActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JRadioButton dirsRadioButton; + private javax.swing.JComboBox equalitySymbolComboBox; private javax.swing.JRadioButton extensionRadioButton; + private javax.swing.JCheckBox fileSizeCheck; + private javax.swing.JComboBox fileSizeComboBox; + private javax.swing.JSpinner fileSizeSpinner; private javax.swing.JRadioButton filesAndDirsRadioButton; private javax.swing.JRadioButton filesRadioButton; private javax.swing.JRadioButton fullNameRadioButton; private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel2; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; + private javax.swing.JCheckBox mimeCheck; + private javax.swing.JComboBox mimeTypeComboBox; private javax.swing.ButtonGroup nameButtonGroup; + private javax.swing.JCheckBox nameCheck; private javax.swing.JCheckBox nameRegexCheckbox; private javax.swing.JTextField nameTextField; + private javax.swing.JCheckBox pathCheck; private javax.swing.JCheckBox pathRegexCheckBox; private javax.swing.JLabel pathSeparatorInfoLabel; private javax.swing.JTextField pathTextField; diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsManager.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsManager.java index 781846cabe..20d6c1e5c7 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsManager.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsManager.java @@ -19,6 +19,9 @@ package org.sleuthkit.autopsy.modules.interestingitems; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -29,9 +32,8 @@ import java.util.Observable; import java.util.logging.Level; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; +import org.openide.util.io.NbObjectInputStream; +import org.openide.util.io.NbObjectOutputStream; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.coreutils.XMLUtil; @@ -49,8 +51,10 @@ final class InterestingItemDefsManager extends Observable { private static final List ILLEGAL_FILE_NAME_CHARS = Collections.unmodifiableList(new ArrayList<>(Arrays.asList("\\", "/", ":", "*", "?", "\"", "<", ">"))); private static final List ILLEGAL_FILE_PATH_CHARS = Collections.unmodifiableList(new ArrayList<>(Arrays.asList("\\", ":", "*", "?", "\"", "<", ">"))); - private static final String INTERESTING_FILES_SET_DEFS_FILE_NAME = "InterestingFilesSetDefs.xml"; //NON-NLS - private static final String DEFAULT_FILE_SET_DEFS_PATH = PlatformUtil.getUserConfigDirectory() + File.separator + INTERESTING_FILES_SET_DEFS_FILE_NAME; + private static final String LEGACY_FILES_SET_DEFS_FILE_NAME = "InterestingFilesSetDefs.xml"; //NON-NLS + private static final String INTERESTING_FILES_SET_DEFS_SERIALIZATION_NAME = "InterestingFileSets.settings"; + private static final String INTERESTING_FILES_SET_DEFS_SERIALIZATION_PATH = PlatformUtil.getUserConfigDirectory() + File.separator + INTERESTING_FILES_SET_DEFS_SERIALIZATION_NAME; + private static final String LEGACY_FILE_SET_DEFS_PATH = PlatformUtil.getUserConfigDirectory() + File.separator + LEGACY_FILES_SET_DEFS_FILE_NAME; private static InterestingItemDefsManager instance; /** @@ -88,8 +92,8 @@ final class InterestingItemDefsManager extends Observable { * @return A map of interesting files set names to interesting file sets, * possibly empty. */ - synchronized Map getInterestingFilesSets() { - return FilesSetXML.readDefinitionsFile(DEFAULT_FILE_SET_DEFS_PATH); + synchronized Map getInterestingFilesSets() throws InterestingItemDefsManagerException { + return FilesSetXML.readDefinitionsFile(LEGACY_FILE_SET_DEFS_PATH); } /** @@ -99,8 +103,8 @@ final class InterestingItemDefsManager extends Observable { * @param filesSets A mapping of interesting files set names to files sets, * used to enforce unique files set names. */ - synchronized void setInterestingFilesSets(Map filesSets) { - FilesSetXML.writeDefinitionsFile(DEFAULT_FILE_SET_DEFS_PATH, filesSets); + synchronized void setInterestingFilesSets(Map filesSets) throws InterestingItemDefsManagerException { + FilesSetXML.writeDefinitionsFile(INTERESTING_FILES_SET_DEFS_SERIALIZATION_PATH, filesSets); this.setChanged(); this.notifyObservers(); } @@ -130,21 +134,6 @@ final class InterestingItemDefsManager extends Observable { private static final String TYPE_FILTER_VALUE_FILES = "file"; //NON-NLS private static final String TYPE_FILTER_VALUE_DIRS = "dir"; //NON-NLS - // The following tags and attributes are currently specific to the - // Autopsy implementation of interesting files set definitions. Autopsy - // definitions that use these will not be able to be used by TSK - // Framework. However, Autopsy can accept TSK Framework definitions: - // - // 1. Rules do not have names in the TSK Framework schema, but rules do - // have names in the Autopsy schema. Names will be synthesized as needed - // to allow Autopsy to use TSK Framework interesting files set - // definitions. - // 2. The TSK Framework has an interesting files module that supports - // simple globbing with "*" characters. Name rules and path filters with - // "*" characters will be converted to regexes to allow Autopsy to use - // TSK Framework interesting files set definitions. - // 3. Type filters are required by Autopsy, but not by TSK Frmaework. - // Missing type filters will defualt to "files" filters. private static final String REGEX_ATTR = "regex"; //NON-NLS private static final String PATH_REGEX_ATTR = "pathRegex"; //NON-NLS private static final String TYPE_FILTER_VALUE_FILES_AND_DIRS = "files_and_dirs"; //NON-NLS @@ -161,10 +150,13 @@ final class InterestingItemDefsManager extends Observable { // Note: This method takes a file path to support the possibility of // multiple intersting files set definition files, e.g., one for // definitions that ship with Autopsy and one for user definitions. - static Map readDefinitionsFile(String filePath) { - Map filesSets = new HashMap<>(); + static Map readDefinitionsFile(String filePath) throws InterestingItemDefsManagerException { + Map filesSets = readSerializedDefinitions(); - // Check if the file exists. + if (!filesSets.isEmpty()) { + return filesSets; + } + // Check if the legacy xml file exists. File defsFile = new File(filePath); if (!defsFile.exists()) { return filesSets; @@ -195,10 +187,34 @@ final class InterestingItemDefsManager extends Observable { for (int i = 0; i < setElems.getLength(); ++i) { readFilesSet((Element) setElems.item(i), filesSets, filePath); } - return filesSets; } + /** + * Reads the definitions from the serialization file + * + * @return the map representing settings saved to serialization file, + * empty set if the file does not exist. + * + * @throws InterestingItemDefsManagerException if file could not be read + */ + private static Map readSerializedDefinitions() throws InterestingItemDefsManagerException { + String filePath = INTERESTING_FILES_SET_DEFS_SERIALIZATION_PATH; + File fileSetFile = new File(filePath); + if (fileSetFile.exists()) { + try { + try (NbObjectInputStream in = new NbObjectInputStream(new FileInputStream(filePath))) { + InterestingItemsFilesSetSettings filesSetsSettings = (InterestingItemsFilesSetSettings) in.readObject(); + return filesSetsSettings.getFilesSets(); + } + } catch (IOException | ClassNotFoundException ex) { + throw new InterestingItemDefsManagerException(String.format("Failed to read settings from %s", filePath), ex); + } + } else { + return new HashMap(); + } + } + /** * Reads in an interesting files set. * @@ -288,16 +304,16 @@ final class InterestingItemDefsManager extends Observable { private static FilesSet.Rule readFileNameRule(Element elem) { String ruleName = FilesSetXML.readRuleName(elem); - // The content of the rule tag is a file name filter. It may be a + // The content of the rule tag is a file name condition. It may be a // regex, or it may be from a TSK Framework rule definition with a // "*" globbing char, or it may be simple text. String content = elem.getTextContent(); - FilesSet.Rule.FullNameFilter nameFilter; + FilesSet.Rule.FullNameCondition nameCondition; String regex = elem.getAttribute(FilesSetXML.REGEX_ATTR); if ((!regex.isEmpty() && regex.equalsIgnoreCase("true")) || content.contains("*")) { // NON-NLS Pattern pattern = compileRegex(content); if (pattern != null) { - nameFilter = new FilesSet.Rule.FullNameFilter(pattern); + nameCondition = new FilesSet.Rule.FullNameCondition(pattern); } else { logger.log(Level.SEVERE, "Error compiling " + FilesSetXML.NAME_RULE_TAG + " regex, ignoring malformed '{0}' rule definition", ruleName); // NON-NLS return null; @@ -309,29 +325,29 @@ final class InterestingItemDefsManager extends Observable { return null; } } - nameFilter = new FilesSet.Rule.FullNameFilter(content); + nameCondition = new FilesSet.Rule.FullNameCondition(content); } - // Read in the type filter. - FilesSet.Rule.MetaTypeFilter metaTypeFilter = FilesSetXML.readMetaTypeFilter(elem); - if (metaTypeFilter == null) { + // Read in the type condition. + FilesSet.Rule.MetaTypeCondition metaTypeCondition = FilesSetXML.readMetaTypeCondition(elem); + if (metaTypeCondition == null) { // Malformed attribute. return null; } - // Read in the optional path filter. Null is o.k., but if the attribute + // Read in the optional path condition. Null is o.k., but if the attribute // is there, be sure it is not malformed. - FilesSet.Rule.ParentPathFilter pathFilter = null; + FilesSet.Rule.ParentPathCondition pathCondition = null; if (!elem.getAttribute(FilesSetXML.PATH_FILTER_ATTR).isEmpty() || !elem.getAttribute(FilesSetXML.PATH_REGEX_ATTR).isEmpty()) { - pathFilter = FilesSetXML.readPathFilter(elem); - if (pathFilter == null) { + pathCondition = FilesSetXML.readPathCondition(elem); + if (pathCondition == null) { // Malformed attribute. return null; } } - return new FilesSet.Rule(ruleName, nameFilter, metaTypeFilter, pathFilter); + return new FilesSet.Rule(ruleName, nameCondition, metaTypeCondition, pathCondition, null, null); } /** @@ -346,16 +362,16 @@ final class InterestingItemDefsManager extends Observable { private static FilesSet.Rule readFileExtensionRule(Element elem) { String ruleName = FilesSetXML.readRuleName(elem); - // The content of the rule tag is a file name extension filter. It may + // The content of the rule tag is a file name extension condition. It may // be a regex, or it may be from a TSK Framework rule definition // with a "*" globbing char. String content = elem.getTextContent(); - FilesSet.Rule.ExtensionFilter extFilter; + FilesSet.Rule.ExtensionCondition extCondition; String regex = elem.getAttribute(FilesSetXML.REGEX_ATTR); if ((!regex.isEmpty() && regex.equalsIgnoreCase("true")) || content.contains("*")) { // NON-NLS Pattern pattern = compileRegex(content); if (pattern != null) { - extFilter = new FilesSet.Rule.ExtensionFilter(pattern); + extCondition = new FilesSet.Rule.ExtensionCondition(pattern); } else { logger.log(Level.SEVERE, "Error compiling " + FilesSetXML.EXTENSION_RULE_TAG + " regex, ignoring malformed {0} rule definition", ruleName); // NON-NLS return null; @@ -367,35 +383,35 @@ final class InterestingItemDefsManager extends Observable { return null; } } - extFilter = new FilesSet.Rule.ExtensionFilter(content); + extCondition = new FilesSet.Rule.ExtensionCondition(content); } - // The rule must have a meta-type filter, unless a TSK Framework + // The rule must have a meta-type condition, unless a TSK Framework // definitions file is being read. - FilesSet.Rule.MetaTypeFilter metaTypeFilter = null; + FilesSet.Rule.MetaTypeCondition metaTypeCondition = null; if (!elem.getAttribute(FilesSetXML.TYPE_FILTER_ATTR).isEmpty()) { - metaTypeFilter = FilesSetXML.readMetaTypeFilter(elem); - if (metaTypeFilter == null) { + metaTypeCondition = FilesSetXML.readMetaTypeCondition(elem); + if (metaTypeCondition == null) { // Malformed attribute. return null; } } else { - metaTypeFilter = new FilesSet.Rule.MetaTypeFilter(FilesSet.Rule.MetaTypeFilter.Type.FILES); + metaTypeCondition = new FilesSet.Rule.MetaTypeCondition(FilesSet.Rule.MetaTypeCondition.Type.FILES); } - // The rule may have a path filter. Null is o.k., but if the attribute + // The rule may have a path condition. Null is o.k., but if the attribute // is there, it must not be malformed. - FilesSet.Rule.ParentPathFilter pathFilter = null; + FilesSet.Rule.ParentPathCondition pathCondition = null; if (!elem.getAttribute(FilesSetXML.PATH_FILTER_ATTR).isEmpty() || !elem.getAttribute(FilesSetXML.PATH_REGEX_ATTR).isEmpty()) { - pathFilter = FilesSetXML.readPathFilter(elem); - if (pathFilter == null) { + pathCondition = FilesSetXML.readPathCondition(elem); + if (pathCondition == null) { // Malformed attribute. return null; } } - return new FilesSet.Rule(ruleName, extFilter, metaTypeFilter, pathFilter); + return new FilesSet.Rule(ruleName, extCondition, metaTypeCondition, pathCondition, null, null); } /** @@ -428,62 +444,63 @@ final class InterestingItemDefsManager extends Observable { } /** - * Construct a meta-type filter for an interesting files set membership - * rule from data in an XML element. + * Construct a meta-type condition for an interesting files set + * membership rule from data in an XML element. * * @param ruleElement The XML element. * - * @return The meta-type filter, or null if there is an error (logged). + * @return The meta-type condition, or null if there is an error + * (logged). */ - private static FilesSet.Rule.MetaTypeFilter readMetaTypeFilter(Element ruleElement) { - FilesSet.Rule.MetaTypeFilter filter = null; - String filterAttribute = ruleElement.getAttribute(FilesSetXML.TYPE_FILTER_ATTR); - if (!filterAttribute.isEmpty()) { - switch (filterAttribute) { + private static FilesSet.Rule.MetaTypeCondition readMetaTypeCondition(Element ruleElement) { + FilesSet.Rule.MetaTypeCondition condition = null; + String conditionAttribute = ruleElement.getAttribute(FilesSetXML.TYPE_FILTER_ATTR); + if (!conditionAttribute.isEmpty()) { + switch (conditionAttribute) { case FilesSetXML.TYPE_FILTER_VALUE_FILES: - filter = new FilesSet.Rule.MetaTypeFilter(FilesSet.Rule.MetaTypeFilter.Type.FILES); + condition = new FilesSet.Rule.MetaTypeCondition(FilesSet.Rule.MetaTypeCondition.Type.FILES); break; case FilesSetXML.TYPE_FILTER_VALUE_DIRS: - filter = new FilesSet.Rule.MetaTypeFilter(FilesSet.Rule.MetaTypeFilter.Type.DIRECTORIES); + condition = new FilesSet.Rule.MetaTypeCondition(FilesSet.Rule.MetaTypeCondition.Type.DIRECTORIES); break; case FilesSetXML.TYPE_FILTER_VALUE_FILES_AND_DIRS: - filter = new FilesSet.Rule.MetaTypeFilter(FilesSet.Rule.MetaTypeFilter.Type.FILES_AND_DIRECTORIES); + condition = new FilesSet.Rule.MetaTypeCondition(FilesSet.Rule.MetaTypeCondition.Type.FILES_AND_DIRECTORIES); break; default: - logger.log(Level.SEVERE, "Found {0} " + FilesSetXML.TYPE_FILTER_ATTR + " attribute with unrecognized value ''{0}'', ignoring malformed rule definition", filterAttribute); // NON-NLS + logger.log(Level.SEVERE, "Found {0} " + FilesSetXML.TYPE_FILTER_ATTR + " attribute with unrecognized value ''{0}'', ignoring malformed rule definition", conditionAttribute); // NON-NLS break; } } else { // Accept TSK Framework interesting files set definitions, // default to files. - filter = new FilesSet.Rule.MetaTypeFilter(FilesSet.Rule.MetaTypeFilter.Type.FILES); + condition = new FilesSet.Rule.MetaTypeCondition(FilesSet.Rule.MetaTypeCondition.Type.FILES); } - return filter; + return condition; } /** - * Construct a path filter for an interesting files set membership rule - * from data in an XML element. + * Construct a path condition for an interesting files set membership + * rule from data in an XML element. * * @param ruleElement The XML element. * - * @return The path filter, or null if there is an error (logged). + * @return The path condition, or null if there is an error (logged). */ - private static FilesSet.Rule.ParentPathFilter readPathFilter(Element ruleElement) { - FilesSet.Rule.ParentPathFilter filter = null; + private static FilesSet.Rule.ParentPathCondition readPathCondition(Element ruleElement) { + FilesSet.Rule.ParentPathCondition condition = null; String path = ruleElement.getAttribute(FilesSetXML.PATH_FILTER_ATTR); String pathRegex = ruleElement.getAttribute(FilesSetXML.PATH_REGEX_ATTR); if (!pathRegex.isEmpty() && path.isEmpty()) { try { Pattern pattern = Pattern.compile(pathRegex); - filter = new FilesSet.Rule.ParentPathFilter(pattern); + condition = new FilesSet.Rule.ParentPathCondition(pattern); } catch (PatternSyntaxException ex) { - logger.log(Level.SEVERE, "Error compiling " + FilesSetXML.PATH_REGEX_ATTR + " regex, ignoring malformed path filter definition", ex); // NON-NLS + logger.log(Level.SEVERE, "Error compiling " + FilesSetXML.PATH_REGEX_ATTR + " regex, ignoring malformed path condition definition", ex); // NON-NLS } } else if (!path.isEmpty() && pathRegex.isEmpty()) { - filter = new FilesSet.Rule.ParentPathFilter(path); + condition = new FilesSet.Rule.ParentPathCondition(path); } - return filter; + return condition; } /** @@ -498,85 +515,33 @@ final class InterestingItemDefsManager extends Observable { // Note: This method takes a file path to support the possibility of // multiple intersting files set definition files, e.g., one for // definitions that ship with Autopsy and one for user definitions. - static boolean writeDefinitionsFile(String filePath, Map interestingFilesSets) { - DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); - try { - // Create the new XML document. - DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); - Document doc = docBuilder.newDocument(); - Element rootElement = doc.createElement(FilesSetXML.FILE_SETS_ROOT_TAG); - doc.appendChild(rootElement); - - // Add the interesting files sets to the document. - for (FilesSet set : interestingFilesSets.values()) { - // Add the files set element and its attributes. - Element setElement = doc.createElement(FilesSetXML.FILE_SET_TAG); - setElement.setAttribute(FilesSetXML.NAME_ATTR, set.getName()); - setElement.setAttribute(FilesSetXML.DESC_ATTR, set.getDescription()); - setElement.setAttribute(FilesSetXML.IGNORE_KNOWN_FILES_ATTR, Boolean.toString(set.ignoresKnownFiles())); - - // Add the child elements for the set membership rules. - for (FilesSet.Rule rule : set.getRules().values()) { - // Add a rule element with the appropriate name filter - // type tag. - FilesSet.Rule.FileNameFilter nameFilter = rule.getFileNameFilter(); - Element ruleElement; - if (nameFilter instanceof FilesSet.Rule.FullNameFilter) { - ruleElement = doc.createElement(FilesSetXML.NAME_RULE_TAG); - } else { - ruleElement = doc.createElement(FilesSetXML.EXTENSION_RULE_TAG); - } - - // Add the rule name attribute. - ruleElement.setAttribute(FilesSetXML.NAME_ATTR, rule.getName()); - - // Add the name filter regex attribute - ruleElement.setAttribute(FilesSetXML.REGEX_ATTR, Boolean.toString(nameFilter.isRegex())); - - // Add the type filter attribute. - FilesSet.Rule.MetaTypeFilter typeFilter = rule.getMetaTypeFilter(); - switch (typeFilter.getMetaType()) { - case FILES: - ruleElement.setAttribute(FilesSetXML.TYPE_FILTER_ATTR, FilesSetXML.TYPE_FILTER_VALUE_FILES); - break; - case DIRECTORIES: - ruleElement.setAttribute(FilesSetXML.TYPE_FILTER_ATTR, FilesSetXML.TYPE_FILTER_VALUE_DIRS); - break; - default: - ruleElement.setAttribute(FilesSetXML.TYPE_FILTER_ATTR, FilesSetXML.TYPE_FILTER_VALUE_FILES_AND_DIRS); - break; - } - - // Add the optional path filter. - FilesSet.Rule.ParentPathFilter pathFilter = rule.getPathFilter(); - if (pathFilter != null) { - if (pathFilter.isRegex()) { - ruleElement.setAttribute(FilesSetXML.PATH_REGEX_ATTR, pathFilter.getTextToMatch()); - } else { - ruleElement.setAttribute(FilesSetXML.PATH_FILTER_ATTR, pathFilter.getTextToMatch()); - } - } - - // Add the name filter text as the rule element content. - ruleElement.setTextContent(nameFilter.getTextToMatch()); - - setElement.appendChild(ruleElement); - } - - rootElement.appendChild(setElement); - } - - // Overwrite the previous definitions file. Note that the utility - // method logs an error on failure. - return XMLUtil.saveDoc(FilesSetXML.class, filePath, XML_ENCODING, doc); - - } catch (ParserConfigurationException ex) { - logger.log(Level.SEVERE, "Error writing interesting files definition file to " + filePath, ex); // NON-NLS - return false; + static boolean writeDefinitionsFile(String filePath, Map interestingFilesSets) throws InterestingItemDefsManagerException { + try (NbObjectOutputStream out = new NbObjectOutputStream(new FileOutputStream(filePath))) { + out.writeObject(new InterestingItemsFilesSetSettings(interestingFilesSets)); + } catch (IOException ex) { + throw new InterestingItemDefsManagerException(String.format("Failed to write settings to %s", filePath), ex); } + return true; + } + } + + static class InterestingItemDefsManagerException extends Exception { + + InterestingItemDefsManagerException() { } + InterestingItemDefsManagerException(String message) { + super(message); + } + + InterestingItemDefsManagerException(String message, Throwable cause) { + super(message, cause); + } + + InterestingItemDefsManagerException(Throwable cause) { + super(cause); + } } } diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsPanel.form b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsPanel.form index 6b92c6b39f..e55060f6a1 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsPanel.form @@ -4,6 +4,8 @@ + + @@ -28,18 +30,14 @@ - - - + + - - - - + @@ -67,7 +65,7 @@ - + @@ -83,65 +81,104 @@ - + - - - - - - - - - - - - - - - - + + + + + - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - + + + + + + + + + + + + + - + @@ -149,65 +186,81 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - + + - - - + + + + + + + + + @@ -242,7 +295,6 @@ - @@ -250,6 +302,9 @@ + + + @@ -442,6 +497,9 @@ + + + @@ -471,16 +529,16 @@ - + - + - + @@ -532,6 +590,9 @@ + + + @@ -613,6 +674,9 @@ + + + @@ -651,15 +715,15 @@ - + - + - + @@ -700,6 +764,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsPanel.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsPanel.java index caa6098f55..61271fc54c 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemDefsPanel.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2014 Basis Technology Corp. + * Copyright 2011-2016 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,25 +20,51 @@ package org.sleuthkit.autopsy.modules.interestingitems; import java.awt.EventQueue; import java.awt.Font; +import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.SortedSet; import java.util.TreeMap; +import java.util.logging.Level; import javax.swing.DefaultListModel; +import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import org.apache.tika.mime.MediaType; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.corecomponents.OptionsPanel; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.ingest.IngestModuleGlobalSettingsPanel; +import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector; +import org.apache.tika.mime.MediaType; +import org.apache.tika.mime.MimeTypes; +import org.openide.util.Exceptions; +import org.sleuthkit.autopsy.coreutils.Logger; /** * A panel that allows a user to make interesting item definitions. */ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel implements OptionsPanel { + @NbBundle.Messages({ + "InterestingItemDefsPanel.bytes=Bytes", + "InterestingItemDefsPanel.kiloBytes=Kilobytes", + "InterestingItemDefsPanel.megaBytes=Megabytes", + "InterestingItemDefsPanel.gigaBytes=Gigabytes", + "InterestingItemsDefsPanel.loadError=Error loading interesting files sets from file.", + "InterestingItemsDefsPanel.saveError=Error saving interesting files sets to file." + }) + + private static final SortedSet mediaTypes = MimeTypes.getDefaultMimeTypes().getMediaTypeRegistry().getTypes(); private final DefaultListModel setsListModel = new DefaultListModel<>(); private final DefaultListModel rulesListModel = new DefaultListModel<>(); + private final Logger logger = Logger.getLogger(InterestingItemDefsPanel.class.getName()); + private JButton okButton = new JButton("OK"); + private JButton cancelButton = new JButton("Cancel"); // The following is a map of interesting files set names to interesting // files set definitions. It is a snapshot of the files set definitions @@ -54,18 +80,58 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp */ InterestingItemDefsPanel() { this.initComponents(); + this.customInit(); this.setsList.setModel(setsListModel); this.setsList.addListSelectionListener(new InterestingItemDefsPanel.SetsListSelectionListener()); this.rulesList.setModel(rulesListModel); this.rulesList.addListSelectionListener(new InterestingItemDefsPanel.RulesListSelectionListener()); } + @NbBundle.Messages({"InterestingItemDefsPanel.Title=Global Interesting Items Settings"}) + private void customInit() { + setName(Bundle.InterestingItemDefsPanel_Title()); + + Set fileTypesCollated = new HashSet<>(); + for (MediaType mediaType : mediaTypes) { + fileTypesCollated.add(mediaType.toString()); + } + + FileTypeDetector fileTypeDetector; + try { + fileTypeDetector = new FileTypeDetector(); + List userDefinedFileTypes = fileTypeDetector.getUserDefinedTypes(); + fileTypesCollated.addAll(userDefinedFileTypes); + + } catch (FileTypeDetector.FileTypeDetectorInitException ex) { + logger.log(Level.SEVERE, "Unable to get user defined file types", ex); + } + + List toSort = new ArrayList<>(fileTypesCollated); + toSort.sort((String string1, String string2) -> { + int result = String.CASE_INSENSITIVE_ORDER.compare(string1, string2); + if (result == 0) { + result = string1.compareTo(string2); + } + return result; + }); + + for (String file : toSort) { + mimeTypeComboBox.addItem(file); + } + this.fileSizeUnitComboBox.setSelectedIndex(1); + this.equalitySignComboBox.setSelectedIndex(2); + } + /** * @inheritDoc */ @Override public void saveSettings() { - InterestingItemDefsManager.getInstance().setInterestingFilesSets(this.filesSets); + try { + InterestingItemDefsManager.getInstance().setInterestingFilesSets(this.filesSets); + } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) { + MessageNotifyUtil.Message.error(Bundle.InterestingItemsDefsPanel_saveError()); + } } /** @@ -83,9 +149,14 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp public void load() { this.resetComponents(); - // Get a working copy of the interesting files set definitions and sort - // by set name. - this.filesSets = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets()); + try { + // Get a working copy of the interesting files set definitions and sort + // by set name. + this.filesSets = new TreeMap<>(InterestingItemDefsManager.getInstance().getInterestingFilesSets()); + } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) { + MessageNotifyUtil.Message.error(Bundle.InterestingItemsDefsPanel_loadError()); + this.filesSets = new TreeMap<>(); + } // Populate the list model for the interesting files sets list // component. @@ -124,8 +195,8 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp this.fileNameRadioButton.setSelected(true); this.fileNameRegexCheckbox.setSelected(false); this.filesRadioButton.setSelected(true); - this.rulePathFilterTextField.setText(""); - this.rulePathFilterRegexCheckBox.setSelected(false); + this.rulePathConditionTextField.setText(""); + this.rulePathConditionRegexCheckBox.setSelected(false); this.newRuleButton.setEnabled(!this.setsListModel.isEmpty()); this.editRuleButton.setEnabled(false); this.deleteRuleButton.setEnabled(false); @@ -189,18 +260,27 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp // Get the selected rule and populate the rule components. FilesSet.Rule rule = InterestingItemDefsPanel.this.rulesList.getSelectedValue(); if (rule != null) { - // Get the filters that make up the rule. - FilesSet.Rule.FileNameFilter nameFilter = rule.getFileNameFilter(); - FilesSet.Rule.MetaTypeFilter typeFilter = rule.getMetaTypeFilter(); - FilesSet.Rule.ParentPathFilter pathFilter = rule.getPathFilter(); + // Get the conditions that make up the rule. + FilesSet.Rule.FileNameCondition nameCondition = rule.getFileNameCondition(); + FilesSet.Rule.MetaTypeCondition typeCondition = rule.getMetaTypeCondition(); + FilesSet.Rule.ParentPathCondition pathCondition = rule.getPathCondition(); + FilesSet.Rule.MimeTypeCondition mimeTypeCondition = rule.getMimeTypeCondition(); + FilesSet.Rule.FileSizeCondition fileSizeCondition = rule.getFileSizeCondition(); // Populate the components that display the properties of the // selected rule. - InterestingItemDefsPanel.this.fileNameTextField.setText(nameFilter.getTextToMatch()); - InterestingItemDefsPanel.this.fileNameRadioButton.setSelected(nameFilter instanceof FilesSet.Rule.FullNameFilter); - InterestingItemDefsPanel.this.fileNameExtensionRadioButton.setSelected(nameFilter instanceof FilesSet.Rule.ExtensionFilter); - InterestingItemDefsPanel.this.fileNameRegexCheckbox.setSelected(nameFilter.isRegex()); - switch (typeFilter.getMetaType()) { + if (nameCondition != null) { + InterestingItemDefsPanel.this.fileNameTextField.setText(nameCondition.getTextToMatch()); + InterestingItemDefsPanel.this.fileNameRadioButton.setSelected(nameCondition instanceof FilesSet.Rule.FullNameCondition); + InterestingItemDefsPanel.this.fileNameExtensionRadioButton.setSelected(nameCondition instanceof FilesSet.Rule.ExtensionCondition); + InterestingItemDefsPanel.this.fileNameRegexCheckbox.setSelected(nameCondition.isRegex()); + } else { + InterestingItemDefsPanel.this.fileNameTextField.setText(""); + InterestingItemDefsPanel.this.fileNameRadioButton.setSelected(true); + InterestingItemDefsPanel.this.fileNameExtensionRadioButton.setSelected(false); + InterestingItemDefsPanel.this.fileNameRegexCheckbox.setSelected(false); + } + switch (typeCondition.getMetaType()) { case FILES: InterestingItemDefsPanel.this.filesRadioButton.setSelected(true); break; @@ -211,12 +291,26 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp InterestingItemDefsPanel.this.bothRadioButton.setSelected(true); break; } - if (pathFilter != null) { - InterestingItemDefsPanel.this.rulePathFilterTextField.setText(pathFilter.getTextToMatch()); - InterestingItemDefsPanel.this.rulePathFilterRegexCheckBox.setSelected(pathFilter.isRegex()); + if (pathCondition != null) { + InterestingItemDefsPanel.this.rulePathConditionTextField.setText(pathCondition.getTextToMatch()); + InterestingItemDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(pathCondition.isRegex()); } else { - InterestingItemDefsPanel.this.rulePathFilterTextField.setText(""); - InterestingItemDefsPanel.this.rulePathFilterRegexCheckBox.setSelected(false); + InterestingItemDefsPanel.this.rulePathConditionTextField.setText(""); + InterestingItemDefsPanel.this.rulePathConditionRegexCheckBox.setSelected(false); + } + if (mimeTypeCondition != null) { + InterestingItemDefsPanel.this.mimeTypeComboBox.setSelectedItem(mimeTypeCondition.getMimeType()); + } else { + InterestingItemDefsPanel.this.mimeTypeComboBox.setSelectedIndex(0); + } + if (fileSizeCondition != null) { + InterestingItemDefsPanel.this.fileSizeUnitComboBox.setSelectedItem(fileSizeCondition.getUnit().getName()); + InterestingItemDefsPanel.this.equalitySignComboBox.setSelectedItem(fileSizeCondition.getComparator().getSymbol()); + InterestingItemDefsPanel.this.jSpinner1.setValue(fileSizeCondition.getSizeValue()); + } else { + InterestingItemDefsPanel.this.fileSizeUnitComboBox.setSelectedIndex(1); + InterestingItemDefsPanel.this.equalitySignComboBox.setSelectedIndex(2); + InterestingItemDefsPanel.this.jSpinner1.setValue(0); } // Enable the new, edit and delete rule buttons. @@ -290,18 +384,17 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp FilesSetRulePanel panel; if (selectedRule != null) { // Editing an existing rule definition. - panel = new FilesSetRulePanel(selectedRule); + panel = new FilesSetRulePanel(selectedRule, okButton, cancelButton); } else { // Creating a new rule definition. - panel = new FilesSetRulePanel(); + panel = new FilesSetRulePanel(okButton, cancelButton); } - // Do a dialog box with the files set panel until the user either enters // a valid definition or cancels. Note that the panel gives the user // feedback when isValidDefinition() is called. int option = JOptionPane.OK_OPTION; do { - option = JOptionPane.showConfirmDialog(null, panel, NbBundle.getMessage(FilesSetRulePanel.class, "FilesSetRulePanel.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + option = JOptionPane.showOptionDialog(null, panel, NbBundle.getMessage(FilesSetPanel.class, "FilesSetPanel.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, new Object[]{okButton, cancelButton}, okButton); } while (option == JOptionPane.OK_OPTION && !panel.isValidRuleDefinition()); if (option == JOptionPane.OK_OPTION) { @@ -316,7 +409,7 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp if (selectedRule != null) { rules.remove(selectedRule.getUuid()); } - FilesSet.Rule newRule = new FilesSet.Rule(panel.getRuleName(), panel.getFileNameFilter(), panel.getMetaTypeFilter(), panel.getPathFilter()); + FilesSet.Rule newRule = new FilesSet.Rule(panel.getRuleName(), panel.getFileNameCondition(), panel.getMetaTypeCondition(), panel.getPathCondition(), panel.getMimeTypeCondition(), panel.getFileSizeCondition()); rules.put(newRule.getUuid(), newRule); // Add the new/edited files set definition, replacing any previous @@ -380,6 +473,7 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp private void initComponents() { fileNameButtonGroup = new javax.swing.ButtonGroup(); + typeButtonGroup = new javax.swing.ButtonGroup(); jScrollPane1 = new javax.swing.JScrollPane(); jPanel1 = new javax.swing.JPanel(); jLabel6 = new javax.swing.JLabel(); @@ -388,18 +482,18 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp editRuleButton = new javax.swing.JButton(); rulesListLabel = new javax.swing.JLabel(); rulesListScrollPane = new javax.swing.JScrollPane(); - rulesList = new javax.swing.JList<>(); + rulesList = new javax.swing.JList(); setDescScrollPanel = new javax.swing.JScrollPane(); setDescriptionTextArea = new javax.swing.JTextArea(); editSetButton = new javax.swing.JButton(); setsListScrollPane = new javax.swing.JScrollPane(); - setsList = new javax.swing.JList<>(); + setsList = new javax.swing.JList(); fileNameExtensionRadioButton = new javax.swing.JRadioButton(); jLabel3 = new javax.swing.JLabel(); fileNameTextField = new javax.swing.JTextField(); jLabel5 = new javax.swing.JLabel(); fileNameRadioButton = new javax.swing.JRadioButton(); - rulePathFilterTextField = new javax.swing.JTextField(); + rulePathConditionTextField = new javax.swing.JTextField(); ignoreKnownFilesCheckbox = new javax.swing.JCheckBox(); fileNameRegexCheckbox = new javax.swing.JCheckBox(); separator = new javax.swing.JSeparator(); @@ -412,9 +506,15 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp dirsRadioButton = new javax.swing.JRadioButton(); jLabel1 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); - rulePathFilterRegexCheckBox = new javax.swing.JCheckBox(); + rulePathConditionRegexCheckBox = new javax.swing.JCheckBox(); jScrollPane2 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); + jLabel7 = new javax.swing.JLabel(); + mimeTypeComboBox = new javax.swing.JComboBox(); + jLabel8 = new javax.swing.JLabel(); + equalitySignComboBox = new javax.swing.JComboBox(); + jSpinner1 = new javax.swing.JSpinner(); + fileSizeUnitComboBox = new javax.swing.JComboBox(); setFont(getFont().deriveFont(getFont().getStyle() & ~java.awt.Font.BOLD, 11)); @@ -428,13 +528,13 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp newRuleButton.setFont(newRuleButton.getFont().deriveFont(newRuleButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); newRuleButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/add16.png"))); // NOI18N org.openide.awt.Mnemonics.setLocalizedText(newRuleButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.newRuleButton.text")); // NOI18N - newRuleButton.setEnabled(false); newRuleButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { newRuleButtonActionPerformed(evt); } }); + typeButtonGroup.add(filesRadioButton); filesRadioButton.setFont(filesRadioButton.getFont().deriveFont(filesRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); filesRadioButton.setSelected(true); org.openide.awt.Mnemonics.setLocalizedText(filesRadioButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.filesRadioButton.text")); // NOI18N @@ -496,6 +596,11 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp fileNameTextField.setEditable(false); fileNameTextField.setFont(fileNameTextField.getFont().deriveFont(fileNameTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); fileNameTextField.setText(org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.fileNameTextField.text")); // NOI18N + fileNameTextField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + fileNameTextFieldActionPerformed(evt); + } + }); jLabel5.setFont(jLabel5.getFont().deriveFont(jLabel5.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel5.text")); // NOI18N @@ -505,9 +610,9 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp org.openide.awt.Mnemonics.setLocalizedText(fileNameRadioButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.fileNameRadioButton.text")); // NOI18N fileNameRadioButton.setEnabled(false); - rulePathFilterTextField.setEditable(false); - rulePathFilterTextField.setFont(rulePathFilterTextField.getFont().deriveFont(rulePathFilterTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - rulePathFilterTextField.setText(org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.rulePathFilterTextField.text")); // NOI18N + rulePathConditionTextField.setEditable(false); + rulePathConditionTextField.setFont(rulePathConditionTextField.getFont().deriveFont(rulePathConditionTextField.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + rulePathConditionTextField.setText(org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.rulePathConditionTextField.text")); // NOI18N ignoreKnownFilesCheckbox.setFont(ignoreKnownFilesCheckbox.getFont().deriveFont(ignoreKnownFilesCheckbox.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(ignoreKnownFilesCheckbox, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.ignoreKnownFilesCheckbox.text")); // NOI18N @@ -527,6 +632,7 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp setsListLabel.setFont(setsListLabel.getFont().deriveFont(setsListLabel.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(setsListLabel, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.setsListLabel.text")); // NOI18N + typeButtonGroup.add(bothRadioButton); bothRadioButton.setFont(bothRadioButton.getFont().deriveFont(bothRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(bothRadioButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.bothRadioButton.text")); // NOI18N bothRadioButton.setEnabled(false); @@ -563,6 +669,7 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp jLabel2.setFont(jLabel2.getFont().deriveFont(jLabel2.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel2.text")); // NOI18N + typeButtonGroup.add(dirsRadioButton); dirsRadioButton.setFont(dirsRadioButton.getFont().deriveFont(dirsRadioButton.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(dirsRadioButton, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.dirsRadioButton.text")); // NOI18N dirsRadioButton.setEnabled(false); @@ -578,9 +685,9 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp jLabel4.setFont(jLabel4.getFont().deriveFont(jLabel4.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel4.text")); // NOI18N - rulePathFilterRegexCheckBox.setFont(rulePathFilterRegexCheckBox.getFont().deriveFont(rulePathFilterRegexCheckBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); - org.openide.awt.Mnemonics.setLocalizedText(rulePathFilterRegexCheckBox, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.rulePathFilterRegexCheckBox.text")); // NOI18N - rulePathFilterRegexCheckBox.setEnabled(false); + rulePathConditionRegexCheckBox.setFont(rulePathConditionRegexCheckBox.getFont().deriveFont(rulePathConditionRegexCheckBox.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); + org.openide.awt.Mnemonics.setLocalizedText(rulePathConditionRegexCheckBox, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.rulePathConditionRegexCheckBox.text")); // NOI18N + rulePathConditionRegexCheckBox.setEnabled(false); jScrollPane2.setFont(jScrollPane2.getFont().deriveFont(jScrollPane2.getFont().getStyle() & ~java.awt.Font.BOLD, 11)); @@ -594,6 +701,22 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp jTextArea1.setWrapStyleWord(true); jScrollPane2.setViewportView(jTextArea1); + org.openide.awt.Mnemonics.setLocalizedText(jLabel7, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel7.text")); // NOI18N + + mimeTypeComboBox.setEditable(true); + mimeTypeComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] {""})); + mimeTypeComboBox.setEnabled(false); + + org.openide.awt.Mnemonics.setLocalizedText(jLabel8, org.openide.util.NbBundle.getMessage(InterestingItemDefsPanel.class, "InterestingItemDefsPanel.jLabel8.text")); // NOI18N + + equalitySignComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "=", ">", "≥", "<", "≤" })); + equalitySignComboBox.setEnabled(false); + + jSpinner1.setEnabled(false); + + fileSizeUnitComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { Bundle.InterestingItemDefsPanel_bytes(), Bundle.InterestingItemDefsPanel_kiloBytes(), Bundle.InterestingItemDefsPanel_megaBytes(), Bundle.InterestingItemDefsPanel_gigaBytes() })); + fileSizeUnitComboBox.setEnabled(false); + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( @@ -611,112 +734,152 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp .addComponent(editSetButton, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(deleteSetButton))) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGap(18, 18, 18) .addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, 6, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(10, 10, 10) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(rulesListLabel) - .addComponent(jLabel5) - .addComponent(ignoreKnownFilesCheckbox) + .addGap(12, 12, 12) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(jPanel1Layout.createSequentialGroup() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jLabel2) - .addComponent(jLabel1)) - .addGap(18, 18, 18) - .addComponent(filesRadioButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jLabel1) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(jLabel2) + .addGap(27, 27, 27) + .addComponent(filesRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(dirsRadioButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(bothRadioButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bothRadioButton) + .addGap(27, 27, 27)))) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() - .addGap(9, 9, 9) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGap(380, 380, 380) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() - .addGap(2, 2, 2) - .addComponent(jLabel3) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(fileNameRadioButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(fileNameExtensionRadioButton, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(fileNameRegexCheckbox)) - .addComponent(fileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 250, javax.swing.GroupLayout.PREFERRED_SIZE))) - .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(jLabel3) + .addComponent(jLabel7) + .addComponent(jLabel8)) + .addGap(6, 6, 6)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addComponent(jLabel4) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(rulePathFilterRegexCheckBox) - .addComponent(rulePathFilterTextField))))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(rulePathConditionTextField, javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup() + .addComponent(equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(mimeTypeComboBox, javax.swing.GroupLayout.Alignment.LEADING, 0, 245, Short.MAX_VALUE) + .addComponent(fileNameTextField))) .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(360, 360, 360) + .addComponent(rulesListLabel)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(360, 360, 360) + .addComponent(jLabel5)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(360, 360, 360) + .addComponent(ignoreKnownFilesCheckbox)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(360, 360, 360) + .addComponent(setDescScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(360, 360, 360) + .addComponent(jLabel6)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(360, 360, 360) + .addComponent(rulesListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(360, 360, 360) .addComponent(newRuleButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGap(18, 18, 18) .addComponent(editRuleButton) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGap(18, 18, 18) .addComponent(deleteRuleButton)) - .addComponent(setDescScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel6) - .addComponent(rulesListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(456, 456, 456) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(fileNameRadioButton) + .addGap(4, 4, 4) + .addComponent(fileNameExtensionRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(fileNameRegexCheckbox)) + .addComponent(rulePathConditionRegexCheckBox)))) + .addGap(20, 20, 20)) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, 444, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(separator) .addGroup(jPanel1Layout.createSequentialGroup() - .addComponent(jLabel6) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jLabel5) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(setDescScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(ignoreKnownFilesCheckbox) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(rulesListLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(rulesListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(newRuleButton) - .addComponent(editRuleButton) - .addComponent(deleteRuleButton)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(jLabel1) - .addGap(2, 2, 2) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel2) - .addComponent(filesRadioButton) - .addComponent(dirsRadioButton) - .addComponent(bothRadioButton)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel3) - .addComponent(fileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(fileNameRadioButton) - .addComponent(fileNameExtensionRadioButton) - .addComponent(fileNameRegexCheckbox)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(setsListLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(setsListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 199, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(newSetButton) + .addComponent(editSetButton) + .addComponent(deleteSetButton))) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(jLabel6) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel5) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(setDescScrollPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ignoreKnownFilesCheckbox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(rulesListLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(rulesListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(newRuleButton) + .addComponent(editRuleButton) + .addComponent(deleteRuleButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel1) + .addGap(2, 2, 2) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel2) + .addComponent(filesRadioButton) + .addComponent(dirsRadioButton) + .addComponent(bothRadioButton)) + .addGap(16, 16, 16) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel3) + .addComponent(fileNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(fileNameRadioButton) + .addComponent(fileNameExtensionRadioButton) + .addComponent(fileNameRegexCheckbox)))) + .addGap(14, 14, 14) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) - .addComponent(rulePathFilterTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(rulePathFilterRegexCheckBox)) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup() - .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, 18) - .addComponent(setsListLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(setsListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 199, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(rulePathConditionTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(rulePathConditionRegexCheckBox) + .addGap(10, 10, 10) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(newSetButton) - .addComponent(editSetButton) - .addComponent(deleteSetButton)))) + .addComponent(jLabel7) + .addComponent(mimeTypeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(16, 16, 16) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel8) + .addComponent(equalitySignComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(fileSizeUnitComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addContainerGap()) ); @@ -729,33 +892,34 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 710, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 728, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 34, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addGap(0, 11, Short.MAX_VALUE) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 468, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 503, Short.MAX_VALUE) ); }// //GEN-END:initComponents + private void dirsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dirsRadioButtonActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_dirsRadioButtonActionPerformed + private void newSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newSetButtonActionPerformed this.doFileSetsDialog(null); }//GEN-LAST:event_newSetButtonActionPerformed - private void editSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editSetButtonActionPerformed - this.doFileSetsDialog(this.setsList.getSelectedValue()); - }//GEN-LAST:event_editSetButtonActionPerformed - - private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newRuleButtonActionPerformed - this.doFilesSetRuleDialog(null); - }//GEN-LAST:event_newRuleButtonActionPerformed - - private void editRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editRuleButtonActionPerformed - this.doFilesSetRuleDialog(this.rulesList.getSelectedValue()); - }//GEN-LAST:event_editRuleButtonActionPerformed + private void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteRuleButtonActionPerformed + // Interesting file sets are immutable for thread safety, + // so editing a files set rule definition is a replacement + // operation. Preserve the existing rules from the set being + // edited, except for the deleted rule. + FilesSet oldSet = this.setsList.getSelectedValue(); + Map rules = new HashMap<>(oldSet.getRules()); + FilesSet.Rule selectedRule = this.rulesList.getSelectedValue(); + rules.remove(selectedRule.getUuid()); + this.replaceFilesSet(oldSet, oldSet.getName(), oldSet.getDescription(), oldSet.ignoresKnownFiles(), rules); + }//GEN-LAST:event_deleteRuleButtonActionPerformed private void deleteSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteSetButtonActionPerformed FilesSet selectedSet = this.setsList.getSelectedValue(); @@ -771,25 +935,25 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp } }//GEN-LAST:event_deleteSetButtonActionPerformed - private void deleteRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteRuleButtonActionPerformed - // Interesting file sets are immutable for thread safety, - // so editing a files set rule definition is a replacement - // operation. Preserve the existing rules from the set being - // edited, except for the deleted rule. - FilesSet oldSet = this.setsList.getSelectedValue(); - Map rules = new HashMap<>(oldSet.getRules()); - FilesSet.Rule selectedRule = this.rulesList.getSelectedValue(); - rules.remove(selectedRule.getUuid()); - this.replaceFilesSet(oldSet, oldSet.getName(), oldSet.getDescription(), oldSet.ignoresKnownFiles(), rules); - }//GEN-LAST:event_deleteRuleButtonActionPerformed - private void ignoreKnownFilesCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ignoreKnownFilesCheckboxActionPerformed // TODO add your handling code here: }//GEN-LAST:event_ignoreKnownFilesCheckboxActionPerformed - private void dirsRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dirsRadioButtonActionPerformed + private void editSetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editSetButtonActionPerformed + this.doFileSetsDialog(this.setsList.getSelectedValue()); + }//GEN-LAST:event_editSetButtonActionPerformed + + private void editRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editRuleButtonActionPerformed + this.doFilesSetRuleDialog(this.rulesList.getSelectedValue()); + }//GEN-LAST:event_editRuleButtonActionPerformed + + private void newRuleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newRuleButtonActionPerformed + this.doFilesSetRuleDialog(null); + }//GEN-LAST:event_newRuleButtonActionPerformed + + private void fileNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileNameTextFieldActionPerformed // TODO add your handling code here: - }//GEN-LAST:event_dirsRadioButtonActionPerformed + }//GEN-LAST:event_fileNameTextFieldActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JRadioButton bothRadioButton; @@ -798,11 +962,13 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp private javax.swing.JRadioButton dirsRadioButton; private javax.swing.JButton editRuleButton; private javax.swing.JButton editSetButton; + private javax.swing.JComboBox equalitySignComboBox; private javax.swing.ButtonGroup fileNameButtonGroup; private javax.swing.JRadioButton fileNameExtensionRadioButton; private javax.swing.JRadioButton fileNameRadioButton; private javax.swing.JCheckBox fileNameRegexCheckbox; private javax.swing.JTextField fileNameTextField; + private javax.swing.JComboBox fileSizeUnitComboBox; private javax.swing.JRadioButton filesRadioButton; private javax.swing.JCheckBox ignoreKnownFilesCheckbox; private javax.swing.JLabel jLabel1; @@ -811,14 +977,18 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; + private javax.swing.JLabel jLabel7; + private javax.swing.JLabel jLabel8; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JSpinner jSpinner1; private javax.swing.JTextArea jTextArea1; + private javax.swing.JComboBox mimeTypeComboBox; private javax.swing.JButton newRuleButton; private javax.swing.JButton newSetButton; - private javax.swing.JCheckBox rulePathFilterRegexCheckBox; - private javax.swing.JTextField rulePathFilterTextField; + private javax.swing.JCheckBox rulePathConditionRegexCheckBox; + private javax.swing.JTextField rulePathConditionTextField; private javax.swing.JList rulesList; private javax.swing.JLabel rulesListLabel; private javax.swing.JScrollPane rulesListScrollPane; @@ -828,6 +998,7 @@ final class InterestingItemDefsPanel extends IngestModuleGlobalSettingsPanel imp private javax.swing.JList setsList; private javax.swing.JLabel setsListLabel; private javax.swing.JScrollPane setsListScrollPane; + private javax.swing.ButtonGroup typeButtonGroup; // End of variables declaration//GEN-END:variables } diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemsFilesSetSettings.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemsFilesSetSettings.java new file mode 100755 index 0000000000..14771992eb --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemsFilesSetSettings.java @@ -0,0 +1,44 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2011-2016 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.autopsy.modules.interestingitems; + +import java.io.Serializable; +import java.util.Map; + +/** + * + * @author oliver + */ +class InterestingItemsFilesSetSettings implements Serializable { + private static final long serialVersionUID = 1L; + private Map filesSets; + InterestingItemsFilesSetSettings(Map filesSets) { + this.filesSets = filesSets; + } + + /** + * @return the filesSets + */ + Map getFilesSets() { + return filesSets; + } + + + +} diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemsIngestModuleFactory.java b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemsIngestModuleFactory.java index 549e75c963..1779c8b3c2 100755 --- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemsIngestModuleFactory.java +++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/InterestingItemsIngestModuleFactory.java @@ -20,8 +20,11 @@ package org.sleuthkit.autopsy.modules.interestingitems; import java.util.ArrayList; import java.util.List; +import org.openide.util.Exceptions; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.ServiceProvider; +import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.Version; import org.sleuthkit.autopsy.ingest.FileIngestModule; import org.sleuthkit.autopsy.ingest.IngestModuleFactory; @@ -37,6 +40,10 @@ import org.sleuthkit.autopsy.ingest.IngestModuleIngestJobSettingsPanel; @ServiceProvider(service = IngestModuleFactory.class) final public class InterestingItemsIngestModuleFactory extends IngestModuleFactoryAdapter { + @Messages({ + "InterestingItemsIngestModuleFactory.defaultSettingsError=Error getting default interesting files settings from file." + }) + @Override public String getModuleDisplayName() { return getModuleName(); @@ -76,8 +83,12 @@ final public class InterestingItemsIngestModuleFactory extends IngestModuleFacto // definitions independent of the rules that make up the defintions. // Doing so also keeps the serialization simple. List enabledFilesSetNames = new ArrayList<>(); - for (String name : InterestingItemDefsManager.getInstance().getInterestingFilesSets().keySet()) { - enabledFilesSetNames.add(name); + try { + for (String name : InterestingItemDefsManager.getInstance().getInterestingFilesSets().keySet()) { + enabledFilesSetNames.add(name); + } + } catch (InterestingItemDefsManager.InterestingItemDefsManagerException ex) { + MessageNotifyUtil.Message.error(Bundle.InterestingItemsIngestModuleFactory_defaultSettingsError()); } return new FilesIdentifierIngestJobSettings(enabledFilesSetNames); } diff --git a/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.form b/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.form index c4bd675f90..76a6f6cec7 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.form +++ b/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.form @@ -87,7 +87,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.java b/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.java index a75ab43848..bfdc9deca9 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.java +++ b/Core/src/org/sleuthkit/autopsy/report/ArtifactSelectionDialog.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.EnumMap; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; @@ -40,15 +41,14 @@ import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.BlackboardArtifact; -import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; import org.sleuthkit.datamodel.TskCoreException; public class ArtifactSelectionDialog extends javax.swing.JDialog { private ArtifactModel model; private ArtifactRenderer renderer; - private Map artifactStates; - private List artifacts; + private Map artifactTypeSelections; + private List artifactTypes; /** * Creates new form ArtifactSelectionDialog @@ -61,27 +61,31 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog { } /** - * Populate the list of artifacts with all important artifacts. + * Populate the list of artifact types with all important artifact types. */ @SuppressWarnings("deprecation") private void populateList() { try { - ArrayList doNotReport = new ArrayList<>(); - doNotReport.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO); - doNotReport.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT); // output is too unstructured for table review. + ArrayList doNotReport = new ArrayList<>(); + doNotReport.add(new BlackboardArtifact.Type(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getTypeID(), + BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getLabel(), + BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getDisplayName())); + doNotReport.add(new BlackboardArtifact.Type(BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getTypeID(), + BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getLabel(), + BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getDisplayName())); // output is too unstructured for table review - artifacts = Case.getCurrentCase().getSleuthkitCase().getBlackboardArtifactTypesInUse(); - artifacts.removeAll(doNotReport); - Collections.sort(artifacts, new Comparator() { + artifactTypes = Case.getCurrentCase().getSleuthkitCase().getArtifactTypesInUse(); + artifactTypes.removeAll(doNotReport); + Collections.sort(artifactTypes, new Comparator() { @Override - public int compare(ARTIFACT_TYPE o1, ARTIFACT_TYPE o2) { + public int compare(BlackboardArtifact.Type o1, BlackboardArtifact.Type o2) { return o1.getDisplayName().compareTo(o2.getDisplayName()); } }); - artifactStates = new EnumMap<>(BlackboardArtifact.ARTIFACT_TYPE.class); - for (BlackboardArtifact.ARTIFACT_TYPE type : artifacts) { - artifactStates.put(type, Boolean.TRUE); + artifactTypeSelections = new HashMap<>(); + for (BlackboardArtifact.Type type : artifactTypes) { + artifactTypeSelections.put(type, Boolean.TRUE); } } catch (TskCoreException ex) { Logger.getLogger(ArtifactSelectionDialog.class.getName()).log(Level.SEVERE, "Error getting list of artifacts in use: " + ex.getLocalizedMessage()); //NON-NLS @@ -99,17 +103,19 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog { @Override public void mousePressed(MouseEvent evt) { int index = artifactList.locationToIndex(evt.getPoint()); - BlackboardArtifact.ARTIFACT_TYPE type = model.getElementAt(index); - artifactStates.put(type, !artifactStates.get(type)); + BlackboardArtifact.Type type = model.getElementAt(index); + artifactTypeSelections.put(type, !artifactTypeSelections.get(type)); artifactList.repaint(); } }); } /** - * Display this dialog, and return the selected artifacts. + * Display this dialog, and return the selected artifactTypes. + * + * @return The state of artifact types displayed */ - Map display() { + Map display() { this.setTitle(NbBundle.getMessage(this.getClass(), "ArtifactSelectionDialog.dlgTitle.text")); Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); // set the popUp window / JFrame @@ -120,7 +126,7 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog { setLocation((screenDimension.width - w) / 2, (screenDimension.height - h) / 2); this.setVisible(true); - return artifactStates; + return artifactTypeSelections; } /** @@ -215,20 +221,20 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog { }//GEN-LAST:event_okButtonActionPerformed private void selectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectAllButtonActionPerformed - for (ARTIFACT_TYPE type : artifacts) { - artifactStates.put(type, Boolean.TRUE); + for (BlackboardArtifact.Type type : artifactTypes) { + artifactTypeSelections.put(type, Boolean.TRUE); } artifactList.repaint(); }//GEN-LAST:event_selectAllButtonActionPerformed private void deselectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deselectAllButtonActionPerformed - for (ARTIFACT_TYPE type : artifacts) { - artifactStates.put(type, Boolean.FALSE); + for (BlackboardArtifact.Type type : artifactTypes) { + artifactTypeSelections.put(type, Boolean.FALSE); } artifactList.repaint(); }//GEN-LAST:event_deselectAllButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JList artifactList; + private javax.swing.JList artifactList; private javax.swing.JScrollPane artifactScrollPane; private javax.swing.JButton deselectAllButton; private javax.swing.JButton okButton; @@ -236,16 +242,16 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog { private javax.swing.JLabel titleLabel; // End of variables declaration//GEN-END:variables - private class ArtifactModel implements ListModel { + private class ArtifactModel implements ListModel { @Override public int getSize() { - return artifacts.size(); + return artifactTypes.size(); } @Override - public ARTIFACT_TYPE getElementAt(int index) { - return artifacts.get(index); + public BlackboardArtifact.Type getElementAt(int index) { + return artifactTypes.get(index); } @Override @@ -257,13 +263,13 @@ public class ArtifactSelectionDialog extends javax.swing.JDialog { } } - private class ArtifactRenderer extends JCheckBox implements ListCellRenderer { + private class ArtifactRenderer extends JCheckBox implements ListCellRenderer { @Override - public Component getListCellRendererComponent(JList list, ARTIFACT_TYPE value, int index, boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(JList list, BlackboardArtifact.Type value, int index, boolean isSelected, boolean cellHasFocus) { if (value != null) { setEnabled(list.isEnabled()); - setSelected(artifactStates.get(value)); + setSelected(artifactTypeSelections.get(value)); setFont(list.getFont()); setBackground(list.getBackground()); setForeground(list.getForeground()); diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties index 5e74024afe..d535c310f4 100644 --- a/Core/src/org/sleuthkit/autopsy/report/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/report/Bundle.properties @@ -71,8 +71,6 @@ ReportGenerator.artifactTable.taggedResults.text=Contains results that were tagg ReportGenerator.progress.processing=Now processing {0}... ReportGenerator.msgShow.skippingArtType.title=Skipping artifact type {0} in reports ReportGenerator.msgShow.skippingArtType.msg=Unknown columns to report on -ReportGenerator.msgShow.skippingArtRow.title=Skipping artifact rows for type {0} in reports -ReportGenerator.msgShow.skippingArtRow.msg=Unknown columns to report on ReportGenerator.makeContTagTab.taggedFiles.msg=Contains files that were tagged with one of the following\: ReportGenerator.makeBbArtTagTab.taggedRes.msg=This report only includes results tagged with\: ReportGenerator.tagTable.header.resultType=Result Type diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java index 59472416cc..fed97afb85 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportGenerator.java @@ -34,6 +34,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -41,6 +42,9 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; +import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import javax.swing.JDialog; @@ -49,10 +53,12 @@ import javax.swing.SwingWorker; import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.EscapeUtil; import org.sleuthkit.autopsy.coreutils.ImageUtils; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; +import org.sleuthkit.autopsy.datamodel.ContentUtils; import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; @@ -66,6 +72,7 @@ import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.SleuthkitCase.CaseDbQuery; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; +import org.sleuthkit.datamodel.BlackboardAttribute.Type; /** * Instances of this class use GeneralReportModules, TableReportModules and @@ -83,6 +90,7 @@ class ReportGenerator { private Map tableProgress; private Map generalProgress; private Map fileProgress; + private Map> columnHeaderMap; private String reportPath; private ReportGenerationPanel panel = new ReportGenerationPanel(); @@ -132,18 +140,19 @@ class ReportGenerator { tableProgress = new HashMap<>(); fileProgress = new HashMap<>(); setupProgressPanels(tableModuleStates, generalModuleStates, fileListModuleStates); + this.columnHeaderMap = new HashMap<>(); } /** * Create a ReportProgressPanel for each report generation module selected * by the user. * - * @param tableModuleStates The enabled/disabled state of each - * TableReportModule - * @param generalModuleStates The enabled/disabled state of each - * GeneralReportModule + * @param tableModuleStates The enabled/disabled state of each + * TableReportModule + * @param generalModuleStates The enabled/disabled state of each + * GeneralReportModule * @param fileListModuleStates The enabled/disabled state of each - * FileReportModule + * FileReportModule */ private void setupProgressPanels(Map tableModuleStates, Map generalModuleStates, Map fileListModuleStates) { if (null != tableModuleStates) { @@ -235,11 +244,11 @@ class ReportGenerator { * Run the TableReportModules using a SwingWorker. * * @param artifactTypeSelections the enabled/disabled state of the artifact - * types to be included in the report - * @param tagSelections the enabled/disabled state of the tag names to be - * included in the report + * types to be included in the report + * @param tagSelections the enabled/disabled state of the tag names + * to be included in the report */ - public void generateTableReports(Map artifactTypeSelections, Map tagNameSelections) { + public void generateTableReports(Map artifactTypeSelections, Map tagNameSelections) { if (!tableProgress.isEmpty() && null != artifactTypeSelections) { TableReportsWorker worker = new TableReportsWorker(artifactTypeSelections, tagNameSelections); worker.execute(); @@ -250,7 +259,7 @@ class ReportGenerator { * Run the FileReportModules using a SwingWorker. * * @param enabledInfo the Information that should be included about each - * file in the report. + * file in the report. */ public void generateFileListReports(Map enabledInfo) { if (!fileProgress.isEmpty() && null != enabledInfo) { @@ -420,19 +429,19 @@ class ReportGenerator { private class TableReportsWorker extends SwingWorker { private List tableModules = new ArrayList<>(); - private List artifactTypes = new ArrayList<>(); + private List artifactTypes = new ArrayList<>(); private HashSet tagNamesFilter = new HashSet<>(); private List images = new ArrayList<>(); - TableReportsWorker(Map artifactTypeSelections, Map tagNameSelections) { + TableReportsWorker(Map artifactTypeSelections, Map tagNameSelections) { // Get the report modules selected by the user. for (Entry entry : tableProgress.entrySet()) { tableModules.add(entry.getKey()); } // Get the artifact types selected by the user. - for (Entry entry : artifactTypeSelections.entrySet()) { + for (Entry entry : artifactTypeSelections.entrySet()) { if (entry.getValue()) { artifactTypes.add(entry.getKey()); } @@ -457,7 +466,7 @@ class ReportGenerator { module.startReport(reportPath); progress.start(); progress.setIndeterminate(false); - progress.setMaximumProgress(ARTIFACT_TYPE.values().length + 2); // +2 for content and blackboard artifact tags + progress.setMaximumProgress(this.artifactTypes.size() + 2); // +2 for content and blackboard artifact tags } } @@ -492,7 +501,7 @@ class ReportGenerator { } // Add a table to the report for every enabled blackboard artifact type. - for (ARTIFACT_TYPE type : artifactTypes) { + for (BlackboardArtifact.Type type : artifactTypes) { // Check for cancellaton. removeCancelledTableReportModules(); if (tableModules.isEmpty()) { @@ -506,62 +515,61 @@ class ReportGenerator { } // Keyword hits and hashset hit artifacts get special handling. - if (type.equals(ARTIFACT_TYPE.TSK_KEYWORD_HIT)) { + if (type.getTypeID() == ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) { writeKeywordHits(tableModules, comment.toString(), tagNamesFilter); continue; - } else if (type.equals(ARTIFACT_TYPE.TSK_HASHSET_HIT)) { + } else if (type.getTypeID() == ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) { writeHashsetHits(tableModules, comment.toString(), tagNamesFilter); continue; } - List unsortedArtifacts = getFilteredArtifacts(type, tagNamesFilter); + List artifactList = getFilteredArtifacts(type, tagNamesFilter); - if (unsortedArtifacts.isEmpty()) { + if (artifactList.isEmpty()) { continue; } - // The most efficient way to sort all the Artifacts is to add them to a List, and then - // sort that List based off a Comparator. Adding to a TreeMap/Set/List sorts the list - // each time an element is added, which adds unnecessary overhead if we only need it sorted once. - Collections.sort(unsortedArtifacts); - - // Get the column headers appropriate for the artifact type. /* - * @@@ BC: Seems like a better design here would be to have a - * method that takes in the artifact as an argument and returns - * the attributes. We then use that to make the headers and to - * make each row afterwards so that we don't have - * artifact-specific logic in both getArtifactTableCoumnHeaders - * and ArtifactData.getRow() + Gets all of the attribute types of this artifact type by adding + all of the types to a set */ - List columnHeaders = getArtifactTableColumnHeaders(type.getTypeID()); - if (columnHeaders == null) { - // @@@ Hack to prevent system from hanging. Better solution is to merge all attributes into a single column or analyze the artifacts to find out how many are needed. + Set attrTypeSet = new TreeSet<>((Type o1, Type o2) -> o1.getDisplayName().compareTo(o2.getDisplayName())); + for (ArtifactData data : artifactList) { + List attributes = data.getAttributes(); + for (BlackboardAttribute attribute : attributes) { + attrTypeSet.add(attribute.getAttributeType()); + } + } + // Get the columns appropriate for the artifact type. This is + // used to get the data that will be in the cells below based on + // type, and display the column headers. + List columns = getArtifactTableColumns(type.getTypeID(), attrTypeSet); + if (columns.isEmpty()) { continue; } + ReportGenerator.this.columnHeaderMap.put(type.getTypeID(), columns); + + // The artifact list is sorted now, as getting the row data is + // dependent on having the columns, which is necessary for + // sorting. + Collections.sort(artifactList); + List columnHeaderNames = new ArrayList<>(); + for (Column currColumn : columns) { + columnHeaderNames.add(currColumn.getColumnHeader()); + } for (TableReportModule module : tableModules) { module.startDataType(type.getDisplayName(), comment.toString()); - module.startTable(columnHeaders); + module.startTable(columnHeaderNames); } - - boolean msgSent = false; - for (ArtifactData artifactData : unsortedArtifacts) { + for (ArtifactData artifactData : artifactList) { // Add the row data to all of the reports. for (TableReportModule module : tableModules) { - // Get the row data for this type of artifact. + // Get the row data for this artifact, and has the + // module add it. List rowData = artifactData.getRow(); if (rowData.isEmpty()) { - if (msgSent == false) { - MessageNotifyUtil.Notify.show(NbBundle.getMessage(this.getClass(), - "ReportGenerator.msgShow.skippingArtRow.title", - type), - NbBundle.getMessage(this.getClass(), - "ReportGenerator.msgShow.skippingArtRow.msg"), - MessageNotifyUtil.MessageType.ERROR); - msgSent = true; - } continue; } @@ -870,15 +878,15 @@ class ReportGenerator { * Get a List of the artifacts and data of the given type that pass the * given Tag Filter. * - * @param type The artifact type to get + * @param type The artifact type to get * @param tagNamesFilter The tag names that should be included. * * @return a list of the filtered tags. */ - private List getFilteredArtifacts(ARTIFACT_TYPE type, HashSet tagNamesFilter) { + private List getFilteredArtifacts(BlackboardArtifact.Type type, HashSet tagNamesFilter) { List artifacts = new ArrayList<>(); try { - for (BlackboardArtifact artifact : skCase.getBlackboardArtifacts(type)) { + for (BlackboardArtifact artifact : skCase.getBlackboardArtifacts(type.getTypeID())) { List tags = Case.getCurrentCase().getServices().getTagsManager().getBlackboardArtifactTagsByArtifact(artifact); HashSet uniqueTagNames = new HashSet<>(); for (BlackboardArtifactTag tag : tags) { @@ -1046,7 +1054,11 @@ class ReportGenerator { currentKeyword = keyword; for (TableReportModule module : tableModules) { module.addSetElement(currentKeyword); - module.startTable(getArtifactTableColumnHeaders(ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID())); + List columnHeaderNames = new ArrayList<>(); + columnHeaderNames.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.preview")); + columnHeaderNames.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")); + columnHeaderNames.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tags")); + module.startTable(columnHeaderNames); } } @@ -1178,7 +1190,11 @@ class ReportGenerator { currentSet = set; for (TableReportModule module : tableModules) { module.startSet(currentSet); - module.startTable(getArtifactTableColumnHeaders(ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID())); + List columnHeaderNames = new ArrayList<>(); + columnHeaderNames.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.file")); + columnHeaderNames.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.size")); + columnHeaderNames.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tags")); + module.startTable(columnHeaderNames); tableProgress.get(module).updateStatusLabel( NbBundle.getMessage(this.getClass(), "ReportGenerator.progress.processingList", ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName(), currentSet)); @@ -1203,335 +1219,523 @@ class ReportGenerator { } /** - * For a given artifact type ID, return the list of the row titles we're + * For a given artifact type ID, return the list of the columns that we are * reporting on. * - * @param artifactTypeId artifact type ID + * @param artifactTypeId artifact type ID + * @param attributeTypeSet The set of attributeTypeSet available for this + * artifact type * * @return List row titles */ - private List getArtifactTableColumnHeaders(int artifactTypeId) { - ArrayList columnHeaders; + private List getArtifactTableColumns(int artifactTypeId, Set attributeTypeSet) { + ArrayList columns = new ArrayList<>(); - BlackboardArtifact.ARTIFACT_TYPE type = BlackboardArtifact.ARTIFACT_TYPE.fromID(artifactTypeId); - switch (type) { - case TSK_WEB_BOOKMARK: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.url"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.title"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateCreated"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_WEB_COOKIE: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.url"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.value"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_WEB_HISTORY: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.url"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateAccessed"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.referrer"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.title"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.urlDomainDecoded"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_WEB_DOWNLOAD: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dest"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.sourceUrl"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateAccessed"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_RECENT_OBJECT: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.path"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_INSTALLED_PROG: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.progName"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.instDateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_KEYWORD_HIT: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.preview"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_HASHSET_HIT: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.file"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.size")})); - break; - case TSK_DEVICE_ATTACHED: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.devMake"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.devModel"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.deviceId"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_WEB_SEARCH_QUERY: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.text"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.domain"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateAccessed"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.progName"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_METADATA_EXIF: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTaken"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.devManufacturer"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.devModel"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.altitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_CONTACT: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.personName"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumber"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumHome"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumOffice"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumMobile"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.email"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_MESSAGE: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.msgType"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.direction"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.readStatus"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.fromPhoneNum"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.fromEmail"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.toPhoneNum"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.toEmail"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.subject"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.text"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_CALLLOG: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.personName"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.fromPhoneNum"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.toPhoneNum"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.direction"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_CALENDAR_ENTRY: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.calendarEntryType"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.description"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.startDateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.endDateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.location"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_SPEED_DIAL_ENTRY: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.shortCut"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.personName"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumber"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_BLUETOOTH_PAIRING: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.deviceName"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.deviceAddress"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_GPS_TRACKPOINT: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_GPS_BOOKMARK: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.altitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.locationAddress"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_GPS_LAST_KNOWN_LOCATION: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.altitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.locationAddress"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_GPS_SEARCH: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.altitude"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.locationAddress"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_SERVICE_ACCOUNT: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.category"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.userId"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.password"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.personName"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.appName"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.url"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.appPath"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.description"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.replytoAddress"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.mailServer"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_ENCRYPTION_DETECTED: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_EXT_MISMATCH_DETECTED: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.file"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.extension.text"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.mimeType.text"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.path")})); - break; - case TSK_OS_INFO: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.processorArchitecture.text"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.osName.text"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.osInstallDate.text"), - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile")})); - break; - case TSK_EMAIL_MSG: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskEmailTo"), //TSK_EMAIL_TO - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskEmailFrom"), //TSK_EMAIL_FROM - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskSubject"), //TSK_SUBJECT - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskDateTimeSent"), //TSK_DATETIME_SENT - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskDateTimeRcvd"), //TSK_DATETIME_RCVD - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskPath"), //TSK_PATH - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskEmailCc"), //TSK_EMAIL_CC - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskEmailBcc"), //TSK_EMAIL_BCC - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskMsgId")})); //TSK_MSG_ID - break; - case TSK_INTERESTING_FILE_HIT: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskSetName"), //TSK_SET_NAME - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskInterestingFilesCategory"), //TSK_CATEGORY - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskPath")})); //TSK_PATH - break; - case TSK_GPS_ROUTE: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskGpsRouteCategory"), //TSK_CATEGORY - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), //TSK_DATETIME - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitudeEnd"), //TSK_GEO_LATITUDE_END - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitudeEnd"), //TSK_GEO_LONGITUDE_END - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitudeStart"), //TSK_GEO_LATITUDE_START - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitudeStart"), //TSK_GEO_LONGITUDE_START - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), //TSK_NAME - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.location"), //TSK_LOCATION - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program")}));//TSK_PROG_NAME - break; - case TSK_INTERESTING_ARTIFACT_HIT: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskSetName"), //TSK_SET_NAME - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.associatedArtifact"), //TSK_ASSOCIATED_ARTIFACT - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program")})); //TSK_PROG_NAME - break; - case TSK_PROG_RUN: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), //TSK_PROG_NAME - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.associatedArtifact"), //TSK_ASSOCIATED_ARTIFACT - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), //TSK_DATETIME - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.count")})); //TSK_COUNT - break; + // Long switch statement to retain ordering of attribute types that are + // attached to pre-defined artifact types. + if (ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.url"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_URL))); - case TSK_OS_ACCOUNT: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.userName"), //TSK_USER_NAME - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.userId")})); //TSK_USER_ID - break; + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.title"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_TITLE))); - case TSK_REMOTE_DRIVE: - columnHeaders = new ArrayList<>(Arrays.asList(new String[]{ - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.localPath"), //TSK_LOCAL_PATH - NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.remotePath")})); //TSK_REMOTE_PATH - break; - default: - return null; - } - columnHeaders.add(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tags")); + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateCreated"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_CREATED))); - return columnHeaders; - } + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); - /** - * Map all BlackboardAttributes' values in a list of BlackboardAttributes to - * each attribute's attribute type ID, using module's dateToString method - * for date/time conversions if a module is supplied. - * - * @param attList list of BlackboardAttributes to be mapped - * @param module the TableReportModule the mapping is for - * - * @return Map of the BlackboardAttributes mapped to their - * attribute type ID - */ - public Map getMappedAttributes(List attList, TableReportModule... module) { - Map attributes = new HashMap<>(); - int size = ATTRIBUTE_TYPE.values().length; - for (int n = 0; n <= size; n++) { - attributes.put(n, ""); - } - for (BlackboardAttribute tempatt : attList) { - String value = ""; - Integer type = tempatt.getAttributeType().getTypeID(); - if (type.equals(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID()) - || type.equals(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED.getTypeID()) - || type.equals(ATTRIBUTE_TYPE.TSK_DATETIME_CREATED.getTypeID()) - || type.equals(ATTRIBUTE_TYPE.TSK_DATETIME_MODIFIED.getTypeID()) - || type.equals(ATTRIBUTE_TYPE.TSK_DATETIME_SENT.getTypeID()) - || type.equals(ATTRIBUTE_TYPE.TSK_DATETIME_RCVD.getTypeID()) - || type.equals(ATTRIBUTE_TYPE.TSK_DATETIME_START.getTypeID()) - || type.equals(ATTRIBUTE_TYPE.TSK_DATETIME_END.getTypeID())) { - if (module.length > 0) { - value = module[0].dateToString(tempatt.getValueLong()); - } else { - SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); - value = sdf.format(new java.util.Date((tempatt.getValueLong() * 1000))); - } - } else { - value = tempatt.getDisplayString(); + } else if (ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.url"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_URL))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.value"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_VALUE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + } else if (ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.url"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_URL))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateAccessed"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.referrer"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_REFERRER))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.title"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_TITLE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.urlDomainDecoded"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_URL_DECODED))); + + } else if (ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dest"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PATH))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.sourceUrl"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_URL))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateAccessed"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + } else if (ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.path"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PATH))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + } else if (ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.progName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.instDateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + } else if (ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() == artifactTypeId) { + columns.add(new HeaderOnlyColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.preview"))); + + } else if (ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() == artifactTypeId) { + columns.add(new SourceFileColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.file"))); + + columns.add(new HeaderOnlyColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.size"))); + + } else if (ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.devMake"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DEVICE_MAKE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.devModel"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DEVICE_MODEL))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.deviceId"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DEVICE_ID))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + } else if (ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.text"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_TEXT))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.domain"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DOMAIN))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateAccessed"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.progName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + } else if (ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTaken"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_CREATED))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.devManufacturer"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DEVICE_MAKE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.devModel"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DEVICE_MODEL))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.altitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE))); + + } else if (ARTIFACT_TYPE.TSK_CONTACT.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.personName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumber"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumHome"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_HOME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumOffice"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_OFFICE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumMobile"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_MOBILE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.email"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_EMAIL))); + + } else if (ARTIFACT_TYPE.TSK_MESSAGE.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.msgType"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_MESSAGE_TYPE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.direction"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DIRECTION))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.readStatus"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_READ_STATUS))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.fromPhoneNum"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.fromEmail"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_EMAIL_FROM))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.toPhoneNum"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.toEmail"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_EMAIL_TO))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.subject"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SUBJECT))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.text"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_TEXT))); + + } else if (ARTIFACT_TYPE.TSK_CALLLOG.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.personName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.fromPhoneNum"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.toPhoneNum"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_START))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.direction"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DIRECTION))); + + } else if (ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.calendarEntryType"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_CALENDAR_ENTRY_TYPE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.description"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DESCRIPTION))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.startDateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_START))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.endDateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_END))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.location"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_LOCATION))); + + } else if (ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.shortCut"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SHORTCUT))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.personName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME_PERSON))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.phoneNumber"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER))); + + } else if (ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.deviceName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DEVICE_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.deviceAddress"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DEVICE_ID))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + } else if (ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + } else if (ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.altitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.locationAddress"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_LOCATION))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + } else if (ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.altitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.locationAddress"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_LOCATION))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + } else if (ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.altitude"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.locationAddress"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_LOCATION))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + } else if (ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.category"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_CATEGORY))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.userId"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_USER_ID))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.password"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PASSWORD))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.personName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.appName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.url"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_URL))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.appPath"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PATH))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.description"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DESCRIPTION))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.replytoAddress"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_EMAIL_REPLYTO))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.mailServer"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SERVER_NAME))); + + } else if (ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME))); + + } else if (ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID() == artifactTypeId) { + columns.add(new HeaderOnlyColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.file"))); + + columns.add(new HeaderOnlyColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.extension.text"))); + + columns.add(new HeaderOnlyColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.mimeType.text"))); + + columns.add(new HeaderOnlyColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.path"))); + + } else if (ARTIFACT_TYPE.TSK_OS_INFO.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.processorArchitecture.text"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROCESSOR_ARCHITECTURE))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.osName.text"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.osInstallDate.text"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + } else if (ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskEmailTo"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_EMAIL_TO))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskEmailFrom"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_EMAIL_FROM))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskSubject"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SUBJECT))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskDateTimeSent"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_SENT))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskDateTimeRcvd"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME_RCVD))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskPath"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PATH))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskEmailCc"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_EMAIL_CC))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskEmailBcc"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_EMAIL_BCC))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskMsgId"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_MSG_ID))); + + } else if (ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskSetName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SET_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskInterestingFilesCategory"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_CATEGORY))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskPath"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PATH))); + + } else if (ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskGpsRouteCategory"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_CATEGORY))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitudeEnd"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_END))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitudeEnd"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_END))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.latitudeStart"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_START))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.longitudeStart"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_START))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.name"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.location"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_LOCATION))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + } else if (ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tskSetName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SET_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.associatedArtifact"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + } else if (ARTIFACT_TYPE.TSK_PROG_RUN.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.program"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PROG_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.associatedArtifact"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.dateTime"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DATETIME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.count"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_COUNT))); + + } else if (ARTIFACT_TYPE.TSK_OS_ACCOUNT.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.userName"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_USER_NAME))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.userId"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_USER_ID))); + + } else if (ARTIFACT_TYPE.TSK_REMOTE_DRIVE.getTypeID() == artifactTypeId) { + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.localPath"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_LOCAL_PATH))); + + columns.add(new AttributeColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.remotePath"), + new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_REMOTE_PATH))); + } else { + // This is the case that it is a custom type. The reason an else is + // necessary is to make sure that the source file column is added + for (BlackboardAttribute.Type type : attributeTypeSet) { + columns.add(new AttributeColumn(type.getDisplayName(), type)); } + columns.add(new SourceFileColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile"))); + columns.add(new TaggedResultsColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tags"))); - if (value == null) { - value = ""; - } - value = EscapeUtil.escapeHtml(value); - attributes.put(type, value); + // Short circuits to guarantee that the attribute types aren't added + // twice. + return columns; } - return attributes; + // If it is an attribute column, it removes the attribute type of that + // column from the set, so types are not reported more than once. + for (Column column : columns) { + attributeTypeSet = column.removeTypeFromSet(attributeTypeSet); + } + // Now uses the remaining types in the set to construct columns + for (BlackboardAttribute.Type type : attributeTypeSet) { + columns.add(new AttributeColumn(type.getDisplayName(), type)); + } + // Source file column is added here for ordering purposes. + if (artifactTypeId == ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_CONTACT.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_MESSAGE.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_CALLLOG.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID() + || artifactTypeId == ARTIFACT_TYPE.TSK_OS_INFO.getTypeID()) { + columns.add(new SourceFileColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.srcFile"))); + } + columns.add(new TaggedResultsColumn(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tags"))); + + return columns; } /** @@ -1557,11 +1761,10 @@ class ReportGenerator { * * @return String unique path */ - private String getFileUniquePath(long objId) { + private String getFileUniquePath(Content content) { try { - AbstractFile af = skCase.getAbstractFileById(objId); - if (af != null) { - return af.getUniquePath(); + if (content != null) { + return content.getUniquePath(); } else { return ""; } @@ -1570,6 +1773,7 @@ class ReportGenerator { logger.log(Level.WARNING, "Failed to get Abstract File by ID.", ex); //NON-NLS } return ""; + } /** @@ -1582,11 +1786,17 @@ class ReportGenerator { private List attributes; private HashSet tags; private List rowData = null; + private Content content; ArtifactData(BlackboardArtifact artifact, List attrs, HashSet tags) { this.artifact = artifact; this.attributes = attrs; this.tags = tags; + try { + this.content = Case.getCurrentCase().getSleuthkitCase().getContentById(artifact.getObjectID()); + } catch (TskCoreException ex) { + logger.log(Level.SEVERE, "Could not get content from database"); + } } public BlackboardArtifact getArtifact() { @@ -1609,9 +1819,17 @@ class ReportGenerator { return artifact.getObjectID(); } + /** + * @return the content + */ + public Content getContent() { + return content; + } + /** * Compares ArtifactData objects by the first attribute they have in - * common in their List. + * common in their List. Should only be used on two + * artifacts of the same type * * If all attributes are the same, they are assumed duplicates and are * compared by their artifact id. Should only be used with attributes of @@ -1627,22 +1845,32 @@ class ReportGenerator { return compare; } } - // If all attributes are the same, they're most likely duplicates so sort by artifact ID return ((Long) this.getArtifactID()).compareTo((Long) otherArtifactData.getArtifactID()); } /** * Get the values for each row in the table report. + * + * the value types of custom artifacts + * + * @return A list of string representing the data for this artifact. */ public List getRow() { if (rowData == null) { try { rowData = getOrderedRowDataAsStrings(); - // replace null values if attribute was not defined - for (int i = 0; i < rowData.size(); i++) { - if (rowData.get(i) == null) { - rowData.set(i, ""); + // If else is done so that row data is not set before + // columns are added to the hash map. + if (rowData.size() > 0) { + // replace null values if attribute was not defined + for (int i = 0; i < rowData.size(); i++) { + if (rowData.get(i) == null) { + rowData.set(i, ""); + } } + } else { + rowData = null; + return new ArrayList<>(); } } catch (TskCoreException ex) { errorList.add( @@ -1659,274 +1887,67 @@ class ReportGenerator { * correct order to be written to the report. * * @return List row values. Values could be null if attribute is - * not defined in artifact + * not defined in artifact * * @throws TskCoreException */ private List getOrderedRowDataAsStrings() throws TskCoreException { - Map mappedAttributes = getMappedAttributes(); + List orderedRowData = new ArrayList<>(); - BlackboardArtifact.ARTIFACT_TYPE type = BlackboardArtifact.ARTIFACT_TYPE.fromID(getArtifact().getArtifactTypeID()); - switch (type) { - case TSK_WEB_BOOKMARK: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_URL.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_TITLE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_CREATED.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_WEB_COOKIE: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_URL.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_VALUE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_WEB_HISTORY: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_URL.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_REFERRER.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_TITLE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_URL_DECODED.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_WEB_DOWNLOAD: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PATH.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_URL.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_RECENT_OBJECT: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PATH.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_INSTALLED_PROG: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_DEVICE_ATTACHED: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DEVICE_MAKE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DEVICE_MODEL.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DEVICE_ID.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_WEB_SEARCH_QUERY: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_TEXT.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DOMAIN.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_METADATA_EXIF: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_CREATED.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DEVICE_MAKE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DEVICE_MODEL.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_CONTACT: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_HOME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_OFFICE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_MOBILE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_EMAIL.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_MESSAGE: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_MESSAGE_TYPE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DIRECTION.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_READ_STATUS.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_EMAIL_FROM.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_EMAIL_TO.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_SUBJECT.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_TEXT.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_CALLLOG: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_START.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DIRECTION.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_CALENDAR_ENTRY: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_CALENDAR_ENTRY_TYPE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DESCRIPTION.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_START.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_END.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_LOCATION.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_SPEED_DIAL_ENTRY: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_SHORTCUT.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME_PERSON.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PHONE_NUMBER.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_BLUETOOTH_PAIRING: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DEVICE_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DEVICE_ID.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_GPS_TRACKPOINT: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_GPS_BOOKMARK: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_LOCATION.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_GPS_LAST_KNOWN_LOCATION: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_LOCATION.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_GPS_SEARCH: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_LOCATION.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_SERVICE_ACCOUNT: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_CATEGORY.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_USER_ID.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PASSWORD.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_URL.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PATH.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DESCRIPTION.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_EMAIL_REPLYTO.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_SERVER_NAME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_TOOL_OUTPUT: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_TEXT.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_ENCRYPTION_DETECTED: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_EXT_MISMATCH_DETECTED: - AbstractFile file = skCase.getAbstractFileById(getObjectID()); - if (file != null) { - orderedRowData.add(file.getName()); - orderedRowData.add(file.getNameExtension()); - String mimeType = file.getMIMEType(); - if(mimeType == null) { - orderedRowData.add(""); - } - else { - orderedRowData.add(mimeType); - } - orderedRowData.add(file.getUniquePath()); + if (ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID() == getArtifact().getArtifactTypeID()) { + if (content != null && content instanceof AbstractFile) { + AbstractFile file = (AbstractFile) content; + orderedRowData.add(file.getName()); + orderedRowData.add(file.getNameExtension()); + String mimeType = file.getMIMEType(); + if (mimeType == null) { + orderedRowData.add(""); } else { - // Make empty rows to make sure the formatting is correct - orderedRowData.add(null); - orderedRowData.add(null); - orderedRowData.add(null); - orderedRowData.add(null); + orderedRowData.add(mimeType); } - break; - case TSK_OS_INFO: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROCESSOR_ARCHITECTURE.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(getFileUniquePath(getObjectID())); - break; - case TSK_EMAIL_MSG: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_EMAIL_TO.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_EMAIL_FROM.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_SUBJECT.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_SENT.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME_RCVD.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PATH.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_EMAIL_CC.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_EMAIL_BCC.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_MSG_ID.getTypeID())); - break; - case TSK_INTERESTING_FILE_HIT: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_CATEGORY.getTypeID())); - String pathToShow = mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PATH.getTypeID()); - if (pathToShow.isEmpty()) { - pathToShow = getFileUniquePath(getObjectID()); + orderedRowData.add(file.getUniquePath()); + } else { + // Make empty rows to make sure the formatting is correct + orderedRowData.add(null); + orderedRowData.add(null); + orderedRowData.add(null); + orderedRowData.add(null); + } + orderedRowData.add(makeCommaSeparatedList(getTags())); + + } else if (ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() == getArtifact().getArtifactTypeID()) { + String[] attributeDataArray = new String[3]; + // Array is used so that the order of the attributes is + // maintained. + for (BlackboardAttribute attr : attributes) { + if (attr.getAttributeType().equals(new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SET_NAME))) { + attributeDataArray[0] = attr.getDisplayString(); + } else if (attr.getAttributeType().equals(new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_CATEGORY))) { + attributeDataArray[1] = attr.getDisplayString(); + } else if (attr.getAttributeType().equals(new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PATH))) { + String pathToShow = attr.getDisplayString(); + if (pathToShow.isEmpty()) { + pathToShow = getFileUniquePath(content); + } + attributeDataArray[2] = pathToShow; } - orderedRowData.add(pathToShow); - break; - case TSK_GPS_ROUTE: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_CATEGORY.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_END.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_END.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_START.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_START.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_LOCATION.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - break; - case TSK_INTERESTING_ARTIFACT_HIT: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - break; - case TSK_PROG_RUN: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_PROG_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_COUNT.getTypeID())); - break; - case TSK_OS_ACCOUNT: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_USER_NAME.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_USER_ID.getTypeID())); - break; - case TSK_REMOTE_DRIVE: - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_LOCAL_PATH.getTypeID())); - orderedRowData.add(mappedAttributes.get(ATTRIBUTE_TYPE.TSK_REMOTE_PATH.getTypeID())); - break; + } + orderedRowData.addAll(Arrays.asList(attributeDataArray)); + orderedRowData.add(makeCommaSeparatedList(getTags())); + + } else { + if (ReportGenerator.this.columnHeaderMap.containsKey(this.artifact.getArtifactTypeID())) { + + for (Column currColumn : ReportGenerator.this.columnHeaderMap.get(this.artifact.getArtifactTypeID())) { + String cellData = currColumn.getCellData(this); + orderedRowData.add(cellData); + } + } } - orderedRowData.add(makeCommaSeparatedList(getTags())); return orderedRowData; } - /** - * Returns a mapping of Attribute Type ID to the String representation - * of an Attribute Value. - */ - private Map getMappedAttributes() { - return ReportGenerator.this.getMappedAttributes(attributes); - } } /** @@ -1955,6 +1976,137 @@ class ReportGenerator { } return uniqueTagNames; + } + private interface Column { + + String getColumnHeader(); + + String getCellData(ArtifactData artData); + + Set removeTypeFromSet(Set types); + } + + private class AttributeColumn implements Column { + + private String columnHeader; + private BlackboardAttribute.Type attributeType; + + /** + * Constructs an ArtifactCell + * + * @param columnHeader The header text of this column + * @param attributeType The attribute type associated with this column + */ + AttributeColumn(String columnHeader, BlackboardAttribute.Type attributeType) { + this.columnHeader = Objects.requireNonNull(columnHeader); + this.attributeType = attributeType; + } + + @Override + public String getColumnHeader() { + return this.columnHeader; + } + + @Override + public String getCellData(ArtifactData artData) { + List attributes = artData.getAttributes(); + for (BlackboardAttribute attribute : attributes) { + if (attribute.getAttributeType().equals(this.attributeType)) { + if (attribute.getAttributeType().getValueType() != BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) { + return attribute.getDisplayString(); + } else { + return ContentUtils.getStringTime(attribute.getValueLong(), artData.getContent()); + } + } + } + return ""; + } + + @Override + public Set removeTypeFromSet(Set types) { + types.remove(this.attributeType); + return types; + } + } + + private class SourceFileColumn implements Column { + + private String columnHeader; + + SourceFileColumn(String columnHeader) { + this.columnHeader = columnHeader; + } + + @Override + public String getColumnHeader() { + return this.columnHeader; + } + + @Override + public String getCellData(ArtifactData artData) { + return getFileUniquePath(artData.getContent()); + /*else if (this.columnHeader.equals(NbBundle.getMessage(this.getClass(), "ReportGenerator.artTableColHdr.tags"))) { + return makeCommaSeparatedList(artData.getTags()); + } + return "";*/ + } + + @Override + public Set removeTypeFromSet(Set types) { + // This column doesn't have a type, so nothing to remove + return types; + } + } + + private class TaggedResultsColumn implements Column { + + private String columnHeader; + + TaggedResultsColumn(String columnHeader) { + this.columnHeader = columnHeader; + } + + @Override + public String getColumnHeader() { + return this.columnHeader; + } + + @Override + public String getCellData(ArtifactData artData) { + return makeCommaSeparatedList(artData.getTags()); + } + + @Override + public Set removeTypeFromSet(Set types) { + // This column doesn't have a type, so nothing to remove + return types; + } + } + + private class HeaderOnlyColumn implements Column { + + private String columnHeader; + + HeaderOnlyColumn(String columnHeader) { + this.columnHeader = columnHeader; + } + + @Override + public String getColumnHeader() { + return columnHeader; + } + + @Override + public String getCellData(ArtifactData artData) { + throw new UnsupportedOperationException("Cannot get cell data of unspecified column"); + } + + @Override + public Set removeTypeFromSet(Set types) { + // This column doesn't have a type, so nothing to remove + return types; + } + } } diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java b/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java index 6083c0870a..196f770ca7 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportHTML.java @@ -262,7 +262,6 @@ class ReportHTML implements TableReportModule { break; } } else { // no defined artifact found for this dataType - logger.log(Level.WARNING, "useDataTypeIcon: no artifact found for data type = " + dataType); //NON-NLS in = getClass().getResourceAsStream("/org/sleuthkit/autopsy/report/images/star.png"); //NON-NLS iconFileName = "star.png"; //NON-NLS iconFilePath = path + File.separator + iconFileName; diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.java index ef882bc01c..f57da241f9 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportVisualPanel2.java @@ -23,6 +23,7 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.EnumMap; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -50,8 +51,8 @@ final class ReportVisualPanel2 extends JPanel { private Map tagStates = new LinkedHashMap<>(); private List tags = new ArrayList<>(); ArtifactSelectionDialog dialog = new ArtifactSelectionDialog(new JFrame(), true); - private Map artifactStates = new EnumMap<>(ARTIFACT_TYPE.class); - private List artifacts = new ArrayList<>(); + private Map artifactStates = new HashMap<>(); + private List artifacts = new ArrayList<>(); private TagsListModel tagsModel; private TagsListRenderer tagsRenderer; @@ -111,16 +112,20 @@ final class ReportVisualPanel2 extends JPanel { private void initArtifactTypes() { try { - ArrayList doNotReport = new ArrayList<>(); - doNotReport.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO); - doNotReport.add(BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT); // output is too unstructured for table review + ArrayList doNotReport = new ArrayList<>(); + doNotReport.add(new BlackboardArtifact.Type(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getTypeID(), + BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getLabel(), + BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getDisplayName())); + doNotReport.add(new BlackboardArtifact.Type(BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getTypeID(), + BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getLabel(), + BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getDisplayName())); // output is too unstructured for table review - artifacts = Case.getCurrentCase().getSleuthkitCase().getBlackboardArtifactTypesInUse(); + artifacts = Case.getCurrentCase().getSleuthkitCase().getArtifactTypesInUse(); artifacts.removeAll(doNotReport); - artifactStates = new EnumMap<>(ARTIFACT_TYPE.class); - for (ARTIFACT_TYPE type : artifacts) { + artifactStates = new HashMap<>(); + for (BlackboardArtifact.Type type : artifacts) { artifactStates.put(type, Boolean.TRUE); } } catch (TskCoreException ex) { @@ -134,9 +139,11 @@ final class ReportVisualPanel2 extends JPanel { } /** + * Gets the enabled/disabled state of all artifacts + * * @return the enabled/disabled state of all Artifacts */ - Map getArtifactStates() { + Map getArtifactStates() { return artifactStates; } @@ -159,7 +166,7 @@ final class ReportVisualPanel2 extends JPanel { private boolean areArtifactsSelected() { boolean result = false; - for (Entry entry : artifactStates.entrySet()) { + for (Entry entry : artifactStates.entrySet()) { if (entry.getValue()) { result = true; } diff --git a/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java b/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java index 231942223a..bf51dfee86 100644 --- a/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java +++ b/Core/src/org/sleuthkit/autopsy/report/ReportWizardAction.java @@ -42,7 +42,7 @@ import org.openide.util.actions.CallableSystemAction; import org.openide.util.actions.Presenter; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.core.RuntimeProperties; -import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE; +import org.sleuthkit.datamodel.BlackboardArtifact; @ActionID(category = "Tools", id = "org.sleuthkit.autopsy.report.ReportWizardAction") @ActionRegistration(displayName = "#CTL_ReportWizardAction", lazy = false) @@ -68,7 +68,7 @@ public final class ReportWizardAction extends CallableSystemAction implements Pr ReportGenerator generator = new ReportGenerator((Map) wiz.getProperty("tableModuleStates"), //NON-NLS (Map) wiz.getProperty("generalModuleStates"), //NON-NLS (Map) wiz.getProperty("fileModuleStates")); //NON-NLS - generator.generateTableReports((Map) wiz.getProperty("artifactStates"), (Map) wiz.getProperty("tagStates")); //NON-NLS + generator.generateTableReports((Map) wiz.getProperty("artifactStates"), (Map) wiz.getProperty("tagStates")); //NON-NLS generator.generateFileListReports((Map) wiz.getProperty("fileReportOptions")); //NON-NLS generator.generateGeneralReports(); generator.displayProgressPanels(); diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/ArtifactEventType.java b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/ArtifactEventType.java index 0739a3580c..ccf482e7ec 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/ArtifactEventType.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/ArtifactEventType.java @@ -147,7 +147,6 @@ public interface ArtifactEventType extends EventType { if (type.getArtifactType().getTypeID() != artf.getArtifactTypeID()) { throw new IllegalArgumentException(); } - if (artf.getAttribute(type.getDateTimeAttrubuteType()) == null) { LOGGER.log(Level.WARNING, "Artifact {0} has no date/time attribute, skipping it.", artf.getArtifactID()); // NON-NLS return null; diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java index 79f705bab0..838144fadd 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/HashHitsFilter.java @@ -16,7 +16,7 @@ import org.openide.util.NbBundle; public class HashHitsFilter extends UnionFilter { @Override - @NbBundle.Messages("hashHitsFilter.displayName.text=Only Hash Set Hits") + @NbBundle.Messages("hashHitsFilter.displayName.text=Hash Sets") public String getDisplayName() { return Bundle.hashHitsFilter_displayName_text(); } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java index 44d71793fe..6d90482157 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/TagsFilter.java @@ -17,7 +17,7 @@ import org.sleuthkit.datamodel.TagName; public class TagsFilter extends UnionFilter { @Override - @NbBundle.Messages("tagsFilter.displayName.text=Only Events Tagged") + @NbBundle.Messages("tagsFilter.displayName.text=Tags") public String getDisplayName() { return Bundle.tagsFilter_displayName_text(); } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java index 362580094c..85a299e5fc 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java @@ -72,7 +72,7 @@ public class TypeFilter extends UnionFilter { } @Override - @NbBundle.Messages("TypeFilter.displayName.text=Event Type Filter") + @NbBundle.Messages("TypeFilter.displayName.text=Event Type") public String getDisplayName() { return (eventType == RootEventType.getInstance()) ? Bundle.TypeFilter_displayName_text() diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java index 806704312f..764a4fa4d1 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/FileTypeUtils.java @@ -23,7 +23,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import static java.util.Objects.isNull; -import static java.util.Objects.nonNull; import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -183,11 +182,7 @@ public enum FileTypeUtils { } public static Optional getMimeType(AbstractFile file) throws TskCoreException { - final FileTypeDetector fileTypeDetector = getFileTypeDetector(); - if (nonNull(fileTypeDetector)) { - return Optional.ofNullable(fileTypeDetector.getFileType(file)); - } - return Optional.empty(); + return Optional.ofNullable(file.getMIMEType()); } static boolean isDrawableMimeType(String mimeType) { @@ -227,8 +222,8 @@ public enum FileTypeUtils { try { return getMimeType(file) .map(String::toLowerCase) - .map(mimeType -> - mimeType.startsWith("video/") + .map(mimeType + -> mimeType.startsWith("video/") || videoMimeTypes.contains(mimeType)) .orElseGet(() -> FileTypeUtils.videoExtensions.contains(file.getNameExtension())); } catch (TskCoreException ex) { diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java index 246fb00154..897667e846 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java @@ -20,7 +20,6 @@ package org.sleuthkit.autopsy.imagegallery; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -29,7 +28,6 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.logging.Level; -import java.util.stream.Collectors; import javafx.application.Platform; import javafx.beans.Observable; import javafx.beans.property.ReadOnlyBooleanProperty; @@ -81,12 +79,9 @@ import org.sleuthkit.autopsy.imagegallery.gui.Toolbar; import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.Content; -import org.sleuthkit.datamodel.FileSystem; -import org.sleuthkit.datamodel.Image; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskData; -import org.sleuthkit.datamodel.VirtualDirectory; /** * Connects different parts of ImageGallery together and is hub for flow of @@ -916,37 +911,8 @@ public final class ImageGalleryController implements Executor { @Override List getFiles() throws TskCoreException { - if (dataSource instanceof Image) { - List fileSystems = ((Image) dataSource).getFileSystems(); - if (fileSystems.isEmpty()) { - /* - * no filesystems, don't bother with the initial population, - * just sort things out on file_done events - */ - progressHandle.finish(); - return Collections.emptyList(); - } - //use this clause to only grab files from the newly added filesystems. - String fsQuery = fileSystems.stream() - .map(fileSystem -> String.valueOf(fileSystem.getId())) - .collect(Collectors.joining(" OR fs_obj_id = ", "(fs_obj_id = ", ") ")); //NON-NLS - - return tskCase.findAllFilesWhere(fsQuery + " AND " + DRAWABLE_QUERY); //NON-NLS - } else if (dataSource instanceof VirtualDirectory) { - /* - * fs_obj_id is set only for file system files, so we will match - * the VirtualDirectory's name in the parent path. - * - * TODO: A future database schema could probably make this - * cleaner. If we had a datasource_id column in the files table - * we could just match agains that. - */ - return tskCase.findAllFilesWhere(" parent_path LIKE '/" + dataSource.getName() + "/%' AND " + DRAWABLE_QUERY); //NON-NLS - } else { - String msg = "Uknown datasource type: " + dataSource.getClass().getName(); - LOGGER.log(Level.SEVERE, msg); - throw new IllegalArgumentException(msg); - } + long datasourceID = dataSource.getDataSource().getId(); + return tskCase.findAllFilesWhere("data_source_obj_id = " + datasourceID + " AND " + DRAWABLE_QUERY); } @Override diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties index ec90106241..d500c116ec 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties @@ -72,7 +72,6 @@ Installer.reportPortError=Indexing server port {0} is not available. Check if y Installer.reportStopPortError=Indexing server stop port {0} is not available. Consider changing {1} in {2} property file in the application user folder. Installer.errorInitKsmMsg=Error initializing Keyword Search module Installer.reportInitError=Indexing server port {0} is not available. Check if your security software does not block {1} and consider changing {2} in {3} property file in the application user folder. Then try rebooting your system if another process was causing the conflict. -KeywordSearchConfigurationPanel.customizeComponents.title=Advanced Keyword Search Configuration KeywordSearchConfigurationPanel.customizeComponents.listTabTitle=Lists KeywordSearchConfigurationPanel.customizeComponents.stringExtTitle=String Extraction KeywordSearchConfigurationPanel.customizeComponents.genTabTitle=General diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties index ea8d0a5c4d..19f88e66aa 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties @@ -1,288 +1,287 @@ -OpenIDE-Module-Display-Category=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB +OpenIDE-Module-Display-Category=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb OpenIDE-Module-Long-Description=\ - \u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\n\n\ - \u3053\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u306F\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u306E\u30C7\u30A3\u30B9\u30AF\u30A4\u30E1\u30FC\u30B8\u306B\u3042\u308B\u30D5\u30A1\u30A4\u30EB\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3057\u307E\u3059\u3002\n\ - \u305D\u3057\u3066\u3001\u4E00\u3064\u4EE5\u4E0A\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\uFF08\u5358\u8A9E\u3084\u6B63\u898F\u8868\u73FE\u3092\u542B\u3080\uFF09\u3092\u5229\u7528\u3057\u3001\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u3092\u5B9A\u671F\u7684\u306B\u691C\u7D22\u3057\u3001\u7D50\u679C\u3092\u8868\u793A\u3057\u307E\u3059\u3002\n\n\ - \u3053\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u306B\u306F\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u8A2D\u5B9A\u3001\u53F3\u4E0A\u9685\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30D0\u30FC\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u306E\u7D50\u679C\u3092\u30CF\u30A4\u30E9\u30A4\u30C8\u3057\u3066\u8868\u793A\u3059\u308B\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u30D3\u30E5\u30FC\u30A2\u3068\u691C\u7D22\u7D50\u679C\u30D3\u30E5\u30FC\u30A2\u306A\u3069\u3001\u30E1\u30A4\u30F3GUI\u3068\u9023\u643A\u3059\u308B\u8FFD\u52A0\u306E\u30C4\u30FC\u30EB\u304C\u542B\u307E\u308C\u307E\u3059\u3002 -OpenIDE-Module-Name=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22 -ListBundleName=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 -ListBundleConfig=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u8A2D\u5B9A -ExtractedContentPanel.hitLabel.text=\u30DA\u30FC\u30B8\u5185\u306E\u4E00\u81F4\uFF1A + \u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\n\n\ + \u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u6642\u306e\u30c7\u30a3\u30b9\u30af\u30a4\u30e1\u30fc\u30b8\u306b\u3042\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3057\u307e\u3059\u3002\n\ + \u305d\u3057\u3066\u3001\u4e00\u3064\u4ee5\u4e0a\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\uff08\u5358\u8a9e\u3084\u6b63\u898f\u8868\u73fe\u3092\u542b\u3080\uff09\u3092\u5229\u7528\u3057\u3001\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u5b9a\u671f\u7684\u306b\u691c\u7d22\u3057\u3001\u7d50\u679c\u3092\u8868\u793a\u3057\u307e\u3059\u3002\n\n\ + \u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u306f\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u8a2d\u5b9a\u3001\u53f3\u4e0a\u9685\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30d0\u30fc\u3001\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u306e\u7d50\u679c\u3092\u30cf\u30a4\u30e9\u30a4\u30c8\u3057\u3066\u8868\u793a\u3059\u308b\u62bd\u51fa\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8\u30d3\u30e5\u30fc\u30a2\u3068\u691c\u7d22\u7d50\u679c\u30d3\u30e5\u30fc\u30a2\u306a\u3069\u3001\u30e1\u30a4\u30f3GUI\u3068\u9023\u643a\u3059\u308b\u8ffd\u52a0\u306e\u30c4\u30fc\u30eb\u304c\u542b\u307e\u308c\u307e\u3059\u3002 +OpenIDE-Module-Name=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22 +ListBundleName=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8 +ListBundleConfig=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u8a2d\u5b9a +ExtractedContentPanel.hitLabel.text=\u30da\u30fc\u30b8\u5185\u306e\u4e00\u81f4\uff1a ExtractedContentPanel.hitCountLabel.text=- ExtractedContentPanel.hitOfLabel.text=of ExtractedContentPanel.hitTotalLabel.text=- -ExtractedContentPanel.hitButtonsLabel.text=\u4E00\u81F4 -ExtractedContentPanel.copyMenuItem.text=\u30B3\u30D4\u30FC -ExtractedContentPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E -KeywordSearchEditListPanel.saveListButton.text=\u30EA\u30B9\u30C8\u3092\u30B3\u30D4\u30FC -KeywordSearchEditListPanel.addWordButton.text=\u8FFD\u52A0 -KeywordSearchEditListPanel.chRegex.text=\u6B63\u898F\u8868\u73FE -KeywordSearchEditListPanel.deleteWordButton.text=\u9078\u629E\u3057\u305F\u3082\u306E\u3092\u524A\u9664 -KeywordSearchEditListPanel.cutMenuItem.text=\u30AB\u30C3\u30C8 -KeywordSearchEditListPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E -KeywordSearchEditListPanel.pasteMenuItem.text=\u8CBC\u308A\u4ED8\u3051 -KeywordSearchEditListPanel.copyMenuItem.text=\u30B3\u30D4\u30FC -KeywordSearchEditListPanel.exportButton.text=\u30EA\u30B9\u30C8\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8 -KeywordSearchEditListPanel.deleteListButton.text=\u30EA\u30B9\u30C8\u3092\u524A\u9664 -KeywordSearchListsManagementPanel.newListButton.text=\u65B0\u898F\u30EA\u30B9\u30C8 -KeywordSearchListsManagementPanel.importButton.text=\u30EA\u30B9\u30C8\u3092\u30A4\u30F3\u30DD\u30FC\u30C8 -KeywordSearchListsViewerPanel.searchAddButton.text=\u691C\u7D22 -KeywordSearchListsViewerPanel.manageListsButton.text=\u30EA\u30B9\u30C8\u3092\u7BA1\u7406 -KeywordSearchListsViewerPanel.ingestIndexLabel.text=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\uFF1A -ExtractedContentPanel.pageButtonsLabel.text=\u30DA\u30FC\u30B8 -ExtractedContentPanel.pagesLabel.text=\u30DA\u30FC\u30B8\uFF1A -KeywordSearchEditListPanel.ingestMessagesCheckbox.text=\u30D2\u30C3\u30C8\u6BCE\u306B\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u3078\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u4FE1 -KeywordSearchEditListPanel.ingestMessagesCheckbox.toolTipText=\u3053\u306E\u30EA\u30B9\u30C8\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u691C\u7D22\u306B\u30D2\u30C3\u30C8\u3057\u305F\u5834\u5408\u3001\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u306B\u9001\u4FE1 -KeywordSearchEditListPanel.keywordOptionsLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30AA\u30D7\u30B7\u30E7\u30F3 -KeywordSearchEditListPanel.listOptionsLabel.text=\u30EA\u30B9\u30C8\u30AA\u30D7\u30B7\u30E7\u30F3 -KeywordSearchListsManagementPanel.keywordListsLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\uFF1A -KeywordSearchEditListPanel.keywordsLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\uFF1A -OpenIDE-Module-Short-Description=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB\u3001\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u30D3\u30E5\u30FC\u30A2\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30C4\u30FC\u30EB -KeywordSearchListsViewerPanel.manageListsButton.toolTipText=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3001\u30EA\u30B9\u30C8\u306E\u8A2D\u5B9A\u3068\u95A2\u9023\u3059\u308B\u30AD\u30FC\u30EF\u30FC\u30C9\u306E\u7BA1\u7406\u3002\u3053\u306E\u8A2D\u5B9A\u306F\u5168\u3066\u306E\u30B1\u30FC\u30B9\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002 -AbstractKeywordSearchPerformer.search.dialogErrorHeader=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A8\u30E9\u30FC -AbstractKeywordSearchPerformer.search.invalidSyntaxHeader=\u30AF\u30A8\u30EA\u30B7\u30F3\u30BF\u30C3\u30AF\u30B9\u30A8\u30E9\u30FC -AbstractKeywordSearchPerformer.search.searchIngestInProgressTitle=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u5B9F\u884C\u4E2D -AbstractKeywordSearchPerformer.search.ingestInProgressBody=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u5B9F\u884C\u4E2D
\u5168\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u691C\u7D22\u7D50\u679C\u304C\u4E0D\u5B8C\u5168\u306B\u306A\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\u3002
\u3053\u306E\u691C\u7D22\u3092\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F -AbstractKeywordSearchPerformer.search.emptyKeywordErrorBody=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u304C\u7A7A\u767D\u3067\u3059\u3002\u6700\u4F4E\uFF11\u3064\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u30EA\u30B9\u30C8\u306B\u8FFD\u52A0\u3057\u3066\u4E0B\u3055\u3044\u3002 -AbstractKeywordSearchPerformer.search.noFilesInIdxMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u307E\u3060\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002
\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u518D\u5EA6\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306F{0}\u5206\u3054\u3068\u306B\u66F4\u65B0\u3055\u308C\u307E\u3059\u3002 -AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002
\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u6709\u52B9\u5316\u3057\u3066\u30A4\u30E1\u30FC\u30B8\u3092\u518D\u5EA6\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3002 -ExtractedContentPanel.setMarkup.panelTxt=\u30C6\u30AD\u30B9\u30C8\u30ED\u30FC\u30C9\u4E2D...\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u3002 -ExtractedContentViewer.toString=\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8 -ExtractedContentViewer.toolTip=\u30D5\u30A1\u30A4\u30EB\u3084\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u7D50\u679C\u304B\u3089\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3002\u3053\u306E\u30D3\u30E5\u30FC\u30A2\u3092\u6709\u52B9\u5316\u3059\u308B\u306B\u306F\u3001\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u5B9F\u884C\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 -ExtractedContentViewer.getTitle=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8 -ExtractedContentViewer.getSolrContent.knownFileMsg=

{0}\u306F\u65E2\u77E5\u30D5\u30A1\u30A4\u30EB\u3067\u3059\uFF08MDS\u30CF\u30C3\u30B7\u30E5\u306B\u57FA\u3065\u304F\u3068\uFF09\u3002\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u30C6\u30AD\u30B9\u30C8\u304C\u3042\u308A\u307E\u305B\u3093\u3002

-ExtractedContentViewer.getSolrContent.noTxtYetMsg=

{0}\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u30C6\u30AD\u30B9\u30C8\u304C\u3042\u308A\u307E\u305B\u3093\u3002
\u30C6\u30AD\u30B9\u30C8\u304C\u7121\u3044\u304B\u3001\u307E\u3060\u89E3\u6790\u3055\u308C\u3066\u3044\u306A\u3044\u304B\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u304C\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306B\u6709\u52B9\u5316\u3055\u308C\u3066\u3044\u306A\u304B\u3063\u305F\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002

-HighlightedMatchesSource.getMarkup.noMatchMsg=
\u3053\u306E\u30DA\u30FC\u30B8\u4E0A\u3067\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u30D2\u30C3\u30C8\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002
\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u30D5\u30A1\u30A4\u30EB\u540D\u306B\u542B\u307E\u308C\u3066\u3044\u305F\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002
\u30D2\u30C3\u30C8\u3057\u305F\u7D50\u679C\u3092\u898B\u308B\u306E\u306B\u5225\u306E\u30DA\u30FC\u30B8\u306B\u79FB\u52D5\u3059\u308B\u304B\u3001\u30AA\u30EA\u30B8\u30CA\u30EB\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3059\u308B\u306E\u306B\u3001\u300C\u62BD\u51FA\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u300D\u3092\u9078\u629E\u3057\u3066\u4E0B\u3055\u3044\u3002
-HighlightedMatchesSource.toString=\u691C\u7D22\u7D50\u679C -Installer.reportPortError=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B5\u30FC\u30D0\u30FC\u30DD\u30FC\u30C8 {0} \u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u4F7F\u7528\u3057\u3066\u3044\u308B\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2\u304C {1} \u3092\u30D6\u30ED\u30C3\u30AF\u3057\u3066\u3044\u306A\u3044\u304B\u78BA\u8A8D\u3057\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u30E6\u30FC\u30B6\u30FC\u30D5\u30A9\u30EB\u30C0\u30FC\u5185\u306E{3}\u30D7\u30ED\u30D1\u30C6\u30A3\u30D5\u30A1\u30A4\u30EB\u306E{2}\u3092\u5909\u66F4\u3059\u308B\u691C\u8A0E\u3092\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3082\u3057\u4ED6\u306E\u51E6\u7406\u304C\u554F\u984C\u306E\u539F\u56E0\u3067\u3042\u308C\u3070\u3001\u30B7\u30B9\u30C6\u30E0\u3092\u518D\u8D77\u52D5\u3057\u3066\u4E0B\u3055\u3044\u3002 -Installer.reportStopPortError=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B5\u30FC\u30D0\u30FC\u30B9\u30C8\u30C3\u30D7\u30DD\u30FC\u30C8 {0} \u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u30E6\u30FC\u30B6\u30FC\u30D5\u30A9\u30EB\u30C0\u30FC\u5185\u306E{3}\u30D7\u30ED\u30D1\u30C6\u30A3\u30D5\u30A1\u30A4\u30EB\u306E{2}\u3092\u5909\u66F4\u3059\u308B\u691C\u8A0E\u3092\u3057\u3066\u304F\u3060\u3055\u3044\u3002 -Installer.errorInitKsmMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30E2\u30B8\u30E5\u30FC\u30EB\u306E\u8D77\u52D5\u30A8\u30E9\u30FC -Installer.reportInitError=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B5\u30FC\u30D0\u30FC\u30DD\u30FC\u30C8 {0} \u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u4F7F\u7528\u3057\u3066\u3044\u308B\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2\u304C {1} \u3092\u30D6\u30ED\u30C3\u30AF\u3057\u3066\u3044\u306A\u3044\u304B\u78BA\u8A8D\u3057\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u30E6\u30FC\u30B6\u30FC\u30D5\u30A9\u30EB\u30C0\u30FC\u5185\u306E{3}\u30D7\u30ED\u30D1\u30C6\u30A3\u30D5\u30A1\u30A4\u30EB\u306E{2}\u3092\u5909\u66F4\u3059\u308B\u691C\u8A0E\u3092\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3082\u3057\u4ED6\u306E\u51E6\u7406\u304C\u554F\u984C\u306E\u539F\u56E0\u3067\u3042\u308C\u3070\u3001\u30B7\u30B9\u30C6\u30E0\u3092\u518D\u8D77\u52D5\u3057\u3066\u4E0B\u3055\u3044\u3002 -KeywordSearchConfigurationPanel.customizeComponents.title=\u30A2\u30C9\u30D0\u30F3\u30B9\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u8A2D\u5B9A -KeywordSearchConfigurationPanel.customizeComponents.listTabTitle=\u30EA\u30B9\u30C8 -KeywordSearchConfigurationPanel.customizeComponents.stringExtTitle=\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA -KeywordSearchConfigurationPanel.customizeComponents.genTabTitle=\u4E00\u822C -KeywordSearchConfigurationPanel.customizeComponents.listLabToolTip=\u30EA\u30B9\u30C8\u8A2D\u5B9A -KeywordSearchConfigurationPanel.customizeComponents.stringExtToolTip=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u8A2D\u5B9A -KeywordSearchConfigurationPanel.customizeComponents.genTabToolTip=\u4E00\u822C\u8A2D\u5B9A -KeywordSearchConfigurationPanel1.customizeComponents.title=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u524A\u9664 -KeywordSearchConfigurationPanel1.customizeComponents.body=\u5168\u3066\u306E\u30B1\u30FC\u30B9\u306B\u304A\u3051\u308B\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u524A\u9664\u3057\u307E\u3059\u3002\u3053\u306E\u524A\u9664\u3092\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F -KeywordSearchConfigurationPanel1.customizeComponents.keywordListEmptyErr=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u304C\u7A7A\u767D\u306A\u306E\u3067\u3001\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093 -KeywordSearch.newKwListTitle=\u65B0\u898F\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u540D\uFF1A -KeywordSearchConfigurationPanel1.customizeComponents.noOwDefaultMsg=\u30C7\u30D5\u30A9\u30EB\u30C8\u30EA\u30B9\u30C8\u306F\u4E0A\u66F8\u304D\u3067\u304D\u307E\u305B\u3093 -KeywordSearchConfigurationPanel1.customizeComponents.kwListExistMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 <{0}> \u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\uFF1F -KeywordSearchConfigurationPanel1.customizeComponents.kwListSavedMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 <{0}> \u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F -KeywordSearchEditListPanel.customizeComponents.kwReToolTip=\u30AD\u30FC\u30EF\u30FC\u30C9\u306F\u6B63\u7FA9\u8868\u73FE\u3067\u3059 -KeywordSearchEditListPanel.customizeComponents.addWordToolTip=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30EA\u30B9\u30C8\u306B\u65B0\u3057\u3044\u5358\u8A9E\u3092\u8FFD\u52A0 -KeywordSearchEditListPanel.customizeComponents.enterNewWordToolTip=\u691C\u7D22\u3059\u308B\u306E\u306B\u65B0\u898F\u5358\u8A9E\u307E\u305F\u306F\u6B63\u898F\u8868\u73FE\u3092\u5165\u529B -KeywordSearchEditListPanel.customizeComponents.exportToFile=\u65E2\u5B58\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u30D5\u30A1\u30A4\u30EB\u306B\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8 -KeywordSearchEditListPanel.customizeComponents.saveCurrentWIthNewNameToolTip=\u65E2\u5B58\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u306B\u540D\u524D\u3092\u4ED8\u3051\u3066\u4FDD\u5B58 -KeywordSearchEditListPanel.customizeComponents.removeSelectedMsg=\u9078\u629E\u3057\u305F\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u30EA\u30B9\u30C8\u304B\u3089\u524A\u9664 -KeywordSearchEditListPanel.newKwTitle=\u65B0\u898F\u30AD\u30FC\u30EF\u30FC\u30C9\u30A8\u30F3\u30C8\u30EA\u30FC -KeywordSearchEditListPanel.addWordButtonAction.kwAlreadyExistsMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u306F\u65E2\u306B\u30EA\u30B9\u30C8\u306B\u5B58\u5728\u3057\u307E\u3059\u3002 -KeywordSearchEditListPanel.invalidKwMsg=\u7121\u52B9\u306A\u30AD\u30FC\u30EF\u30FC\u30C9\u30D1\u30BF\u30FC\u30F3\u3002\u5358\u8A9E\u3082\u3057\u304F\u306F\u6B63\u3057\u3044\u6B63\u898F\u8868\u73FE\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002 -KeywordSearchEditListPanel.removeKwMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u524A\u9664 -KeywordSearchEditListPanel.deleteWordButtonActionPerformed.delConfirmMsg=\u5168\u3066\u306E\u30B1\u30FC\u30B9\u306B\u304A\u3051\u308B\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u524A\u9664\u3057\u307E\u3059\u3002\u3053\u306E\u524A\u9664\u3092\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F -KeywordSearchEditListPanel.exportButtonActionPerformed.fileFilterLabel=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8XML\u30D5\u30A1\u30A4\u30EB -KeywordSearchEditListPanel.exportButtonActionPerformed.fileExistPrompt=\ {0} \u30D5\u30A1\u30A4\u30EB\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\uFF1F -KeywordSearchEditListPanel.exportButtonActionPerformed.kwListExportedMsg=\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3055\u308C\u305F\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 -KeywordSearchEditListPanel.kwColName=\u30AD\u30FC\u30EF\u30FC\u30C9 -KeywordSearchEditListPanel.exportButtonActionPerformed.regExColName=\u6B63\u898F\u8868\u73FE -KeywordSearchFilterNode.getFileActions.openExternViewActLbl=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F -KeywordSearchFilterNode.getFileActions.searchSameMd5=\u540C\u3058MD5\u30CF\u30C3\u30B7\u30E5\u3092\u6301\u3064\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22 -KeywordSearchFilterNode.getFileActions.viewInNewWinActionLbl=\u65B0\u3057\u3044\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u8868\u793A -KeywordSearchIngestModule.init.badInitMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30B5\u30FC\u30D0\u30FC\u304C\u6B63\u3057\u304F\u8D77\u52D5\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3002 -KeywordSearchIngestModule.init.tryStopSolrMsg={0}
\u53E4\u3044java Solr\u51E6\u7406\u3092\uFF08\u3082\u3057\u5B58\u5728\u3059\u308C\u3070\uFF09\u505C\u6B62\u3057\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u3092\u518D\u8D77\u52D5\u3057\u3066\u304F\u3060\u3055\u3044\u3002 -KeywordSearchIngestModule.init.noKwInLstMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u306B\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -KeywordSearchIngestModule.init.onlyIdxKwSkipMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3060\u3051\u5B9F\u884C\u3055\u308C\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u306F\u30B9\u30AD\u30C3\u30D7\u3055\u308C\u307E\u3059\u3002\uFF08\u300C\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 - \u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u8FFD\u52A0\u300D\u3092\u4F7F\u7528\u3057\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u8FFD\u52A0\u3059\u308B\u306E\u306F\u53EF\u80FD\u3067\u3059\u3002\uFF09 -KeywordSearchIngestModule.postIndexSummary.knowFileHeaderLbl=\u65E2\u77E5\u30BF\u30A4\u30D7\u304C\u3042\u308B\u30D5\u30A1\u30A4\u30EB -KeywordSearchIngestModule.postIndexSummary.fileGenStringsHead=\u4E00\u822C\u7684\u306A\u30B9\u30C8\u30EA\u30F3\u30B0\u304C\u62BD\u51FA\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB -KeywordSearchIngestModule.postIndexSummary.mdOnlyLbl=\u30E1\u30BF\u30C7\u30FC\u30BF\u306E\u307F\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u307E\u3057\u305F -KeywordSearchIngestModule.postIndexSummary.idxErrLbl=\u30A8\u30E9\u30FC\uFF08\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30A8\u30E9\u30FC\uFF09 -KeywordSearchIngestModule.postIndexSummary.errTxtLbl=\u30A8\u30E9\u30FC\uFF08\u30C6\u30AD\u30B9\u30C8\u62BD\u51FA\uFF09 -KeywordSearchIngestModule.postIndexSummary.errIoLbl=\u30A8\u30E9\u30FC\uFF08I/O\uFF09 -KeywordSearchIngestModule.postIndexSummary.kwIdxResultsLbl=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u7D50\u679C -KeywordSearchIngestModule.postIndexSummary.kwIdxErrsTitle=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u30A8\u30E9\u30FC -KeywordSearchIngestModule.postIndexSummary.kwIdxErrMsgFiles=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B5\u30FC\u30D3\u30B9\u304C{0}\u30D5\u30A1\u30A4\u30EB\u3092\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -KeywordSearchIngestModule.postIndexSummary.kwIdxWarnMsgTitle=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u8B66\u544A -KeywordSearchIngestModule.postIndexSummary.idxErrReadFilesMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B5\u30FC\u30D3\u30B9\u304C\u30D5\u30A1\u30A4\u30EB\u3092\u8AAD\u307F\u8FBC\u3080\u969B\u3084\u30C6\u30AD\u30B9\u30C8\u3092\u62BD\u51FA\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u539F\u56E0\u306F\u7834\u640D\u3057\u305F\u30E1\u30C7\u30A3\u30A2\u3084\u30D5\u30A1\u30A4\u30EB\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchListsViewerPanel.initIngest.addIngestTitle=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u8FFD\u52A0 -KeywordSearchListsViewerPanel.initIngest.addIngestMsg=\u8FFD\u52A0\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u9078\u629E\u3067\u304D\u307E\u3059
\u305D\u3057\u3066\u5B9F\u884C\u4E2D\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u8FFD\u52A0\u3067\u304D\u307E\u3059
\u6B21\u56DE\u306E\u30D5\u30A1\u30A4\u30EB\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u518D\u69CB\u7BC9\u306E\u3068\u304D\u306B\u9078\u629E\u3055\u308C\u305F\u30EA\u30B9\u30C8\u3082\u691C\u7D22\u3055\u308C\u307E\u3059\u3002 -KeywordSearchListsViewerPanel.initIngest.searchIngestTitle=\u691C\u7D22 -KeywordSearchListsViewerPanel.initIngest.addIdxSearchMsg=\u9078\u629E\u3057\u305F\u30EA\u30B9\u30C8\u5185\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u5185\u3067\u691C\u7D22 -KeywordSearchListsViewerPanel.initIngest.ongoingIngestMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\uFF1A {0} \uFF08\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306F\u5B9F\u884C\u4E2D\uFF09 -KeywordSearchListsViewerPanel.initIngest.fileIndexCtMsg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\uFF1A {0} -KeywordSearch.selectedColLbl=\u9078\u629E\u6E08\u307F -KeywordSearch.nameColLbl=\u540D\u524D -KeywordSearch.regExColLbl=\u6B63\u898F\u8868\u73FE -KeywordSearchQueryManager.execute.exeWinTitle=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22 {0} - {1} -KeywordSearch.newKeywordListMsg=\u65B0\u898F\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 -KeywordSearch.importListFileDialogMsg={0}\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -KeywordSearch.yesOwMsg=\u306F\u3044\u3001\u4E0A\u66F8\u304D\u3057\u307E\u3059 -KeywordSearch.noSkipMsg=\u3044\u3044\u3048\u3001\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3059 -KeywordSearch.cancelImportMsg=\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u30AD\u30E3\u30F3\u30BB\u30EB -KeywordSearch.overwriteListPrompt=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 <{0}> \u306F\u30ED\u30FC\u30AB\u30EB\u306B\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\uFF1F -KeywordSearch.importOwConflict=\u30EA\u30B9\u30C8\u30A4\u30F3\u30DD\u30FC\u30C8\u306E\u554F\u984C -KeywordSearch.kwListFailImportMsg=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u304C\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -KeywordSearchListsManagementPanel.fileExtensionFilterLbl=Autopsy\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u30D5\u30A1\u30A4\u30EB(xml) -KeywordSearch.listImportFeatureTitle=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u30A4\u30F3\u30DD\u30FC\u30C8 -KeywordSearchIngestModule.moduleName=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22 -DropdownSearchPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E -DropdownSearchPanel.pasteMenuItem.text=\u8CBC\u308A\u4ED8\u3051 -DropdownSearchPanel.copyMenuItem.text=\u30B3\u30D4\u30FC -DropdownSearchPanel.cutMenuItem.text=\u30AB\u30C3\u30C8 -KeywordSearchIngestModule.moduleDescription=\u30EA\u30B9\u30C8\u5185\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u304A\u3088\u3073\u6B63\u898F\u8868\u73FE\u3092\u4F7F\u3044\u3001\u30D5\u30A1\u30A4\u30EB\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u304A\u3088\u3073\u5B9A\u671F\u7684\u306A\u691C\u7D22\u3092\u5B9F\u884C\u3057\u307E\u3059\u3002 -OptionsCategory_Name_KeywordSearchOptions=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22 -OptionsCategory_Keywords_KeywordSearchOptions=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22 +ExtractedContentPanel.hitButtonsLabel.text=\u4e00\u81f4 +ExtractedContentPanel.copyMenuItem.text=\u30b3\u30d4\u30fc +ExtractedContentPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e +KeywordSearchEditListPanel.saveListButton.text=\u30ea\u30b9\u30c8\u3092\u30b3\u30d4\u30fc +KeywordSearchEditListPanel.addWordButton.text=\u8ffd\u52a0 +KeywordSearchEditListPanel.chRegex.text=\u6b63\u898f\u8868\u73fe +KeywordSearchEditListPanel.deleteWordButton.text=\u9078\u629e\u3057\u305f\u3082\u306e\u3092\u524a\u9664 +KeywordSearchEditListPanel.cutMenuItem.text=\u30ab\u30c3\u30c8 +KeywordSearchEditListPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e +KeywordSearchEditListPanel.pasteMenuItem.text=\u8cbc\u308a\u4ed8\u3051 +KeywordSearchEditListPanel.copyMenuItem.text=\u30b3\u30d4\u30fc +KeywordSearchEditListPanel.exportButton.text=\u30ea\u30b9\u30c8\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8 +KeywordSearchEditListPanel.deleteListButton.text=\u30ea\u30b9\u30c8\u3092\u524a\u9664 +KeywordSearchListsManagementPanel.newListButton.text=\u65b0\u898f\u30ea\u30b9\u30c8 +KeywordSearchListsManagementPanel.importButton.text=\u30ea\u30b9\u30c8\u3092\u30a4\u30f3\u30dd\u30fc\u30c8 +KeywordSearchListsViewerPanel.searchAddButton.text=\u691c\u7d22 +KeywordSearchListsViewerPanel.manageListsButton.text=\u30ea\u30b9\u30c8\u3092\u7ba1\u7406 +KeywordSearchListsViewerPanel.ingestIndexLabel.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\uff1a +ExtractedContentPanel.pageButtonsLabel.text=\u30da\u30fc\u30b8 +ExtractedContentPanel.pagesLabel.text=\u30da\u30fc\u30b8\uff1a +KeywordSearchEditListPanel.ingestMessagesCheckbox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u3078\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1 +KeywordSearchEditListPanel.ingestMessagesCheckbox.toolTipText=\u3053\u306e\u30ea\u30b9\u30c8\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u304c\u691c\u7d22\u306b\u30d2\u30c3\u30c8\u3057\u305f\u5834\u5408\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u9001\u4fe1 +KeywordSearchEditListPanel.keywordOptionsLabel.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30aa\u30d7\u30b7\u30e7\u30f3 +KeywordSearchEditListPanel.listOptionsLabel.text=\u30ea\u30b9\u30c8\u30aa\u30d7\u30b7\u30e7\u30f3 +KeywordSearchListsManagementPanel.keywordListsLabel.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\uff1a +KeywordSearchEditListPanel.keywordsLabel.text=\u30ad\u30fc\u30ef\u30fc\u30c9\uff1a +OpenIDE-Module-Short-Description=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3001\u62bd\u51fa\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8\u30d3\u30e5\u30fc\u30a2\u3001\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30c4\u30fc\u30eb +KeywordSearchListsViewerPanel.manageListsButton.toolTipText=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3001\u30ea\u30b9\u30c8\u306e\u8a2d\u5b9a\u3068\u95a2\u9023\u3059\u308b\u30ad\u30fc\u30ef\u30fc\u30c9\u306e\u7ba1\u7406\u3002\u3053\u306e\u8a2d\u5b9a\u306f\u5168\u3066\u306e\u30b1\u30fc\u30b9\u306b\u9069\u7528\u3055\u308c\u307e\u3059\u3002 +AbstractKeywordSearchPerformer.search.dialogErrorHeader=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a8\u30e9\u30fc +AbstractKeywordSearchPerformer.search.invalidSyntaxHeader=\u30af\u30a8\u30ea\u30b7\u30f3\u30bf\u30c3\u30af\u30b9\u30a8\u30e9\u30fc +AbstractKeywordSearchPerformer.search.searchIngestInProgressTitle=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u4e2d +AbstractKeywordSearchPerformer.search.ingestInProgressBody=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u4e2d
\u5168\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u691c\u7d22\u7d50\u679c\u304c\u4e0d\u5b8c\u5168\u306b\u306a\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002
\u3053\u306e\u691c\u7d22\u3092\u5b9f\u884c\u3057\u307e\u3059\u304b\uff1f +AbstractKeywordSearchPerformer.search.emptyKeywordErrorBody=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u304c\u7a7a\u767d\u3067\u3059\u3002\u6700\u4f4e\uff11\u3064\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0\u3057\u3066\u4e0b\u3055\u3044\u3002 +AbstractKeywordSearchPerformer.search.noFilesInIdxMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u307e\u3060\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002
\u3057\u3070\u3089\u304f\u3057\u3066\u304b\u3089\u518d\u5ea6\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306f{0}\u5206\u3054\u3068\u306b\u66f4\u65b0\u3055\u308c\u307e\u3059\u3002 +AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002
\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u6709\u52b9\u5316\u3057\u3066\u30a4\u30e1\u30fc\u30b8\u3092\u518d\u5ea6\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3002 +ExtractedContentPanel.setMarkup.panelTxt=\u30c6\u30ad\u30b9\u30c8\u30ed\u30fc\u30c9\u4e2d...\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002 +ExtractedContentViewer.toString=\u62bd\u51fa\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8 +ExtractedContentViewer.toolTip=\u30d5\u30a1\u30a4\u30eb\u3084\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u7d50\u679c\u304b\u3089\u62bd\u51fa\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8\u3092\u8868\u793a\u3002\u3053\u306e\u30d3\u30e5\u30fc\u30a2\u3092\u6709\u52b9\u5316\u3059\u308b\u306b\u306f\u3001\u30d5\u30a1\u30a4\u30eb\u306b\u5bfe\u3057\u3066\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 +ExtractedContentViewer.getTitle=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8 +ExtractedContentViewer.getSolrContent.knownFileMsg=

{0}\u306f\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\u3067\u3059\uff08MDS\u30cf\u30c3\u30b7\u30e5\u306b\u57fa\u3065\u304f\u3068\uff09\u3002\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u30c6\u30ad\u30b9\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002

+ExtractedContentViewer.getSolrContent.noTxtYetMsg=

{0}\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u30c6\u30ad\u30b9\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002
\u30c6\u30ad\u30b9\u30c8\u304c\u7121\u3044\u304b\u3001\u307e\u3060\u89e3\u6790\u3055\u308c\u3066\u3044\u306a\u3044\u304b\u3001\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u304c\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306b\u6709\u52b9\u5316\u3055\u308c\u3066\u3044\u306a\u304b\u3063\u305f\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002

+HighlightedMatchesSource.getMarkup.noMatchMsg=
\u3053\u306e\u30da\u30fc\u30b8\u4e0a\u3067\u30ad\u30fc\u30ef\u30fc\u30c9\u304c\u30d2\u30c3\u30c8\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u3002
\u30ad\u30fc\u30ef\u30fc\u30c9\u304c\u30d5\u30a1\u30a4\u30eb\u540d\u306b\u542b\u307e\u308c\u3066\u3044\u305f\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
\u30d2\u30c3\u30c8\u3057\u305f\u7d50\u679c\u3092\u898b\u308b\u306e\u306b\u5225\u306e\u30da\u30fc\u30b8\u306b\u79fb\u52d5\u3059\u308b\u304b\u3001\u30aa\u30ea\u30b8\u30ca\u30eb\u30c6\u30ad\u30b9\u30c8\u3092\u8868\u793a\u3059\u308b\u306e\u306b\u3001\u300c\u62bd\u51fa\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8\u300d\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002
+HighlightedMatchesSource.toString=\u691c\u7d22\u7d50\u679c +Installer.reportPortError=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b5\u30fc\u30d0\u30fc\u30dd\u30fc\u30c8 {0} \u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002\u4f7f\u7528\u3057\u3066\u3044\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c {1} \u3092\u30d6\u30ed\u30c3\u30af\u3057\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30e6\u30fc\u30b6\u30fc\u30d5\u30a9\u30eb\u30c0\u30fc\u5185\u306e{3}\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u306e{2}\u3092\u5909\u66f4\u3059\u308b\u691c\u8a0e\u3092\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3082\u3057\u4ed6\u306e\u51e6\u7406\u304c\u554f\u984c\u306e\u539f\u56e0\u3067\u3042\u308c\u3070\u3001\u30b7\u30b9\u30c6\u30e0\u3092\u518d\u8d77\u52d5\u3057\u3066\u4e0b\u3055\u3044\u3002 +Installer.reportStopPortError=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b5\u30fc\u30d0\u30fc\u30b9\u30c8\u30c3\u30d7\u30dd\u30fc\u30c8 {0} \u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30e6\u30fc\u30b6\u30fc\u30d5\u30a9\u30eb\u30c0\u30fc\u5185\u306e{3}\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u306e{2}\u3092\u5909\u66f4\u3059\u308b\u691c\u8a0e\u3092\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +Installer.errorInitKsmMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u8d77\u52d5\u30a8\u30e9\u30fc +Installer.reportInitError=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b5\u30fc\u30d0\u30fc\u30dd\u30fc\u30c8 {0} \u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002\u4f7f\u7528\u3057\u3066\u3044\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c {1} \u3092\u30d6\u30ed\u30c3\u30af\u3057\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30e6\u30fc\u30b6\u30fc\u30d5\u30a9\u30eb\u30c0\u30fc\u5185\u306e{3}\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u306e{2}\u3092\u5909\u66f4\u3059\u308b\u691c\u8a0e\u3092\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3082\u3057\u4ed6\u306e\u51e6\u7406\u304c\u554f\u984c\u306e\u539f\u56e0\u3067\u3042\u308c\u3070\u3001\u30b7\u30b9\u30c6\u30e0\u3092\u518d\u8d77\u52d5\u3057\u3066\u4e0b\u3055\u3044\u3002 +KeywordSearchConfigurationPanel.customizeComponents.listTabTitle=\u30ea\u30b9\u30c8 +KeywordSearchConfigurationPanel.customizeComponents.stringExtTitle=\u30b9\u30c8\u30ea\u30f3\u30b0\u62bd\u51fa +KeywordSearchConfigurationPanel.customizeComponents.genTabTitle=\u4e00\u822c +KeywordSearchConfigurationPanel.customizeComponents.listLabToolTip=\u30ea\u30b9\u30c8\u8a2d\u5b9a +KeywordSearchConfigurationPanel.customizeComponents.stringExtToolTip=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u30b9\u30c8\u30ea\u30f3\u30b0\u62bd\u51fa\u8a2d\u5b9a +KeywordSearchConfigurationPanel.customizeComponents.genTabToolTip=\u4e00\u822c\u8a2d\u5b9a +KeywordSearchConfigurationPanel1.customizeComponents.title=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u524a\u9664 +KeywordSearchConfigurationPanel1.customizeComponents.body=\u5168\u3066\u306e\u30b1\u30fc\u30b9\u306b\u304a\u3051\u308b\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u524a\u9664\u3057\u307e\u3059\u3002\u3053\u306e\u524a\u9664\u3092\u5b9f\u884c\u3057\u307e\u3059\u304b\uff1f +KeywordSearchConfigurationPanel1.customizeComponents.keywordListEmptyErr=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u304c\u7a7a\u767d\u306a\u306e\u3067\u3001\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093 +KeywordSearch.newKwListTitle=\u65b0\u898f\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u540d\uff1a +KeywordSearchConfigurationPanel1.customizeComponents.noOwDefaultMsg=\u30c7\u30d5\u30a9\u30eb\u30c8\u30ea\u30b9\u30c8\u306f\u4e0a\u66f8\u304d\u3067\u304d\u307e\u305b\u3093 +KeywordSearchConfigurationPanel1.customizeComponents.kwListExistMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8 <{0}> \u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b\uff1f +KeywordSearchConfigurationPanel1.customizeComponents.kwListSavedMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8 <{0}> \u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f +KeywordSearchEditListPanel.customizeComponents.kwReToolTip=\u30ad\u30fc\u30ef\u30fc\u30c9\u306f\u6b63\u7fa9\u8868\u73fe\u3067\u3059 +KeywordSearchEditListPanel.customizeComponents.addWordToolTip=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30ea\u30b9\u30c8\u306b\u65b0\u3057\u3044\u5358\u8a9e\u3092\u8ffd\u52a0 +KeywordSearchEditListPanel.customizeComponents.enterNewWordToolTip=\u691c\u7d22\u3059\u308b\u306e\u306b\u65b0\u898f\u5358\u8a9e\u307e\u305f\u306f\u6b63\u898f\u8868\u73fe\u3092\u5165\u529b +KeywordSearchEditListPanel.customizeComponents.exportToFile=\u65e2\u5b58\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u30d5\u30a1\u30a4\u30eb\u306b\u30a8\u30af\u30b9\u30dd\u30fc\u30c8 +KeywordSearchEditListPanel.customizeComponents.saveCurrentWIthNewNameToolTip=\u65e2\u5b58\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u306b\u540d\u524d\u3092\u4ed8\u3051\u3066\u4fdd\u5b58 +KeywordSearchEditListPanel.customizeComponents.removeSelectedMsg=\u9078\u629e\u3057\u305f\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u30ea\u30b9\u30c8\u304b\u3089\u524a\u9664 +KeywordSearchEditListPanel.newKwTitle=\u65b0\u898f\u30ad\u30fc\u30ef\u30fc\u30c9\u30a8\u30f3\u30c8\u30ea\u30fc +KeywordSearchEditListPanel.addWordButtonAction.kwAlreadyExistsMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u306f\u65e2\u306b\u30ea\u30b9\u30c8\u306b\u5b58\u5728\u3057\u307e\u3059\u3002 +KeywordSearchEditListPanel.invalidKwMsg=\u7121\u52b9\u306a\u30ad\u30fc\u30ef\u30fc\u30c9\u30d1\u30bf\u30fc\u30f3\u3002\u5358\u8a9e\u3082\u3057\u304f\u306f\u6b63\u3057\u3044\u6b63\u898f\u8868\u73fe\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +KeywordSearchEditListPanel.removeKwMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u524a\u9664 +KeywordSearchEditListPanel.deleteWordButtonActionPerformed.delConfirmMsg=\u5168\u3066\u306e\u30b1\u30fc\u30b9\u306b\u304a\u3051\u308b\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u524a\u9664\u3057\u307e\u3059\u3002\u3053\u306e\u524a\u9664\u3092\u5b9f\u884c\u3057\u307e\u3059\u304b\uff1f +KeywordSearchEditListPanel.exportButtonActionPerformed.fileFilterLabel=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8XML\u30d5\u30a1\u30a4\u30eb +KeywordSearchEditListPanel.exportButtonActionPerformed.fileExistPrompt=\ {0} \u30d5\u30a1\u30a4\u30eb\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b\uff1f +KeywordSearchEditListPanel.exportButtonActionPerformed.kwListExportedMsg=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u305f\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8 +KeywordSearchEditListPanel.kwColName=\u30ad\u30fc\u30ef\u30fc\u30c9 +KeywordSearchEditListPanel.exportButtonActionPerformed.regExColName=\u6b63\u898f\u8868\u73fe +KeywordSearchFilterNode.getFileActions.openExternViewActLbl=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f +KeywordSearchFilterNode.getFileActions.searchSameMd5=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22 +KeywordSearchFilterNode.getFileActions.viewInNewWinActionLbl=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a +KeywordSearchIngestModule.init.badInitMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d0\u30fc\u304c\u6b63\u3057\u304f\u8d77\u52d5\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002 +KeywordSearchIngestModule.init.tryStopSolrMsg={0}
\u53e4\u3044java Solr\u51e6\u7406\u3092\uff08\u3082\u3057\u5b58\u5728\u3059\u308c\u3070\uff09\u505c\u6b62\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002 +KeywordSearchIngestModule.init.noKwInLstMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u306b\u30ad\u30fc\u30ef\u30fc\u30c9\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +KeywordSearchIngestModule.init.onlyIdxKwSkipMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3060\u3051\u5b9f\u884c\u3055\u308c\u3001\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u306f\u30b9\u30ad\u30c3\u30d7\u3055\u308c\u307e\u3059\u3002\uff08\u300c\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8 - \u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u8ffd\u52a0\u300d\u3092\u4f7f\u7528\u3057\u3001\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u8ffd\u52a0\u3059\u308b\u306e\u306f\u53ef\u80fd\u3067\u3059\u3002\uff09 +KeywordSearchIngestModule.postIndexSummary.knowFileHeaderLbl=\u65e2\u77e5\u30bf\u30a4\u30d7\u304c\u3042\u308b\u30d5\u30a1\u30a4\u30eb +KeywordSearchIngestModule.postIndexSummary.fileGenStringsHead=\u4e00\u822c\u7684\u306a\u30b9\u30c8\u30ea\u30f3\u30b0\u304c\u62bd\u51fa\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb +KeywordSearchIngestModule.postIndexSummary.mdOnlyLbl=\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u307f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u307e\u3057\u305f +KeywordSearchIngestModule.postIndexSummary.idxErrLbl=\u30a8\u30e9\u30fc\uff08\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30a8\u30e9\u30fc\uff09 +KeywordSearchIngestModule.postIndexSummary.errTxtLbl=\u30a8\u30e9\u30fc\uff08\u30c6\u30ad\u30b9\u30c8\u62bd\u51fa\uff09 +KeywordSearchIngestModule.postIndexSummary.errIoLbl=\u30a8\u30e9\u30fc\uff08I/O\uff09 +KeywordSearchIngestModule.postIndexSummary.kwIdxResultsLbl=\u30ad\u30fc\u30ef\u30fc\u30c9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u7d50\u679c +KeywordSearchIngestModule.postIndexSummary.kwIdxErrsTitle=\u30ad\u30fc\u30ef\u30fc\u30c9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u30a8\u30e9\u30fc +KeywordSearchIngestModule.postIndexSummary.kwIdxErrMsgFiles=\u30ad\u30fc\u30ef\u30fc\u30c9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b5\u30fc\u30d3\u30b9\u304c{0}\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +KeywordSearchIngestModule.postIndexSummary.kwIdxWarnMsgTitle=\u30ad\u30fc\u30ef\u30fc\u30c9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u8b66\u544a +KeywordSearchIngestModule.postIndexSummary.idxErrReadFilesMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b5\u30fc\u30d3\u30b9\u304c\u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u3080\u969b\u3084\u30c6\u30ad\u30b9\u30c8\u3092\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u539f\u56e0\u306f\u7834\u640d\u3057\u305f\u30e1\u30c7\u30a3\u30a2\u3084\u30d5\u30a1\u30a4\u30eb\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchListsViewerPanel.initIngest.addIngestTitle=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u8ffd\u52a0 +KeywordSearchListsViewerPanel.initIngest.addIngestMsg=\u8ffd\u52a0\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u9078\u629e\u3067\u304d\u307e\u3059
\u305d\u3057\u3066\u5b9f\u884c\u4e2d\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u8ffd\u52a0\u3067\u304d\u307e\u3059
\u6b21\u56de\u306e\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u518d\u69cb\u7bc9\u306e\u3068\u304d\u306b\u9078\u629e\u3055\u308c\u305f\u30ea\u30b9\u30c8\u3082\u691c\u7d22\u3055\u308c\u307e\u3059\u3002 +KeywordSearchListsViewerPanel.initIngest.searchIngestTitle=\u691c\u7d22 +KeywordSearchListsViewerPanel.initIngest.addIdxSearchMsg=\u9078\u629e\u3057\u305f\u30ea\u30b9\u30c8\u5185\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u5185\u3067\u691c\u7d22 +KeywordSearchListsViewerPanel.initIngest.ongoingIngestMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\uff1a {0} \uff08\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306f\u5b9f\u884c\u4e2d\uff09 +KeywordSearchListsViewerPanel.initIngest.fileIndexCtMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\uff1a {0} +KeywordSearch.selectedColLbl=\u9078\u629e\u6e08\u307f +KeywordSearch.nameColLbl=\u540d\u524d +KeywordSearch.regExColLbl=\u6b63\u898f\u8868\u73fe +KeywordSearchQueryManager.execute.exeWinTitle=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22 {0} - {1} +KeywordSearch.newKeywordListMsg=\u65b0\u898f\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8 +KeywordSearch.importListFileDialogMsg={0}\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +KeywordSearch.yesOwMsg=\u306f\u3044\u3001\u4e0a\u66f8\u304d\u3057\u307e\u3059 +KeywordSearch.noSkipMsg=\u3044\u3044\u3048\u3001\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059 +KeywordSearch.cancelImportMsg=\u30a4\u30f3\u30dd\u30fc\u30c8\u3092\u30ad\u30e3\u30f3\u30bb\u30eb +KeywordSearch.overwriteListPrompt=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8 <{0}> \u306f\u30ed\u30fc\u30ab\u30eb\u306b\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b\uff1f +KeywordSearch.importOwConflict=\u30ea\u30b9\u30c8\u30a4\u30f3\u30dd\u30fc\u30c8\u306e\u554f\u984c +KeywordSearch.kwListFailImportMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u304c\u30a4\u30f3\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +KeywordSearchListsManagementPanel.fileExtensionFilterLbl=Autopsy\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb(xml) +KeywordSearch.listImportFeatureTitle=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u30a4\u30f3\u30dd\u30fc\u30c8 +KeywordSearchIngestModule.moduleName=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22 +DropdownSearchPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e +DropdownSearchPanel.pasteMenuItem.text=\u8cbc\u308a\u4ed8\u3051 +DropdownSearchPanel.copyMenuItem.text=\u30b3\u30d4\u30fc +DropdownSearchPanel.cutMenuItem.text=\u30ab\u30c3\u30c8 +KeywordSearchIngestModule.moduleDescription=\u30ea\u30b9\u30c8\u5185\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u304a\u3088\u3073\u6b63\u898f\u8868\u73fe\u3092\u4f7f\u3044\u3001\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u304a\u3088\u3073\u5b9a\u671f\u7684\u306a\u691c\u7d22\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002 +OptionsCategory_Name_KeywordSearchOptions=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22 +OptionsCategory_Keywords_KeywordSearchOptions=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22 ExtractedContentPanel.pageOfLabel.text=of ExtractedContentPanel.pageCurLabel.text=- ExtractedContentPanel.pageTotalLabel.text=- -AbstractFileChunk.index.exception.msg=\u30D5\u30A1\u30A4\u30EB\u30B9\u30C8\u30EA\u30F3\u30B0\u30C1\u30E3\u30F3\u30AF\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A {0}, \u30C1\u30E3\u30F3\u30AF\: {1} -AbstractFileStringContentStream.getSize.exception.msg=\u30B9\u30C8\u30EA\u30F3\u30B0\u5168\u4F53\u304C\u5909\u63DB\u3055\u308C\u306A\u3051\u308C\u3070\u3001\u5909\u63DB\u3055\u308C\u305F\u30B9\u30C8\u30EA\u30F3\u30B0\u5185\u306E\u30AD\u30E3\u30E9\u30AF\u30BF\u30FC\u6570\u306F\u4E0D\u660E\u3067\u3059\u3002 -AbstractFileStringContentStream.getSrcInfo.text=\u30D5\u30A1\u30A4\u30EB\uFF1A{0} -ByteContentStream.getSrcInfo.text=\u30D5\u30A1\u30A4\u30EB\uFF1A{0} -ExtractedContentPanel.SetMarkup.progress.loading=\u30C6\u30AD\u30B9\u30C8\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D -ExtractedContentPanel.SetMarkup.progress.displayName=\u30C6\u30AD\u30B9\u30C8\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D -ExtractedContentViewer.nextPage.exception.msg=\u6B21\u306E\u30DA\u30FC\u30B8\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -ExtractedContentViewer.previousPage.exception.msg=\u524D\u306E\u30DA\u30FC\u30B8\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -ExtractedContentViewer.hasNextItem.exception.msg=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u691C\u7D22\u53EF\u80FD\u306A\u30BD\u30FC\u30B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 -ExtractedContentViewer.hasPreviousItem.exception.msg=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u691C\u7D22\u53EF\u80FD\u306A\u30BD\u30FC\u30B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 -ExtractedContentViewer.nextItem.exception.msg=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u691C\u7D22\u53EF\u80FD\u306A\u30BD\u30FC\u30B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 -ExtractedContentViewer.previousItem.exception.msg=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u691C\u7D22\u53EF\u80FD\u306A\u30BD\u30FC\u30B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 -ExtractedContentViewer.currentItem.exception.msg=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u691C\u7D22\u53EF\u80FD\u306A\u30BD\u30FC\u30B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 -HighlightedMatchesSource.nextPage.exception.msg=\u6B21\u306E\u30DA\u30FC\u30B8\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -HighlightedMatchesSource.previousPage.exception.msg=\u524D\u306E\u30DA\u30FC\u30B8\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -HighlightedMatchesSource.nextItem.exception.msg=\u6B21\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -HighlightedMatchesSource.previousItem.exception.msg=\u524D\u306E\u30A2\u30A4\u30C6\u30E0\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -Ingester.ingest.exception.unknownImgId.msg=\u6B21\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3066\u3044\u307E\u3059\u3002\u30D5\u30A1\u30A4\u30EB\uFF1A{0}\u306E\u4E0D\u660E\u306A\u30A4\u30E1\u30FC\u30B8ID -Ingester.ingest.exception.cantReadStream.msg=\u30B3\u30F3\u30C6\u30F3\u30C4\u30B9\u30C8\u30EA\u30FC\u30E0\u3092\u8AAD\u307F\u53D6\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A{0} -Ingester.ingest.exception.err.msg=\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306E\u30A8\u30E9\u30FC\uFF1A{0} -Ingester.ingestExtract.exception.solrTimeout.msg=\u6B21\u306EID\u306B\u5BFE\u3059\u308B\u3001Solr\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u30EA\u30AF\u30A8\u30B9\u30C8\u306F\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF1A{0}, \u540D\u524D\: {1} -Ingester.ingestExtract.exception.probPostToSolr.msg=Solr\u306B\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30DD\u30B9\u30C8\u3059\u308B\u306E\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002ID\uFF1A{0}, \u540D\u524D\: {1} -Ingester.UpReqestTask.run.exception.sorlNotAvail.msg=Solr\u30B3\u30A2\u304C\u5229\u7528\u4E0D\u53EF\u3067\u3059\u3002\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3067\u304D\u307E\u305B\u3093\u3002 -Ingester.UpRequestTask.run.exception.probReadFile.msg=\u30D5\u30A1\u30A4\u30EB\u306E\u8AAD\u307F\u53D6\u308A\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Ingester.UpRequestTask.run.exception.solrProb.msg=Solr\u306B\u554F\u984C\u304C\u3042\u308A\u307E\u3059 -Ingester.UpRequestTask.run.exception.probPostToSolr.msg=\u30D5\u30A1\u30A4\u30EB\u30B3\u30F3\u30C6\u30F3\u30C4\u3092Solr\u306B\u8F09\u305B\u308B\u306E\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002SolrException\u30A8\u30E9\u30FC\u30B3\u30FC\u30C9\uFF1A{0} -Ingester.FscContentStream.getSrcInfo=\u30D5\u30A1\u30A4\u30EB\uFF1A{0} -Ingester.FscContentStream.getReader=\u307E\u3060\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 -Ingester.NullContentStream.getSrcInfo.text=\u30D5\u30A1\u30A4\u30EB\uFF1A{0} -Ingester.NullContentStream.getReader=\u307E\u3060\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 -KeywordSearch.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -KeywordSearch.fireNumIdxFileChg.moduleErr.msg=KeywordSearch\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchIngestModule.init.exception.errConnToSolr.msg=Solr\u30B5\u30FC\u30D0\u3078\u63A5\u7D9A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A{0} -KeywordSearchListsEncase.save.exception.msg=\u307E\u3060\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 -KeywordSearchListsEncase.save2.exception.msg=\u307E\u3060\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 -KeywordSearchListsEncase.encaseMetaType.exception.msg=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u306A\u3044EncaseMetaType\uFF1A{0} -KeywordSearchListsManagementPanel.getColName.text=\u540D\u524D -KeywordSearchListsManagementPanel.setValueAt.exception.msg=\u30BB\u30EB\u306E\u7DE8\u96C6\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -KeywordSearchOptionsPanelController.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -KeywordSearchOptionsPanelController.moduleErr.msg1=KeywordSearchOptionsPanelController\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchOptionsPanelController.moduleErr.msg2=KeywordSearchOptionsPanelController\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchQueryManager.pathText.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22 -KeywordSearchResultFactory.progress.saving=\u7D50\u679C\u3092\u4FDD\u5B58\u4E2D\uFF1A{0} -KeywordSearchSettings.moduleName.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22 -KeywordSearchSettings.properties_options.text={0}_\u30AA\u30D7\u30B7\u30E7\u30F3 +AbstractFileChunk.index.exception.msg=\u30d5\u30a1\u30a4\u30eb\u30b9\u30c8\u30ea\u30f3\u30b0\u30c1\u30e3\u30f3\u30af\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0}, \u30c1\u30e3\u30f3\u30af\: {1} +AbstractFileStringContentStream.getSize.exception.msg=\u30b9\u30c8\u30ea\u30f3\u30b0\u5168\u4f53\u304c\u5909\u63db\u3055\u308c\u306a\u3051\u308c\u3070\u3001\u5909\u63db\u3055\u308c\u305f\u30b9\u30c8\u30ea\u30f3\u30b0\u5185\u306e\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u6570\u306f\u4e0d\u660e\u3067\u3059\u3002 +AbstractFileStringContentStream.getSrcInfo.text=\u30d5\u30a1\u30a4\u30eb\uff1a{0} +ByteContentStream.getSrcInfo.text=\u30d5\u30a1\u30a4\u30eb\uff1a{0} +ExtractedContentPanel.SetMarkup.progress.loading=\u30c6\u30ad\u30b9\u30c8\u3092\u8aad\u307f\u8fbc\u307f\u4e2d +ExtractedContentPanel.SetMarkup.progress.displayName=\u30c6\u30ad\u30b9\u30c8\u3092\u8aad\u307f\u8fbc\u307f\u4e2d +ExtractedContentViewer.nextPage.exception.msg=\u6b21\u306e\u30da\u30fc\u30b8\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +ExtractedContentViewer.previousPage.exception.msg=\u524d\u306e\u30da\u30fc\u30b8\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +ExtractedContentViewer.hasNextItem.exception.msg=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u691c\u7d22\u53ef\u80fd\u306a\u30bd\u30fc\u30b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +ExtractedContentViewer.hasPreviousItem.exception.msg=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u691c\u7d22\u53ef\u80fd\u306a\u30bd\u30fc\u30b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +ExtractedContentViewer.nextItem.exception.msg=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u691c\u7d22\u53ef\u80fd\u306a\u30bd\u30fc\u30b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +ExtractedContentViewer.previousItem.exception.msg=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u691c\u7d22\u53ef\u80fd\u306a\u30bd\u30fc\u30b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +ExtractedContentViewer.currentItem.exception.msg=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u691c\u7d22\u53ef\u80fd\u306a\u30bd\u30fc\u30b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 +HighlightedMatchesSource.nextPage.exception.msg=\u6b21\u306e\u30da\u30fc\u30b8\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +HighlightedMatchesSource.previousPage.exception.msg=\u524d\u306e\u30da\u30fc\u30b8\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +HighlightedMatchesSource.nextItem.exception.msg=\u6b21\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +HighlightedMatchesSource.previousItem.exception.msg=\u524d\u306e\u30a2\u30a4\u30c6\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +Ingester.ingest.exception.unknownImgId.msg=\u6b21\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u3044\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\uff1a{0}\u306e\u4e0d\u660e\u306a\u30a4\u30e1\u30fc\u30b8ID +Ingester.ingest.exception.cantReadStream.msg=\u30b3\u30f3\u30c6\u30f3\u30c4\u30b9\u30c8\u30ea\u30fc\u30e0\u3092\u8aad\u307f\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f\uff1a{0} +Ingester.ingest.exception.err.msg=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306e\u30a8\u30e9\u30fc\uff1a{0} +Ingester.ingestExtract.exception.solrTimeout.msg=\u6b21\u306eID\u306b\u5bfe\u3059\u308b\u3001Solr\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u30ea\u30af\u30a8\u30b9\u30c8\u306f\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u307e\u3057\u305f\uff1a{0}, \u540d\u524d\: {1} +Ingester.ingestExtract.exception.probPostToSolr.msg=Solr\u306b\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u30dd\u30b9\u30c8\u3059\u308b\u306e\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002ID\uff1a{0}, \u540d\u524d\: {1} +Ingester.UpReqestTask.run.exception.sorlNotAvail.msg=Solr\u30b3\u30a2\u304c\u5229\u7528\u4e0d\u53ef\u3067\u3059\u3002\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3067\u304d\u307e\u305b\u3093\u3002 +Ingester.UpRequestTask.run.exception.probReadFile.msg=\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u53d6\u308a\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Ingester.UpRequestTask.run.exception.solrProb.msg=Solr\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3059 +Ingester.UpRequestTask.run.exception.probPostToSolr.msg=\u30d5\u30a1\u30a4\u30eb\u30b3\u30f3\u30c6\u30f3\u30c4\u3092Solr\u306b\u8f09\u305b\u308b\u306e\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002SolrException\u30a8\u30e9\u30fc\u30b3\u30fc\u30c9\uff1a{0} +Ingester.FscContentStream.getSrcInfo=\u30d5\u30a1\u30a4\u30eb\uff1a{0} +Ingester.FscContentStream.getReader=\u307e\u3060\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +Ingester.NullContentStream.getSrcInfo.text=\u30d5\u30a1\u30a4\u30eb\uff1a{0} +Ingester.NullContentStream.getReader=\u307e\u3060\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +KeywordSearch.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +KeywordSearch.fireNumIdxFileChg.moduleErr.msg=KeywordSearch\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchIngestModule.init.exception.errConnToSolr.msg=Solr\u30b5\u30fc\u30d0\u3078\u63a5\u7d9a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a{0} +KeywordSearchListsEncase.save.exception.msg=\u307e\u3060\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +KeywordSearchListsEncase.save2.exception.msg=\u307e\u3060\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 +KeywordSearchListsEncase.encaseMetaType.exception.msg=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044EncaseMetaType\uff1a{0} +KeywordSearchListsManagementPanel.getColName.text=\u540d\u524d +KeywordSearchListsManagementPanel.setValueAt.exception.msg=\u30bb\u30eb\u306e\u7de8\u96c6\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093 +KeywordSearchOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +KeywordSearchOptionsPanelController.moduleErr.msg1=KeywordSearchOptionsPanelController\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchOptionsPanelController.moduleErr.msg2=KeywordSearchOptionsPanelController\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchQueryManager.pathText.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22 +KeywordSearchResultFactory.progress.saving=\u7d50\u679c\u3092\u4fdd\u5b58\u4e2d\uff1a{0} +KeywordSearchSettings.moduleName.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22 +KeywordSearchSettings.properties_options.text={0}_\u30aa\u30d7\u30b7\u30e7\u30f3 KeywordSearchSettings.propertiesNSRL.text={0}_NSRL -KeywordSearchSettings.propertiesScripts.text={0}_\u30B9\u30AF\u30EA\u30D7\u30C8 -NoOpenCoreException.err.noOpenSorlCore.msg=\u73FE\u5728\u958B\u3044\u3066\u3044\u308BSolr\u30B3\u30A2\u304C\u3042\u308A\u307E\u305B\u3093\u3002 -Server.start.exception.cantStartSolr.msg=Solr\u30B5\u30FC\u30D0\u30D7\u30ED\u30BB\u30B9\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F -Server.start.exception.cantStartSolr.msg2=Solr\u30B5\u30FC\u30D0\u30D7\u30ED\u30BB\u30B9\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F -Server.isRunning.exception.errCheckSolrRunning.msg=Solr\u30B5\u30FC\u30D0\u306E\u7A3C\u50CD\u72B6\u614B\u3092\u78BA\u8A8D\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -Server.isRunning.exception.errCheckSolrRunning.msg2=Solr\u30B5\u30FC\u30D0\u304C\u7A3C\u50CD\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -Server.openCore.exception.alreadyOpen.msg=\u3059\u3067\u306B\u958B\u3044\u3066\u3044\u308B\u30B3\u30A2\u3067\u3059\uFF01\u307E\u305A\u78BA\u5B9F\u306B\u30B3\u30A2\u3092\u9589\u3058\u3066\u4E0B\u3055\u3044\u3002 -Server.queryNumIdxFiles.exception.msg=\u8907\u6570\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066\u306E\u30AF\u30A8\u30EA\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Server.queryNumIdxChunks.exception.msg=\u8907\u6570\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30C1\u30E3\u30F3\u30AF\u306B\u5BFE\u3057\u3066\u306E\u30AF\u30A8\u30EA\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Server.queryNumIdxDocs.exception.msg=\u8907\u6570\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306B\u5BFE\u3057\u3066\u306E\u30AF\u30A8\u30EA\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Server.queryIsIdxd.exception.msg=\u30B3\u30F3\u30C6\u30F3\u30C4\u304C\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u304B\u78BA\u8A8D\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Server.queryNumFileChunks.exception.msg=\u30D5\u30A1\u30A4\u30EB\u30C1\u30E3\u30F3\u30AF\u306E\u6570\u3092\u78BA\u8A8D\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002 -Server.query.exception.msg=\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\uFF1A{0} -Server.query2.exception.msg=\u30AF\u30A8\u30EA\uFF1A{0}\u3092\u5B9F\u884C\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -Server.queryTerms.exception.msg=Terms\u30AF\u30A8\u30EA\: {0}\u3092\u5B9F\u884C\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -Server.openCore.exception.msg=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30B5\u30FC\u30D3\u30B9\u304C\u307E\u3060\u7A3C\u50CD\u3057\u3066\u3044\u307E\u305B\u3093 -Server.openCore.exception.cantOpen.msg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u4F5C\u6210\u307E\u305F\u306F\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F -Server.request.exception.exception.msg=Solr\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u767A\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F -Server.commit.exception.msg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u30B3\u30DF\u30C3\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F -Server.addDoc.exception.msg=\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u30CF\u30F3\u30C9\u30E9\u30FC\u3092\u4F7F\u7528\u3057\u307E\u3057\u305F\u304C\u3001\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u6B21\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u8FFD\u52A0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A{0} -Server.close.exception.msg=\u30B3\u30A2\u3092\u9589\u3058\u308C\u307E\u305B\u3093 -Server.close.exception.msg2=\u30B3\u30A2\u3092\u9589\u3058\u308C\u307E\u305B\u3093 -Server.solrServerNoPortException.msg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u306B\u4F7F\u7528\u3057\u3066\u3044\u308B\u30B5\u30FC\u30D0\u306F\u30DD\u30FC\u30C8{0}\u306B\u30D0\u30A4\u30F3\u30C9\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30DD\u30FC\u30C8\u306F\u4F7F\u7528\u4E0D\u53EF\u3067\u3059\u3002\u30C7\u30D5\u30A9\u30EB\u30C8{1}\u30DD\u30FC\u30C8\u306E\u5909\u66F4\u3092\u691C\u8A0E\u3057\u3066\u4E0B\u3055\u3044\u3002 -KeywordSearchIngestModule.doInBackGround.displayName=\u5B9A\u671F\u7684\u306A\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22 -KeywordSearchIngestModule.doInBackGround.finalizeMsg=- \u6700\u7D42\u51E6\u7406\u4E2D -KeywordSearchIngestModule.doInBackGround.pendingMsg=\uFF08\u30DA\u30F3\u30C7\u30A3\u30F3\u30B0\uFF09 -SearchRunner.doInBackGround.cancelMsg=\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09 -Server.addDoc.exception.msg2=\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u30CF\u30F3\u30C9\u30E9\u30FC\u3092\u4F7F\u7528\u3057\u307E\u3057\u305F\u304C\u3001\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u6B21\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u8FFD\u52A0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A{0} +KeywordSearchSettings.propertiesScripts.text={0}_\u30b9\u30af\u30ea\u30d7\u30c8 +NoOpenCoreException.err.noOpenSorlCore.msg=\u73fe\u5728\u958b\u3044\u3066\u3044\u308bSolr\u30b3\u30a2\u304c\u3042\u308a\u307e\u305b\u3093\u3002 +Server.start.exception.cantStartSolr.msg=Solr\u30b5\u30fc\u30d0\u30d7\u30ed\u30bb\u30b9\u3092\u958b\u59cb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +Server.start.exception.cantStartSolr.msg2=Solr\u30b5\u30fc\u30d0\u30d7\u30ed\u30bb\u30b9\u3092\u958b\u59cb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +Server.isRunning.exception.errCheckSolrRunning.msg=Solr\u30b5\u30fc\u30d0\u306e\u7a3c\u50cd\u72b6\u614b\u3092\u78ba\u8a8d\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +Server.isRunning.exception.errCheckSolrRunning.msg2=Solr\u30b5\u30fc\u30d0\u304c\u7a3c\u50cd\u3057\u3066\u3044\u308b\u304b\u78ba\u8a8d\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +Server.openCore.exception.alreadyOpen.msg=\u3059\u3067\u306b\u958b\u3044\u3066\u3044\u308b\u30b3\u30a2\u3067\u3059\uff01\u307e\u305a\u78ba\u5b9f\u306b\u30b3\u30a2\u3092\u9589\u3058\u3066\u4e0b\u3055\u3044\u3002 +Server.queryNumIdxFiles.exception.msg=\u8907\u6570\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306b\u5bfe\u3057\u3066\u306e\u30af\u30a8\u30ea\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Server.queryNumIdxChunks.exception.msg=\u8907\u6570\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30c1\u30e3\u30f3\u30af\u306b\u5bfe\u3057\u3066\u306e\u30af\u30a8\u30ea\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Server.queryNumIdxDocs.exception.msg=\u8907\u6570\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u5bfe\u3057\u3066\u306e\u30af\u30a8\u30ea\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Server.queryIsIdxd.exception.msg=\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u304b\u78ba\u8a8d\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Server.queryNumFileChunks.exception.msg=\u30d5\u30a1\u30a4\u30eb\u30c1\u30e3\u30f3\u30af\u306e\u6570\u3092\u78ba\u8a8d\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 +Server.query.exception.msg=\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a{0} +Server.query2.exception.msg=\u30af\u30a8\u30ea\uff1a{0}\u3092\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +Server.queryTerms.exception.msg=Terms\u30af\u30a8\u30ea\: {0}\u3092\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +Server.openCore.exception.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d3\u30b9\u304c\u307e\u3060\u7a3c\u50cd\u3057\u3066\u3044\u307e\u305b\u3093 +Server.openCore.exception.cantOpen.msg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4f5c\u6210\u307e\u305f\u306f\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f +Server.request.exception.exception.msg=Solr\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u767a\u884c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +Server.commit.exception.msg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u30b3\u30df\u30c3\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f +Server.addDoc.exception.msg=\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u4f7f\u7528\u3057\u307e\u3057\u305f\u304c\u3001\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u6b21\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\uff1a{0} +Server.close.exception.msg=\u30b3\u30a2\u3092\u9589\u3058\u308c\u307e\u305b\u3093 +Server.close.exception.msg2=\u30b3\u30a2\u3092\u9589\u3058\u308c\u307e\u305b\u3093 +Server.solrServerNoPortException.msg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u306b\u4f7f\u7528\u3057\u3066\u3044\u308b\u30b5\u30fc\u30d0\u306f\u30dd\u30fc\u30c8{0}\u306b\u30d0\u30a4\u30f3\u30c9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30dd\u30fc\u30c8\u306f\u4f7f\u7528\u4e0d\u53ef\u3067\u3059\u3002\u30c7\u30d5\u30a9\u30eb\u30c8{1}\u30dd\u30fc\u30c8\u306e\u5909\u66f4\u3092\u691c\u8a0e\u3057\u3066\u4e0b\u3055\u3044\u3002 +KeywordSearchIngestModule.doInBackGround.displayName=\u5b9a\u671f\u7684\u306a\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22 +KeywordSearchIngestModule.doInBackGround.finalizeMsg=- \u6700\u7d42\u51e6\u7406\u4e2d +KeywordSearchIngestModule.doInBackGround.pendingMsg=\uff08\u30da\u30f3\u30c7\u30a3\u30f3\u30b0\uff09 +SearchRunner.doInBackGround.cancelMsg=\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09 +Server.addDoc.exception.msg2=\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u4f7f\u7528\u3057\u307e\u3057\u305f\u304c\u3001\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u6b21\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\uff1a{0} ExtractedContentViewer.getSolrContent.txtBodyItal={0} Keyword.toString.text=Keyword'{'query\={0}, isLiteral\={1}, keywordType\={2}'}' KeywordSearchJobSettingsPanel.keywordSearchEncodings.text=- KeywordSearchJobSettingsPanel.languagesValLabel.text=- -KeywordSearchJobSettingsPanel.encodingsLabel.text=\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\uFF1A -KeywordSearchJobSettingsPanel.titleLabel.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u306B\u6709\u52B9\u306B\u3059\u308B\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u9078\u629E\uFF1A -KeywordSearchJobSettingsPanel.languagesLabel.toolTipText=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u304B\u3089\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u3092\u6709\u52B9\u306B\u3057\u305F\u30B9\u30AF\u30EA\u30D7\u30C8\u3002\u30A2\u30C9\u30D0\u30F3\u30B9\u8A2D\u5B9A\u304B\u3089\u5909\u66F4\u304C\u53EF\u80FD\u3067\u3059\u3002 -KeywordSearchJobSettingsPanel.languagesLabel.text=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u304B\u3089\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u3092\u6709\u52B9\u306B\u3057\u305F\u30B9\u30AF\u30EA\u30D7\u30C8\uFF1A -KeywordSearchGlobalLanguageSettingsPanel.enableUTF8Checkbox.text=UTF8\u30C6\u30AD\u30B9\u30C8\u62BD\u51FA\u306E\u6709\u52B9\u5316 -KeywordSearchGlobalLanguageSettingsPanel.ingestSettingsLabel.text=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u304B\u3089\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u8A2D\u5B9A\uFF08\u5909\u66F4\u306F\u6B21\u56DE\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u304B\u3089\u6709\u52B9\uFF09\uFF1A -KeywordSearchGlobalLanguageSettingsPanel.enableUTF16Checkbox.text=UTF16LE\u3068UTF16BE\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u306E\u6709\u52B9\u5316 -KeywordSearchGlobalLanguageSettingsPanel.languagesLabel.text=\u6709\u52B9\u306A\u30B9\u30AF\u30EA\u30D7\u30C8\uFF08\u8A00\u8A9E\uFF09\uFF1A -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton1.toolTipText=\uFF12\uFF10\u5206\uFF08\u6700\u77ED\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton1.text=\uFF12\uFF10\u5206\uFF08\u6700\u3082\u9045\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u6700\u77ED\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton2.toolTipText=\uFF11\uFF10\u5206\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\u3088\u308A\u5168\u4F53\u7684\u306B\u901F\u3044\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton2.text=\uFF11\uFF10\u5206\uFF08\u3088\u308A\u9045\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u3088\u308A\u901F\u3044\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 -KeywordSearchGlobalSearchSettingsPanel.frequencyLabel.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306E\u7D50\u679C\u66F4\u65B0\u306E\u983B\u5EA6\uFF1A -KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.toolTipText=Hash DB\u30B5\u30FC\u30D3\u30B9\u3092\u4E8B\u524D\u306B\u5B9F\u884C\u3059\u308B\u304B\u3001\u6B21\u56DE\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u9078\u629E\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 -KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u4E2D\u306BNSRL\u306E\u30D5\u30A1\u30A4\u30EB\uFF08\u65E2\u77E5\u306E\u30D5\u30A1\u30A4\u30EB\uFF09\u3092\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u8FFD\u52A0\u3057\u306A\u3044 -KeywordSearchGlobalSearchSettingsPanel.informationLabel.text=\u60C5\u5831 -KeywordSearchGlobalSearchSettingsPanel.settingsLabel.text=\u8A2D\u5B9A +KeywordSearchJobSettingsPanel.encodingsLabel.text=\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\uff1a +KeywordSearchJobSettingsPanel.titleLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u6642\u306b\u6709\u52b9\u306b\u3059\u308b\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u9078\u629e\uff1a +KeywordSearchJobSettingsPanel.languagesLabel.toolTipText=\u4e0d\u660e\u306a\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u304b\u3089\u306e\u30b9\u30c8\u30ea\u30f3\u30b0\u62bd\u51fa\u3092\u6709\u52b9\u306b\u3057\u305f\u30b9\u30af\u30ea\u30d7\u30c8\u3002\u30a2\u30c9\u30d0\u30f3\u30b9\u8a2d\u5b9a\u304b\u3089\u5909\u66f4\u304c\u53ef\u80fd\u3067\u3059\u3002 +KeywordSearchJobSettingsPanel.languagesLabel.text=\u4e0d\u660e\u306a\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u304b\u3089\u306e\u30b9\u30c8\u30ea\u30f3\u30b0\u62bd\u51fa\u3092\u6709\u52b9\u306b\u3057\u305f\u30b9\u30af\u30ea\u30d7\u30c8\uff1a +KeywordSearchGlobalLanguageSettingsPanel.enableUTF8Checkbox.text=UTF8\u30c6\u30ad\u30b9\u30c8\u62bd\u51fa\u306e\u6709\u52b9\u5316 +KeywordSearchGlobalLanguageSettingsPanel.ingestSettingsLabel.text=\u4e0d\u660e\u306a\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u304b\u3089\u306e\u30b9\u30c8\u30ea\u30f3\u30b0\u62bd\u51fa\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u8a2d\u5b9a\uff08\u5909\u66f4\u306f\u6b21\u56de\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304b\u3089\u6709\u52b9\uff09\uff1a +KeywordSearchGlobalLanguageSettingsPanel.enableUTF16Checkbox.text=UTF16LE\u3068UTF16BE\u30b9\u30c8\u30ea\u30f3\u30b0\u62bd\u51fa\u306e\u6709\u52b9\u5316 +KeywordSearchGlobalLanguageSettingsPanel.languagesLabel.text=\u6709\u52b9\u306a\u30b9\u30af\u30ea\u30d7\u30c8\uff08\u8a00\u8a9e\uff09\uff1a +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton1.toolTipText=\uff12\uff10\u5206\uff08\u6700\u77ed\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u6642\u9593\uff09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton1.text=\uff12\uff10\u5206\uff08\u6700\u3082\u9045\u3044\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3001\u6700\u77ed\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u6642\u9593\uff09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton2.toolTipText=\uff11\uff10\u5206\uff08\u30c7\u30d5\u30a9\u30eb\u30c8\u3088\u308a\u5168\u4f53\u7684\u306b\u901f\u3044\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u6642\u9593\uff09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton2.text=\uff11\uff10\u5206\uff08\u3088\u308a\u9045\u3044\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3001\u3088\u308a\u901f\u3044\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u6642\u9593\uff09 +KeywordSearchGlobalSearchSettingsPanel.frequencyLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306e\u7d50\u679c\u66f4\u65b0\u306e\u983b\u5ea6\uff1a +KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.toolTipText=Hash DB\u30b5\u30fc\u30d3\u30b9\u3092\u4e8b\u524d\u306b\u5b9f\u884c\u3059\u308b\u304b\u3001\u6b21\u56de\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 +KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306bNSRL\u306e\u30d5\u30a1\u30a4\u30eb\uff08\u65e2\u77e5\u306e\u30d5\u30a1\u30a4\u30eb\uff09\u3092\u30ad\u30fc\u30ef\u30fc\u30c9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u8ffd\u52a0\u3057\u306a\u3044 +KeywordSearchGlobalSearchSettingsPanel.informationLabel.text=\u60c5\u5831 +KeywordSearchGlobalSearchSettingsPanel.settingsLabel.text=\u8a2d\u5b9a KeywordSearchGlobalSearchSettingsPanel.filesIndexedValue.text=- -KeywordSearchGlobalSearchSettingsPanel.filesIndexedLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5185\u306E\u30D5\u30A1\u30A4\u30EB\uFF1A +KeywordSearchGlobalSearchSettingsPanel.filesIndexedLabel.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5185\u306e\u30d5\u30a1\u30a4\u30eb\uff1a KeywordSearchGlobalSearchSettingsPanel.chunksValLabel.text=- -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton4.toolTipText=\uFF11\u5206\uFF08\u5168\u4F53\u7684\u306A\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton4.text_1=\uFF11\u5206\uFF08\u3088\u308A\u901F\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u6700\u3082\u9577\u3044\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\uFF09 -KeywordSearchGlobalSearchSettingsPanel.chunksLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5185\u306E\u30C1\u30E3\u30F3\u30AF\uFF1A -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton3.toolTipText=\uFF15\u5206\uFF08\u5168\u4F53\u7684\u306A\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton3.text=\uFF15\u5206\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\uFF09 -DropdownSearchPanel.substringRadioButton.text=\u30B5\u30D6\u30B9\u30C8\u30EA\u30F3\u30B0\u4E00\u81F4 -AbstractFileTikaTextExtract.index.exception.tikaParse.msg=\u4F8B\u5916\uFF1A\u30D5\u30A1\u30A4\u30EB\uFF1A{0}, {1}\u306EApache Tika\u30D1\u30FC\u30B9\u30BF\u30B9\u30AF\u5B9F\u884C\u4E2D\u306E\u4E88\u671F\u305B\u306C\u4F8B\u5916 -AbstractFileTikaTextExtract.index.tikaParseTimeout.text=\u4F8B\u5916\uFF1A\u30B3\u30F3\u30C6\u30F3\u30C4\uFF1A{0}, {1}\u306EApache Tika\u30D1\u30FC\u30B9\u306E\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 -DropdownSearchPanel.exactRadioButton.text=\u5B8C\u5168\u4E00\u81F4 -DropdownSearchPanel.regexRadioButton.text=\u6B63\u898F\u8868\u73FE -DropdownSearchPanel.searchButton.text=\u691C\u7D22 -KeywordSearchEditListPanel.exportButtonAction.featureName.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8 -KeywordSearchGlobalListSettingsPanel.component.featureName.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u4FDD\u5B58 -KeywordSearchGlobalSearchSettingsPanel.showSnippetsCB.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u7D50\u679C\u306B\u8868\u793A\uFF08\u691C\u7D22\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09 -KeywordSearchIngestModule.fileThLbl=\u30D5\u30A1\u30A4\u30EB -KeywordSearchIngestModule.kwHitLbl=\u30AD\u30FC\u30EF\u30FC\u30C9\u30D2\u30C3\u30C8\uFF1A -KeywordSearchIngestModule.kwHitThLbl=\u30AD\u30FC\u30EF\u30FC\u30C9 -KeywordSearchIngestModule.listThLbl=\u30EA\u30B9\u30C8 -KeywordSearchIngestModule.previewThLbl=\u30D7\u30EC\u30D3\u30E5\u30FC -KeywordSearchIngestModule.regExpHitLbl=\u6B63\u898F\u8868\u73FE\u30D2\u30C3\u30C8\uFF1A -KeywordSearchIngestModule.regExThLbl=\u6B63\u898F\u8868\u73FE -KeywordSearchListsAbstract.addList.errMsg1.msg=KeywordSearchListsAbstract\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchListsAbstract.addList.errMsg2.msg=KeywordSearchListsAbstract\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchListsAbstract.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC -KeywordSearchPanel.searchDropButton.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22 -SearchRunner.updateTimer.title.text=SearchRunner\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u30BF\u30A4\u30DE\u30FC -KeywordSearchListsAbstract.deleteList.errMsg1.msg=KeywordSearchListsAbstract\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchListsAbstract.saveList.errMsg1.msg=KeywordSearchListsAbstract\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchListsAbstract.saveList.errMsg2.msg=KeywordSearchListsAbstract\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchListsAbstract.writeLists.errMsg1.msg=KeywordSearchListsAbstract\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchListsAbstract.writeLists.errMsg2.msg=KeywordSearchListsAbstract\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002 -KeywordSearchListsManagementPanel.newKeywordListDescription=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8<{0}>\u306F\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30EA\u30B9\u30C8\u3068\u3057\u3066\u5B58\u5728\u3057\u307E\u3059\u3002\u30D7\u30ED\u30B0\u30E9\u30E0\u3092\u4F7F\u7528\u4E2D\u306E\u307F\u3053\u306E\u30EA\u30B9\u30C8\u3092\u7F6E\u304D\u63DB\u3048\u307E\u3059\u304B\uFF1F\uFF08\u3053\u306E\u5909\u66F4\u306F\u7D99\u7D9A\u3055\u308C\u307E\u305B\u3093\uFF09 -KeywordSearchListsManagementPanel.newKeywordListDescription2=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8<{0}>\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\u3002\u7F6E\u304D\u63DB\u3048\u307E\u3059\u304B\uFF1F -KeywordSearchModuleFactory.createFileIngestModule.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof KeywordSearchJobSettings -KeywordSearchModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8A2D\u5B9A\u3092\u884C\u3046\u70BA\u306E\u60F3\u5B9A\u3055\u308C\u308B\u5F15\u6570\u306Finstanceof KeywordSearchJobSettings -SearchRunner.Searcher.done.err.msg=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u3092\u5B9F\u884C\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.text=\u5B9A\u671F\u7684\u691C\u7D22\u7121\u3057 -KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.toolTipText=\u5168\u4F53\u7684\u306B\u4E00\u756A\u901F\u3044\u3067\u3059\u304C\u3001\u51E6\u7406\u304C\u5B8C\u4E86\u3059\u308B\u307E\u3067\u7D50\u679C\u306F\u8868\u793A\u3055\u308C\u307E\u305B\u3093 -HighlightedMatchesSource.getMarkup.queryFailedMsg=
\u30AD\u30FC\u30EF\u30FC\u30C9\u306B\u30D2\u30C3\u30C8\u3057\u305F\u7D50\u679C\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002
Autopsy\u304CSolr\u30B5\u30FC\u30D0\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002
\ -KeywordSearch.openCore.notification.msg=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F -KeywordSearch.closeCore.notification.msg=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u9589\u3058\u308B\u969B\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -KeywordSearchListsManagementPanel.fileExtensionFilterLb2=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u30D5\u30A1\u30A4\u30EB\u3092\u30A8\u30F3\u30B1\u30FC\u30B9\u3059\u308B(txt) -Server.connect.exception.msg=Solr\u30B5\u30FC\u30D0\u30FC\u3078\u306E\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A -Server.openCore.exception.noIndexDir.msg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u307E\u305F\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002 -KeywordSearchIngestModule.startUp.noOpenCore.msg=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u304C\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u307E\u305F\u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002 -KeywordSearchIngestModule.startUp.fileTypeDetectorInitializationException.msg=\u30D5\u30A1\u30A4\u30EB\u30BF\u30A4\u30D7\u30C7\u30A3\u30C6\u30AF\u30BF\u3092\u8D77\u52D5\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F -SolrConnectionCheck.HostnameOrPort=hostname\u3084\u30DD\u30FC\u30C8\u756A\u53F7\u304C\u7121\u52B9\u3067\u3059\u3002 -SolrConnectionCheck.Hostname=hostname\u304C\u7121\u52B9\u3067\u3059\u3002 -SolrConnectionCheck.Port=\u30DD\u30FC\u30C8\u756A\u53F7\u304C\u7121\u52B9\u3067\u3059\u3002 -SolrConnectionCheck.MissingHostname=hostname\u304C\u6B20\u3051\u3066\u307E\u3059\u3002 -RawText.getText.error.msg=\u30C6\u30AD\u30B9\u30C8\u3092\u53D6\u5F97\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton4.toolTipText=\uff11\u5206\uff08\u5168\u4f53\u7684\u306a\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u6642\u9593\u304c\u9577\u304f\u306a\u308a\u307e\u3059\uff09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton4.text_1=\uff11\u5206\uff08\u3088\u308a\u901f\u3044\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3001\u6700\u3082\u9577\u3044\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u6642\u9593\uff09 +KeywordSearchGlobalSearchSettingsPanel.chunksLabel.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5185\u306e\u30c1\u30e3\u30f3\u30af\uff1a +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton3.toolTipText=\uff15\u5206\uff08\u5168\u4f53\u7684\u306a\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u6642\u9593\u304c\u9577\u304f\u306a\u308a\u307e\u3059\uff09 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton3.text=\uff15\u5206\uff08\u30c7\u30d5\u30a9\u30eb\u30c8\uff09 +DropdownSearchPanel.substringRadioButton.text=\u30b5\u30d6\u30b9\u30c8\u30ea\u30f3\u30b0\u4e00\u81f4 +AbstractFileTikaTextExtract.index.exception.tikaParse.msg=\u4f8b\u5916\uff1a\u30d5\u30a1\u30a4\u30eb\uff1a{0}, {1}\u306eApache Tika\u30d1\u30fc\u30b9\u30bf\u30b9\u30af\u5b9f\u884c\u4e2d\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916 +AbstractFileTikaTextExtract.index.tikaParseTimeout.text=\u4f8b\u5916\uff1a\u30b3\u30f3\u30c6\u30f3\u30c4\uff1a{0}, {1}\u306eApache Tika\u30d1\u30fc\u30b9\u306e\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8 +DropdownSearchPanel.exactRadioButton.text=\u5b8c\u5168\u4e00\u81f4 +DropdownSearchPanel.regexRadioButton.text=\u6b63\u898f\u8868\u73fe +DropdownSearchPanel.searchButton.text=\u691c\u7d22 +KeywordSearchEditListPanel.exportButtonAction.featureName.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u30a8\u30af\u30b9\u30dd\u30fc\u30c8 +KeywordSearchGlobalListSettingsPanel.component.featureName.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u4fdd\u5b58 +KeywordSearchGlobalSearchSettingsPanel.showSnippetsCB.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30d7\u30ec\u30d3\u30e5\u30fc\u3092\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u7d50\u679c\u306b\u8868\u793a\uff08\u691c\u7d22\u6642\u9593\u304c\u9577\u304f\u306a\u308a\u307e\u3059\uff09 +KeywordSearchIngestModule.fileThLbl=\u30d5\u30a1\u30a4\u30eb +KeywordSearchIngestModule.kwHitLbl=\u30ad\u30fc\u30ef\u30fc\u30c9\u30d2\u30c3\u30c8\uff1a +KeywordSearchIngestModule.kwHitThLbl=\u30ad\u30fc\u30ef\u30fc\u30c9 +KeywordSearchIngestModule.listThLbl=\u30ea\u30b9\u30c8 +KeywordSearchIngestModule.previewThLbl=\u30d7\u30ec\u30d3\u30e5\u30fc +KeywordSearchIngestModule.regExpHitLbl=\u6b63\u898f\u8868\u73fe\u30d2\u30c3\u30c8\uff1a +KeywordSearchIngestModule.regExThLbl=\u6b63\u898f\u8868\u73fe +KeywordSearchListsAbstract.addList.errMsg1.msg=KeywordSearchListsAbstract\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchListsAbstract.addList.errMsg2.msg=KeywordSearchListsAbstract\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchListsAbstract.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc +KeywordSearchPanel.searchDropButton.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22 +SearchRunner.updateTimer.title.text=SearchRunner\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30bf\u30a4\u30de\u30fc +KeywordSearchListsAbstract.deleteList.errMsg1.msg=KeywordSearchListsAbstract\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchListsAbstract.saveList.errMsg1.msg=KeywordSearchListsAbstract\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchListsAbstract.saveList.errMsg2.msg=KeywordSearchListsAbstract\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchListsAbstract.writeLists.errMsg1.msg=KeywordSearchListsAbstract\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchListsAbstract.writeLists.errMsg2.msg=KeywordSearchListsAbstract\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002 +KeywordSearchListsManagementPanel.newKeywordListDescription=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8<{0}>\u306f\u8aad\u307f\u53d6\u308a\u5c02\u7528\u30ea\u30b9\u30c8\u3068\u3057\u3066\u5b58\u5728\u3057\u307e\u3059\u3002\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f7f\u7528\u4e2d\u306e\u307f\u3053\u306e\u30ea\u30b9\u30c8\u3092\u7f6e\u304d\u63db\u3048\u307e\u3059\u304b\uff1f\uff08\u3053\u306e\u5909\u66f4\u306f\u7d99\u7d9a\u3055\u308c\u307e\u305b\u3093\uff09 +KeywordSearchListsManagementPanel.newKeywordListDescription2=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8<{0}>\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u7f6e\u304d\u63db\u3048\u307e\u3059\u304b\uff1f +KeywordSearchModuleFactory.createFileIngestModule.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof KeywordSearchJobSettings +KeywordSearchModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof KeywordSearchJobSettings +SearchRunner.Searcher.done.err.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u3092\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.text=\u5b9a\u671f\u7684\u691c\u7d22\u7121\u3057 +KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.toolTipText=\u5168\u4f53\u7684\u306b\u4e00\u756a\u901f\u3044\u3067\u3059\u304c\u3001\u51e6\u7406\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u7d50\u679c\u306f\u8868\u793a\u3055\u308c\u307e\u305b\u3093 +HighlightedMatchesSource.getMarkup.queryFailedMsg=
\u30ad\u30fc\u30ef\u30fc\u30c9\u306b\u30d2\u30c3\u30c8\u3057\u305f\u7d50\u679c\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
Autopsy\u304cSolr\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
\ +KeywordSearch.openCore.notification.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f +KeywordSearch.closeCore.notification.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u9589\u3058\u308b\u969b\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +KeywordSearchListsManagementPanel.fileExtensionFilterLb2=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u30a8\u30f3\u30b1\u30fc\u30b9\u3059\u308b(txt) +Server.connect.exception.msg=Solr\u30b5\u30fc\u30d0\u30fc\u3078\u306e\u63a5\u7d9a\u306b\u5931\u6557\u3057\u307e\u3057\u305f\uff1a +Server.openCore.exception.noIndexDir.msg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u307e\u305f\u306f\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002 +KeywordSearchIngestModule.startUp.noOpenCore.msg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304c\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u307e\u305f\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002 +KeywordSearchIngestModule.startUp.fileTypeDetectorInitializationException.msg=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u30c7\u30a3\u30c6\u30af\u30bf\u3092\u8d77\u52d5\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f +SolrConnectionCheck.HostnameOrPort=hostname\u3084\u30dd\u30fc\u30c8\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059\u3002 +SolrConnectionCheck.Hostname=hostname\u304c\u7121\u52b9\u3067\u3059\u3002 +SolrConnectionCheck.Port=\u30dd\u30fc\u30c8\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059\u3002 +SolrConnectionCheck.MissingHostname=hostname\u304c\u6b20\u3051\u3066\u307e\u3059\u3002 +RawText.getText.error.msg=\u30c6\u30ad\u30b9\u30c8\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java index 112a8982ab..652715bc31 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchGlobalSettingsPanel.java @@ -36,8 +36,9 @@ final class KeywordSearchGlobalSettingsPanel extends IngestModuleGlobalSettingsP customizeComponents(); } + @NbBundle.Messages({"KeywordSearchGlobalSettingsPanel.Title=Global Keyword Search Settings"}) private void customizeComponents() { - setName(NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel.customizeComponents.title")); + setName(Bundle.KeywordSearchGlobalSettingsPanel_Title()); listsPanel = new GlobalListSettingsPanel(); languagesPanel = new KeywordSearchGlobalLanguageSettingsPanel(); generalPanel = new KeywordSearchGlobalSearchSettingsPanel(); diff --git a/NEWS.txt b/NEWS.txt index cf692b5ed3..53c2d3fb0c 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -10,7 +10,7 @@ Improvements: - New Embedded File Extractor module that incorporates ZIP file module and extracts images from Office documents - Views area counts updates when ZIP files and such are found - Updates to python scripting for new version of Python, scripts are reloaded each time ingest is run, and errors are better shown. -- Updated right click actions to be consistent accross all file types +- Updated right click actions to be consistent across all file types - Changed logic of Interesting Files module to look for substrings of parent path. - Lots of minor fixes and enhancements @@ -18,7 +18,7 @@ Improvements: ---------------- VERSION 3.1.2 -------------- Improvements: - New PhotoRec carving ingest module -- Regripper output is avaiable as a report instead of TOOL_OUTPUT artifact +- Regripper output is available as a report instead of TOOL_OUTPUT artifact - Updated version of RegRipper - New STIX/Cybox report module (manually run after image has been analyzed) - File type module supports user defined file types and can alert when they are found @@ -71,12 +71,12 @@ Improvements: - Times can be displayed in local time or GMT - New "EnCase-style" report that lists files and metadata in tab delimited file - Changed report wizard to make one report at a time -- report improvements (only regnerate if data exists) +- report improvements (only regenerate if data exists) - more error messages if recent activity module fails - more error checking in recent activity module and don't bail as quickly - Cleanup of recent activity module - better handle if ingest module throws exception during init() -- do not run ingest if any module faile to init() +- do not run ingest if any module failed to init() - Added FILE_DONE event to ingest manager - Added search engine parsers for linkedin, twitter, and facebook - HTML text is better formatted @@ -484,7 +484,7 @@ Autopsy Windows 03/05/05: Update: Added SSN and credit card seach patterns from Jerry Shenk. -03/05/05: Update: Added temporal data when a note is creaed. +03/05/05: Update: Added temporal data when a note is created. 03/11/05: Update: Changed to new TSK names for srch_strings and img_stat @@ -531,7 +531,7 @@ directory box, the recover bit is set so the full contents are shown. 03/29/04: Update: Changed text for the data integrity option when adding a new image. -04/20/04: Bug Fix: Fixed error that occured when data browsing with +04/20/04: Bug Fix: Fixed error that occurred when data browsing with a raw or swap image. The TSK usage for these file system types was inconsistent and it was fixed in version 1.69. (BUG: 925382). (Reported by Harald Katzer) @@ -670,7 +670,7 @@ number of bytes. than once. (Paul Bakker) 06/01/03: Bug Fix: Some keyword searches with $ in it were failing 06/01/03: Update: Keyword searches are now saved to a file and can be - found in the keyword seach main menu + found in the keyword search main menu 06/01/03: Update: Changed the format a little of the keyword search menu 06/01/03: Update: Added grep cheat sheet @@ -713,7 +713,7 @@ number of bytes. 03/20/03: Update: passwd and group files are now imported in timelines by selecting the image - no more inode values 03/20/03: Update: Cleaned up HTML code in timeline section -03/21/03: Update: Added '-z' flag to usage of 'file' so that comressed +03/21/03: Update: Added '-z' flag to usage of 'file' so that compressed files are opened. 03/21/03: Bug Fix: Some special values needed to be escaped in the grep keyword search (for non regular expressions) (\.]^$"-). @@ -770,7 +770,7 @@ Interface Changes: --------------------------- Version 1.61 --------------------------------- -08/28/02: Update: White space is allowed at the begining of the morgue file +08/28/02: Update: White space is allowed at the beginning of the morgue file 08/28/02: Bug Fix: No error is generated if md5.txt does not exist from main menu 08/28/02: Update: Improved error messages diff --git a/README.txt b/README.txt index 1bdce6e2b5..d38a4cc1a4 100644 --- a/README.txt +++ b/README.txt @@ -1,35 +1,34 @@ - Autopsy 3.0 - http://www.sleuthkit.org/ - - March 13, 2013 +Autopsy 4 +http://www.sleuthkit.org/ +March 15, 2016 OVERVIEW Autopsy is a graphical interface to The Sleuth Kit and other open source digital forensics tools. -Autopsy 3 is a complete rewrite from Autopsy 2 and it is now Java-based. +Autopsy 3 was a complete rewrite from Autopsy 2 to make it Java-based. +Autopsy 4 improves on Autopsy 3 by supporting collaboration on a single case by multiple users. Although Autopsy is designed to be cross-platform (Windows, Linux, MacOSX), the current version is fully functional and fully tested only on Windows. We have run it on XP, Vista, and Windows 7 with no problems. -Autopsy 3.0 is released under the Apache 2.0 license. +Autopsy 4 is released under the Apache 2.0 license. +Some libraries Autopsy uses may have different, but similar, open source licenses. INSTALLATION -All Autopsy dependencies are bundled with the installer provided. -There is no need for manual installation of additional dependencies if the installer is used. +For a Windows installation, all Autopsy dependencies are bundled with the installer provided. +There is no need for manual installation of additional dependencies if the Windows installer is used. If you want the Japanese localized version, you must have the Japanese language pack (http://support.microsoft.com/kb/972813) installed and the default locale set to JA. (http://windows.microsoft.com/en-us/windows/change-system-locale#1TC=windows-7). -Refer to the next section for additional info on third-party software requirements to run Autopsy without installer. - Refer to the KNOWN_ISSUES.txt file for known bugs that could cause investigation problems. SUPPORT -There is a built-in help system in Autopsy once you get it started. There is also a QuickStart Guide that came with the installer. +There is a built-in help system in Autopsy once you get it started. There is also a QuickStart Guide that comes with the installer. Send any bug reports or feature requests to the sleuthkit-users e-mail list. http://www.sleuthkit.org/support.php @@ -42,24 +41,24 @@ The Autopsy code is released under the Apache License, Version 2. See LICENSE-2 EMBEDDED SOFTWARE -This section lists the software components and libraries that are used inside of -Autopsy. These tools are bundled with the installer, unless specified otherwise. +This section lists the software components and libraries that are used by of +Autopsy. These tools are bundled with the Windows installer, unless specified otherwise. JRE (Java Runtime Environment) 1.8 - Web page: http://www.oracle.com/technetwork/java/index.html - License: http://www.oracle.com/technetwork/java/javase/terms/license/index.html -Netbeans 7.3 RCP platform and .jar files bundled with the platform +Netbeans 8.0.2 RCP platform and .jar files bundled with the platform - Web page: http://netbeans.org/features/platform/ - License: -http://services.netbeans.org/downloads/licence/nb-7.0-final-2011-04-20-license.txt +https://netbeans.org/downloads/jdk-bundle/8.0.2/nb802-LICENSE.txt Sleuth Kit for analyzing disk images. - Web page: http://www.sleuthkit.org/sleuthkit/ - License: http://sleuthkit.org/sleuthkit/licenses.php Libewf for opening E01 files -- Web page: http://sourceforge.net/projects/libewf/ +- Web page: https://github.com/libyal/libewf - License: http://www.gnu.org/licenses/lgpl.html zlib for opening E01 files @@ -116,7 +115,7 @@ ImgScalr 4.2 for image resizing in image viewers - License: http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/#license -EMBEDED RESOURCES +EMBEDDED RESOURCES This section lists other resources, such as icons, that are used by Autopsy. diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RecentDocumentsByLnk.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RecentDocumentsByLnk.java index f97603974e..bb200551fb 100644 --- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RecentDocumentsByLnk.java +++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/RecentDocumentsByLnk.java @@ -98,10 +98,7 @@ class RecentDocumentsByLnk extends Extract { boolean unalloc = recentFile.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.UNALLOC) || recentFile.isDirNameFlagSet(TskData.TSK_FS_NAME_FLAG_ENUM.UNALLOC); if (unalloc == false) { - logger.log(Level.SEVERE, "Error lnk parsing the file to get recent files" + recentFile, e); //NON-NLS - this.addErrorMessage( - NbBundle.getMessage(this.getClass(), "RecentDocumentsByLnk.getRecDoc.errParsingFile", - this.getName(), recentFile.getName())); + logger.log(Level.WARNING, "Error lnk parsing the file to get recent files {0}", recentFile); //NON-NLS } continue; } diff --git a/Testing/test/qa-functional/src/org/sleuthkit/autopsy/testing/RegressionTest.java b/Testing/test/qa-functional/src/org/sleuthkit/autopsy/testing/RegressionTest.java index 4f0a538810..1f081e06bd 100755 --- a/Testing/test/qa-functional/src/org/sleuthkit/autopsy/testing/RegressionTest.java +++ b/Testing/test/qa-functional/src/org/sleuthkit/autopsy/testing/RegressionTest.java @@ -226,7 +226,7 @@ public class RegressionTest extends TestCase { public void testConfigureHash() { logger.info("Hash Configure"); - JDialog hashMainDialog = JDialogOperator.waitJDialog("Hash Set Configuration", false, false); + JDialog hashMainDialog = JDialogOperator.waitJDialog("Global Hash Lookup Settings", false, false); JDialogOperator hashMainDialogOperator = new JDialogOperator(hashMainDialog); List databases = new ArrayList(); databases.add(getEscapedPath(System.getProperty("nsrl_path"))); @@ -266,7 +266,7 @@ public class RegressionTest extends TestCase { public void testConfigureSearch() { logger.info("Search Configure"); - JDialog jd = JDialogOperator.waitJDialog("Advanced Keyword Search Configuration", false, false); + JDialog jd = JDialogOperator.waitJDialog("Global Keyword Search Settings", false, false); JDialogOperator jdo = new JDialogOperator(jd); String words = getEscapedPath(System.getProperty("keyword_path")); JButtonOperator jbo0 = new JButtonOperator(jdo, "Import List", 0); diff --git a/docs/doxygen-user/filetype.dox b/docs/doxygen-user/filetype.dox index 8bc5a511cf..22d40add12 100644 --- a/docs/doxygen-user/filetype.dox +++ b/docs/doxygen-user/filetype.dox @@ -36,6 +36,6 @@ This module does not have obvious impacts in the user interface, though it is us To see the file type of an individual file, view the "Results" tab in the lower right when you navigate to the file. You should see a page in there that mentions the file type. -The Views area of the tree does not take the results of this module into account. That part of the tree relies on extension. We will be upating it in the future to rely on extension when there is no output from this module for the file. +The Views area of the tree does not take the results of this module into account. That part of the tree relies on extension. We will be updating it in the future to rely on extension when there is no output from this module for the file. */ diff --git a/docs/doxygen-user/image_gallery.dox b/docs/doxygen-user/image_gallery.dox index be0c3c4b87..50c5f87c6f 100644 --- a/docs/doxygen-user/image_gallery.dox +++ b/docs/doxygen-user/image_gallery.dox @@ -10,7 +10,7 @@ The new image gallery feature has been designed specifically with child-exploita This document assumes basic familiarity with Autopsy. Quick Start =========== -1. The Image Gallery tool can be configured to collect data about images/videos as ingest runs or all at once after ingest. To change this setting go to "Tools", "Options", "Image /Video Gallery". This setting is saved per case, but can not be changed during ingest. See the Options window for more details +1. The Image Gallery tool can be configured to collect data about images/videos as ingest runs or all at once after ingest. To change this setting go to "Tools", "Options", "Image /Video Gallery". This setting is saved per case, but cannot be changed during ingest. See the Options window for more details 2. Create a case as normal and add a disk image (or folder of files) as a data source. Ensure that you have the hash lookup module enabled with NSRL and known bad hashsets, the EXIF module enabled, and the File Type module enabled. 3. Click "Tools", "View Images/Videos" in the menu. This will open the Autopsy Image/Video Analysis tool in a new window. 4. Groups of images will be presented as they are analyzed by the background ingest modules. You can later resort and regroup, but it is required to keep it grouped by folder while ingest is still ongoing. @@ -94,7 +94,7 @@ In slide show mode a group shows only one file at a time at an increased size. Table/Tree of contents ---------------------- -The section in the top left with tabs labeled “Contents” and “Hash Hits” provides an overview of the groups of files in the case. It changes to reflect the current Group By setting: for hierarchical groupings (path) it shows a tree of folders (folders containing images/videos (groups) are marked with a distinctive icon ), and for other groupings it shows only a flat list. +The section in the top left with tabs labelled “Contents” and “Hash Hits” provides an overview of the groups of files in the case. It changes to reflect the current Group By setting: for hierarchical groupings (path) it shows a tree of folders (folders containing images/videos (groups) are marked with a distinctive icon ), and for other groupings it shows only a flat list. Each group shows the number of files that hit against configured Hash DBs during ingest (hash hits) and the total number of image/video files as a ratio (hash hits / total) after its name. By selecting groups in the tree/list you can navigate directly to them in the main display area. If the Hash Hits tab is selected only groups containing files that have hash hits are shown. diff --git a/docs/doxygen-user/ingest.dox b/docs/doxygen-user/ingest.dox index 27a3412d0e..cbb0763215 100644 --- a/docs/doxygen-user/ingest.dox +++ b/docs/doxygen-user/ingest.dox @@ -23,7 +23,7 @@ There are two ways to start ingest modules: -# Immediately after you add a data source -# By right-clicking on a data source from the tree in the main interface and choosing "Run Ingest Modules" -Once ingest is started, you can review the currently running ingest tasks in the task bar on the bottom-right corner of the main window. The ingest tasks can be canceled by the user if so desired. +Once ingest is started, you can review the currently running ingest tasks in the task bar on the bottom-right corner of the main window. The ingest tasks can be cancelled by the user if so desired. Note: sometimes the cancellation process may take several seconds or more to complete cleanly, depending on what the ingest module was currently doing. diff --git a/docs/doxygen-user/stix.dox b/docs/doxygen-user/stix.dox index 9e9f4fc976..e3dcdb0be0 100755 --- a/docs/doxygen-user/stix.dox +++ b/docs/doxygen-user/stix.dox @@ -16,7 +16,7 @@ Quick Start -# After the image has been added and ingest is complete, click the Report button then select STIX. Next choose either a single STIX file or a directory of STIX files to run against the image. It is possible to do this while ingest is running but the results will be incomplete. -# Once the STIX report module is complete, there will be two sets of results: - Entries will be created under Interesting Items in the Autopsy tree, under a subheading for each indicator. - - A log of which indicators/observables were found is generated by the report module (Follow the link on the Report Generation Progess window) + - A log of which indicators/observables were found is generated by the report module (Follow the link on the Report Generation Progress window) Supported CybOX Objects @@ -93,7 +93,7 @@ See http://cybox.mitre.org for more information on CybOX Objects. Limitations =========== - As shown in the list above, not all CybOX objects/fields are currently supported. When an unsupported object/field is found in an observable, its status is set to "indeterminate" instead of true or false. These indeterminate fields will not change the result of the observable composition (i.e., if the rest is true, the overall result will stay as true). -- Not all ConditionTypeEnum values are supported. It varies by field, but generally on String fields the following work: EQUALS, DOES_NOT_EQUAL, CONTAINS, DOES_NOT_CONTAIN, STARTS_WITH, ENDS_WITH. If a condtion type is not supported there will be a warning in the log file. +- Not all ConditionTypeEnum values are supported. It varies by field, but generally on String fields the following work: EQUALS, DOES_NOT_EQUAL, CONTAINS, DOES_NOT_CONTAIN, STARTS_WITH, ENDS_WITH. If a condition type is not supported there will be a warning in the log file. - Related objects are not processed diff --git a/docs/doxygen-user/tagging.dox b/docs/doxygen-user/tagging.dox index 71be81158d..c634486f96 100755 --- a/docs/doxygen-user/tagging.dox +++ b/docs/doxygen-user/tagging.dox @@ -12,7 +12,7 @@ Which to choose depends upon the context and what you desire in the final report \image html tagging-1.PNG -Once you have choosen to tag the file or the result, there are two more options: +Once you have chosen to tag the file or the result, there are two more options: - Quick Tag -- use this if you just want the tag - Tag and Comment -- use this if you need to add a comment about this tag diff --git a/docs/doxygen-user/timeline.dox b/docs/doxygen-user/timeline.dox index 67c306bb84..b1702e01ab 100755 --- a/docs/doxygen-user/timeline.dox +++ b/docs/doxygen-user/timeline.dox @@ -7,7 +7,7 @@ This document assumes basic familiarity with Autopsy. Quick Start =========== -# Create a case as normal and add a disk image (or folder of files) as a data source. To get the most out of the timeline, ensure that you have the hash lookup module enabled with NSRL (to ignore known files) and have the EXIF and recent activity modules enabled to collect additional temporal data. --# After the image has been added, click "Tools", "Timeline" in the menu. This will open the Timeline tool in a new window. You can do this while ingest is running, but you will not have access to the temporal data that will be found after you create the timeline, unless you re-open the timeline tool. +-# After the image has been added, click "Tools", "Timeline" in the menu. This will open the Timeline tool in a new window. You can do this while ingest is running, but you will not have access to the temporal data that will be found after you create the timeline, unless you re-open the timeline tool. @@ -136,7 +136,7 @@ Visualization Area: Counts View ------------------------------- The Counts View shows a stacked bar chart with time periods along the x-axis and event counts along the y-axis. The height of each bar represents the number of events that occurred in that time period. The different colored segments represent different event types. Right clicking the bars brings up a context menu with selection and zooming actions. -The only setting specific to the Counts View is what kind of vertical scale to use. The default linear scale is good for many use cases. When this scale is selected, the height of the bars represents the counts in a linear, one-to-one fashion, and the y-axis is labeled with values. When the range of count values is very large, date ranges with relatively low counts have a bar that may be too small to see. To help avoid the misperception of this as no events, the labels for time periods with events are bold relative to the labels for time periods with no events. +The only setting specific to the Counts View is what kind of vertical scale to use. The default linear scale is good for many use cases. When this scale is selected, the height of the bars represents the counts in a linear, one-to-one fashion, and the y-axis is labelled with values. When the range of count values is very large, date ranges with relatively low counts have a bar that may be too small to see. To help avoid the misperception of this as no events, the labels for time periods with events are bold relative to the labels for time periods with no events. To see the events when the bar for a period is too small, there are three options: adjust the window size so that the visualization area has more vertical space, adjust the time range shown so that time periods with relatively much larger bars are excluded, or adjust the scale setting to square root or logarithmic. The square root and logarithmic scales represent the number of events in a non linear way that compresses the difference between very large and very small numbers. Note that even with the logarithmic scale, an extremely large difference in counts may still produce bars too small to see. In this case the only option may be to exclude events to reduce the difference in counts. Because the square root and logarithmic scales are applied to each event type separately, the height of the combined bar is not very meaningful, and to emphasize this, no labels are shown on the y-axis. The non-linear scales should be used to quickly compare the counts relative across _time within a type, or across types for one time period, but not both_. The exact numbers (available in tooltips or the result viewer) should be used for absolute comparisons. Use the non-linear scales with care. diff --git a/docs/doxygen/platformConcepts.dox b/docs/doxygen/platformConcepts.dox index 10ab5453cf..9fe5417377 100755 --- a/docs/doxygen/platformConcepts.dox +++ b/docs/doxygen/platformConcepts.dox @@ -2,7 +2,7 @@ -This page covers the motivation for and basics of Autopsy modules. It applies to both Java and Python modules. Later pages will focus on getting the devevelopment environment setup and how to write specific modules. +This page covers the motivation for and basics of Autopsy modules. It applies to both Java and Python modules. Later pages will focus on getting the development environment setup and how to write specific modules. \section platform_motivation Why Write Modules? @@ -18,7 +18,7 @@ The main reason for considering writing an Autopsy module instead of a stand-alo Autopsy was designed to be an extensible platform for other developers to leverage. There are several places in the platform where plug-in modules can be applied. - Ingest Modules: These modules are run when a new data source (such as a disk image) is added to a case (and can be re-run afterwards too). These modules come in two forms: - File Ingest Modules are called for every file in the data source. Use this type of module if you want to examine the contents of all or most of the files. Examples include hash calculation, hash lookup, file type identification, and entropy calculation. These modules are passed in a reference to a file to analyze. - - Data Source Ingest Modules are called once for every image or set of logical files. These modules can use the database to query for one or more files and perform analysis on them. Examples include web artifact analysis and searches that can rely only file names and extensions. Note that these modules will not have access to the contents of ZIP files. These modules are also often used when wrapping an executabe that takes a disk image in as input. + - Data Source Ingest Modules are called once for every image or set of logical files. These modules can use the database to query for one or more files and perform analysis on them. Examples include web artifact analysis and searches that can rely only file names and extensions. Note that these modules will not have access to the contents of ZIP files. These modules are also often used when wrapping an executable that takes a disk image in as input. See \ref mod_ingest_page for details on building these modules. - Report Modules: These modules are (typically) run after the user has reviewed results and tagged files. Their intention is to create an output report of the results, but they can also be used to perform analysis. See \ref mod_report_page for details on creating these modules. - Content Viewers: These modules are graphical and focus on displaying a specific file in some unique way. These are the modules in the lower right of the interface. The platform comes with viewers to view the file in hexadecimal, extract the strings from the file, and view images and movies. See \ref mod_content_page for details on creating these modules. diff --git a/docs/doxygen/regressionTesting.dox b/docs/doxygen/regressionTesting.dox index 9f4ce872a2..f08101eaa6 100755 --- a/docs/doxygen/regressionTesting.dox +++ b/docs/doxygen/regressionTesting.dox @@ -81,7 +81,7 @@ Other commands can be issued by adding the following arguments to the script -r, --rebuild Rebuild the gold standards from the test results for each image. -i, --ignore -Ignores the ./input directory when searching for files. Only use in combinatin with a configuration file. +Ignores the ./input directory when searching for files. Only use in combination with a configuration file. -u, --unallocated Ignores unallocated space when ingesting. Faster, but yields less accurate results. -k, --keep @@ -153,7 +153,7 @@ For additional details regarding setting up and using Jemmy, please see -The Jemmy UI framework includes elements such as buttons, frames, dialog boxes and wizards. In order to manipulate these elements programatically, the associated ContainerOperators must be used. RegressionTest.java makes use of the following major operators: +The Jemmy UI framework includes elements such as buttons, frames, dialog boxes and wizards. In order to manipulate these elements programmatically, the associated ContainerOperators must be used. RegressionTest.java makes use of the following major operators: JButtonOperator JDialogOperator @@ -174,7 +174,7 @@ For example, to find a JDialog whose display name is the string "Hash Database C JDialog hashMainDialog = JDialogOperator.waitJDialog("Hash Database Configuration", false, false); -The two booleans are for searching the exact string including subsrtings, and for searching case sensitively. +The two booleans are for searching the exact string including substrings, and for searching case sensitively. Note that the method used is called '.waitJDialog', and not '.findJDialog'. This is an important distinction regarding thoroughness of the find, but the functionality of the same. Refer to the link on Jemmy above for greater detail. @@ -194,7 +194,7 @@ For further reference regarding ContainerOperators, please see http://www.jarvana.com/jarvana/view/org/netbeans/jemmy/2.2.7.5/jemmy-2.2.7.5-javadoc.jar!/org/netbeans/jemmy/operators/ContainerOperator.html -When an element has been selected, the individual components may be manipluated with ContainerOperators. +When an element has been selected, the individual components may be manipulated with ContainerOperators. To select a button, use the code below, where cont is one of the ContainerOperators from above, text is the text displayed on the button, and index is the button's order if there are multiple with the same name (i.e. if there are three buttons labeled �preview�, the first's index is 0, then 1, then 2). JbuttonOperator jbo = new JbuttonOperator(ContainerOperator cont, String text, int index); diff --git a/docs/doxygen/workflow.dox b/docs/doxygen/workflow.dox index c348545beb..3f5e2f3777 100755 --- a/docs/doxygen/workflow.dox +++ b/docs/doxygen/workflow.dox @@ -27,7 +27,7 @@ If you want to develop a module that analyzes drive data, then this is probably The UI has three main areas. The tree on the left-hand side, the result viewers in the upper right, and the content viewers in the lower right. Data passes between these areas by encapsulating them in Netbeans Node objects (see org.openide.nodes.Node). These allow Autopsy to generically handle all types of data. The org.sleuthkit.autopsy.datamodel package wraps the generic org.sleuthkit.datamodel Sleuth Kit objects as Netbeans Nodes. -Nodes are modeled in a parent-child hierarchy with other nodes. All data within a Case is represented in a hierarchy with the disk images being one level below the case and volumes and such below the image. +Nodes are modelled in a parent-child hierarchy with other nodes. All data within a Case is represented in a hierarchy with the disk images being one level below the case and volumes and such below the image. The tree on the left hand-side shows the analysis results. Its contents are populated from the central database. diff --git a/test/script/tskdbdiff.py b/test/script/tskdbdiff.py index 5fcbb8ff2a..c70263fd39 100755 --- a/test/script/tskdbdiff.py +++ b/test/script/tskdbdiff.py @@ -355,6 +355,7 @@ def normalize_db_entry(line, table): object_index = line.find('INSERT INTO "tsk_objects"') report_index = line.find('INSERT INTO "reports"') layout_index = line.find('INSERT INTO "tsk_file_layout"') + data_source_info_index = line.find('INSERT INTO "data_source_info"') parens = line[line.find('(') + 1 : line.find(')')] fields_list = parens.replace(" ", "").split(',') @@ -395,6 +396,10 @@ def normalize_db_entry(line, table): fields_list[2] = "0" newLine = ('INSERT INTO "reports" VALUES(' + ','.join(fields_list) + ');') return newLine + elif (data_source_info_index != -1): + fields_list[1] = "{device id}" + newLine = ('INSERT INTO "data_source_info" VALUES(' + ','.join(fields_list) + ');') + return newLine else: return line diff --git a/thirdparty/jdiff/v-custom/doc/CHANGES.txt b/thirdparty/jdiff/v-custom/doc/CHANGES.txt index 9cff1bfdcd..a348f20369 100644 --- a/thirdparty/jdiff/v-custom/doc/CHANGES.txt +++ b/thirdparty/jdiff/v-custom/doc/CHANGES.txt @@ -25,7 +25,7 @@ task to specify the language version, e.g. for dealing with asserts. #875516 Some HTML elements in user comments were being processed incorrectly. Thanks to Jojo Dijamco for pointing this bug out. -#875470 @link tags were not exanded in user comments. +#875470 @link tags were not expanded in user comments. #877437 Other issues with @link in user comments. Many thanks to Brian Duff for these bugs and their fixes.