Merge branch 'develop' of https://www.github.com/sleuthkit/autopsy into develop

This commit is contained in:
alexjacks92 2014-02-19 15:48:35 -05:00
commit 00baf95ee4
37 changed files with 1159 additions and 283 deletions

1
.gitignore vendored
View File

@ -36,7 +36,6 @@
!/Ingest/nbproject/project.properties !/Ingest/nbproject/project.properties
/branding_spear /branding_spear
/installer_spear /installer_spear
Bundle_*.properties
*/genfiles.properties */genfiles.properties
genfiles.properties genfiles.properties
/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties /branding/core/core.jar/org/netbeans/core/startup/Bundle.properties

View File

@ -27,6 +27,8 @@ import javax.swing.AbstractAction;
import javax.swing.JMenu; import javax.swing.JMenu;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import org.openide.util.NbBundle;
import org.openide.util.Utilities; import org.openide.util.Utilities;
import org.openide.util.Lookup; import org.openide.util.Lookup;
import org.openide.util.actions.Presenter; import org.openide.util.actions.Presenter;
@ -41,6 +43,10 @@ import static org.sleuthkit.autopsy.hashdatabase.HashDbManager.HashDb;
*/ */
final class AddContentToHashDbAction extends AbstractAction implements Presenter.Popup { final class AddContentToHashDbAction extends AbstractAction implements Presenter.Popup {
private static AddContentToHashDbAction instance; private static AddContentToHashDbAction instance;
private final static String SINGLE_SELECTION_NAME = NbBundle.getMessage(AddContentToHashDbAction.class,
"AddContentToHashDbAction.singleSelectionName");
private final static String MULTIPLE_SELECTION_NAME = NbBundle.getMessage(AddContentToHashDbAction.class,
"AddContentToHashDbAction.multipleSelectionName");
/** /**
* AddContentToHashDbAction is a singleton to support multi-selection of nodes, since * AddContentToHashDbAction is a singleton to support multi-selection of nodes, since
@ -70,8 +76,6 @@ final class AddContentToHashDbAction extends AbstractAction implements Presenter
// Instances of this class are used to implement the a pop up menu for this // Instances of this class are used to implement the a pop up menu for this
// action. // action.
private final class AddContentToHashDbMenu extends JMenu { private final class AddContentToHashDbMenu extends JMenu {
private final static String SINGLE_SELECTION_NAME = "Add file to hash database";
private final static String MULTIPLE_SELECTION_NAME = "Add files to hash database";
AddContentToHashDbMenu() { AddContentToHashDbMenu() {
super(SINGLE_SELECTION_NAME); super(SINGLE_SELECTION_NAME);
@ -117,7 +121,9 @@ final class AddContentToHashDbAction extends AbstractAction implements Presenter
} }
} }
else { else {
JMenuItem empty = new JMenuItem("No hash databases configured"); JMenuItem empty = new JMenuItem(
NbBundle.getMessage(this.getClass(),
"AddContentToHashDbAction.ContentMenu.noHashDbsConfigd"));
empty.setEnabled(false); empty.setEnabled(false);
add(empty); add(empty);
} }
@ -126,7 +132,8 @@ final class AddContentToHashDbAction extends AbstractAction implements Presenter
// a hash database creation dialog and adds the selected files to the // a hash database creation dialog and adds the selected files to the
// the new database. // the new database.
addSeparator(); addSeparator();
JMenuItem newHashSetItem = new JMenuItem("Create database..."); JMenuItem newHashSetItem = new JMenuItem(NbBundle.getMessage(this.getClass(),
"AddContentToHashDbAction.ContentMenu.createDbItem"));
newHashSetItem.addActionListener(new ActionListener() { newHashSetItem.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
@ -148,12 +155,25 @@ final class AddContentToHashDbAction extends AbstractAction implements Presenter
hashSet.addHashes(file); hashSet.addHashes(file);
} }
catch (TskCoreException ex) { catch (TskCoreException ex) {
//noinspection HardCodedStringLiteral
Logger.getLogger(AddContentToHashDbAction.class.getName()).log(Level.SEVERE, "Error adding to hash database", ex); Logger.getLogger(AddContentToHashDbAction.class.getName()).log(Level.SEVERE, "Error adding to hash database", ex);
JOptionPane.showMessageDialog(null, "Unable to add " + file.getName() + " to the hash database.", "Add to Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(null,
NbBundle.getMessage(this.getClass(),
"AddContentToHashDbAction.addFilesToHashSet.unableToAddFileMsg",
file.getName()),
NbBundle.getMessage(this.getClass(),
"AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr"),
JOptionPane.ERROR_MESSAGE);
} }
} }
else { else {
JOptionPane.showMessageDialog(null, "Unable to add the " + (files.size() > 1 ? "files" : "file") + " to the hash database. Hashes have not been calculated. Please configure and run an appropriate ingest module.", "Add to Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(null,
NbBundle.getMessage(this.getClass(),
"AddContentToHashDbAction.addFilesToHashSet.unableToAddFileSzMsg",
files.size() > 1 ? "files" : "file"),
NbBundle.getMessage(this.getClass(),
"AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr"),
JOptionPane.ERROR_MESSAGE);
break; break;
} }
} }

View File

@ -4,14 +4,13 @@ OpenIDE-Module-Long-Description=\
The ingest module analyzes files in the disk image and marks them as "known" (based on NSRL database lookup for "known" files) and "bad / interesting" (based on one or more databases supplied by the user).\n\n\ The ingest module analyzes files in the disk image and marks them as "known" (based on NSRL database lookup for "known" files) and "bad / interesting" (based on one or more databases supplied by the user).\n\n\
The module also contains additional non-ingest tools that are integrated in the GUI, such as file lookup by hash and hash database configuration. The module also contains additional non-ingest tools that are integrated in the GUI, such as file lookup by hash and hash database configuration.
OpenIDE-Module-Name=HashDatabase OpenIDE-Module-Name=HashDatabase
OptionsCategory_Name_HashDatabase=Hash Database
OptionsCategory_Keywords_HashDatabase=Hash Database
HashDbSimplePanel.knownLabel.text=NSRL Database: HashDbSimplePanel.knownLabel.text=NSRL Database:
HashDbSimplePanel.notableLabel.text=Known Bad Database(s): HashDbSimplePanel.notableLabel.text=Known Bad Database(s):
HashDbSimplePanel.knownValLabel.text=- HashDbSimplePanel.knownValLabel.text=-
HashDbSimplePanel.notableValLabel.text=- HashDbSimplePanel.notableValLabel.text=-
HashDbSearchPanel.hashTable.columnModel.title0=MD5 Hashes HashDbSearchPanel.hashTable.columnModel.title0=MD5 Hashes
HashDbSearchPanel.hashTable.columnModel.title3=Title 4
HashDbSearchPanel.hashTable.columnModel.title2=Title 3
HashDbSearchPanel.hashTable.columnModel.title1=Title 2
HashDbSearchPanel.addButton.text=Add Hash HashDbSearchPanel.addButton.text=Add Hash
HashDbSearchPanel.hashField.text= HashDbSearchPanel.hashField.text=
HashDbSearchPanel.hashLabel.text=MD5 hash: HashDbSearchPanel.hashLabel.text=MD5 hash:
@ -25,7 +24,7 @@ OpenIDE-Module-Short-Description=Hash Database Ingest Module and hash db tools
HashDbImportDatabaseDialog.jLabel1.text=Hash Set Name: HashDbImportDatabaseDialog.jLabel1.text=Hash Set Name:
HashDbImportDatabaseDialog.databasePathTextField.text= HashDbImportDatabaseDialog.databasePathTextField.text=
HashDbImportDatabaseDialog.knownBadRadioButton.text=Known Bad HashDbImportDatabaseDialog.knownBadRadioButton.text=Known Bad
HashDbImportDatabaseDialog.jLabel2.text=Type of database: HashDbImportDatabaseDialog.jLabel2.text=Type of database\:
HashDbImportDatabaseDialog.okButton.text=OK HashDbImportDatabaseDialog.okButton.text=OK
HashDbImportDatabaseDialog.cancelButton.text=Cancel HashDbImportDatabaseDialog.cancelButton.text=Cancel
HashDbCreateDatabaseDialog.jLabel2.text=Type: HashDbCreateDatabaseDialog.jLabel2.text=Type:
@ -55,7 +54,6 @@ HashDbConfigPanel.indexPathLabel.text=No database selected
ModalNoButtons.CURRENTDB_LABEL.text=(CurrentDb) ModalNoButtons.CURRENTDB_LABEL.text=(CurrentDb)
ModalNoButtons.CURRENTLYON_LABEL.text=Currently Indexing x of y ModalNoButtons.CURRENTLYON_LABEL.text=Currently Indexing x of y
ModalNoButtons.GO_GET_COFFEE_LABEL.text=Hash databases are currently being indexed, this may take some time. ModalNoButtons.GO_GET_COFFEE_LABEL.text=Hash databases are currently being indexed, this may take some time.
ModalNoButtons.cancelButton.text=Cancel
ModalNoButtons.CANCEL_BUTTON.text=Cancel ModalNoButtons.CANCEL_BUTTON.text=Cancel
HashDbSimpleConfigPanel.knownBadHashDbsLabel.text=Select known BAD hash databases to use: HashDbSimpleConfigPanel.knownBadHashDbsLabel.text=Select known BAD hash databases to use:
HashDbSimpleConfigPanel.knownHashDbsLabel.text=Select known hash databases to use: HashDbSimpleConfigPanel.knownHashDbsLabel.text=Select known hash databases to use:
@ -79,3 +77,130 @@ HashDbCreateDatabaseDialog.okButton.text=OK
HashDbCreateDatabaseDialog.databasePathTextField.text= HashDbCreateDatabaseDialog.databasePathTextField.text=
HashDbConfigPanel.searchDuringIngestCheckbox.text=Search during ingest HashDbConfigPanel.searchDuringIngestCheckbox.text=Search during ingest
HashDbConfigPanel.sendIngestMessagesCheckBox.text=Send ingest messages HashDbConfigPanel.sendIngestMessagesCheckBox.text=Send ingest messages
AddContentToHashDbAction.ContentMenu.noHashDbsConfigd=No hash databases configured
AddContentToHashDbAction.ContentMenu.createDbItem=Create database...
AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr=Add to Hash Database Error
AddContentToHashDbAction.addFilesToHashSet.unableToAddFileMsg=Unable to add {0} to the hash database.
AddContentToHashDbAction.addFilesToHashSet.unableToAddFileSzMsg=Unable to add the {0} to the hash database. Hashes have not been calculated. Please configure and run an appropriate ingest module.
HashDatabaseOptionsPanelController.moduleErr=Module Error
HashDatabaseOptionsPanelController.moduleErrMsg=A module caused an error listening to HashDatabaseOptionsPanelController updates. See log to determine which module. Some data could be incomplete.
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
HashDbConfigPanel.indexStatusText.indexOnly=Index only
HashDbConfigPanel.indexStatusText.indexed=Indexed
HashDbConfigPanel.indexButtonText.reIndex=Re-Index
HashDbConfigPanel.indexStatusText.noIndex=No index
HashDbConfigPanel.dbsNotIndexedMsg=The following databases are not indexed, would you like to index them now? \
{0}
HashDbConfigPanel.dbNotIndexedMsg=The following database is not indexed, would you like to index it now? \
{0}
HashDbConfigPanel.unindexedDbsMsg=Unindexed databases
HashDbConfigPanel.allUnindexedDbsRmFromListMsg=All unindexed databases will be removed from the list
HashDbConfigPanel.nameColLbl=Name
HashDbConfigPanel.editingCellsNotSupportedMsg=Editing of cells is not supported
HashDbConfigPanel.deleteDbActionConfirmMsg=This will remove the hash database for all cases. Do you want to proceed?
HashDbConfigPanel.deleteDbActionMsg=Delete Hash Database from Configuration
HashDbCreateDatabaseDialog.defaultFileName=hashset
HashDbCreateDatabaseDialog.createHashDbMsg=Create Hash Database
HashDbCreateDatabaseDialog.hashDbMustHaveFileExtensionMsg=The hash database file must have a .{0} extension.
HashDbCreateDatabaseDialog.fileNameErr=File Name Error
HashDbCreateDatabaseDialog.fileNameAlreadyExistsMsg=A file with this name already exists. Please choose a new file name.
HashDbCreateDatabaseDialog.fileExistsErr=File Already Exists Error
HashDbCreateDatabaseDialog.mustEnterHashSetNameMsg=A hash set name must be entered.
HashDbCreateDatabaseDialog.createHashDbErr=Create Hash Database Error
HashDbCreateDatabaseDialog.mustEnterHashDbPathMsg=A database path must be entered.
HashDbCreateDatabaseDialog.errMsg.hashDbCreationErr=Hash database creation error
HashDbCreateDatabaseDialog.cannotCreateFileAtLocMsg=Cannot create a hash database file at the selected location.
HashDbCreateDatabaseDialog.failedToCreateHashDbMsg=Failed to create the hash database.
HashDbImportDatabaseDialog.importHashDbMsg=Import Hash Database
HashDbImportDatabaseDialog.fileNameExtFilter.text=Hash Database File
HashDbImportDatabaseDialog.failedToGetDbPathMsg=Failed to get the path of the selected database.
HashDbImportDatabaseDialog.importHashDbErr=Import Hash Database Error
HashDbImportDatabaseDialog.mustSelectHashDbFilePathMsg=A hash database file path must be selected.
HashDbImportDatabaseDialog.hashDbDoesNotExistMsg=The selected hash database does not exist.
HashDbImportDatabaseDialog.errorMessage.failedToOpenHashDbMsg=Failed to open hash database at {0}.
HashDbIngestModule.moduleName=Hash Lookup
HashDbIngestModule.moduleDescription=Identifies known and notables files using supplied hash databases, such as a standard NSRL database.
HashDbIngestModule.noKnownHashDbSetMsg=No known hash database set
HashDbIngestModule.knownFileSearchWillNotExecuteWarn=Known file search will not be executed.
HashDbIngestModule.noKnownBadHashDbSetMsg=No known bad hash database set
HashDbIngestModule.knownBadFileSearchWillNotExecuteWarn=Known bad file search will not be executed.
HashDbIngestModule.fileReadErrorMsg=Read Error\: {0}
HashDbIngestModule.calcHashValueErr=Error encountered while calculating the hash value for {0}.
HashDbIngestModule.hashLookupErrorMsg=Hash Lookup Error\: {0}
HashDbIngestModule.settingKnownBadStateErr=Error encountered while setting known bad state for {0}.
HashDbIngestModule.lookingUpKnownBadHashValueErr=Error encountered while looking up known bad hash value for {0}.
HashDbIngestModule.settingsKnownStateErr=Error encountered while setting known state for {0}.
HashDbIngestModule.lookingUpKnownHashValueErr=Error encountered while looking up known hash value for {0}.
HashDbIngestModule.postToBB.fileName=File Name
HashDbIngestModule.postToBB.md5Hash=MD5 Hash
HashDbIngestModule.postToBB.hashsetName=Hashset Name
HashDbIngestModule.postToBB.knownBadMsg=Known Bad\: {0}
HashDbIngestModule.complete.knownBadsFound=Known bads found\:
HashDbIngestModule.complete.totalCalcTime=Total Calculation Time
HashDbIngestModule.complete.totalLookupTime=Total Lookup Time
HashDbIngestModule.complete.databasesUsed=Databases Used\:
HashDbIngestModule.complete.hashLookupResults=Hash Lookup Results
HashDbManager.moduleErrorListeningToUpdatesMsg=A module caused an error listening to HashDbManager updates. See log to determine which module. Some data could be incomplete.
HashDbManager.replacingDuplicateHashsetNameMsg=Duplicate hash set name {0} found.\
Replacing with {1}.
HashDbManager.openHashDbErr=Open Hash Database Error
HashDbManager.unableToOpenHashDbMsg=Unable to open {0} hash database.
HashDbManager.savedBackupOfOldConfigMsg={0}\
A backup copy of the old configuration has been saved as\
{1}
HashDbManager.baseMessage.updatedFormatHashDbConfig=The format of the hash database configuration file has been updated.
HashDbManager.msgBoxTitle.confFileFmtChanged=Configuration File Format Changed
HashDbManager.dlgMsg.dbNotFoundAtLoc=Database {0} could not be found at location\
{1}\
Would you like to search for the file?
HashDbManager.dlgTitle.MissingDb=Missing Database
HashDbManager.progress.indexingHashSet=Indexing {0}
HashDbManager.dlgMsg.errorIndexingHashSet=Error indexing {0} hash database.
HashDbManager.hashDbIndexingErr=Hash Database Indexing Error
HashDbPanelSearchAction.actionName=File Search by MD5 Hash
HashDbSearchAction.dlgMsg.noFilesHaveMD5Calculated=No files currently have an MD5 hash calculated, run HashDB ingest first.
HashDbSearchManager.MD5HashSearch=MD5 Hash Search
HashDbSearchManager.noResultsFoundMsg=No results were found.
HashDbSearchPanel.titleText.ingestOngoing=Ingest is ongoing; this service will be unavailable until it finishes.
HashDbSearchPanel.noFilesHaveMD5HashMsg=No files currently have an MD5 hash.
HashDbSearchPanel.errorText.noHashesAddedMsg=Error\: No hashes have been added.
HashDbSearchPanel.errorText.hashAlreadyAddedMsg=Error\: Hash has already been added.
HashDbSearchPanel.errorText.invalidMD5HashMsg=Error\: That is not a valid MD5 hash.
HashDbSearchThread.progress.cancellingSearch={0} (Cancelling...)
HashDbSearchThread.name.searching=Searching
HashDbSearchThread.noMoreFilesWithMD5Msg=No other files with the same MD5 hash were found.
HashDbSimpleConfigPanel.dlgMsg.mustIndexDbBeforeUse=Hash databases must be indexed before they can be used for ingest
ModalNoButtons.indexingDbsTitle=Indexing databases
ModalNoButtons.indexingDbTitle=Indexing database
ModalNoButtons.exitHashDbIndexingMsg=You are about to exit out of indexing your hash databases. \
The generated index will be left unusable. If you choose to continue,\
please delete the corresponding -md5.idx file in the hash folder.\
Exit indexing?
ModalNoButtons.dlgTitle.unfinishedIndexing=Unfinished Indexing
ModalNoButtons.indexThis.currentlyIndexing1Db=Currently indexing 1 database
ModalNoButtons.indexThese.currentlyIndexing1OfNDbs=Currently indexing 1 of {0}
ModalNoButtons.propChg.currentlyIndexingXofN=Currently indexing {0} of {1}
HashDbManager.duplicateHashSetNameExceptionMsg=The hash set name ''{0}'' has already been used for another hash database.
HashDbManager.hashDbDoesNotExistExceptionMsg=No hash database found at\
{0}
HashDbManager.hashDbFileExistsExceptionMsg=A file already exists at\
{0}
HashDbManager.hashDbAlreadyAddedExceptionMsg=The hash database at\
{0}\
has already been created or imported.
HashDbManager.illegalHashDbFileNameExtensionMsg=The hash database file name must have a .{0} extension.
HashDbManager.moduleErr=Module Error
HashDbManager.knownBad.text=Known Bad
HashDbManager.known.text=Known
HashDbManager.fileNameExtensionFilter.title=Hash Database File
HashDbSearchAction.dlgMsg.title=File Search by MD5 Hash
HashDbSearchAction.getName.text=Hash Search
HashDbSearchPanel.dlgMsg.title=File Search by MD5 Hash
AddContentToHashDbAction.singleSelectionName=Add file to hash database
AddContentToHashDbAction.multipleSelectionName=Add files to hash database

View File

@ -0,0 +1,194 @@
HashDbSimplePanel.knownLabel.text=NSRL\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9
OpenIDE-Module-Display-Category=\u30E2\u30B8\u30E5\u30FC\u30EB\u633F\u5165
OpenIDE-Module-Long-Description=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30E2\u30B8\u30E5\u30FC\u30EB\u633F\u5165 \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\u4E0D\u826F\uFF0F\u7591\u308F\u3057\u3044\u300D\uFF08\u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F\uFF11\u3064\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\u30B3\u30F3\u30D5\u30A3\u30AE\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3\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
HashDbSimplePanel.notableLabel.text=\u65E2\u77E5\u306E\u4E0D\u826F\u306E\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=\u4E0B\u8A18\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\u633F\u5165\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\u306E\u540D\u524D\uFF1A
HashDbImportDatabaseDialog.knownBadRadioButton.text=\u65E2\u77E5\u306E\u60AA\u8CEA
HashDbImportDatabaseDialog.jLabel2.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u7A2E\u985E\uFF1A
HashDbImportDatabaseDialog.okButton.text=OK
HashDbImportDatabaseDialog.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB
HashDbCreateDatabaseDialog.jLabel2.text=\u7A2E\u985E\uFF1A
HashDbCreateDatabaseDialog.knownBadRadioButton.text=\u65E2\u77E5\u306E\u60AA\u8CEA
HashDbCreateDatabaseDialog.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB
HashDbConfigPanel.nameLabel.text=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u306E\u540D\u524D\uFF1A
HashDbConfigPanel.hashDbNameLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093
HashDbConfigPanel.hashDatabasesLabel.text=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\uFF1A
HashDbConfigPanel.hashDbLocationLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093
HashDbConfigPanel.ingestWarningLabel.text=\u51E6\u7406\u4E2D\u3067\u3059\u3002\u5B8C\u4E86\u3059\u308B\u307E\u3067\u4E00\u90E8\u306E\u8A2D\u5B9A\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\u3002
HashDbConfigPanel.jButton3.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30DD\u30FC\u30C8
HashDbConfigPanel.jLabel6.text=\u7A2E\u985E\uFF1A
HashDbConfigPanel.jLabel4.text=\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\uFF1A
HashDbConfigPanel.jLabel2.text=\u540D\u524D\uFF1A
HashDbConfigPanel.optionsLabel.text=\u30AA\u30D7\u30B7\u30E7\u30F3
HashDbConfigPanel.typeLabel.text=\u7A2E\u985E\uFF1A
HashDbConfigPanel.locationLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30D1\u30B9\uFF1A
HashDbConfigPanel.hashDbIndexStatusLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093
HashDbConfigPanel.hashDbTypeLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093
HashDbConfigPanel.indexButton.text=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9
HashDbConfigPanel.indexLabel.text=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30B9\u30C6\u30FC\u30BF\u30B9\uFF1A
HashDbConfigPanel.informationLabel.text=\u30A4\u30F3\u30D5\u30A9\u30E1\u30FC\u30B7\u30E7\u30F3
HashDbConfigPanel.importDatabaseButton.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30DD\u30FC\u30C8
HashDbConfigPanel.deleteDatabaseButton.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u524A\u9664
HashDbConfigPanel.indexPathLabelLabel.text=\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30D1\u30B9\uFF1A
HashDbConfigPanel.indexPathLabel.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093
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
HashDbSimpleConfigPanel.knownBadHashDbsLabel.text=\u65E2\u77E5\u306E\u60AA\u8CEA\u306A\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u51E6\u7406\u306B\u5229\u7528\uFF1A
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.searchDuringIngestCheckbox.text=\u51E6\u7406\u4E2D\u306B\u691C\u7D22
HashDbImportDatabaseDialog.searchDuringIngestCheckbox.text=\u51E6\u7406\u4E2D\u306B\u691C\u7D22
HashDbCreateDatabaseDialog.sendIngestMessagesCheckbox.text=\u51E6\u7406\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u308B
HashDbImportDatabaseDialog.sendIngestMessagesCheckbox.text=\u51E6\u7406\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u308B
HashDbConfigPanel.createDatabaseButton.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u4F5C\u6210
HashDbImportDatabaseDialog.openButton.text=\u958B\u304F...
HashDbSimpleConfigPanel.alwaysCalcHashesCheckbox.text=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u306A\u304F\u3066\u3082\u3001\u30CF\u30C3\u30B7\u30E5\u5024\u3092\u8A08\u7B97
HashDbCreateDatabaseDialog.jLabel3.text=\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u306E\u540D\u524D\uFF1A
HashDbCreateDatabaseDialog.okButton.text=OK
HashDbConfigPanel.searchDuringIngestCheckbox.text=\u51E6\u7406\u4E2D\u306B\u691C\u7D22
HashDbConfigPanel.sendIngestMessagesCheckBox.text=\u51E6\u7406\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u308B
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.addToHashDbErr=\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\u5024\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\u304C\u539F\u56E0\u306A\u306E\u304B\u3092\u30ED\u30B0\u3067\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\u5165\u624B\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=\u4E0B\u8A18\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\
{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\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
HashDbImportDatabaseDialog.importHashDbErr=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u30A8\u30E9\u30FC
HashDbImportDatabaseDialog.mustSelectHashDbFilePathMsg=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\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\u65E2\u77E5\u307E\u305F\u306F\u7591\u308F\u3057\u3044\u3082\u306E\u3092\u7279\u5B9A\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
HashDbSimpleConfigPanel.knownHashDbsLabel.text=\u65E2\u77E5\u306E\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u51E6\u7406\u306B\u5229\u7528\uFF1A
HashDbConfigPanel.dbNotIndexedMsg=\u4E0B\u8A18\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\
{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\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u65E2\u77E5\u306E\u60AA\u8CEA\u3068\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.settingsKnownStateErr={0}\u306E\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u65E2\u77E5\u3068\u8A2D\u5B9A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002
HashDbIngestModule.lookingUpKnownHashValueErr={0}\u306E\u65E2\u77E5\u306E\u4E0D\u826F\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\u3067\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=\u8907\u88FD\u306E\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u540D {0} \u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002\
{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}\
\u53E4\u3044\u8A2D\u5B9A\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u30B3\u30D4\u30FC\u304C\u4E0B\u8A18\u306E\u901A\u308A\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F\u3002\
{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\u4E0B\u8A18\u306E\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u306B\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\
{1}\
\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
HashDbSimpleConfigPanel.dlgMsg.mustIndexDbBeforeUse=\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306B\u5229\u7528\u3059\u308B\u306B\u306F\u3001\u4E8B\u524D\u306B\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\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\
\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\u969B\u306F\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\
\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=\u4E0B\u8A18\u3067\u306F\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\
{0}
HashDbManager.hashDbFileExistsExceptionMsg=\u4E0B\u8A18\u306B\u306F\u65E2\u306B\u30D5\u30A1\u30A4\u30EB\u304C\u5B58\u5728\u3057\u307E\u3059\u3002\
{0}
HashDbManager.hashDbAlreadyAddedExceptionMsg=\u4E0B\u8A18\u306E\u30CF\u30C3\u30B7\u30E5\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\
{0}\
\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

View File

@ -25,6 +25,7 @@ import javax.swing.JComponent;
import org.netbeans.spi.options.OptionsPanelController; import org.netbeans.spi.options.OptionsPanelController;
import org.openide.util.HelpCtx; import org.openide.util.HelpCtx;
import org.openide.util.Lookup; import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import java.util.logging.Level; import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
@ -36,7 +37,8 @@ position = 3,
keywords = "#OptionsCategory_Keywords_HashDatabase", keywords = "#OptionsCategory_Keywords_HashDatabase",
keywordsCategory = "HashDatabase", keywordsCategory = "HashDatabase",
id = "HashDatabase") id = "HashDatabase")
@org.openide.util.NbBundle.Messages({"OptionsCategory_Name_HashDatabase=Hash Database", "OptionsCategory_Keywords_HashDatabase=Hash Database"}) // moved messages to Bundle.properties
//@org.openide.util.NbBundle.Messages({"OptionsCategory_Name_HashDatabase=Hash Database", "OptionsCategory_Keywords_HashDatabase=Hash Database"})
public final class HashDatabaseOptionsPanelController extends OptionsPanelController { public final class HashDatabaseOptionsPanelController extends OptionsPanelController {
private HashDbConfigPanel panel; private HashDbConfigPanel panel;
@ -106,7 +108,10 @@ public final class HashDatabaseOptionsPanelController extends OptionsPanelContro
} }
catch (Exception e) { catch (Exception e) {
logger.log(Level.SEVERE, "HashDatabaseOptionsPanelController listener threw exception", e); logger.log(Level.SEVERE, "HashDatabaseOptionsPanelController listener threw exception", e);
MessageNotifyUtil.Notify.show("Module Error", "A module caused an error listening to HashDatabaseOptionsPanelController updates. See log to determine which module. Some data could be incomplete.", MessageNotifyUtil.MessageType.ERROR); MessageNotifyUtil.Notify.show(
NbBundle.getMessage(this.getClass(), "HashDatabaseOptionsPanelController.moduleErr"),
NbBundle.getMessage(this.getClass(), "HashDatabaseOptionsPanelController.moduleErrMsg"),
MessageNotifyUtil.MessageType.ERROR);
} }
} }
@ -115,7 +120,10 @@ public final class HashDatabaseOptionsPanelController extends OptionsPanelContro
} }
catch (Exception e) { catch (Exception e) {
logger.log(Level.SEVERE, "HashDatabaseOptionsPanelController listener threw exception", e); logger.log(Level.SEVERE, "HashDatabaseOptionsPanelController listener threw exception", e);
MessageNotifyUtil.Notify.show("Module Error", "A module caused an error listening to HashDatabaseOptionsPanelController updates. See log to determine which module. Some data could be incomplete.", MessageNotifyUtil.MessageType.ERROR); MessageNotifyUtil.Notify.show(
NbBundle.getMessage(this.getClass(), "HashDatabaseOptionsPanelController.moduleErr"),
NbBundle.getMessage(this.getClass(), "HashDatabaseOptionsPanelController.moduleErrMsg"),
MessageNotifyUtil.MessageType.ERROR);
} }
} }
} }

View File

@ -36,6 +36,8 @@ import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel; import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer; import javax.swing.table.TableCellRenderer;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.corecomponents.OptionsPanel; import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestManager;
@ -47,9 +49,12 @@ import org.sleuthkit.autopsy.hashdatabase.HashDbManager.HashDb.KnownFilesType;
* Instances of this class provide a comprehensive UI for managing the hash sets configuration. * Instances of this class provide a comprehensive UI for managing the hash sets configuration.
*/ */
public final class HashDbConfigPanel extends javax.swing.JPanel implements OptionsPanel { public final class HashDbConfigPanel extends javax.swing.JPanel implements OptionsPanel {
private static final String NO_SELECTION_TEXT = "No database selected"; private static final String NO_SELECTION_TEXT = NbBundle
private static final String ERROR_GETTING_PATH_TEXT = "Error occurred getting path"; .getMessage(HashDbConfigPanel.class, "HashDbConfigPanel.noSelectionText");
private static final String ERROR_GETTING_INDEX_STATUS_TEXT = "Error occurred getting status"; private static final String ERROR_GETTING_PATH_TEXT = NbBundle
.getMessage(HashDbConfigPanel.class, "HashDbConfigPanel.errorGettingPathText");
private static final String ERROR_GETTING_INDEX_STATUS_TEXT = NbBundle
.getMessage(HashDbConfigPanel.class, "HashDbConfigPanel.errorGettingIndexStatusText");
private HashDbManager hashSetManager = HashDbManager.getInstance(); private HashDbManager hashSetManager = HashDbManager.getInstance();
private HashSetTableModel hashSetTableModel = new HashSetTableModel(); private HashSetTableModel hashSetTableModel = new HashSetTableModel();
@ -71,7 +76,7 @@ public final class HashDbConfigPanel extends javax.swing.JPanel implements Optio
} }
private void customizeComponents() { private void customizeComponents() {
setName("Hash Set Configuration"); setName(NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.setName.hashSetConfig"));
this.ingestWarningLabel.setVisible(false); this.ingestWarningLabel.setVisible(false);
this.hashSetTable.setModel(hashSetTableModel); this.hashSetTable.setModel(hashSetTableModel);
this.hashSetTable.setTableHeader(null); this.hashSetTable.setTableHeader(null);
@ -109,7 +114,7 @@ public final class HashDbConfigPanel extends javax.swing.JPanel implements Optio
// Update indexing components. // Update indexing components.
hashDbIndexStatusLabel.setText(NO_SELECTION_TEXT); hashDbIndexStatusLabel.setText(NO_SELECTION_TEXT);
hashDbIndexStatusLabel.setForeground(Color.black); hashDbIndexStatusLabel.setForeground(Color.black);
indexButton.setText("Index"); indexButton.setText(NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexButtonText.index"));
indexButton.setEnabled(false); indexButton.setEnabled(false);
// Update ingest options. // Update ingest options.
@ -155,32 +160,38 @@ public final class HashDbConfigPanel extends javax.swing.JPanel implements Optio
// Update indexing components. // Update indexing components.
try { try {
if (db.isIndexing()) { if (db.isIndexing()) {
indexButton.setText("Indexing"); indexButton.setText(
hashDbIndexStatusLabel.setText("Index is currently being generated"); NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexButtonText.indexing"));
hashDbIndexStatusLabel.setText(
NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexStatusText.indexGen"));
hashDbIndexStatusLabel.setForeground(Color.black); hashDbIndexStatusLabel.setForeground(Color.black);
indexButton.setEnabled(false); indexButton.setEnabled(false);
} }
else if (db.hasIndex()) { else if (db.hasIndex()) {
if (db.hasIndexOnly()) { if (db.hasIndexOnly()) {
hashDbIndexStatusLabel.setText("Index only"); hashDbIndexStatusLabel.setText(
NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexStatusText.indexOnly"));
} }
else { else {
hashDbIndexStatusLabel.setText("Indexed"); hashDbIndexStatusLabel.setText(
NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexStatusText.indexed"));
} }
hashDbIndexStatusLabel.setForeground(Color.black); hashDbIndexStatusLabel.setForeground(Color.black);
if (db.canBeReIndexed()) { if (db.canBeReIndexed()) {
indexButton.setText("Re-Index"); indexButton.setText(
NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexButtonText.reIndex"));
indexButton.setEnabled(true); indexButton.setEnabled(true);
} }
else { else {
indexButton.setText("Index"); indexButton.setText(NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexButtonText.index"));
indexButton.setEnabled(false); indexButton.setEnabled(false);
} }
} }
else { else {
hashDbIndexStatusLabel.setText("No index"); hashDbIndexStatusLabel.setText(
NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexStatusText.noIndex"));
hashDbIndexStatusLabel.setForeground(Color.red); hashDbIndexStatusLabel.setForeground(Color.red);
indexButton.setText("Index"); indexButton.setText(NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexButtonText.index"));
indexButton.setEnabled(true); indexButton.setEnabled(true);
} }
} }
@ -188,7 +199,7 @@ public final class HashDbConfigPanel extends javax.swing.JPanel implements Optio
Logger.getLogger(HashDbConfigPanel.class.getName()).log(Level.SEVERE, "Error getting index state of hash database", ex); Logger.getLogger(HashDbConfigPanel.class.getName()).log(Level.SEVERE, "Error getting index state of hash database", ex);
hashDbIndexStatusLabel.setText(ERROR_GETTING_INDEX_STATUS_TEXT); hashDbIndexStatusLabel.setText(ERROR_GETTING_INDEX_STATUS_TEXT);
hashDbIndexStatusLabel.setForeground(Color.red); hashDbIndexStatusLabel.setForeground(Color.red);
indexButton.setText("Index"); indexButton.setText(NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.indexButtonText.index"));
indexButton.setEnabled(false); indexButton.setEnabled(false);
} }
@ -282,12 +293,15 @@ public final class HashDbConfigPanel extends javax.swing.JPanel implements Optio
total+= "\n" + hdb.getHashSetName(); total+= "\n" + hdb.getHashSetName();
} }
if(plural){ if(plural){
message = "The following databases are not indexed, would you like to index them now? \n " + total; message = NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.dbsNotIndexedMsg", total);
} }
else{ else{
message = "The following database is not indexed, would you like to index it now? \n" + total; message = NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.dbNotIndexedMsg", total);
} }
int res = JOptionPane.showConfirmDialog(this, message, "Unindexed databases", JOptionPane.YES_NO_OPTION); int res = JOptionPane.showConfirmDialog(this, message,
NbBundle.getMessage(this.getClass(),
"HashDbConfigPanel.unindexedDbsMsg"),
JOptionPane.YES_NO_OPTION);
if(res == JOptionPane.YES_OPTION){ if(res == JOptionPane.YES_OPTION){
ModalNoButtons indexingDialog = new ModalNoButtons(this, new Frame(),unindexed); ModalNoButtons indexingDialog = new ModalNoButtons(this, new Frame(),unindexed);
indexingDialog.setLocationRelativeTo(null); indexingDialog.setLocationRelativeTo(null);
@ -296,7 +310,8 @@ public final class HashDbConfigPanel extends javax.swing.JPanel implements Optio
hashSetTableModel.refreshModel(); hashSetTableModel.refreshModel();
} }
if(res == JOptionPane.NO_OPTION){ if(res == JOptionPane.NO_OPTION){
JOptionPane.showMessageDialog(this, "All unindexed databases will be removed the list"); JOptionPane.showMessageDialog(this, NbBundle.getMessage(this.getClass(),
"HashDbConfigPanel.allUnindexedDbsRmFromListMsg"));
removeThese(unindexed); removeThese(unindexed);
} }
} }
@ -362,7 +377,7 @@ public final class HashDbConfigPanel extends javax.swing.JPanel implements Optio
@Override @Override
public String getColumnName(int column) { public String getColumnName(int column) {
return "Name"; return NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.nameColLbl");
} }
@Override @Override
@ -387,7 +402,8 @@ public final class HashDbConfigPanel extends javax.swing.JPanel implements Optio
@Override @Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) { public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
throw new UnsupportedOperationException("Editing of cells is not supported"); throw new UnsupportedOperationException(
NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.editingCellsNotSupportedMsg"));
} }
@Override @Override
@ -720,7 +736,12 @@ public final class HashDbConfigPanel extends javax.swing.JPanel implements Optio
}//GEN-LAST:event_indexButtonActionPerformed }//GEN-LAST:event_indexButtonActionPerformed
private void deleteDatabaseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteDatabaseButtonActionPerformed private void deleteDatabaseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteDatabaseButtonActionPerformed
if (JOptionPane.showConfirmDialog(null, "This will remove the hash database for all cases. Do you want to proceed? ", "Delete Hash Database from Configuration", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { if (JOptionPane.showConfirmDialog(null,
NbBundle.getMessage(this.getClass(),
"HashDbConfigPanel.deleteDbActionConfirmMsg"),
NbBundle.getMessage(this.getClass(), "HashDbConfigPanel.deleteDbActionMsg"),
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) {
HashDb hashDb = ((HashSetTable)hashSetTable).getSelection(); HashDb hashDb = ((HashSetTable)hashSetTable).getSelection();
if (hashDb != null) { if (hashDb != null) {
hashSetManager.removeHashDatabase(hashDb); hashSetManager.removeHashDatabase(hashDb);

View File

@ -24,6 +24,8 @@ import java.awt.Toolkit;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
@ -44,7 +46,8 @@ import org.sleuthkit.autopsy.hashdatabase.HashDbManager.IllegalHashDatabaseFileN
*/ */
final class HashDbCreateDatabaseDialog extends javax.swing.JDialog { final class HashDbCreateDatabaseDialog extends javax.swing.JDialog {
private static final String DEFAULT_FILE_NAME = "hashset"; private static final String DEFAULT_FILE_NAME = NbBundle
.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.defaultFileName");
private JFileChooser fileChooser = null; private JFileChooser fileChooser = null;
private HashDb newHashDb = null; private HashDb newHashDb = null;
@ -54,7 +57,7 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog {
* or known bad. * or known bad.
*/ */
HashDbCreateDatabaseDialog() { HashDbCreateDatabaseDialog() {
super(new JFrame(), "Create Hash Database", true); super(new JFrame(), NbBundle.getMessage(HashDbCreateDatabaseDialog.class, "HashDbCreateDatabaseDialog.createHashDbMsg"), true);
initFileChooser(); initFileChooser();
initComponents(); initComponents();
display(); display();
@ -74,13 +77,24 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog {
public void approveSelection() { public void approveSelection() {
File selectedFile = getSelectedFile(); File selectedFile = getSelectedFile();
if (!FilenameUtils.getExtension(selectedFile.getName()).equalsIgnoreCase(HashDbManager.getHashDatabaseFileExtension())) { if (!FilenameUtils.getExtension(selectedFile.getName()).equalsIgnoreCase(HashDbManager.getHashDatabaseFileExtension())) {
if (JOptionPane.showConfirmDialog(this, "The hash database file must have a ." + HashDbManager.getHashDatabaseFileExtension() + " extension.", "File Name Error", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) { if (JOptionPane.showConfirmDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.hashDbMustHaveFileExtensionMsg",
HashDbManager.getHashDatabaseFileExtension()),
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.fileNameErr"),
JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
cancelSelection(); cancelSelection();
} }
return; return;
} }
if (selectedFile.exists()) { if (selectedFile.exists()) {
if (JOptionPane.showConfirmDialog(this, "A file with this name already exists. Please choose a new file name.", "File Already Exists Error", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) { if (JOptionPane.showConfirmDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.fileNameAlreadyExistsMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.fileExistsErr"),
JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
cancelSelection(); cancelSelection();
} }
return; return;
@ -310,12 +324,22 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog {
// dialog to allow the user to try again, if desired. // dialog to allow the user to try again, if desired.
if (hashSetNameTextField.getText().isEmpty()) { if (hashSetNameTextField.getText().isEmpty()) {
JOptionPane.showMessageDialog(this, "A hash set name must be entered.", "Create Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.mustEnterHashSetNameMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.createHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }
if (databasePathTextField.getText().isEmpty()) { if (databasePathTextField.getText().isEmpty()) {
JOptionPane.showMessageDialog(this, "A database path must be entered.", "Create Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.mustEnterHashDbPathMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.createHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }
@ -327,24 +351,39 @@ final class HashDbCreateDatabaseDialog extends javax.swing.JDialog {
type = KnownFilesType.KNOWN_BAD; type = KnownFilesType.KNOWN_BAD;
} }
String errorMessage = "Hash database creation error"; String errorMessage = NbBundle
.getMessage(this.getClass(), "HashDbCreateDatabaseDialog.errMsg.hashDbCreationErr");
try try
{ {
newHashDb = HashDbManager.getInstance().addNewHashDatabase(hashSetNameTextField.getText(), fileChooser.getSelectedFile().getCanonicalPath(), searchDuringIngestCheckbox.isSelected(), sendIngestMessagesCheckbox.isSelected(), type); newHashDb = HashDbManager.getInstance().addNewHashDatabase(hashSetNameTextField.getText(), fileChooser.getSelectedFile().getCanonicalPath(), searchDuringIngestCheckbox.isSelected(), sendIngestMessagesCheckbox.isSelected(), type);
} }
catch (IOException ex) { catch (IOException ex) {
Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex); Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex);
JOptionPane.showMessageDialog(this, "Cannot create a hash database file at the selected location.", "Create Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.cannotCreateFileAtLocMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.createHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }
catch (HashDatabaseFileAlreadyExistsException | DuplicateHashSetNameException | HashDatabaseAlreadyAddedException | IllegalHashDatabaseFileNameExtensionException ex) { catch (HashDatabaseFileAlreadyExistsException | DuplicateHashSetNameException | HashDatabaseAlreadyAddedException | IllegalHashDatabaseFileNameExtensionException ex) {
Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex); Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex);
JOptionPane.showMessageDialog(this, ex.getMessage(), "Create Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
ex.getMessage(),
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.createHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }
catch (TskCoreException ex) { catch (TskCoreException ex) {
Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.SEVERE, errorMessage, ex); Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.SEVERE, errorMessage, ex);
JOptionPane.showMessageDialog(this, "Failed to create the hash database.", "Create Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.failedToCreateHashDbMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.createHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }

View File

@ -23,6 +23,8 @@ import java.awt.Toolkit;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
@ -53,7 +55,9 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog {
* known, or known bad. * known, or known bad.
*/ */
HashDbImportDatabaseDialog() { HashDbImportDatabaseDialog() {
super(new JFrame(), "Import Hash Database", true); super(new JFrame(),
NbBundle.getMessage(HashDbImportDatabaseDialog.class, "HashDbImportDatabaseDialog.importHashDbMsg"),
true);
initFileChooser(); initFileChooser();
initComponents(); initComponents();
display(); display();
@ -71,7 +75,8 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog {
fileChooser.setDragEnabled(false); fileChooser.setDragEnabled(false);
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
String[] EXTENSION = new String[] { "txt", "kdb", "idx", "hash", "Hash", "hsh"}; String[] EXTENSION = new String[] { "txt", "kdb", "idx", "hash", "Hash", "hsh"};
FileNameExtensionFilter filter = new FileNameExtensionFilter("Hash Database File", EXTENSION); FileNameExtensionFilter filter = new FileNameExtensionFilter(
NbBundle.getMessage(this.getClass(), "HashDbImportDatabaseDialog.fileNameExtFilter.text"), EXTENSION);
fileChooser.setFileFilter(filter); fileChooser.setFileFilter(filter);
fileChooser.setMultiSelectionEnabled(false); fileChooser.setMultiSelectionEnabled(false);
} }
@ -268,7 +273,9 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog {
} }
catch (IOException ex) { catch (IOException ex) {
Logger.getLogger(HashDbImportDatabaseDialog.class.getName()).log(Level.SEVERE, "Failed to get path of selected database", ex); Logger.getLogger(HashDbImportDatabaseDialog.class.getName()).log(Level.SEVERE, "Failed to get path of selected database", ex);
JOptionPane.showMessageDialog(this, "Failed to get the path of the selected database."); JOptionPane.showMessageDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbImportDatabaseDialog.failedToGetDbPathMsg"));
} }
} }
}//GEN-LAST:event_openButtonActionPerformed }//GEN-LAST:event_openButtonActionPerformed
@ -294,17 +301,32 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog {
// dialog to allow the user to try again, if desired. // dialog to allow the user to try again, if desired.
if(hashSetNameTextField.getText().isEmpty()) { if(hashSetNameTextField.getText().isEmpty()) {
JOptionPane.showMessageDialog(this, "A hash set name must be entered.", "Import Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbCreateDatabaseDialog.mustEnterHashSetNameMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbImportDatabaseDialog.importHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }
if(selectedFilePath.isEmpty()) { if(selectedFilePath.isEmpty()) {
JOptionPane.showMessageDialog(this, "A hash database file path must be selected.", "Import Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbImportDatabaseDialog.mustSelectHashDbFilePathMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbImportDatabaseDialog.importHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }
File file = new File(selectedFilePath); File file = new File(selectedFilePath);
if (!file.exists()) { if (!file.exists()) {
JOptionPane.showMessageDialog(this, "The selected hash database does not exist.", "Import Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
NbBundle.getMessage(this.getClass(),
"HashDbImportDatabaseDialog.hashDbDoesNotExistMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbImportDatabaseDialog.importHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }
@ -316,18 +338,28 @@ final class HashDbImportDatabaseDialog extends javax.swing.JDialog {
type = KnownFilesType.KNOWN_BAD; type = KnownFilesType.KNOWN_BAD;
} }
String errorMessage = "Failed to open hash database at " + selectedFilePath + "."; String errorMessage = NbBundle.getMessage(this.getClass(),
"HashDbImportDatabaseDialog.errorMessage.failedToOpenHashDbMsg",
selectedFilePath);
try { try {
selectedHashDb = HashDbManager.getInstance().addExistingHashDatabase(hashSetNameTextField.getText(), selectedFilePath, searchDuringIngestCheckbox.isSelected(), sendIngestMessagesCheckbox.isSelected(), type); selectedHashDb = HashDbManager.getInstance().addExistingHashDatabase(hashSetNameTextField.getText(), selectedFilePath, searchDuringIngestCheckbox.isSelected(), sendIngestMessagesCheckbox.isSelected(), type);
} }
catch (HashDatabaseDoesNotExistException | DuplicateHashSetNameException | HashDatabaseAlreadyAddedException ex) { catch (HashDatabaseDoesNotExistException | DuplicateHashSetNameException | HashDatabaseAlreadyAddedException ex) {
Logger.getLogger(HashDbImportDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex); Logger.getLogger(HashDbImportDatabaseDialog.class.getName()).log(Level.WARNING, errorMessage, ex);
JOptionPane.showMessageDialog(this, ex.getMessage(), "Import Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
ex.getMessage(),
NbBundle.getMessage(this.getClass(),
"HashDbImportDatabaseDialog.importHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }
catch (TskCoreException ex) { catch (TskCoreException ex) {
Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.SEVERE, errorMessage, ex); Logger.getLogger(HashDbCreateDatabaseDialog.class.getName()).log(Level.SEVERE, errorMessage, ex);
JOptionPane.showMessageDialog(this, errorMessage, "Import Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this,
errorMessage,
NbBundle.getMessage(this.getClass(),
"HashDbImportDatabaseDialog.importHashDbErr"),
JOptionPane.ERROR_MESSAGE);
return; return;
} }

View File

@ -23,6 +23,8 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.Version; import org.sleuthkit.autopsy.coreutils.Version;
@ -47,8 +49,10 @@ import org.sleuthkit.datamodel.HashInfo;
public class HashDbIngestModule extends IngestModuleAbstractFile { public class HashDbIngestModule extends IngestModuleAbstractFile {
private static HashDbIngestModule instance = null; private static HashDbIngestModule instance = null;
public final static String MODULE_NAME = "Hash Lookup"; public final static String MODULE_NAME = NbBundle.getMessage(HashDbIngestModule.class,
public final static String MODULE_DESCRIPTION = "Identifies known and notables files using supplied hash databases, such as a standard NSRL database."; "HashDbIngestModule.moduleName");
public final static String MODULE_DESCRIPTION = NbBundle.getMessage(HashDbIngestModule.class,
"HashDbIngestModule.moduleDescription");
final public static String MODULE_VERSION = Version.getVersion(); final public static String MODULE_VERSION = Version.getVersion();
private static final Logger logger = Logger.getLogger(HashDbIngestModule.class.getName()); private static final Logger logger = Logger.getLogger(HashDbIngestModule.class.getName());
private static final int MAX_COMMENT_SIZE = 500; private static final int MAX_COMMENT_SIZE = 500;
@ -151,10 +155,20 @@ public class HashDbIngestModule extends IngestModuleAbstractFile {
calcHashesIsSet = hashDbManager.getAlwaysCalculateHashes(); calcHashesIsSet = hashDbManager.getAlwaysCalculateHashes();
if (knownHashSets.isEmpty()) { if (knownHashSets.isEmpty()) {
services.postMessage(IngestMessage.createWarningMessage(++messageId, this, "No known hash database set", "Known file search will not be executed.")); services.postMessage(IngestMessage.createWarningMessage(++messageId,
this,
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.noKnownHashDbSetMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.knownFileSearchWillNotExecuteWarn")));
} }
if (knownBadHashSets.isEmpty()) { if (knownBadHashSets.isEmpty()) {
services.postMessage(IngestMessage.createWarningMessage(++messageId, this, "No known bad hash database set", "Known bad file search will not be executed.")); services.postMessage(IngestMessage.createWarningMessage(++messageId,
this,
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.noKnownBadHashDbSetMsg"),
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.knownBadFileSearchWillNotExecuteWarn")));
} }
} }
@ -207,8 +221,14 @@ public class HashDbIngestModule extends IngestModuleAbstractFile {
calctime += (System.currentTimeMillis() - calcstart); calctime += (System.currentTimeMillis() - calcstart);
} catch (IOException ex) { } catch (IOException ex) {
logger.log(Level.WARNING, "Error calculating hash of file " + name, ex); logger.log(Level.WARNING, "Error calculating hash of file " + name, ex);
services.postMessage(IngestMessage.createErrorMessage(++messageId, HashDbIngestModule.this, "Read Error: " + name, services.postMessage(IngestMessage.createErrorMessage(++messageId,
"Error encountered while calculating the hash value for " + name + ".")); HashDbIngestModule.this,
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.fileReadErrorMsg",
name),
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.calcHashValueErr",
name)));
return ProcessResult.ERROR; return ProcessResult.ERROR;
} }
} }
@ -227,8 +247,14 @@ public class HashDbIngestModule extends IngestModuleAbstractFile {
skCase.setKnown(file, TskData.FileKnown.BAD); skCase.setKnown(file, TskData.FileKnown.BAD);
} catch (TskException ex) { } catch (TskException ex) {
logger.log(Level.WARNING, "Couldn't set known bad state for file " + name + " - see sleuthkit log for details", ex); logger.log(Level.WARNING, "Couldn't set known bad state for file " + name + " - see sleuthkit log for details", ex);
services.postMessage(IngestMessage.createErrorMessage(++messageId, HashDbIngestModule.this, "Hash Lookup Error: " + name, services.postMessage(IngestMessage.createErrorMessage(++messageId,
"Error encountered while setting known bad state for " + name + ".")); HashDbIngestModule.this,
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.hashLookupErrorMsg",
name),
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.settingKnownBadStateErr",
name)));
ret = ProcessResult.ERROR; ret = ProcessResult.ERROR;
} }
String hashSetName = db.getHashSetName(); String hashSetName = db.getHashSetName();
@ -252,8 +278,14 @@ public class HashDbIngestModule extends IngestModuleAbstractFile {
lookuptime += (System.currentTimeMillis() - lookupstart); lookuptime += (System.currentTimeMillis() - lookupstart);
} catch (TskException ex) { } catch (TskException ex) {
logger.log(Level.WARNING, "Couldn't lookup known bad hash for file " + name + " - see sleuthkit log for details", ex); logger.log(Level.WARNING, "Couldn't lookup known bad hash for file " + name + " - see sleuthkit log for details", ex);
services.postMessage(IngestMessage.createErrorMessage(++messageId, HashDbIngestModule.this, "Hash Lookup Error: " + name, services.postMessage(IngestMessage.createErrorMessage(++messageId,
"Error encountered while looking up known bad hash value for " + name + ".")); HashDbIngestModule.this,
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.hashLookupErrorMsg",
name),
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.lookingUpKnownBadHashValueErr",
name)));
ret = ProcessResult.ERROR; ret = ProcessResult.ERROR;
} }
} }
@ -271,16 +303,28 @@ public class HashDbIngestModule extends IngestModuleAbstractFile {
break; break;
} catch (TskException ex) { } catch (TskException ex) {
logger.log(Level.WARNING, "Couldn't set known state for file " + name + " - see sleuthkit log for details", ex); logger.log(Level.WARNING, "Couldn't set known state for file " + name + " - see sleuthkit log for details", ex);
services.postMessage(IngestMessage.createErrorMessage(++messageId, HashDbIngestModule.this, "Hash Lookup Error: " + name, services.postMessage(IngestMessage.createErrorMessage(++messageId,
"Error encountered while setting known state for " + name + ".")); HashDbIngestModule.this,
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.hashLookupErrorMsg",
name),
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.settingsKnownStateErr",
name)));
ret = ProcessResult.ERROR; ret = ProcessResult.ERROR;
} }
} }
lookuptime += (System.currentTimeMillis() - lookupstart); lookuptime += (System.currentTimeMillis() - lookupstart);
} catch (TskException ex) { } catch (TskException ex) {
logger.log(Level.WARNING, "Couldn't lookup known hash for file " + name + " - see sleuthkit log for details", ex); logger.log(Level.WARNING, "Couldn't lookup known hash for file " + name + " - see sleuthkit log for details", ex);
services.postMessage(IngestMessage.createErrorMessage(++messageId, HashDbIngestModule.this, "Hash Lookup Error: " + name, services.postMessage(IngestMessage.createErrorMessage(++messageId,
"Error encountered while looking up known hash value for " + name + ".")); HashDbIngestModule.this,
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.hashLookupErrorMsg",
name),
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.lookingUpKnownHashValueErr",
name)));
ret = ProcessResult.ERROR; ret = ProcessResult.ERROR;
} }
} }
@ -307,24 +351,34 @@ public class HashDbIngestModule extends IngestModuleAbstractFile {
detailsSb.append("<table border='0' cellpadding='4' width='280'>"); detailsSb.append("<table border='0' cellpadding='4' width='280'>");
//hit //hit
detailsSb.append("<tr>"); detailsSb.append("<tr>");
detailsSb.append("<th>File Name</th>"); detailsSb.append("<th>")
detailsSb.append("<td>").append(abstractFile.getName()).append("</td>"); .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.postToBB.fileName"))
.append("</th>");
detailsSb.append("<td>")
.append(abstractFile.getName())
.append("</td>");
detailsSb.append("</tr>"); detailsSb.append("</tr>");
detailsSb.append("<tr>"); detailsSb.append("<tr>");
detailsSb.append("<th>MD5 Hash</th>"); detailsSb.append("<th>")
.append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.postToBB.md5Hash"))
.append("</th>");
detailsSb.append("<td>").append(md5Hash).append("</td>"); detailsSb.append("<td>").append(md5Hash).append("</td>");
detailsSb.append("</tr>"); detailsSb.append("</tr>");
detailsSb.append("<tr>"); detailsSb.append("<tr>");
detailsSb.append("<th>Hashset Name</th>"); detailsSb.append("<th>")
.append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.postToBB.hashsetName"))
.append("</th>");
detailsSb.append("<td>").append(hashSetName).append("</td>"); detailsSb.append("<td>").append(hashSetName).append("</td>");
detailsSb.append("</tr>"); detailsSb.append("</tr>");
detailsSb.append("</table>"); detailsSb.append("</table>");
services.postMessage(IngestMessage.createDataMessage(++messageId, this, services.postMessage(IngestMessage.createDataMessage(++messageId, this,
"Known Bad: " + abstractFile.getName(), NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.postToBB.knownBadMsg",
abstractFile.getName()),
detailsSb.toString(), detailsSb.toString(),
abstractFile.getName() + md5Hash, abstractFile.getName() + md5Hash,
badFile)); badFile));
@ -343,20 +397,33 @@ public class HashDbIngestModule extends IngestModuleAbstractFile {
//details //details
detailsSb.append("<table border='0' cellpadding='4' width='280'>"); detailsSb.append("<table border='0' cellpadding='4' width='280'>");
detailsSb.append("<tr><td>Known bads found:</td>"); detailsSb.append("<tr><td>")
.append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.knownBadsFound"))
.append("</td>");
detailsSb.append("<td>").append(knownBadCount).append("</td></tr>"); detailsSb.append("<td>").append(knownBadCount).append("</td></tr>");
detailsSb.append("<tr><td>Total Calculation Time</td><td>").append(calctime).append("</td></tr>\n"); detailsSb.append("<tr><td>")
detailsSb.append("<tr><td>Total Lookup Time</td><td>").append(lookuptime).append("</td></tr>\n"); .append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.totalCalcTime"))
.append("</td><td>").append(calctime).append("</td></tr>\n");
detailsSb.append("<tr><td>")
.append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.totalLookupTime"))
.append("</td><td>").append(lookuptime).append("</td></tr>\n");
detailsSb.append("</table>"); detailsSb.append("</table>");
detailsSb.append("<p>Databases Used:</p>\n<ul>"); detailsSb.append("<p>")
.append(NbBundle.getMessage(this.getClass(), "HashDbIngestModule.complete.databasesUsed"))
.append("</p>\n<ul>");
for (HashDb db : knownBadHashSets) { for (HashDb db : knownBadHashSets) {
detailsSb.append("<li>").append(db.getHashSetName()).append("</li>\n"); detailsSb.append("<li>").append(db.getHashSetName()).append("</li>\n");
} }
detailsSb.append("</ul>"); detailsSb.append("</ul>");
services.postMessage(IngestMessage.createMessage(++messageId, IngestMessage.MessageType.INFO, this, "Hash Lookup Results", detailsSb.toString())); services.postMessage(IngestMessage.createMessage(++messageId,
IngestMessage.MessageType.INFO,
this,
NbBundle.getMessage(this.getClass(),
"HashDbIngestModule.complete.hashLookupResults"),
detailsSb.toString()));
} }
} }

View File

@ -31,6 +31,8 @@ import javax.swing.filechooser.FileNameExtensionFilter;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.coreutils.PlatformUtil;
import org.sleuthkit.autopsy.coreutils.XMLUtil; import org.sleuthkit.autopsy.coreutils.XMLUtil;
import org.w3c.dom.Document; import org.w3c.dom.Document;
@ -52,8 +54,7 @@ import org.sleuthkit.datamodel.HashInfo;
import org.sleuthkit.datamodel.SleuthkitJNI; import org.sleuthkit.datamodel.SleuthkitJNI;
import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import java.util.logging.Level;
import org.sleuthkit.autopsy.coreutils.Logger;
/** /**
* This class implements a singleton that manages the set of hash databases * This class implements a singleton that manages the set of hash databases
* used to classify files as unknown, known or known bad. * used to classify files as unknown, known or known bad.
@ -123,31 +124,32 @@ public class HashDbManager implements PropertyChangeListener {
class DuplicateHashSetNameException extends Exception { class DuplicateHashSetNameException extends Exception {
private DuplicateHashSetNameException(String hashSetName) { private DuplicateHashSetNameException(String hashSetName) {
super("The hash set name '"+ hashSetName +"' has already been used for another hash database."); super(NbBundle.getMessage(HashDbManager.class, "HashDbManager.duplicateHashSetNameExceptionMsg", hashSetName));
} }
} }
class HashDatabaseDoesNotExistException extends Exception { class HashDatabaseDoesNotExistException extends Exception {
private HashDatabaseDoesNotExistException(String path) { private HashDatabaseDoesNotExistException(String path) {
super("No hash database found at\n" + path); super(NbBundle.getMessage(HashDbManager.class, "HashDbManager.hashDbDoesNotExistExceptionMsg", path));
} }
} }
class HashDatabaseFileAlreadyExistsException extends Exception { class HashDatabaseFileAlreadyExistsException extends Exception {
private HashDatabaseFileAlreadyExistsException(String path) { private HashDatabaseFileAlreadyExistsException(String path) {
super("A file already exists at\n" + path); super(NbBundle.getMessage(HashDbManager.class, "HashDbManager.hashDbFileExistsExceptionMsg", path));
} }
} }
class HashDatabaseAlreadyAddedException extends Exception { class HashDatabaseAlreadyAddedException extends Exception {
private HashDatabaseAlreadyAddedException(String path) { private HashDatabaseAlreadyAddedException(String path) {
super("The hash database at\n" + path + "\nhas already been created or imported."); super(NbBundle.getMessage(HashDbManager.class, "HashDbManager.hashDbAlreadyAddedExceptionMsg", path));
} }
} }
class IllegalHashDatabaseFileNameExtensionException extends Exception { class IllegalHashDatabaseFileNameExtensionException extends Exception {
private IllegalHashDatabaseFileNameExtensionException() { private IllegalHashDatabaseFileNameExtensionException() {
super("The hash database file name must have a ." + getHashDatabaseFileExtension() + " extension."); super(NbBundle.getMessage(HashDbManager.class, "HashDbManager.illegalHashDbFileNameExtensionMsg",
getHashDatabaseFileExtension()));
} }
} }
@ -244,7 +246,10 @@ public class HashDbManager implements PropertyChangeListener {
} }
catch (Exception e) { catch (Exception e) {
logger.log(Level.SEVERE, "HashDbManager listener threw exception", e); logger.log(Level.SEVERE, "HashDbManager listener threw exception", e);
MessageNotifyUtil.Notify.show("Module Error", "A module caused an error listening to HashDbManager updates. See log to determine which module. Some data could be incomplete.", MessageNotifyUtil.MessageType.ERROR); MessageNotifyUtil.Notify.show(
"Module Error",
NbBundle.getMessage(this.getClass(), "HashDbManager.moduleErrorListeningToUpdatesMsg"),
MessageNotifyUtil.MessageType.ERROR);
} }
return hashDb; return hashDb;
} }
@ -319,7 +324,10 @@ public class HashDbManager implements PropertyChangeListener {
} }
catch (Exception e) { catch (Exception e) {
logger.log(Level.SEVERE, "HashDbManager listener threw exception", e); logger.log(Level.SEVERE, "HashDbManager listener threw exception", e);
MessageNotifyUtil.Notify.show("Module Error", "A module caused an error listening to HashDbManager updates. See log to determine which module. Some data could be incomplete.", MessageNotifyUtil.MessageType.ERROR); MessageNotifyUtil.Notify.show(
"Module Error",
NbBundle.getMessage(this.getClass(), "HashDbManager.moduleErrorListeningToUpdatesMsg"),
MessageNotifyUtil.MessageType.ERROR);
} }
} }
@ -536,7 +544,12 @@ public class HashDbManager implements PropertyChangeListener {
newHashSetName = hashSetName + suffix; newHashSetName = hashSetName + suffix;
} }
while (hashSetNames.contains(newHashSetName)); while (hashSetNames.contains(newHashSetName));
JOptionPane.showMessageDialog(null, "Duplicate hash set name " + hashSetName + " found.\nReplacing with " + newHashSetName + ".", "Open Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(null,
NbBundle.getMessage(this.getClass(),
"HashDbManager.replacingDuplicateHashsetNameMsg",
hashSetName, newHashSetName),
NbBundle.getMessage(this.getClass(), "HashDbManager.openHashDbErr"),
JOptionPane.ERROR_MESSAGE);
hashSetName = newHashSetName; hashSetName = newHashSetName;
} }
@ -595,7 +608,11 @@ public class HashDbManager implements PropertyChangeListener {
} }
catch (HashDatabaseDoesNotExistException | DuplicateHashSetNameException | HashDatabaseAlreadyAddedException | TskCoreException ex) { catch (HashDatabaseDoesNotExistException | DuplicateHashSetNameException | HashDatabaseAlreadyAddedException | TskCoreException ex) {
Logger.getLogger(HashDbManager.class.getName()).log(Level.SEVERE, "Error opening hash database", ex); Logger.getLogger(HashDbManager.class.getName()).log(Level.SEVERE, "Error opening hash database", ex);
JOptionPane.showMessageDialog(null, "Unable to open " + dbPath + " hash database.", "Open Hash Database Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(null,
NbBundle.getMessage(this.getClass(),
"HashDbManager.unableToOpenHashDbMsg", dbPath),
NbBundle.getMessage(this.getClass(), "HashDbManager.openHashDbErr"),
JOptionPane.ERROR_MESSAGE);
} }
} }
else { else {
@ -617,11 +634,18 @@ public class HashDbManager implements PropertyChangeListener {
if (updatedSchema) { if (updatedSchema) {
String backupFilePath = configFilePath + ".v1_backup"; String backupFilePath = configFilePath + ".v1_backup";
String messageBoxTitle = "Configuration File Format Changed"; String messageBoxTitle = NbBundle.getMessage(this.getClass(),
String baseMessage = "The format of the hash database configuration file has been updated."; "HashDbManager.msgBoxTitle.confFileFmtChanged");
String baseMessage = NbBundle.getMessage(this.getClass(),
"HashDbManager.baseMessage.updatedFormatHashDbConfig");
try { try {
FileUtils.copyFile(new File(configFilePath), new File (backupFilePath)); FileUtils.copyFile(new File(configFilePath), new File (backupFilePath));
JOptionPane.showMessageDialog(null, baseMessage + "\nA backup copy of the old configuration has been saved as\n" + backupFilePath, messageBoxTitle, JOptionPane.INFORMATION_MESSAGE); JOptionPane.showMessageDialog(null,
NbBundle.getMessage(this.getClass(),
"HashDbManager.savedBackupOfOldConfigMsg",
baseMessage, backupFilePath),
messageBoxTitle,
JOptionPane.INFORMATION_MESSAGE);
} }
catch (IOException ex) { catch (IOException ex) {
Logger.getLogger(HashDbManager.class.getName()).log(Level.WARNING, "Failed to save backup of old format configuration file to " + backupFilePath, ex); Logger.getLogger(HashDbManager.class.getName()).log(Level.WARNING, "Failed to save backup of old format configuration file to " + backupFilePath, ex);
@ -643,7 +667,11 @@ public class HashDbManager implements PropertyChangeListener {
// Give the user an opportunity to find the desired file. // Give the user an opportunity to find the desired file.
String newPath = null; String newPath = null;
if (JOptionPane.showConfirmDialog(null, "Database " + hashSetName + " could not be found at location\n" + configuredPath + "\nWould you like to search for the file?", "Missing Database", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { if (JOptionPane.showConfirmDialog(null,
NbBundle.getMessage(this.getClass(), "HashDbManager.dlgMsg.dbNotFoundAtLoc",
hashSetName, configuredPath),
NbBundle.getMessage(this.getClass(), "HashDbManager.dlgTitle.MissingDb"),
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
newPath = searchForFile(); newPath = searchForFile();
if (null != newPath && !newPath.isEmpty()) { if (null != newPath && !newPath.isEmpty()) {
database = new File(newPath); database = new File(newPath);
@ -661,7 +689,8 @@ public class HashDbManager implements PropertyChangeListener {
fc.setDragEnabled(false); fc.setDragEnabled(false);
fc.setFileSelectionMode(JFileChooser.FILES_ONLY); fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
String[] EXTENSION = new String[] { "txt", "idx", "hash", "Hash", "kdb" }; String[] EXTENSION = new String[] { "txt", "idx", "hash", "Hash", "kdb" };
FileNameExtensionFilter filter = new FileNameExtensionFilter("Hash Database File", EXTENSION); FileNameExtensionFilter filter = new FileNameExtensionFilter(
NbBundle.getMessage(this.getClass(), "HashDbManager.fileNameExtensionFilter.title"), EXTENSION);
fc.setFileFilter(filter); fc.setFileFilter(filter);
fc.setMultiSelectionEnabled(false); fc.setMultiSelectionEnabled(false);
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
@ -686,8 +715,8 @@ public class HashDbManager implements PropertyChangeListener {
* object should be classified. * object should be classified.
*/ */
public enum KnownFilesType{ public enum KnownFilesType{
KNOWN("Known"), KNOWN(NbBundle.getMessage(HashDbManager.class, "HashDbManager.known.text")),
KNOWN_BAD("Known Bad"); KNOWN_BAD(NbBundle.getMessage(HashDbManager.class, "HashDbManager.knownBad.text"));
private String displayName; private String displayName;
@ -861,7 +890,8 @@ public class HashDbManager implements PropertyChangeListener {
@Override @Override
protected Object doInBackground() { protected Object doInBackground() {
hashDb.indexing = true; hashDb.indexing = true;
progress = ProgressHandleFactory.createHandle("Indexing " + hashDb.hashSetName); progress = ProgressHandleFactory.createHandle(
NbBundle.getMessage(this.getClass(), "HashDbManager.progress.indexingHashSet", hashDb.hashSetName));
progress.start(); progress.start();
progress.switchToIndeterminate(); progress.switchToIndeterminate();
try { try {
@ -869,7 +899,12 @@ public class HashDbManager implements PropertyChangeListener {
} }
catch (TskCoreException ex) { catch (TskCoreException ex) {
Logger.getLogger(HashDb.class.getName()).log(Level.SEVERE, "Error indexing hash database", ex); Logger.getLogger(HashDb.class.getName()).log(Level.SEVERE, "Error indexing hash database", ex);
JOptionPane.showMessageDialog(null, "Error indexing " + hashDb.getHashSetName() + " hash database.", "Hash Database Indexing Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(null,
NbBundle.getMessage(this.getClass(),
"HashDbManager.dlgMsg.errorIndexingHashSet",
hashDb.getHashSetName()),
NbBundle.getMessage(this.getClass(), "HashDbManager.hashDbIndexingErr"),
JOptionPane.ERROR_MESSAGE);
} }
return null; return null;
} }
@ -884,7 +919,10 @@ public class HashDbManager implements PropertyChangeListener {
} }
catch (Exception e) { catch (Exception e) {
logger.log(Level.SEVERE, "HashDbManager listener threw exception", e); logger.log(Level.SEVERE, "HashDbManager listener threw exception", e);
MessageNotifyUtil.Notify.show("Module Error", "A module caused an error listening to HashDbManager updates. See log to determine which module. Some data could be incomplete.", MessageNotifyUtil.MessageType.ERROR); MessageNotifyUtil.Notify.show(
NbBundle.getMessage(this.getClass(), "HashDbManager.moduleErr"),
NbBundle.getMessage(this.getClass(), "HashDbManager.moduleErrorListeningToUpdatesMsg"),
MessageNotifyUtil.MessageType.ERROR);
} }
} }
} }

View File

@ -25,6 +25,7 @@ import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import org.openide.util.HelpCtx; import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.actions.CallableSystemAction; import org.openide.util.actions.CallableSystemAction;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.corecomponents.AdvancedConfigurationCleanDialog; import org.sleuthkit.autopsy.corecomponents.AdvancedConfigurationCleanDialog;
@ -35,7 +36,7 @@ import org.sleuthkit.autopsy.corecomponents.AdvancedConfigurationCleanDialog;
*/ */
class HashDbPanelSearchAction extends CallableSystemAction { class HashDbPanelSearchAction extends CallableSystemAction {
static final String ACTION_NAME = "File Search by MD5 Hash"; static final String ACTION_NAME = NbBundle.getMessage(HashDbPanelSearchAction.class, "HashDbPanelSearchAction.actionName");
private static HashDbPanelSearchAction instance = null; private static HashDbPanelSearchAction instance = null;
HashDbPanelSearchAction() { HashDbPanelSearchAction() {

View File

@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.hashdatabase;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.openide.util.HelpCtx; import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.actions.CallableSystemAction; import org.openide.util.actions.CallableSystemAction;
import org.sleuthkit.autopsy.datamodel.ContentUtils; import org.sleuthkit.autopsy.datamodel.ContentUtils;
import org.sleuthkit.autopsy.directorytree.HashSearchProvider; import org.sleuthkit.autopsy.directorytree.HashSearchProvider;
@ -103,8 +104,11 @@ class HashDbSearchAction extends CallableSystemAction implements HashSearchProvi
if (HashDbSearcher.countFilesMd5Hashed() > 0) { if (HashDbSearcher.countFilesMd5Hashed() > 0) {
doSearch(); doSearch();
} else { } else {
JOptionPane.showMessageDialog(null, "No files currently have an MD5 hash calculated, run HashDB ingest first.", JOptionPane.showMessageDialog(null,
"File Search by MD5 Hash", JOptionPane.ERROR_MESSAGE); NbBundle.getMessage(this.getClass(),
"HashDbSearchAction.dlgMsg.noFilesHaveMD5Calculated"),
NbBundle.getMessage(this.getClass(), "HashDbSearchAction.dlgMsg.title"),
JOptionPane.ERROR_MESSAGE);
} }
} }
@ -115,7 +119,7 @@ class HashDbSearchAction extends CallableSystemAction implements HashSearchProvi
@Override @Override
public String getName() { public String getName() {
return "Hash Search"; return NbBundle.getMessage(this.getClass(), "HashDbSearchAction.getName.text");
} }
@Override @Override

View File

@ -26,6 +26,7 @@ import javax.swing.JOptionPane;
import org.openide.nodes.AbstractNode; import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children; import org.openide.nodes.Children;
import org.openide.nodes.Node; import org.openide.nodes.Node;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent; import org.openide.windows.TopComponent;
import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent; import org.sleuthkit.autopsy.corecomponents.DataResultTopComponent;
import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.AbstractFile;
@ -78,11 +79,17 @@ import org.sleuthkit.datamodel.AbstractFile;
rootNode = Node.EMPTY; rootNode = Node.EMPTY;
} }
final String pathText = "MD5 Hash Search"; final String pathText = NbBundle.getMessage(this.getClass(), "HashDbSearchManager.MD5HashSearch");
TopComponent searchResultWin = DataResultTopComponent.createInstance("MD5 Hash Search", pathText, rootNode, kvCollection.size()); TopComponent searchResultWin = DataResultTopComponent.createInstance(
NbBundle.getMessage(this.getClass(), "HashDbSearchManager.MD5HashSearch"),
pathText,
rootNode,
kvCollection.size());
searchResultWin.requestActive(); searchResultWin.requestActive();
} else { } else {
JOptionPane.showMessageDialog(null, "No results were found."); JOptionPane.showMessageDialog(null,
NbBundle.getMessage(this.getClass(), "HashDbSearchManager.noResultsFoundMsg"));
} }
} }
} }

View File

@ -24,6 +24,8 @@ import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter; import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.ArrayList; import java.util.ArrayList;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel; import javax.swing.table.DefaultTableModel;
@ -56,10 +58,10 @@ import org.sleuthkit.autopsy.ingest.IngestManager;
boolean running = IngestManager.getDefault().isIngestRunning(); boolean running = IngestManager.getDefault().isIngestRunning();
if(running) { if(running) {
titleLabel.setForeground(Color.red); titleLabel.setForeground(Color.red);
titleLabel.setText("Ingest is ongoing; this service will be unavailable until it finishes."); titleLabel.setText(NbBundle.getMessage(this.getClass(), "HashDbSearchPanel.titleText.ingestOngoing"));
} else { } else {
titleLabel.setForeground(Color.black); titleLabel.setForeground(Color.black);
titleLabel.setText("Search for files with the following MD5 hash(es):"); titleLabel.setText(NbBundle.getMessage(this.getClass(), "HashDbSearchPanel.titleLabel.text"));
} }
hashField.setEditable(!running); hashField.setEditable(!running);
searchButton.setEnabled(!running); searchButton.setEnabled(!running);
@ -151,7 +153,7 @@ import org.sleuthkit.autopsy.ingest.IngestManager;
}, },
new String [] { new String [] {
"MD5 Hashes" NbBundle.getMessage(this.getClass(), "HashDbSearchPanel.hashTable.columnModel.title0")
} }
) { ) {
Class[] types = new Class [] { Class[] types = new Class [] {
@ -294,12 +296,15 @@ import org.sleuthkit.autopsy.ingest.IngestManager;
if(HashDbSearcher.countFilesMd5Hashed() > 0) { if(HashDbSearcher.countFilesMd5Hashed() > 0) {
return doSearch(); return doSearch();
} else { } else {
JOptionPane.showMessageDialog(null, "No files currently have an MD5 hash.", JOptionPane.showMessageDialog(null,
"File Search by MD5 Hash", JOptionPane.ERROR_MESSAGE); NbBundle.getMessage(this.getClass(),
"HashDbSearchPanel.noFilesHaveMD5HashMsg"),
NbBundle.getMessage(this.getClass(), "HashDbSearchPanel.dlgMsg.title"),
JOptionPane.ERROR_MESSAGE);
return false; return false;
} }
} else { } else {
errorField.setText("Error: No hashes have been added."); errorField.setText(NbBundle.getMessage(this.getClass(), "HashDbSearchPanel.errorText.noHashesAddedMsg"));
errorField.setVisible(true); errorField.setVisible(true);
return false; return false;
} }
@ -331,7 +336,8 @@ import org.sleuthkit.autopsy.ingest.IngestManager;
for(int i=0; i<model.getRowCount(); i++) { for(int i=0; i<model.getRowCount(); i++) {
if(model.getValueAt(i, 0).equals(hashField.getText())) { if(model.getValueAt(i, 0).equals(hashField.getText())) {
hashField.setText(""); hashField.setText("");
errorField.setText("Error: Hash has already been added."); errorField.setText(
NbBundle.getMessage(this.getClass(), "HashDbSearchPanel.errorText.hashAlreadyAddedMsg"));
errorField.setVisible(true); errorField.setVisible(true);
errorField.setVisible(true); errorField.setVisible(true);
return; return;
@ -340,7 +346,7 @@ import org.sleuthkit.autopsy.ingest.IngestManager;
model.addRow(new String[] {hash}); model.addRow(new String[] {hash});
hashField.setText(""); // wipe the field hashField.setText(""); // wipe the field
} else { } else {
errorField.setText("Error: That is not a valid MD5 hash."); errorField.setText(NbBundle.getMessage(this.getClass(), "HashDbSearchPanel.errorText.invalidMD5HashMsg"));
errorField.setVisible(true); errorField.setVisible(true);
} }
} }

View File

@ -23,6 +23,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CancellationException; import java.util.concurrent.CancellationException;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
@ -52,12 +54,14 @@ class HashDbSearchThread extends SwingWorker<Object,Void> {
logger.log(Level.INFO, "Starting background processing for file search by MD5 hash."); logger.log(Level.INFO, "Starting background processing for file search by MD5 hash.");
// Setup progress bar // Setup progress bar
final String displayName = "Searching"; final String displayName = NbBundle.getMessage(this.getClass(), "HashDbSearchThread.name.searching");
progress = ProgressHandleFactory.createHandle(displayName, new Cancellable() { progress = ProgressHandleFactory.createHandle(displayName, new Cancellable() {
@Override @Override
public boolean cancel() { public boolean cancel() {
if (progress != null) if (progress != null)
progress.setDisplayName(displayName + " (Cancelling...)"); progress.setDisplayName(
NbBundle.getMessage(this.getClass(), "HashDbSearchThread.progress.cancellingSearch",
displayName));
return HashDbSearchThread.this.cancel(true); return HashDbSearchThread.this.cancel(true);
} }
}); });
@ -97,7 +101,9 @@ class HashDbSearchThread extends SwingWorker<Object,Void> {
} }
} }
if(quit) { if(quit) {
JOptionPane.showMessageDialog(null, "No other files with the same MD5 hash were found."); JOptionPane.showMessageDialog(null,
NbBundle.getMessage(this.getClass(),
"HashDbSearchThread.noMoreFilesWithMD5Msg"));
return; return;
} }
} }

View File

@ -28,6 +28,8 @@ import javax.swing.JScrollPane;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.table.AbstractTableModel; import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestManager;
import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskCoreException;
@ -155,7 +157,9 @@ public class HashDbSimpleConfigPanel extends javax.swing.JPanel {
db.setSearchDuringIngest((Boolean) aValue); db.setSearchDuringIngest((Boolean) aValue);
} }
else { else {
JOptionPane.showMessageDialog(HashDbSimpleConfigPanel.this, "Hash databases must be indexed before they can be used for ingest"); JOptionPane.showMessageDialog(HashDbSimpleConfigPanel.this,
NbBundle.getMessage(this.getClass(),
"HashDbSimpleConfigPanel.dlgMsg.mustIndexDbBeforeUse"));
} }
} }
} }

View File

@ -24,6 +24,8 @@ import java.beans.PropertyChangeListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.hashdatabase.HashDbManager.HashDb; import org.sleuthkit.autopsy.hashdatabase.HashDbManager.HashDb;
/** /**
@ -52,7 +54,7 @@ class ModalNoButtons extends javax.swing.JDialog implements PropertyChangeListen
* @param unindexed the list of unindexed databases to index. * @param unindexed the list of unindexed databases to index.
*/ */
ModalNoButtons(HashDbConfigPanel hdbmp, java.awt.Frame parent, List<HashDb> unindexed) { ModalNoButtons(HashDbConfigPanel hdbmp, java.awt.Frame parent, List<HashDb> unindexed) {
super(parent, "Indexing databases", true); super(parent, NbBundle.getMessage(ModalNoButtons.class, "ModalNoButtons.indexingDbsTitle"), true);
this.unindexed = unindexed; this.unindexed = unindexed;
this.toIndex = null; this.toIndex = null;
this.hdbmp = hdbmp; this.hdbmp = hdbmp;
@ -67,7 +69,7 @@ class ModalNoButtons extends javax.swing.JDialog implements PropertyChangeListen
* @param unindexed The unindexed database to index. * @param unindexed The unindexed database to index.
*/ */
ModalNoButtons(HashDbConfigPanel hdbmp, java.awt.Frame parent, HashDb unindexed){ ModalNoButtons(HashDbConfigPanel hdbmp, java.awt.Frame parent, HashDb unindexed){
super(parent, "Indexing database", true); super(parent, NbBundle.getMessage(ModalNoButtons.class, "ModalNoButtons.indexingDbTitle"), true);
this.unindexed = null; this.unindexed = null;
this.toIndex = unindexed; this.toIndex = unindexed;
this.hdbmp = hdbmp; this.hdbmp = hdbmp;
@ -163,12 +165,13 @@ class ModalNoButtons extends javax.swing.JDialog implements PropertyChangeListen
* @param evt mouse click event * @param evt mouse click event
*/ */
private void CANCEL_BUTTONMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_CANCEL_BUTTONMouseClicked private void CANCEL_BUTTONMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_CANCEL_BUTTONMouseClicked
String message = "You are about to exit out of indexing your hash databases. \n" String message = NbBundle.getMessage(this.getClass(), "ModalNoButtons.exitHashDbIndexingMsg");
+ "The generated index will be left unusable. If you choose to continue,\n "
+ "please delete the corresponding -md5.idx file in the hash folder.\n"
+ " Exit indexing?";
int res = JOptionPane.showConfirmDialog(this, message, "Unfinished Indexing", JOptionPane.YES_NO_OPTION); int res = JOptionPane.showConfirmDialog(this,
message,
NbBundle.getMessage(this.getClass(),
"ModalNoButtons.dlgTitle.unfinishedIndexing"),
JOptionPane.YES_NO_OPTION);
if(res == JOptionPane.YES_OPTION){ if(res == JOptionPane.YES_OPTION){
List<HashDb> remove = new ArrayList<>(); List<HashDb> remove = new ArrayList<>();
if(this.toIndex == null){ if(this.toIndex == null){
@ -203,7 +206,8 @@ class ModalNoButtons extends javax.swing.JDialog implements PropertyChangeListen
currentDb = this.toIndex.getHashSetName(); currentDb = this.toIndex.getHashSetName();
this.CURRENTDB_LABEL.setText("(" + currentDb + ")"); this.CURRENTDB_LABEL.setText("(" + currentDb + ")");
this.length = 1; this.length = 1;
this.CURRENTLYON_LABEL.setText("Currently indexing 1 database"); this.CURRENTLYON_LABEL.setText(
NbBundle.getMessage(this.getClass(), "ModalNoButtons.indexThis.currentlyIndexing1Db"));
if (!this.toIndex.isIndexing()) { if (!this.toIndex.isIndexing()) {
this.toIndex.addPropertyChangeListener(this); this.toIndex.addPropertyChangeListener(this);
HashDbManager.getInstance().indexHashDatabase(toIndex); HashDbManager.getInstance().indexHashDatabase(toIndex);
@ -219,7 +223,8 @@ class ModalNoButtons extends javax.swing.JDialog implements PropertyChangeListen
for (HashDb db : this.unindexed) { for (HashDb db : this.unindexed) {
currentDb = db.getHashSetName(); currentDb = db.getHashSetName();
this.CURRENTDB_LABEL.setText("(" + currentDb + ")"); this.CURRENTDB_LABEL.setText("(" + currentDb + ")");
this.CURRENTLYON_LABEL.setText("Currently indexing 1 of " + length); this.CURRENTLYON_LABEL.setText(
NbBundle.getMessage(this.getClass(), "ModalNoButtons.indexThese.currentlyIndexing1OfNDbs", length));
if (!db.isIndexing()) { if (!db.isIndexing()) {
db.addPropertyChangeListener(this); db.addPropertyChangeListener(this);
HashDbManager.getInstance().indexHashDatabase(db); HashDbManager.getInstance().indexHashDatabase(db);
@ -247,7 +252,9 @@ class ModalNoButtons extends javax.swing.JDialog implements PropertyChangeListen
this.dispose(); this.dispose();
} else { } else {
currentcount++; currentcount++;
this.CURRENTLYON_LABEL.setText("Currently indexing " + currentcount + " of " + length); this.CURRENTLYON_LABEL.setText(
NbBundle.getMessage(this.getClass(), "ModalNoButtons.propChg.currentlyIndexingXofN",
currentcount, length));
} }
} }
} }

View File

@ -21,9 +21,11 @@ package org.sleuthkit.autopsy.keywordsearch;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.util.List; import java.util.List;
import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestManager;
import org.sleuthkit.autopsy.keywordsearch.KeywordSearch.QueryType; import org.sleuthkit.autopsy.keywordsearch.KeywordSearch.QueryType;
import org.sleuthkit.autopsy.keywordsearch.KeywordSearchQueryManager.Presentation; import org.sleuthkit.autopsy.keywordsearch.KeywordSearchQueryManager.Presentation;
import org.openide.util.NbBundle;
/** /**
* Common functionality among keyword search performers / widgets. * Common functionality among keyword search performers / widgets.
@ -31,6 +33,7 @@ import org.sleuthkit.autopsy.keywordsearch.KeywordSearchQueryManager.Presentatio
*/ */
abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel implements KeywordSearchPerformerInterface { abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel implements KeywordSearchPerformerInterface {
private final String keywordSearchErrorDialogHeader = org.openide.util.NbBundle.getMessage(this.getClass(), "AbstractKeywordSearchPerformer.search.dialogErrorHeader");
protected int filesIndexed; protected int filesIndexed;
AbstractKeywordSearchPerformer() { AbstractKeywordSearchPerformer() {
@ -82,22 +85,20 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
if (filesIndexed == 0) { if (filesIndexed == 0) {
if (isRunning) { if (isRunning) {
KeywordSearchUtil.displayDialog("Keyword Search Error", "<html>No files are in index yet. <br />" KeywordSearchUtil.displayDialog(keywordSearchErrorDialogHeader, NbBundle.getMessage(this.getClass(),
+ "Try again later. Index is updated every " + KeywordSearchSettings.getUpdateFrequency().getTime() + " minutes.</html>", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR); "AbstractKeywordSearchPerformer.search.noFilesInIdxMsg",
} KeywordSearchSettings.getUpdateFrequency().getTime()), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
else { } else {
KeywordSearchUtil.displayDialog("Keyword Search Error", "<html>No files were indexed.<br />" KeywordSearchUtil.displayDialog(keywordSearchErrorDialogHeader, NbBundle.getMessage(this.getClass(),
+ "Re-ingest the image with the Keyword Search Module enabled. </html>", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR); "AbstractKeywordSearchPerformer.search.noFilesIdxdMsg"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
} }
return; return;
} }
//check if keyword search module ingest is running (indexing, etc) //check if keyword search module ingest is running (indexing, etc)
if (isRunning) { if (isRunning) {
if (KeywordSearchUtil.displayConfirmDialog("Keyword Search Ingest in Progress", if (KeywordSearchUtil.displayConfirmDialog(org.openide.util.NbBundle.getMessage(this.getClass(), "AbstractKeywordSearchPerformer.search.searchIngestInProgressTitle"),
"<html>Keyword Search Ingest is currently running.<br />" NbBundle.getMessage(this.getClass(), "AbstractKeywordSearchPerformer.search.ingestInProgressBody"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) == false) {
+ "Not all files have been indexed and this search might yield incomplete results.<br />"
+ "Do you want to proceed with this search anyway?</html>", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) == false) {
return; return;
} }
} }
@ -106,12 +107,13 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
if (isMultiwordQuery()) { if (isMultiwordQuery()) {
final List<Keyword> keywords = getQueryList(); final List<Keyword> keywords = getQueryList();
if (keywords.isEmpty()) { if (keywords.isEmpty()) {
KeywordSearchUtil.displayDialog("Keyword Search Error", "Keyword list is empty, please add at least one keyword to the list", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR); KeywordSearchUtil.displayDialog(keywordSearchErrorDialogHeader, NbBundle.getMessage(this.getClass(),
"AbstractKeywordSearchPerformer.search.emptyKeywordErrorBody"),
KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
return; return;
} }
man = new KeywordSearchQueryManager(keywords, Presentation.FLAT); man = new KeywordSearchQueryManager(keywords, Presentation.FLAT);
} } else {
else {
QueryType queryType = null; QueryType queryType = null;
if (isLuceneQuerySelected()) { if (isLuceneQuerySelected()) {
queryType = QueryType.WORD; queryType = QueryType.WORD;
@ -120,7 +122,8 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
} }
final String queryText = getQueryText(); final String queryText = getQueryText();
if (queryText == null || queryText.trim().equals("")) { if (queryText == null || queryText.trim().equals("")) {
KeywordSearchUtil.displayDialog("Keyword Search Error", "Please enter a keyword to search for", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR); KeywordSearchUtil.displayDialog(keywordSearchErrorDialogHeader, NbBundle.getMessage(this.getClass(),
"AbstractKeywordSearchPerformer.search.pleaseEnterKeywordBody"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
return; return;
} }
man = new KeywordSearchQueryManager(getQueryText(), queryType, Presentation.FLAT); man = new KeywordSearchQueryManager(getQueryText(), queryType, Presentation.FLAT);
@ -129,7 +132,8 @@ abstract class AbstractKeywordSearchPerformer extends javax.swing.JPanel impleme
if (man.validate()) { if (man.validate()) {
man.execute(); man.execute();
} else { } else {
KeywordSearchUtil.displayDialog("Keyword Search Error", "Invalid query syntax.", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR); KeywordSearchUtil.displayDialog(keywordSearchErrorDialogHeader, NbBundle.getMessage(this.getClass(),
"AbstractKeywordSearchPerformer.search.invalidSyntaxHeader"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
} }
} }
} }

View File

@ -5,6 +5,8 @@ OpenIDE-Module-Long-Description=\
It then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\ It then periodically runs the search on the indexed files using one or more keyword lists (containing pure words and/or regular expressions) and posts results.\n\n\
The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword seach bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found. The module also contains additional tools integrated in the main GUI, such as keyword list configuration, keyword seach bar in the top-right corner, extracted text viewer and search results viewer showing highlighted keywords found.
OpenIDE-Module-Name=KeywordSearch OpenIDE-Module-Name=KeywordSearch
OptionsCategory_Name_KeywordSearchOptions=Keyword Search
OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search
ListBundleName=Keyword Lists ListBundleName=Keyword Lists
ListBundleConfig=Keyword List Configuration ListBundleConfig=Keyword List Configuration
IndexProgressPanel.statusText.text=Status text IndexProgressPanel.statusText.text=Status text
@ -88,3 +90,97 @@ KeywordSearchListsViewerPanel.manageListsButton.toolTipText=Manage keyword lists
KeywordSearchConfigurationPanel2.frequencyLabel.text=Results update frequency during ingest: KeywordSearchConfigurationPanel2.frequencyLabel.text=Results update frequency during ingest:
KeywordSearchConfigurationPanel2.timeRadioButton4.text_1=1 minute (faster feedback, longest ingest) KeywordSearchConfigurationPanel2.timeRadioButton4.text_1=1 minute (faster feedback, longest ingest)
KeywordSearchConfigurationPanel2.timeRadioButton4.toolTipText=1 minute (overall ingest time will be longest) KeywordSearchConfigurationPanel2.timeRadioButton4.toolTipText=1 minute (overall ingest time will be longest)
KeywordSearchConfigurationPanel2.showSnippetsCB.text=Show Keyword Preview in Keyword Search Results (will result in longer search times)
AbstractKeywordSearchPerformer.search.dialogErrorHeader=Keyword Search Error
AbstractKeywordSearchPerformer.search.invalidSyntaxHeader=Invalid query syntax.
AbstractKeywordSearchPerformer.search.searchIngestInProgressTitle=Keyword Search Ingest in Progress
AbstractKeywordSearchPerformer.search.ingestInProgressBody=<html>Keyword Search Ingest is currently running.<br />Not all files have been indexed and this search might yield incomplete results.<br />Do you want to proceed with this search anyway?</html>
AbstractKeywordSearchPerformer.search.emptyKeywordErrorBody=Keyword list is empty, please add at least one keyword to the list
AbstractKeywordSearchPerformer.search.pleaseEnterKeywordBody=Please enter a keyword to search for
AbstractKeywordSearchPerformer.search.noFilesInIdxMsg=<html>No files are in index yet. <br />Try again later. Index is updated every {0} minutes.</html>
AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=<html>No files were indexed.<br />Re-ingest the image with the Keyword Search Module enabled. </html>
ExtractedContentPanel.setMarkup.panelTxt=<span style\='font-style\:italic'>Loading text... Please wait</span>
ExtractedContentViewer.toString=Extracted Text
ExtractedContentViewer.toolTip=Displays extracted text from files and keyword-search results. Requires Keyword Search ingest to be run on a file to activate this viewer.
ExtractedContentViewer.getTitle=Text
ExtractedContentViewer.getSolrContent.knownFileMsg=<p style\=''font-style\:italic''>{0} is a known file (based on MD5 hash) and does not have text in the index.</p>
ExtractedContentViewer.getSolrContent.noTxtYetMsg=<p style\=''font-style\:italic''>{0} does not have text in the index.<br/>It may have no text, not been analyzed yet, or keyword search was not enabled during ingest.</p>
ExtractedContentViewer.getSolrContent.txtBodyItal=<span style\=''font-style\:italic''>{0}</span>
HighlightedMatchesSource.getMarkup.noMatchMsg=<html><pre><span style\\\\\='background\\\\\:yellow'>There were no keyword hits on this page. <br />Keyword could have been in file name. <br />Advance to another page for hits or choose Extracted Text to view original text..</span></pre></html>
HighlightedMatchesSource.toString=Search Results
Installer.reportPortError=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.
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
KeywordSearchConfigurationPanel.customizeComponents.listLabToolTip=List configuration
KeywordSearchConfigurationPanel.customizeComponents.stringExtToolTip=String extraction configuration for Keyword Search Ingest
KeywordSearchConfigurationPanel.customizeComponents.genTabToolTip=General configuration
KeywordSearchConfigurationPanel1.customizeComponents.title=Delete a keyword list
KeywordSearchConfigurationPanel1.customizeComponents.body=This will delete the keyword list globally (for all Cases). Do you want to proceed with the deletion?
KeywordSearchConfigurationPanel1.customizeComponents.keywordListEmptyErr=Keyword List is empty and cannot be saved
KeywordSearch.newKwListTitle=New keyword list name\:
KeywordSearchConfigurationPanel1.customizeComponents.noOwDefaultMsg=Cannot overwrite default list
KeywordSearchConfigurationPanel1.customizeComponents.kwListExistMsg=Keyword List <{0}> already exists, do you want to replace it?
KeywordSearchConfigurationPanel1.customizeComponents.kwListSavedMsg=Keyword List <{0}> saved
KeywordSearchEditListPanel.customizeComponents.kwReToolTip=Keyword is a regular expression
KeywordSearchEditListPanel.customizeComponents.addWordToolTip=Add a new word to the keyword search list
KeywordSearchEditListPanel.customizeComponents.enterNewWordToolTip=Enter a new word or regex to search
KeywordSearchEditListPanel.customizeComponents.exportToFile=Export the current keyword list to a file
KeywordSearchEditListPanel.customizeComponents.saveCurrentWIthNewNameToolTip=Save the current keyword list with a new name
KeywordSearchEditListPanel.customizeComponents.removeSelectedMsg=Remove selected keyword(s) from the list
KeywordSearchEditListPanel.newKwTitle=New Keyword Entry
KeywordSearchEditListPanel.addWordButtonAction.kwAlreadyExistsMsg=Keyword already exists in the list.
KeywordSearchEditListPanel.invalidKwMsg=Invalid keyword pattern. Use words or a correct regex pattern.
KeywordSearchEditListPanel.removeKwMsg=Removing a keyword
KeywordSearchEditListPanel.deleteWordButtonActionPerformed.delConfirmMsg=This will remove a keyword from the list globally (for all Cases). Do you want to proceed?
KeywordSearchEditListPanel.exportButtonActionPerformed.fileFilterLabel=Keyword List XML file
KeywordSearchEditListPanel.exportButtonActionPerformed.fileExistPrompt=File {0} exists, overwrite?
KeywordSearchEditListPanel.exportButtonActionPerformed.kwListExportedMsg=Keyword lists exported
KeywordSearchEditListPanel.kwColName=Keyword
KeywordSearchEditListPanel.exportButtonActionPerformed.regExColName=RegEx
KeywordSearchFilterNode.getFileActions.openExternViewActLbl=Open in External Viewer
KeywordSearchFilterNode.getFileActions.searchSameMd5=Search for files with the same MD5 hash
KeywordSearchFilterNode.getFileActions.viewInNewWinActionLbl=View in New Window
KeywordSearchIngestModule.init.badInitMsg=Keyword search server was not properly initialized, cannot run keyword search ingest.
KeywordSearchIngestModule.init.tryStopSolrMsg={0}<br />Please try stopping old java Solr process (if it exists) and restart the application.
KeywordSearchIngestModule.init.noKwInLstMsg=No keywords in keyword list.
KeywordSearchIngestModule.init.onlyIdxKwSkipMsg=Only indexing will be done and and keyword search will be skipped (you can still add keyword lists using the Keyword Lists - Add to Ingest).
KeywordSearchIngestModule.postIndexSummary.knowFileHeaderLbl=Files with known types
KeywordSearchIngestModule.postIndexSummary.fileGenStringsHead=Files with general strings extracted
KeywordSearchIngestModule.postIndexSummary.mdOnlyLbl=Metadata only was indexed
KeywordSearchIngestModule.postIndexSummary.idxErrLbl=Error (indexer)
KeywordSearchIngestModule.postIndexSummary.errTxtLbl=Error (text extraction)
KeywordSearchIngestModule.postIndexSummary.errIoLbl=Error (I/O)
KeywordSearchIngestModule.postIndexSummary.kwIdxResultsLbl=Keyword Indexing Results
KeywordSearchIngestModule.postIndexSummary.kwIdxErrsTitle=Keyword Indexing Errors
KeywordSearchIngestModule.postIndexSummary.kwIdxErrMsgFiles=Keyword index service had errors ingesting {0} files.
KeywordSearchIngestModule.postIndexSummary.kwIdxWarnMsgTitle=Keyword Indexing Warning
KeywordSearchIngestModule.postIndexSummary.idxErrReadFilesMsg=Keyword index service had errors reading files and extracting text. Could have been from corrupt media or files.
KeywordSearchListsViewerPanel.initIngest.addIngestTitle=Add to Ingest
KeywordSearchListsViewerPanel.initIngest.addIngestMsg=<html>You can select additional keyword lists<br />and enqueue them to the ongoing ingest.<br />The selected lists will be searched next time the file index is rebuilt.</html>
KeywordSearchListsViewerPanel.initIngest.searchIngestTitle=Search
KeywordSearchListsViewerPanel.initIngest.addIdxSearchMsg=Search indexed files for keywords in selected lists
KeywordSearchListsViewerPanel.initIngest.ongoingIngestMsg=Files Indexed\: {0} (ingest is ongoing)
KeywordSearchListsViewerPanel.initIngest.fileIndexCtMsg=Files Indexed\: {0}
KeywordSearch.selectedColLbl=Selected
KeywordSearch.nameColLbl=Name
KeywordSearch.regExColLbl=RegEx
KeywordSearchQueryManager.execute.exeWinTitle=Keyword search {0} - {1}
KeywordSearch.newKeywordListMsg=New Keyword List
KeywordSearch.importListFileDialogMsg=Error importing keyword list from file {0}
KeywordSearch.yesOwMsg=Yes, overwrite
KeywordSearch.noSkipMsg=No, skip
KeywordSearch.cancelImportMsg=Cancel import
KeywordSearch.overwriteListPrompt=Keyword list <{0}> already exists locally, overwrite?
KeywordSearch.importOwConflict=Import list conflict
KeywordSearch.kwListFailImportMsg=Keyword list not imported
KeywordSearchListsManagementPanel.fileExtensionFilterLbl=Keyword List File
KeywordSearch.listImportFeatureTitle=Keyword List Import
KeywordSearchIngestModule.hashDbModuleName=Hash Lookup
KeywordSearchIngestModule.moduleName=Keyword Search
KeywordSearchIngestModule.moduleDescription=Performs file indexing and periodic search using keywords and regular expressions in lists.

View File

@ -0,0 +1,166 @@
OpenIDE-Module-Display-Category=\u30E2\u30B8\u30E5\u30FC\u30EB\u633F\u5165
OpenIDE-Module-Long-Description=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30E2\u30B8\u30E5\u30FC\u30EB\u633F\u5165\n\n\
\u633F\u5165\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\
\u305D\u3057\u3066\u3001\u4E00\u3064\u4EE5\u4E0A\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\uFF08\u5358\u8A9E\u3084\u4E00\u822C\u7684\u306A\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
IndexProgressPanel.statusText.text=\u30B9\u30C6\u30FC\u30BF\u30B9\u30C6\u30AD\u30B9\u30C8
IndexProgressPanel.cancelButton.text=\u30AD\u30E3\u30F3\u30BB\u30EB
ExtractedContentPanel.hitLabel.text=\u30DA\u30FC\u30B8\u4E0A\u306E\u4E00\u81F4
ExtractedContentPanel.hitCountLabel.text=
ExtractedContentPanel.hitOfLabel.text=
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=\u4E00\u822C\u7684\u306A\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
KeywordSearchEditListPanel.useForIngestCheckbox.text=\u51E6\u7406\u4E2D\u306B\u4F7F\u7528
KeywordSearchListsManagementPanel.importButton.text=\u30EA\u30B9\u30C8\u3092\u30A4\u30F3\u30DD\u30FC\u30C8
KeywordSearchPanel.searchBox.text=\u691C\u7D22...
KeywordSearchPanel.regExCheckboxMenuItem.text=\u4E00\u822C\u7684\u306A\u8868\u73FE\u3092\u4F7F\u7528
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
KeywordSearchPanel.cutMenuItem.text=\u30AB\u30C3\u30C8
KeywordSearchPanel.copyMenuItem.text=\u30B3\u30D4\u30FC
KeywordSearchPanel.pasteMenuItem.text=\u8CBC\u308A\u4ED8\u3051
KeywordSearchPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E
ExtractedContentPanel.pageButtonsLabel.text=\u30DA\u30FC\u30B8
ExtractedContentPanel.pagesLabel.text=\u30DA\u30FC\u30B8\uFF1A
KeywordSearchEditListPanel.ingestMessagesCheckbox.text=\u51E6\u7406\u4E2D\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u306B\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\u51E6\u7406\u4E2D\u306B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9\u306B\u9001\u4FE1
KeywordSearchConfigurationPanel2.skipNSRLCheckBox.text=\u51E6\u7406\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
KeywordSearchConfigurationPanel2.skipNSRLCheckBox.toolTipText=Hash DB\u30B5\u30FC\u30D3\u30B9\u3092\u4E8B\u524D\u306B\u5B9F\u884C\u3059\u308B\u304B\u3001\u6B21\u56DE\u306E\u51E6\u7406\u6642\u306B\u9078\u629E\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002
KeywordSearchConfigurationPanel2.filesIndexedLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5185\u306E\u30D5\u30A1\u30A4\u30EB\uFF1A
KeywordSearchIngestSimplePanel.languagesLabel.text=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u5F62\u5F0F\u304B\u3089\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u3092\u6709\u52B9\u306B\u3057\u305F\u30B9\u30AF\u30EA\u30D7\u30C8\uFF1A
KeywordSearchIngestSimplePanel.languagesLabel.toolTipText=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u5F62\u5F0F\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\u3067\u5909\u66F4\u304C\u53EF\u80FD\u3067\u3059\u3002
KeywordSearchConfigurationPanel3.languagesLabel.text=\u6709\u52B9\u306A\u30B9\u30AF\u30EA\u30D7\u30C8\uFF08\u8A00\u8A9E\uFF09\uFF1A
KeywordSearchConfigurationPanel2.chunksLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5185\u306E\u30C1\u30E3\u30F3\u30AF\uFF1A
KeywordSearchConfigurationPanel3.enableUTF8Checkbox.text=UTF8\u30C6\u30AD\u30B9\u30C8\u62BD\u51FA\u306E\u6709\u52B9\u5316
KeywordSearchConfigurationPanel3.enableUTF16Checkbox.text=UTF16LE\u3068UTF16BE\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u306E\u6709\u52B9\u5316
KeywordSearchEditListPanel.keywordOptionsLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30AA\u30D7\u30B7\u30E7\u30F3
KeywordSearchEditListPanel.listOptionsLabel.text=\u30EA\u30B9\u30C8\u30AA\u30D7\u30B7\u30E7\u30F3
KeywordSearchConfigurationPanel3.ingestSettingsLabel.text=\u4E0D\u660E\u306A\u30D5\u30A1\u30A4\u30EB\u5F62\u5F0F\u304B\u3089\u306E\u30B9\u30C8\u30EA\u30F3\u30B0\u62BD\u51FA\u306E\u51E6\u7406\u65B9\u6CD5\u306E\u8A2D\u5B9A\uFF08\u5909\u66F4\u306F\u6B21\u56DE\u306E\u51E6\u7406\u304B\u3089\u6709\u52B9\uFF09\uFF1A
KeywordSearchConfigurationPanel2.settingsLabel.text=\u8A2D\u5B9A
KeywordSearchConfigurationPanel2.informationLabel.text=\u30A4\u30F3\u30D5\u30A9\u30E1\u30FC\u30B7\u30E7\u30F3
KeywordSearchListsManagementPanel.keywordListsLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\uFF1A
KeywordSearchEditListPanel.keywordsLabel.text=\u30AD\u30FC\u30EF\u30FC\u30C9\uFF1A
KeywordSearchConfigurationPanel2.timeRadioButton1.toolTipText=\uFF12\uFF10\u5206\uFF08\u6700\u77ED\u306E\u51E6\u7406\u6642\u9593\uFF09
KeywordSearchConfigurationPanel2.timeRadioButton1.text=\uFF12\uFF10\u5206\uFF08\u6700\u3082\u9045\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u6700\u77ED\u306E\u51E6\u7406\u6642\u9593\uFF09
KeywordSearchConfigurationPanel2.timeRadioButton2.toolTipText=\uFF11\uFF10\u5206\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\u3088\u308A\u5168\u4F53\u7684\u306B\u901F\u3044\u51E6\u7406\u6642\u9593\uFF09
KeywordSearchConfigurationPanel2.timeRadioButton2.text=\uFF11\uFF10\u5206\uFF08\u3088\u308A\u9045\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u3088\u308A\u901F\u3044\u51E6\u7406\u6642\u9593\uFF09
KeywordSearchConfigurationPanel2.timeRadioButton3.toolTipText=\uFF15\u5206\uFF08\u5168\u4F53\u7684\u306A\u51E6\u7406\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09
KeywordSearchConfigurationPanel2.timeRadioButton3.text=\uFF15\u5206\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\uFF09
KeywordSearchIngestSimplePanel.encodingsLabel.text=\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\uFF1A
KeywordSearchIngestSimplePanel.titleLabel.text=\u51E6\u7406\u4E2D\u306B\u6709\u52B9\u306A\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u9078\u629E\uFF1A
OpenIDE-Module-Short-Description=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u51E6\u7406\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
KeywordSearchConfigurationPanel2.frequencyLabel.text=\u51E6\u7406\u4E2D\u306E\u7D50\u679C\u66F4\u65B0\u306E\u983B\u5EA6\uFF1A
KeywordSearchConfigurationPanel2.timeRadioButton4.text_1=\uFF11\u5206\uFF08\u3088\u308A\u901F\u3044\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3001\u6700\u3082\u9577\u3044\u51E6\u7406\u6642\u9593\uFF09
KeywordSearchConfigurationPanel2.timeRadioButton4.toolTipText=\uFF11\u5206\uFF08\u5168\u4F53\u7684\u306A\u51E6\u7406\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09
KeywordSearchConfigurationPanel2.showSnippetsCB.text=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u7D50\u679C\u306B\u30AD\u30FC\u30EF\u30FC\u30C9\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u8868\u793A\uFF08\u691C\u7D22\u6642\u9593\u304C\u9577\u304F\u306A\u308A\u307E\u3059\uFF09
AbstractKeywordSearchPerformer.search.dialogErrorHeader=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30A8\u30E9\u30FC
AbstractKeywordSearchPerformer.search.invalidSyntaxHeader=\u30B7\u30F3\u30BF\u30C3\u30AF\u30B9\u30A8\u30E9\u30FC
AbstractKeywordSearchPerformer.search.searchIngestInProgressTitle=\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3092\u5B9F\u884C\u4E2D
AbstractKeywordSearchPerformer.search.ingestInProgressBody=<html>\u30AD\u30FC\u30EF\u30FC\u30C9\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3092\u5B9F\u884C\u4E2D<br />\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<br />\u3053\u306E\u691C\u7D22\u3092\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F</html>
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\u8FFD\u52A0\u3057\u3066\u4E0B\u3055\u3044\u3002
AbstractKeywordSearchPerformer.search.pleaseEnterKeywordBody=\u691C\u7D22\u3059\u308B\u30AD\u30FC\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044
AbstractKeywordSearchPerformer.search.noFilesInIdxMsg=<html>\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u307E\u3060\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002<br />\u3057\u3070\u3089\u304F\u3057\u3066\u304B\u3089\u3001\u518D\u5EA6\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306F\u3000{0}\u3000\u5206\u6BCE\u66F4\u65B0\u3055\u308C\u307E\u3059\u3002</html>
AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=<html>\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u5316\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\u3002<br />\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30E2\u30B8\u30E5\u30FC\u30EB\u3092\u6709\u52B9\u5316\u3057\u3066\u30A4\u30E1\u30FC\u30B8\u3092\u518D\u51E6\u7406\u3002</html>
ExtractedContentPanel.setMarkup.panelTxt=<span style\='font-style\:italic'>\u30C6\u30AD\u30B9\u30C8\u30ED\u30FC\u30C9\u4E2D\u3002\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044...</span>
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\u30A2\u30AF\u30C6\u30A3\u30D9\u30A4\u30C8\u3059\u308B\u306B\u306F\u3001\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u51E6\u7406\u3092\u30D5\u30A1\u30A4\u30EB\u4E0A\u3067\u5B9F\u884C\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002
ExtractedContentViewer.getTitle=\u30C6\u30AD\u30B9\u30C8
ExtractedContentViewer.getSolrContent.knownFileMsg=<p style\=''font-style\:italic''>{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</p>
ExtractedContentViewer.getSolrContent.noTxtYetMsg=<p style\=''font-style\:italic''>{0}\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306B\u30C6\u30AD\u30B9\u30C8\u304C\u3042\u308A\u307E\u305B\u3093\u3002<br/>\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\u51E6\u7406\u4E2D\u306B\u6709\u52B9\u5316\u3055\u308C\u3066\u3044\u306A\u304B\u3063\u305F\u306E\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002</p>
HighlightedMatchesSource.getMarkup.noMatchMsg=<html><pre><span style\\\\\='background\\\\\:yellow'>\u3053\u306E\u30DA\u30FC\u30B8\u4E0A\u3067\u30AD\u30FC\u30EF\u30FC\u30C9\u304C\u30D2\u30C3\u30C8\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002<br />\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 <br />\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</span></pre></html>
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} \u306E {2} \u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u30D5\u30A1\u30A4\u30EB\u306E\u5909\u66F4\u3092\u691C\u8A0E\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 {1} \u306E {2} \u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u30D5\u30A1\u30A4\u30EB\u306E\u5909\u66F4\u3092\u691C\u8A0E\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 {2} \u306E {3} \u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u30D5\u30A1\u30A4\u30EB\u306E\u5909\u66F4\u3092\u691C\u8A0E\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\u51E6\u7406\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\u3067\u3059\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\u4E00\u822C\u7684\u306A\u8868\u73FE\u3067\u3059
KeywordSearchEditListPanel.customizeComponents.addWordToolTip=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u30EA\u30B9\u30C8\u306B\u5358\u8A9E\u3092\u8FFD\u52A0
KeywordSearchEditListPanel.customizeComponents.enterNewWordToolTip=\u65B0\u898F\u5358\u8A9E\u3084\u4E00\u822C\u7684\u306A\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\u4E00\u822C\u7684\u306A\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=\u4E00\u822C\u7684\u306A\u8868\u73FE
KeywordSearchFilterNode.getFileActions.openExternViewActLbl=\u5916\u90E8\u30D3\u30E5\u30FC\u30A2\u3067\u958B\u304F
KeywordSearchFilterNode.getFileActions.searchSameMd5=\u540C\u4E00\u306EMD5\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\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22\u51E6\u7406\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3002
KeywordSearchIngestModule.init.tryStopSolrMsg={0}<br />\u53E4\u3044java Solr\u51E6\u7406\u3092\u505C\u6B62\u3057\uFF08\u3082\u3057\u5B58\u5728\u3059\u308C\u3070\uFF09\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\uFF08\u300C\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8 - \u51E6\u7406\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
KeywordSearchIngestModule.postIndexSummary.knowFileHeaderLbl=\u65E2\u77E5\u306E\u7A2E\u985E\u306E\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\u4E2D\u306B {0} \u30D5\u30A1\u30A4\u30EB\u306E\u51E6\u7406\u30A8\u30E9\u30FC\u304C\u3042\u308A\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\u4E2D\u306B\u30D5\u30A1\u30A4\u30EB\u306E\u8AAD\u307F\u8FBC\u307F\u3084\u30C6\u30AD\u30B9\u30C8\u62BD\u51FA\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u3042\u308A\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=\u51E6\u7406\u306B\u8FFD\u52A0
KeywordSearchListsViewerPanel.initIngest.addIngestMsg=<html>\u8FFD\u52A0\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u9078\u629E\u3067\u304D\u307E\u3059<br />\u305D\u3057\u3066\u5B9F\u884C\u4E2D\u306E\u51E6\u7406\u306B\u8FFD\u52A0\u3067\u304D\u307E\u3059<br />\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</html>
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\u51E6\u7406\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=\u4E00\u822C\u7684\u306A\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}\u3000\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3059\u308B\u306E\u306B\u30A8\u30E9\u30FC\u304C\u3042\u308A\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\u304C\u3001\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=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u30D5\u30A1\u30A4\u30EB
KeywordSearch.listImportFeatureTitle=\u30AD\u30FC\u30EF\u30FC\u30C9\u30EA\u30B9\u30C8\u30A4\u30F3\u30DD\u30FC\u30C8
KeywordSearchIngestModule.hashDbModuleName=\u30CF\u30C3\u30B7\u30E5\u30EB\u30C3\u30AF\u30A2\u30C3\u30D7
KeywordSearchIngestModule.moduleName=\u30AD\u30FC\u30EF\u30FC\u30C9\u691C\u7D22
KeywordSearchIngestModule.moduleDescription=\u30EA\u30B9\u30C8\u5185\u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u304A\u3088\u3073\u4E00\u822C\u7684\u306A\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

View File

@ -26,6 +26,8 @@ import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import java.awt.event.ItemListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
import javax.swing.JTextPane; import javax.swing.JTextPane;
@ -659,7 +661,7 @@ class ExtractedContentPanel extends javax.swing.JPanel {
* background thread. To be invoked from GUI thread only. * background thread. To be invoked from GUI thread only.
*/ */
private void setMarkup(MarkupSource source) { private void setMarkup(MarkupSource source) {
setPanelText("<span style='font-style:italic'>Loading text... Please wait</span>", false); setPanelText(NbBundle.getMessage(this.getClass(), "ExtractedContentPanel.setMarkup.panelTxt"), false);
new SetMarkup(source).execute(); new SetMarkup(source).execute();
} }

View File

@ -27,6 +27,8 @@ import java.util.Collection;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.SolrServerException;
import org.openide.nodes.Node; import org.openide.nodes.Node;
@ -184,7 +186,7 @@ public class ExtractedContentViewer implements DataContentViewer {
@Override @Override
public String toString() { public String toString() {
return "Extracted Text"; return NbBundle.getMessage(this.getClass(), "ExtractedContentViewer.toString");
} }
@Override @Override
@ -264,12 +266,12 @@ public class ExtractedContentViewer implements DataContentViewer {
@Override @Override
public String getTitle() { public String getTitle() {
return "Text"; return NbBundle.getMessage(this.getClass(), "ExtractedContentViewer.getTitle");
} }
@Override @Override
public String getToolTip() { public String getToolTip() {
return "Displays extracted text from files and keyword-search results. Requires Keyword Search ingest to be run on a file to activate this viewer. "; return NbBundle.getMessage(this.getClass(), "ExtractedContentViewer.toolTip");
} }
@Override @Override
@ -424,13 +426,13 @@ public class ExtractedContentViewer implements DataContentViewer {
//we know it's AbstractFile, but do quick check to make sure if we index other objects in future //we know it's AbstractFile, but do quick check to make sure if we index other objects in future
boolean isKnown = FileKnown.KNOWN.equals(((AbstractFile)contentObj).getKnown()); boolean isKnown = FileKnown.KNOWN.equals(((AbstractFile)contentObj).getKnown());
if (isKnown && KeywordSearchSettings.getSkipKnown()) { if (isKnown && KeywordSearchSettings.getSkipKnown()) {
msg = "<p style='font-style:italic'>" + name + " is a known file (based on MD5 hash) and does not have text in the index.</p>"; msg = NbBundle.getMessage(this.getClass(), "ExtractedContentViewer.getSolrContent.knownFileMsg", name);
} }
} }
if (msg == null) { if (msg == null) {
msg = "<p style='font-style:italic'>" + name + " does not have text in the index.<br/>It may have no text, not been analyzed yet, or keyword search was not enabled during ingest.</p>"; msg = NbBundle.getMessage(this.getClass(), "ExtractedContentViewer.getSolrContent.noTxtYetMsg", name);
} }
String htmlMsg = "<span style='font-style:italic'>" + msg + "</span>"; String htmlMsg = NbBundle.getMessage(this.getClass(), "ExtractedContentViewer.getSolrContent.txtBodyItal", msg);
return htmlMsg; return htmlMsg;
} }

View File

@ -26,6 +26,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest.METHOD; import org.apache.solr.client.solrj.SolrRequest.METHOD;
@ -46,7 +48,7 @@ class HighlightedMatchesSource implements MarkupSource, HighlightLookup {
private static final String HIGHLIGHT_PRE = "<span style='background:yellow'>"; private static final String HIGHLIGHT_PRE = "<span style='background:yellow'>";
private static final String HIGHLIGHT_POST = "</span>"; private static final String HIGHLIGHT_POST = "</span>";
private static final String ANCHOR_PREFIX = HighlightedMatchesSource.class.getName() + "_"; private static final String ANCHOR_PREFIX = HighlightedMatchesSource.class.getName() + "_";
private static final String NO_MATCHES = "<html><pre><span style='background:yellow'>There were no keyword hits on this page. <br />Keyword could have been in file name. <br />Advance to another page for hits or choose Extracted Text to view original text..</span></pre></html>";
private Content content; private Content content;
private String keywordHitQuery; private String keywordHitQuery;
private Server solrServer; private Server solrServer;
@ -364,11 +366,12 @@ class HighlightedMatchesSource implements MarkupSource, HighlightLookup {
Map<String, List<String>> responseHighlightID = responseHighlight.get(contentIdStr); Map<String, List<String>> responseHighlightID = responseHighlight.get(contentIdStr);
if (responseHighlightID == null) { if (responseHighlightID == null) {
return NO_MATCHES; return NbBundle.getMessage(this.getClass(), "HighlightedMatchesSource.getMarkup.noMatchMsg");
} }
List<String> contentHighlights = responseHighlightID.get(highLightField); List<String> contentHighlights = responseHighlightID.get(highLightField);
if (contentHighlights == null) { if (contentHighlights == null) {
return NO_MATCHES; return NbBundle.getMessage(this.getClass(), "HighlightedMatchesSource.getMarkup.noMatchMsg");
} else { } else {
// extracted content (minus highlight tags) is HTML-escaped // extracted content (minus highlight tags) is HTML-escaped
String highlightedContent = contentHighlights.get(0).trim(); String highlightedContent = contentHighlights.get(0).trim();
@ -388,7 +391,7 @@ class HighlightedMatchesSource implements MarkupSource, HighlightLookup {
@Override @Override
public String toString() { public String toString() {
return "Search Results"; return NbBundle.getMessage(this.getClass(), "HighlightedMatchesSource.toString");
} }
@Override @Override

View File

@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.keywordsearch;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.modules.ModuleInstall; import org.openide.modules.ModuleInstall;
import org.openide.util.NbBundle;
import org.openide.windows.WindowManager; import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.keywordsearch.Server.SolrServerNoPortException; import org.sleuthkit.autopsy.keywordsearch.Server.SolrServerNoPortException;
@ -201,12 +202,8 @@ class Installer extends ModuleInstall {
WindowManager.getDefault().invokeWhenUIReady(new Runnable() { WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
@Override @Override
public void run() { public void run() {
final String msg = "Indexing server port " + curFailPort + " is not available. " final String msg = NbBundle.getMessage(this.getClass(), "Installer.reportPortError", curFailPort, Version.getName(), Server.PROPERTIES_CURRENT_SERVER_PORT, Server.PROPERTIES_FILE);
+ " Check if your security software does not block " + Version.getName() MessageNotifyUtil.Notify.error(NbBundle.getMessage(this.getClass(), "Installer.errorInitKsmMsg"), msg);
+ " and consider changing " + Server.PROPERTIES_CURRENT_SERVER_PORT + " in "
+ Server.PROPERTIES_FILE + " property file in the application user folder."
+ " Then try rebooting your system if another process was causing the conflict. ";
MessageNotifyUtil.Notify.error("Error initializing Keyword Search module", msg);
} }
}); });
} }
@ -215,10 +212,8 @@ class Installer extends ModuleInstall {
WindowManager.getDefault().invokeWhenUIReady(new Runnable() { WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
@Override @Override
public void run() { public void run() {
final String msg = "Indexing server stop port " + curFailPort + " is not available. " final String msg = NbBundle.getMessage(this.getClass(), "Installer.reportStopPortError", curFailPort, Server.PROPERTIES_CURRENT_STOP_PORT, Server.PROPERTIES_FILE);
+ " Consider changing " + Server.PROPERTIES_CURRENT_STOP_PORT + " in " MessageNotifyUtil.Notify.error(NbBundle.getMessage(this.getClass(), "Installer.errorInitKsmMsg"), msg);
+ Server.PROPERTIES_FILE + " property file in the application user folder.";
MessageNotifyUtil.Notify.error("Error initializing Keyword Search module", msg);
} }
}); });
} }
@ -227,14 +222,10 @@ class Installer extends ModuleInstall {
WindowManager.getDefault().invokeWhenUIReady(new Runnable() { WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
@Override @Override
public void run() { public void run() {
final String msg = "Indexing server port " + KeywordSearch.getServer().getCurrentSolrServerPort() + " is not available. " final String msg = NbBundle.getMessage(this.getClass(), "Installer.reportInitError", KeywordSearch.getServer().getCurrentSolrServerPort(), Version.getName(), Server.PROPERTIES_CURRENT_SERVER_PORT, Server.PROPERTIES_FILE);
+ " Check if your security software does not block " + Version.getName() MessageNotifyUtil.Notify.error(NbBundle.getMessage(this.getClass(), "Installer.errorInitKsmMsg"), msg);
+ " and consider changing " + Server.PROPERTIES_CURRENT_SERVER_PORT + " in "
+ Server.PROPERTIES_FILE + " property file in the application user folder."
+ " Then try rebooting your system if another process was causing the conflict. ";
MessageNotifyUtil.Notify.error("Error initializing Keyword Search module", msg);
MessageNotifyUtil.Notify.error("Error initializing Keyword Search module", msg); MessageNotifyUtil.Notify.error(NbBundle.getMessage(this.getClass(), "Installer.errorInitKsmMsg"), msg);
} }
}); });
} }

View File

@ -19,6 +19,7 @@
package org.sleuthkit.autopsy.keywordsearch; package org.sleuthkit.autopsy.keywordsearch;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.corecomponents.OptionsPanel; import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
/** /**
@ -36,13 +37,16 @@ public final class KeywordSearchConfigurationPanel extends javax.swing.JPanel im
} }
private void customizeComponents() { private void customizeComponents() {
setName("Advanced Keyword Search Configuration"); setName(NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel.customizeComponents.title"));
listsPanel = new KeywordSearchConfigurationPanel1(); listsPanel = new KeywordSearchConfigurationPanel1();
languagesPanel = new KeywordSearchConfigurationPanel3(); languagesPanel = new KeywordSearchConfigurationPanel3();
generalPanel = new KeywordSearchConfigurationPanel2(); generalPanel = new KeywordSearchConfigurationPanel2();
tabbedPane.insertTab("Lists", null, listsPanel, "List configuration", 0); tabbedPane.insertTab(NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel.customizeComponents.listTabTitle"), null,
tabbedPane.insertTab("String Extraction", null, languagesPanel, "String extraction configuration for Keyword Search Ingest", 1); listsPanel, NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel.customizeComponents.listLabToolTip"), 0);
tabbedPane.insertTab("General", null, generalPanel, "General configuration", 2); tabbedPane.insertTab(NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel.customizeComponents.stringExtTitle"), null,
languagesPanel, NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel.customizeComponents.stringExtToolTip"), 1);
tabbedPane.insertTab(NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel.customizeComponents.genTabTitle"), null,
generalPanel, NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel.customizeComponents.genTabToolTip"), 2);
} }
/** /**

View File

@ -28,9 +28,10 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.List; import java.util.List;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.corecomponents.OptionsPanel; import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
import org.sleuthkit.autopsy.ingest.IngestManager;
/** /**
* Panel containing all other Keyword search Options panels. * Panel containing all other Keyword search Options panels.
@ -59,9 +60,8 @@ class KeywordSearchConfigurationPanel1 extends javax.swing.JPanel implements Opt
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if (KeywordSearchUtil.displayConfirmDialog("Delete a keyword list" if (KeywordSearchUtil.displayConfirmDialog(NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel1.customizeComponents.title")
, "This will delete the keyword list globally (for all Cases). " , NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel1.customizeComponents.body" )
+ "Do you want to proceed with the deletion? "
, KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) ) { , KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) ) {
KeywordSearchListsXML deleter = KeywordSearchListsXML.getCurrent(); KeywordSearchListsXML deleter = KeywordSearchListsXML.getCurrent();
@ -84,13 +84,14 @@ class KeywordSearchConfigurationPanel1 extends javax.swing.JPanel implements Opt
List<Keyword> keywords = currentKeywordList.getKeywords(); List<Keyword> keywords = currentKeywordList.getKeywords();
if (keywords.isEmpty()) { if (keywords.isEmpty()) {
KeywordSearchUtil.displayDialog(FEATURE_NAME, "Keyword List is empty and cannot be saved", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO); KeywordSearchUtil.displayDialog(FEATURE_NAME, NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel1.customizeComponents.keywordListEmptyErr"),
KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO);
return; return;
} }
String listName = (String) JOptionPane.showInputDialog( String listName = (String) JOptionPane.showInputDialog(
null, null,
"New keyword list name:", NbBundle.getMessage(this.getClass(), "KeywordSearch.newKwListTitle"),
FEATURE_NAME, FEATURE_NAME,
JOptionPane.PLAIN_MESSAGE, JOptionPane.PLAIN_MESSAGE,
null, null,
@ -101,12 +102,12 @@ class KeywordSearchConfigurationPanel1 extends javax.swing.JPanel implements Opt
} }
if (writer.listExists(listName) && writer.getList(listName).isLocked()) { if (writer.listExists(listName) && writer.getList(listName).isLocked()) {
KeywordSearchUtil.displayDialog(FEATURE_NAME, "Cannot overwrite default list", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN); KeywordSearchUtil.displayDialog(FEATURE_NAME, NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel1.customizeComponents.noOwDefaultMsg"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);
return; return;
} }
boolean shouldAdd = false; boolean shouldAdd = false;
if (writer.listExists(listName)) { if (writer.listExists(listName)) {
boolean replace = KeywordSearchUtil.displayConfirmDialog(FEATURE_NAME, "Keyword List <" + listName + "> already exists, do you want to replace it?", boolean replace = KeywordSearchUtil.displayConfirmDialog(FEATURE_NAME, NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel1.customizeComponents.kwListExistMsg", listName),
KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN); KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);
if (replace) { if (replace) {
shouldAdd = true; shouldAdd = true;
@ -118,7 +119,7 @@ class KeywordSearchConfigurationPanel1 extends javax.swing.JPanel implements Opt
if (shouldAdd) { if (shouldAdd) {
writer.addList(listName, keywords); writer.addList(listName, keywords);
KeywordSearchUtil.displayDialog(FEATURE_NAME, "Keyword List <" + listName + "> saved", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO); KeywordSearchUtil.displayDialog(FEATURE_NAME, NbBundle.getMessage(this.getClass(), "KeywordSearchConfigurationPanel1.customizeComponents.kwListSavedMsg", listName), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO);
} }
//currentKeywordList = writer.getList(listName); //currentKeywordList = writer.getList(listName);

View File

@ -30,6 +30,8 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException; import java.util.regex.PatternSyntaxException;
@ -71,12 +73,12 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
private void customizeComponents() { private void customizeComponents() {
chRegex.setToolTipText("Keyword is a regular expression"); chRegex.setToolTipText(NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.customizeComponents.kwReToolTip"));
addWordButton.setToolTipText(("Add a new word to the keyword search list")); addWordButton.setToolTipText((NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.customizeComponents.addWordToolTip")));
addWordField.setToolTipText("Enter a new word or regex to search"); addWordField.setToolTipText(NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.customizeComponents.enterNewWordToolTip"));
exportButton.setToolTipText("Export the current keyword list to a file"); exportButton.setToolTipText(NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.customizeComponents.exportToFile"));
saveListButton.setToolTipText("Save the current keyword list with a new name"); saveListButton.setToolTipText(NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.customizeComponents.saveCurrentWIthNewNameToolTip"));
deleteWordButton.setToolTipText("Remove selected keyword(s) from the list"); deleteWordButton.setToolTipText(NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.customizeComponents.removeSelectedMsg"));
//keywordTable.setAutoscrolls(true); //keywordTable.setAutoscrolls(true);
//keywordTable.setTableHeader(null); //keywordTable.setTableHeader(null);
@ -489,7 +491,8 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
if (newWord.equals("")) { if (newWord.equals("")) {
return; return;
} else if (currentKeywordList.hasKeyword(keyword)) { } else if (currentKeywordList.hasKeyword(keyword)) {
KeywordSearchUtil.displayDialog("New Keyword Entry", "Keyword already exists in the list.", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO); KeywordSearchUtil.displayDialog(NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.newKwTitle"),
NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.addWordButtonAction.kwAlreadyExistsMsg"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO);
return; return;
} }
@ -504,7 +507,8 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
valid = false; valid = false;
} }
if (!valid) { if (!valid) {
KeywordSearchUtil.displayDialog("New Keyword Entry", "Invalid keyword pattern. Use words or a correct regex pattern.", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR); KeywordSearchUtil.displayDialog(NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.newKwTitle"),
NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.invalidKwMsg"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
return; return;
} }
@ -518,9 +522,8 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
}//GEN-LAST:event_addWordButtonActionPerformed }//GEN-LAST:event_addWordButtonActionPerformed
private void deleteWordButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteWordButtonActionPerformed private void deleteWordButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteWordButtonActionPerformed
if (KeywordSearchUtil.displayConfirmDialog("Removing a keyword" if (KeywordSearchUtil.displayConfirmDialog(NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.removeKwMsg")
, "This will remove a keyword from the list globally (for all Cases). " , NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.deleteWordButtonActionPerformed.delConfirmMsg")
+ "Do you want to proceed? "
, KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) ) { , KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) ) {
tableModel.deleteSelected(keywordTable.getSelectedRows()); tableModel.deleteSelected(keywordTable.getSelectedRows());
@ -540,7 +543,7 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
JFileChooser chooser = new JFileChooser(); JFileChooser chooser = new JFileChooser();
final String EXTENSION = "xml"; final String EXTENSION = "xml";
FileNameExtensionFilter filter = new FileNameExtensionFilter( FileNameExtensionFilter filter = new FileNameExtensionFilter(
"Keyword List XML file", EXTENSION); NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.exportButtonActionPerformed.fileFilterLabel"), EXTENSION);
chooser.setFileFilter(filter); chooser.setFileFilter(filter);
chooser.setSelectedFile(new File(currentKeywordList.getName())); chooser.setSelectedFile(new File(currentKeywordList.getName()));
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
@ -561,7 +564,9 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
boolean shouldWrite = true; boolean shouldWrite = true;
if (selFile.exists()) { if (selFile.exists()) {
shouldWrite = KeywordSearchUtil.displayConfirmDialog(FEATURE_NAME, "File " + selFile.getName() + " exists, overwrite?", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN); shouldWrite = KeywordSearchUtil.displayConfirmDialog(FEATURE_NAME,
NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.exportButtonActionPerformed.fileExistPrompt",
selFile.getName()), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);
} }
if (!shouldWrite) { if (!shouldWrite) {
return; return;
@ -575,7 +580,8 @@ class KeywordSearchEditListPanel extends javax.swing.JPanel implements ListSelec
final KeywordSearchListsXML exporter = new KeywordSearchListsXML(fileAbs); final KeywordSearchListsXML exporter = new KeywordSearchListsXML(fileAbs);
boolean written = exporter.saveLists(toWrite); boolean written = exporter.saveLists(toWrite);
if (written) { if (written) {
KeywordSearchUtil.displayDialog(FEATURE_NAME, "Keyword lists exported", KeywordSearchUtil.displayDialog(FEATURE_NAME,
NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.exportButtonActionPerformed.kwListExportedMsg"),
KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO); KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO);
} }
} }
@ -689,10 +695,10 @@ private void useForIngestCheckboxActionPerformed(java.awt.event.ActionEvent evt)
switch (column) { switch (column) {
case 0: case 0:
colName = "Keyword"; colName = NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.kwColName");
break; break;
case 1: case 1:
colName = "RegEx"; colName = NbBundle.getMessage(this.getClass(), "KeywordSearchEditListPanel.exportButtonActionPerformed.regExColName");
break; break;
default: default:
; ;

View File

@ -26,6 +26,7 @@ import org.openide.nodes.Node;
import org.openide.nodes.Node.Property; import org.openide.nodes.Node.Property;
import org.openide.nodes.PropertySupport; import org.openide.nodes.PropertySupport;
import org.openide.nodes.Sheet; import org.openide.nodes.Sheet;
import org.openide.util.NbBundle;
import org.openide.util.lookup.Lookups; import org.openide.util.lookup.Lookups;
import org.openide.util.lookup.ProxyLookup; import org.openide.util.lookup.ProxyLookup;
import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint; import org.sleuthkit.autopsy.coreutils.ContextMenuExtensionPoint;
@ -127,11 +128,11 @@ class KeywordSearchFilterNode extends FilterNode {
private List<Action> getFileActions() { private List<Action> getFileActions() {
List<Action> actions = new ArrayList<>(); List<Action> actions = new ArrayList<>();
actions.add(new NewWindowViewAction("View in New Window", KeywordSearchFilterNode.this)); actions.add(new NewWindowViewAction(NbBundle.getMessage(this.getClass(), "KeywordSearchFilterNode.getFileActions.viewInNewWinActionLbl"), KeywordSearchFilterNode.this));
actions.add(new ExternalViewerAction("Open in External Viewer", getOriginal())); actions.add(new ExternalViewerAction(NbBundle.getMessage(this.getClass(), "KeywordSearchFilterNode.getFileActions.openExternViewActLbl"), getOriginal()));
actions.add(null); actions.add(null);
actions.add(ExtractAction.getInstance()); actions.add(ExtractAction.getInstance());
actions.add(new HashSearchAction("Search for files with the same MD5 hash", getOriginal())); actions.add(new HashSearchAction(NbBundle.getMessage(this.getClass(), "KeywordSearchFilterNode.getFileActions.searchSameMd5"), getOriginal()));
actions.add(null); // creates a menu separator actions.add(null); // creates a menu separator
actions.add(AddContentTagAction.getInstance()); actions.add(AddContentTagAction.getInstance());
actions.addAll(ContextMenuExtensionPoint.getActions()); actions.addAll(ContextMenuExtensionPoint.getActions());

View File

@ -33,6 +33,8 @@ import java.util.concurrent.CancellationException;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
@ -96,8 +98,10 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
} }
}; };
private static final Logger logger = Logger.getLogger(KeywordSearchIngestModule.class.getName()); private static final Logger logger = Logger.getLogger(KeywordSearchIngestModule.class.getName());
public static final String MODULE_NAME = "Keyword Search"; public static final String MODULE_NAME = NbBundle.getMessage(KeywordSearchIngestModule.class,
public static final String MODULE_DESCRIPTION = "Performs file indexing and periodic search using keywords and regular expressions in lists."; "KeywordSearchIngestModule.moduleName");
public static final String MODULE_DESCRIPTION = NbBundle.getMessage(KeywordSearchIngestModule.class,
"KeywordSearchIngestModule.moduleDescription");
final public static String MODULE_VERSION = Version.getVersion(); final public static String MODULE_VERSION = Version.getVersion();
private static KeywordSearchIngestModule instance = null; private static KeywordSearchIngestModule instance = null;
private IngestServices services; private IngestServices services;
@ -122,7 +126,8 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
private volatile int messageID = 0; private volatile int messageID = 0;
private boolean processedFiles; private boolean processedFiles;
private volatile boolean finalSearcherDone = true; //mark as done, until it's inited private volatile boolean finalSearcherDone = true; //mark as done, until it's inited
private final String hashDBModuleName = "Hash Lookup"; //NOTE this needs to match the HashDB module getName() private final String hashDBModuleName = NbBundle
.getMessage(this.getClass(), "KeywordSearchIngestModule.hashDbModuleName"); //NOTE this needs to match the HashDB module getName()
private SleuthkitCase caseHandle = null; private SleuthkitCase caseHandle = null;
private static List<AbstractFileExtract> textExtractors; private static List<AbstractFileExtract> textExtractors;
private static AbstractFileStringExtract stringExtractor; private static AbstractFileStringExtract stringExtractor;
@ -352,9 +357,9 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
final Server server = KeywordSearch.getServer(); final Server server = KeywordSearch.getServer();
try { try {
if (!server.isRunning()) { if (!server.isRunning()) {
String msg = "Keyword search server was not properly initialized, cannot run keyword search ingest. "; String msg = NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.init.badInitMsg");
logger.log(Level.SEVERE, msg); logger.log(Level.SEVERE, msg);
String details = msg + "<br />Please try stopping old java Solr process (if it exists) and restart the application."; String details = NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.init.tryStopSolrMsg", msg);
services.postMessage(IngestMessage.createErrorMessage(++messageID, instance, msg, details)); services.postMessage(IngestMessage.createErrorMessage(++messageID, instance, msg, details));
return; return;
@ -362,8 +367,8 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
} catch (KeywordSearchModuleException ex) { } catch (KeywordSearchModuleException ex) {
logger.log(Level.WARNING, "Error checking if Solr server is running while initializing ingest", ex); logger.log(Level.WARNING, "Error checking if Solr server is running while initializing ingest", ex);
//this means Solr is not properly initialized //this means Solr is not properly initialized
String msg = "Keyword search server was not properly initialized, cannot run keyword search ingest. "; String msg = NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.init.badInitMsg");
String details = msg + "<br />Please try stopping old java Solr process (if it exists) and restart the application."; String details = NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.init.tryStopSolrMsg", msg);
services.postMessage(IngestMessage.createErrorMessage(++messageID, instance, msg, details)); services.postMessage(IngestMessage.createErrorMessage(++messageID, instance, msg, details));
return; return;
} }
@ -397,7 +402,8 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
initKeywords(); initKeywords();
if (keywords.isEmpty() || keywordLists.isEmpty()) { if (keywords.isEmpty() || keywordLists.isEmpty()) {
services.postMessage(IngestMessage.createWarningMessage(++messageID, instance, "No keywords in keyword list.", "Only indexing will be done and and keyword search will be skipped (you can still add keyword lists using the Keyword Lists - Add to Ingest).")); services.postMessage(IngestMessage.createWarningMessage(++messageID, instance, NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.init.noKwInLstMsg"),
NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.init.onlyIdxKwSkipMsg")));
} }
processedFiles = false; processedFiles = false;
@ -540,21 +546,23 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
} }
StringBuilder msg = new StringBuilder(); StringBuilder msg = new StringBuilder();
msg.append("<table border=0><tr><td>Files with known types</td><td>").append(text_ingested).append("</td></tr>"); msg.append("<table border=0><tr><td>").append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.knowFileHeaderLbl")).append("</td><td>").append(text_ingested).append("</td></tr>");
msg.append("<tr><td>Files with general strings extracted</td><td>").append(strings_ingested).append("</td></tr>"); msg.append("<tr><td>").append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.fileGenStringsHead")).append("</td><td>").append(strings_ingested).append("</td></tr>");
msg.append("<tr><td>Metadata only was indexed</td><td>").append(metadata_ingested).append("</td></tr>"); msg.append("<tr><td>").append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.mdOnlyLbl")).append("</td><td>").append(metadata_ingested).append("</td></tr>");
msg.append("<tr><td>Error (indexer)</td><td>").append(error_index).append("</td></tr>"); msg.append("<tr><td>").append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.idxErrLbl")).append("</td><td>").append(error_index).append("</td></tr>");
msg.append("<tr><td>Error (text extraction)</td><td>").append(error_text).append("</td></tr>"); msg.append("<tr><td>").append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.errTxtLbl")).append("</td><td>").append(error_text).append("</td></tr>");
msg.append("<tr><td>Error (I/O)</td><td>").append(error_io).append("</td></tr>"); msg.append("<tr><td>").append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.errIoLbl")).append("</td><td>").append(error_io).append("</td></tr>");
msg.append("</table>"); msg.append("</table>");
String indexStats = msg.toString(); String indexStats = msg.toString();
logger.log(Level.INFO, "Keyword Indexing Completed: " + indexStats); logger.log(Level.INFO, "Keyword Indexing Completed: " + indexStats);
services.postMessage(IngestMessage.createMessage(++messageID, MessageType.INFO, this, "Keyword Indexing Results", indexStats)); services.postMessage(IngestMessage.createMessage(++messageID, MessageType.INFO, this, NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.kwIdxResultsLbl"), indexStats));
if (error_index > 0) { if (error_index > 0) {
MessageNotifyUtil.Notify.error("Keyword Indexing Errors", "Keyword index service had errors ingesting " + error_index + " files."); MessageNotifyUtil.Notify.error(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.kwIdxErrsTitle"),
NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.kwIdxErrMsgFiles", error_index));
} }
else if (error_io + error_text > 0) { else if (error_io + error_text > 0) {
MessageNotifyUtil.Notify.warn("Keyword Indexing Warning", "Keyword index service had errors reading files and extracting text. Could have been from corrupt media or files."); MessageNotifyUtil.Notify.warn(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.kwIdxWarnMsgTitle"),
NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.postIndexSummary.idxErrReadFilesMsg"));
} }
} }
@ -901,13 +909,15 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
logger.log(Level.INFO, "Pending start of new searcher"); logger.log(Level.INFO, "Pending start of new searcher");
} }
final String displayName = "Keyword Search" + (finalRun ? " - Finalizing" : ""); final String displayName = NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.doInBackGround.displayName") +
progressGroup = AggregateProgressFactory.createSystemHandle(displayName + (" (Pending)"), null, new Cancellable() { (finalRun ? (" - "+ NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.doInBackGround.finalizeMsg")) : "");
progressGroup = AggregateProgressFactory.createSystemHandle(displayName + (" ("+
NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.doInBackGround.pendingMsg") +")"), null, new Cancellable() {
@Override @Override
public boolean cancel() { public boolean cancel() {
logger.log(Level.INFO, "Cancelling the searcher by user."); logger.log(Level.INFO, "Cancelling the searcher by user.");
if (progressGroup != null) { if (progressGroup != null) {
progressGroup.setDisplayName(displayName + " (Cancelling...)"); progressGroup.setDisplayName(displayName + " ("+ NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.doInBackGround.cancelMsg") +"...)");
} }
return Searcher.this.cancel(true); return Searcher.this.cancel(true);
} }
@ -1069,9 +1079,9 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
//final int hitFiles = newResults.size(); //final int hitFiles = newResults.size();
if (!keywordQuery.isLiteral()) { if (!keywordQuery.isLiteral()) {
subjectSb.append("RegExp hit: "); subjectSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.regExpHitLbl"));
} else { } else {
subjectSb.append("Keyword hit: "); subjectSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.kwHitLbl"));
} }
//subjectSb.append("<"); //subjectSb.append("<");
String uniqueKey = null; String uniqueKey = null;
@ -1089,7 +1099,7 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
detailsSb.append("<table border='0' cellpadding='4' width='280'>"); detailsSb.append("<table border='0' cellpadding='4' width='280'>");
//hit //hit
detailsSb.append("<tr>"); detailsSb.append("<tr>");
detailsSb.append("<th>Keyword hit</th>"); detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.kwHitLThLbl"));
detailsSb.append("<td>").append(EscapeUtil.escapeHtml(attr.getValueString())).append("</td>"); detailsSb.append("<td>").append(EscapeUtil.escapeHtml(attr.getValueString())).append("</td>");
detailsSb.append("</tr>"); detailsSb.append("</tr>");
@ -1097,7 +1107,7 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW.getTypeID()); attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW.getTypeID());
if (attr != null) { if (attr != null) {
detailsSb.append("<tr>"); detailsSb.append("<tr>");
detailsSb.append("<th>Preview</th>"); detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.previewThLbl"));
detailsSb.append("<td>").append(EscapeUtil.escapeHtml(attr.getValueString())).append("</td>"); detailsSb.append("<td>").append(EscapeUtil.escapeHtml(attr.getValueString())).append("</td>");
detailsSb.append("</tr>"); detailsSb.append("</tr>");
@ -1105,7 +1115,7 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
//file //file
detailsSb.append("<tr>"); detailsSb.append("<tr>");
detailsSb.append("<th>File</th>"); detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.fileThLbl"));
detailsSb.append("<td>").append(hitFile.getParentPath()).append(hitFile.getName()).append("</td>"); detailsSb.append("<td>").append(hitFile.getParentPath()).append(hitFile.getName()).append("</td>");
detailsSb.append("</tr>"); detailsSb.append("</tr>");
@ -1114,7 +1124,7 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
//list //list
attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID()); attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID());
detailsSb.append("<tr>"); detailsSb.append("<tr>");
detailsSb.append("<th>List</th>"); detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.listThLbl"));
detailsSb.append("<td>").append(attr.getValueString()).append("</td>"); detailsSb.append("<td>").append(attr.getValueString()).append("</td>");
detailsSb.append("</tr>"); detailsSb.append("</tr>");
@ -1123,7 +1133,7 @@ public final class KeywordSearchIngestModule extends IngestModuleAbstractFile {
attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID()); attr = written.getAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_REGEXP.getTypeID());
if (attr != null) { if (attr != null) {
detailsSb.append("<tr>"); detailsSb.append("<tr>");
detailsSb.append("<th>RegEx</th>"); detailsSb.append(NbBundle.getMessage(this.getClass(), "KeywordSearchIngestModule.regExThLbl"));
detailsSb.append("<td>").append(attr.getValueString()).append("</td>"); detailsSb.append("<td>").append(attr.getValueString()).append("</td>");
detailsSb.append("</tr>"); detailsSb.append("</tr>");

View File

@ -91,8 +91,10 @@ public abstract class KeywordSearchListsAbstract {
ips.add(new Keyword("(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])", false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IP_ADDRESS)); ips.add(new Keyword("(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])", false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_IP_ADDRESS));
//email //email
List<Keyword> emails = new ArrayList<Keyword>(); List<Keyword> emails = new ArrayList<Keyword>();
emails.add(new Keyword("(?=.{8})[a-z0-9%+_-]+(?:\\.[a-z0-9%+_-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,4}(?<!\\.txt|\\.exe|\\.dll|\\.jpg|\\.xml)", false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL)); emails.add(new Keyword("(?=.{8})[a-z0-9%+_-]+(?:\\.[a-z0-9%+_-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,4}(?<!\\.txt|\\.exe|\\.dll|\\.jpg|\\.xml)",
//emails.add(new Keyword("[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}", false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL)); false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL));
//emails.add(new Keyword("[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}",
// false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL));
//URL //URL
List<Keyword> urls = new ArrayList<Keyword>(); List<Keyword> urls = new ArrayList<Keyword>();
//urls.add(new Keyword("http://|https://|^www\\.", false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)); //urls.add(new Keyword("http://|https://|^www\\.", false, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL));

View File

@ -25,11 +25,11 @@
package org.sleuthkit.autopsy.keywordsearch; package org.sleuthkit.autopsy.keywordsearch;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
@ -176,21 +176,23 @@ class KeywordSearchListsManagementPanel extends javax.swing.JPanel implements Op
private void newListButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newListButtonActionPerformed private void newListButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newListButtonActionPerformed
KeywordSearchListsXML writer = KeywordSearchListsXML.getCurrent(); KeywordSearchListsXML writer = KeywordSearchListsXML.getCurrent();
String listName = (String) JOptionPane.showInputDialog(null, "New keyword list name:", "New Keyword List", JOptionPane.PLAIN_MESSAGE, null, null, ""); String listName = (String) JOptionPane.showInputDialog(null, NbBundle.getMessage(this.getClass(), "KeywordSearch.newKwListTitle"),
NbBundle.getMessage(this.getClass(), "KeywordSearch.newKeywordListMsg"), JOptionPane.PLAIN_MESSAGE, null, null, "");
if (listName == null || listName.trim().equals("")) { if (listName == null || listName.trim().equals("")) {
return; return;
} }
boolean shouldAdd = false; boolean shouldAdd = false;
if (writer.listExists(listName)) { if (writer.listExists(listName)) {
if (writer.getList(listName).isLocked() ) { if (writer.getList(listName).isLocked() ) {
boolean replace = KeywordSearchUtil.displayConfirmDialog("New Keyword List", "Keyword List <" + listName boolean replace = KeywordSearchUtil.displayConfirmDialog(NbBundle.getMessage(this.getClass(), "KeywordSearch.newKeywordListMsg"),
+ "> already exists as a read-only list. Do you want to replace it for the duration of the program (the change will not be persistent).", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN); NbBundle.getMessage(this.getClass(), "KeywordSearch.keywordListAlreadyExistMsg", listName), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);
if (replace) { if (replace) {
shouldAdd = true; shouldAdd = true;
} }
} }
else { else {
boolean replace = KeywordSearchUtil.displayConfirmDialog("New Keyword List", "Keyword List <" + listName + "> already exists, do you want to replace it?", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN); boolean replace = KeywordSearchUtil.displayConfirmDialog(NbBundle.getMessage(this.getClass(), "KeywordSearch.newKwListTitle"),
NbBundle.getMessage(this.getClass(), "KeywordSearch.kwListAlreadyExistMsg", listName), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN);
if (replace) { if (replace) {
shouldAdd = true; shouldAdd = true;
} }
@ -211,12 +213,10 @@ class KeywordSearchListsManagementPanel extends javax.swing.JPanel implements Op
private void importButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_importButtonActionPerformed private void importButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_importButtonActionPerformed
final String FEATURE_NAME = "Keyword List Import";
JFileChooser chooser = new JFileChooser(); JFileChooser chooser = new JFileChooser();
final String[] EXTENSION = new String[]{"xml", "txt"}; final String[] EXTENSION = new String[]{"xml", "txt"};
FileNameExtensionFilter filter = new FileNameExtensionFilter( FileNameExtensionFilter filter = new FileNameExtensionFilter(
"Keyword List File", EXTENSION); NbBundle.getMessage(this.getClass(), "KeywordSearchListsManagementPanel.fileExtensionFilterLbl"), EXTENSION);
chooser.setFileFilter(filter); chooser.setFileFilter(filter);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
@ -239,7 +239,8 @@ class KeywordSearchListsManagementPanel extends javax.swing.JPanel implements Op
} }
if (!reader.load()) { if (!reader.load()) {
KeywordSearchUtil.displayDialog(FEATURE_NAME, "Error importing keyword list from file " + fileAbs, KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR); KeywordSearchUtil.displayDialog(
NbBundle.getMessage(this.getClass(), "KeywordSearch.listImportFeatureTitle"), NbBundle.getMessage(this.getClass(), "KeywordSearch.importListFileDialogMsg", fileAbs), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.ERROR);
return; return;
} }
@ -251,12 +252,12 @@ class KeywordSearchListsManagementPanel extends javax.swing.JPanel implements Op
for (KeywordSearchListsAbstract.KeywordSearchList list : toImport) { for (KeywordSearchListsAbstract.KeywordSearchList list : toImport) {
//check name collisions //check name collisions
if (writer.listExists(list.getName())) { if (writer.listExists(list.getName())) {
Object[] options = {"Yes, overwrite", Object[] options = {NbBundle.getMessage(this.getClass(), "KeywordSearch.yesOwMsg"),
"No, skip", NbBundle.getMessage(this.getClass(), "KeywordSearch.noSkipMsg"),
"Cancel import"}; NbBundle.getMessage(this.getClass(), "KeywordSearch.cancelImportMsg")};
int choice = JOptionPane.showOptionDialog(this, int choice = JOptionPane.showOptionDialog(this,
"Keyword list <" + list.getName() + "> already exists locally, overwrite?", NbBundle.getMessage(this.getClass(), "KeywordSearch.overwriteListPrompt", list.getName()),
"Import list conflict", NbBundle.getMessage(this.getClass(), "KeywordSearch.importOwConflict"),
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, JOptionPane.QUESTION_MESSAGE,
null, null,
@ -280,7 +281,8 @@ class KeywordSearchListsManagementPanel extends javax.swing.JPanel implements Op
} }
if (!writer.writeLists(toImportConfirmed)) { if (!writer.writeLists(toImportConfirmed)) {
KeywordSearchUtil.displayDialog(FEATURE_NAME, "Keyword list not imported", KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO); KeywordSearchUtil.displayDialog(
NbBundle.getMessage(this.getClass(), "KeywordSearch.listImportFeatureTitle"), NbBundle.getMessage(this.getClass(), "KeywordSearch.kwListFailImportMsg"), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.INFO);
} }
} }

View File

@ -36,7 +36,8 @@ import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel; import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer; import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn; import javax.swing.table.TableColumn;
import org.apache.solr.client.solrj.SolrServerException;
import org.openide.util.NbBundle;
import org.openide.util.actions.SystemAction; import org.openide.util.actions.SystemAction;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.ingest.IngestManager; import org.sleuthkit.autopsy.ingest.IngestManager;
@ -162,16 +163,14 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
private void initIngest(boolean running) { private void initIngest(boolean running) {
if (running) { if (running) {
ingestRunning = true; ingestRunning = true;
searchAddButton.setText("Add to Ingest"); searchAddButton.setText(NbBundle.getMessage(this.getClass(), "KeywordSearchListsViewerPanel.initIngest.addIngestTitle"));
searchAddButton.setToolTipText("<html>You can select additional keyword lists" searchAddButton.setToolTipText(NbBundle.getMessage(this.getClass(), "KeywordSearchListsViewerPanel.initIngest.addIngestMsg" ));
+ "<br />and enqueue them to the ongoing ingest."
+ "<br />The selected lists will be searched next time the file index is rebuilt.</html>");
listsTableModel.resync(); listsTableModel.resync();
} else { } else {
ingestRunning = false; ingestRunning = false;
searchAddButton.setText("Search"); searchAddButton.setText(NbBundle.getMessage(this.getClass(), "KeywordSearchListsViewerPanel.initIngest.searchIngestTitle"));
searchAddButton.setToolTipText("Search indexed files for keywords in selected lists"); searchAddButton.setToolTipText(NbBundle.getMessage(this.getClass(), "KeywordSearchListsViewerPanel.initIngest.addIdxSearchMsg"));
listsTableModel.resync(); listsTableModel.resync();
} }
updateIngestIndexLabel(running); updateIngestIndexLabel(running);
@ -179,11 +178,10 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
private void updateIngestIndexLabel(boolean ingestRunning) { private void updateIngestIndexLabel(boolean ingestRunning) {
if (ingestRunning) { if (ingestRunning) {
ingestIndexLabel.setText("Files Indexed: " + filesIndexed ingestIndexLabel.setText(NbBundle.getMessage(this.getClass(), "KeywordSearchListsViewerPanel.initIngest.ongoingIngestMsg", filesIndexed));
+ " (ingest is ongoing)");
} }
else { else {
ingestIndexLabel.setText("Files Indexed: " + filesIndexed); ingestIndexLabel.setText(NbBundle.getMessage(this.getClass(), "KeywordSearchListsViewerPanel.initIngest.fileIndexCtMsg", filesIndexed));
} }
} }
@ -357,10 +355,10 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
String ret = null; String ret = null;
switch (column) { switch (column) {
case 0: case 0:
ret = "Selected"; ret = NbBundle.getMessage(this.getClass(), "KeywordSearch.selectedColLbl");
break; break;
case 1: case 1:
ret = "Name"; ret = NbBundle.getMessage(this.getClass(), "KeywordSearch.nameColLbl");
break; break;
default: default:
break; break;
@ -511,10 +509,10 @@ class KeywordSearchListsViewerPanel extends AbstractKeywordSearchPerformer {
String ret = null; String ret = null;
switch (column) { switch (column) {
case 0: case 0:
ret = "Name"; ret = NbBundle.getMessage(this.getClass(), "KeywordSearch.nameColLbl");
break; break;
case 1: case 1:
ret = "RegEx"; ret = NbBundle.getMessage(this.getClass(), "KeywordSearch.regExColLbl");
break; break;
default: default:
break; break;

View File

@ -19,7 +19,8 @@ iconBase = "org/sleuthkit/autopsy/keywordsearch/options-icon.png",
position = 2, position = 2,
keywords = "#OptionsCategory_Keywords_KeywordSearchOptions", keywords = "#OptionsCategory_Keywords_KeywordSearchOptions",
keywordsCategory = "KeywordSearchOptions") keywordsCategory = "KeywordSearchOptions")
@org.openide.util.NbBundle.Messages({"OptionsCategory_Name_KeywordSearchOptions=Keyword Search", "OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search"}) // moved messages to Bundle.properties
//@org.openide.util.NbBundle.Messages({"OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search", "OptionsCategory_Keywords_KeywordSearchOptions=Keyword Search"})
public final class KeywordSearchOptionsPanelController extends OptionsPanelController { public final class KeywordSearchOptionsPanelController extends OptionsPanelController {
private KeywordSearchConfigurationPanel panel; private KeywordSearchConfigurationPanel panel;

View File

@ -92,7 +92,9 @@ class KeywordSearchPanel extends AbstractKeywordSearchPerformer {
@Override @Override
public void focusGained(FocusEvent e) { public void focusGained(FocusEvent e) {
if (searchBox.getText().equals("Search...")) { if (searchBox.getText()
.equals(org.openide.util.NbBundle.getMessage(KeywordSearchPanel.class,
"KeywordSearchPanel.searchBox.text"))) {
searchBox.setText(""); searchBox.setText("");
searchBox.setForeground(Color.BLACK); searchBox.setForeground(Color.BLACK);
entered = true; entered = true;
@ -146,7 +148,9 @@ class KeywordSearchPanel extends AbstractKeywordSearchPerformer {
} else if (jmi.equals(copyMenuItem)) { } else if (jmi.equals(copyMenuItem)) {
searchBox.copy(); searchBox.copy();
} else if (jmi.equals(pasteMenuItem)) { } else if (jmi.equals(pasteMenuItem)) {
if (searchBox.getText().equals("Search...")) { if (searchBox.getText()
.equals(org.openide.util.NbBundle.getMessage(KeywordSearchPanel.class,
"KeywordSearchPanel.searchBox.text"))) {
searchBox.setText(""); searchBox.setText("");
searchBox.setForeground(Color.BLACK); searchBox.setForeground(Color.BLACK);
entered = true; entered = true;
@ -166,7 +170,8 @@ class KeywordSearchPanel extends AbstractKeywordSearchPerformer {
private void resetSearchBox() { private void resetSearchBox() {
searchBox.setEditable(true); searchBox.setEditable(true);
searchBox.setText("Search..."); searchBox.setText(org.openide.util.NbBundle.getMessage(KeywordSearchPanel.class,
"KeywordSearchPanel.searchBox.text"));
searchBox.setForeground(Color.LIGHT_GRAY); searchBox.setForeground(Color.LIGHT_GRAY);
regExCheckboxMenuItem.setEnabled(true); regExCheckboxMenuItem.setEnabled(true);
entered = false; entered = false;

View File

@ -24,6 +24,8 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.openide.nodes.AbstractNode; import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children; import org.openide.nodes.Children;
@ -152,7 +154,7 @@ class KeywordSearchQueryManager {
String queryConcatStr = queryConcat.toString(); String queryConcatStr = queryConcat.toString();
final int queryConcatStrLen = queryConcatStr.length(); final int queryConcatStrLen = queryConcatStr.length();
final String queryStrShort = queryConcatStrLen > 15 ? queryConcatStr.substring(0, 14) + "..." : queryConcatStr; final String queryStrShort = queryConcatStrLen > 15 ? queryConcatStr.substring(0, 14) + "..." : queryConcatStr;
final String windowTitle = "Keyword search " + (++resultWindowCount) + " - " + queryStrShort; final String windowTitle = NbBundle.getMessage(this.getClass(), "KeywordSearchQueryManager.execute.exeWinTitle", ++resultWindowCount, queryStrShort);
DataResultTopComponent searchResultWin = DataResultTopComponent.createInstance(windowTitle); DataResultTopComponent searchResultWin = DataResultTopComponent.createInstance(windowTitle);
if (things.size() > 0) { if (things.size() > 0) {
Children childThingNodes = Children childThingNodes =

View File

@ -80,6 +80,7 @@
</if> </if>
<property name="app.property.file" value="${zip-tmp}/${app.name}/etc/${app.name}.conf" /> <property name="app.property.file" value="${zip-tmp}/${app.name}/etc/${app.name}.conf" />
<!-- for Japanese localized version add option: -Duser.language=ja -->
<property name="jvm.options" value="&quot;--branding ${app.name} -J-Xms24m -J-XX:MaxPermSize=128M -J-Xverify:none -J-Xdock:name=${app.title}&quot;" /> <property name="jvm.options" value="&quot;--branding ${app.name} -J-Xms24m -J-XX:MaxPermSize=128M -J-Xverify:none -J-Xdock:name=${app.title}&quot;" />
<propertyfile file="${app.property.file}"> <propertyfile file="${app.property.file}">
<!-- Note: can be higher on 64 bit systems, should be in sync with project.properties --> <!-- Note: can be higher on 64 bit systems, should be in sync with project.properties -->

View File

@ -14,6 +14,7 @@ project.org.sleuthkit.autopsy.fileextmismatch=FileExtMismatch
update_versions=false update_versions=false
#custom JVM options #custom JVM options
#Note: can be higher on 64 bit systems, should be in sync with build.xml #Note: can be higher on 64 bit systems, should be in sync with build.xml
# for Japanese version add: -J-Duser.language=ja
run.args.extra=-J-Xms24m -J-XX:MaxPermSize=128M -J-Xverify:none run.args.extra=-J-Xms24m -J-XX:MaxPermSize=128M -J-Xverify:none
auxiliary.org-netbeans-modules-apisupport-installer.license-type=apache.v2 auxiliary.org-netbeans-modules-apisupport-installer.license-type=apache.v2
auxiliary.org-netbeans-modules-apisupport-installer.os-linux=false auxiliary.org-netbeans-modules-apisupport-installer.os-linux=false