Microsoft Translator\u30a2\u30ab\u30a6\u30f3\u30c8\u306bMicrosoft Translator\u8a8d\u8a3c\u30ad\u30fc\u3092\u63d0\u4f9b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 \u5165\u624b\u65b9\u6cd5\u306e\u8aac\u660e\u306f\u6b21\u306e\u5834\u6240\u306b\u3042\u308a\u307e\u3059\uff1a
BingTranslatorSettingsPanel.resultLabel.text=\u7d50\u679c\:
BingTranslatorSettingsPanel.targetLanguageLabel.text=\u5bfe\u8c61\u8a00\u8a9e\:
BingTranslatorSettingsPanel.testButton.text=\u30c6\u30b9\u30c8
@@ -21,7 +21,7 @@ GoogleTranslatorSettingsPanel.errorMessage.unableToReadCredentials=\u8cc7\u683c\
GoogleTranslatorSettingsPanel.errorMessage.unknownFailureGetting=\u73fe\u5728\u306e\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u8a00\u8a9e\u306e\u30ea\u30b9\u30c8\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002
GoogleTranslatorSettingsPanel.errorMessage.unknownFailurePopulating=\u73fe\u5728\u306e\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u8a00\u8a9e\u306e\u30ea\u30b9\u30c8\u3092\u5165\u529b\u3067\u304d\u307e\u305b\u3093\u3002
GoogleTranslatorSettingsPanel.fileChooser.confirmButton=\u9078\u629e
-GoogleTranslatorSettingsPanel.instructionsTextArea.text=
Google\u7ffb\u8a33\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30b5\u30fc\u30d3\u30b9\u30fb\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u3092\u542b\u3080JSON\u8a8d\u8a3c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002 \u30b5\u30fc\u30d3\u30b9\u30a2\u30fb\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306e\u4f5c\u6210\u65b9\u6cd5\u306b\u3064\u3044\u3066\u306f\u3001\u3053\u3061\u3089\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002
https\://cloud.google.com/iam/docs/creating-managing-service-account-keys\u3002 div>
+GoogleTranslatorSettingsPanel.instructionsTextArea.text=
Google\u7ffb\u8a33\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u3092\u542b\u3080JSON\u8a8d\u8a3c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002 \u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306e\u53d6\u5f97\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u60c5\u5831\u306f\u3001\u6b21\u306e\u5834\u6240\u306b\u3042\u308a\u307e\u3059\uff1a
https\://cloud.google.com/iam/docs/creating-managing-service-account-keys.
GoogleTranslatorSettingsPanel.json.description=JSON\u30d5\u30a1\u30a4\u30eb
GoogleTranslatorSettingsPanel.resultLabel.text=\u7d50\u679c\:
GoogleTranslatorSettingsPanel.targetLanguageLabel.text=\u5bfe\u8c61\u8a00\u8a9e\:
diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle_ja.properties
index b9442d6a12..9dcea73218 100644
--- a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle_ja.properties
@@ -1,5 +1,6 @@
-OptionsCategory_Name_Machine_Translation=\u6a5f\u68b0\u7ffb\u8a33
+#Fri Feb 12 16:56:29 UTC 2021
OptionsCategory_Keywords_Machine_Translation_Settings=\u6a5f\u68b0\u7ffb\u8a33\u8a2d\u5b9a
+OptionsCategory_Name_Machine_Translation=\u6a5f\u68b0\u7ffb\u8a33
TranslatedContentPanel.comboBoxOption.originalText=\u30aa\u30ea\u30b8\u30ca\u30eb\u30c6\u30ad\u30b9\u30c8(\u6700\u592725KB)
TranslatedContentPanel.comboBoxOption.translatedText=\u7ffb\u8a33\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8
TranslatedContentViewer.emptyTranslation=\u751f\u6210\u3055\u308c\u305f\u7ffb\u8a33\u7d50\u679c\u306f\u7a7a(\u672a\u5165\u529b)\u3067\u3057\u305f\u3002
@@ -9,6 +10,7 @@ TranslatedContentViewer.extractingFileText=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\
TranslatedContentViewer.extractingImageText=\u30a4\u30e1\u30fc\u30b8\u304b\u3089\u30c6\u30ad\u30b9\u30c8\u3092\u62bd\u51fa\u4e2d\u3067\u3059\u3002\u304a\u5f85\u3061\u304f\u3060\u3055\u3044...
TranslatedContentViewer.noIndexedTextMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c\u3057\u3001\u7ffb\u8a33\u30c6\u30ad\u30b9\u30c8\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002
TranslatedContentViewer.noServiceProvider=\u6a5f\u68b0\u7ffb\u8a33\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+TranslatedContentViewer.ocrNotEnabled=OCR\u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u305b\u3093\u3002 \u5909\u66f4\u3059\u308b\u306b\u306f\u3001[\u30c4\u30fc\u30eb]-> [\u30aa\u30d7\u30b7\u30e7\u30f3]-> [\u6a5f\u68b0\u7ffb\u8a33]\u3092\u9078\u3093\u3067\u4e0b\u3055\u3044
TranslatedContentViewer.textAlreadyIndexed=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8\u306e\u30d3\u30e5\u30fc\u30ef\u30fc\u3067\u30aa\u30ea\u30b8\u30ca\u30eb\u30c6\u30ad\u30b9\u30c8\u3092\u8868\u793a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
TranslatedContentViewer.translatingText=\u30c6\u30ad\u30b9\u30c8\u3092\u7ffb\u8a33\u4e2d\u3067\u3059\u3002T\u304a\u5f85\u3061\u304f\u3060\u3055\u3044...
TranslatedContentViewer.translationException=\u7ffb\u8a33\u3092\u8a66\u307f\u3066\u3044\u308b\u9593\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
@@ -16,7 +18,7 @@ TranslatedTextViewer.maxPayloadSize=\u30c6\u30ad\u30b9\u30c8\u306e\u6700\u521d\u
TranslatedTextViewer.title=\u7ffb\u8a33
TranslatedTextViewer.toolTip=\u7ffb\u8a33\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u8868\u793a\u3057\u307e\u3059\u3002
TranslationContentPanel.autoDetectOCR=\u81ea\u52d5\u691c\u51fa\u3055\u308c\u305f\u8a00\u8a9e
-TranslationContentPanel.ocrLabel.text=OCR:
+TranslationContentPanel.ocrLabel.text=OCR\:
+TranslationContentPanel.showLabel.text=\u8868\u793a\:
TranslationOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
TranslationOptionsPanelController.moduleErr.msg=TranslationSettingsPanelController\u66f4\u65b0\u306e\u30ea\u30c3\u30b9\u30f3\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u767a\u751f\u3055\u305b\u307e\u3057\u305f\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5224\u65ad\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
-TranslationContentPanel.showLabel.text=\u8868\u793a:
diff --git a/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java
index b87d0044a2..f6e003c7b0 100755
--- a/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java
+++ b/Core/test/unit/src/org/sleuthkit/autopsy/discovery/search/DomainSearchTestUtils.java
@@ -34,7 +34,7 @@ public class DomainSearchTestUtils {
long totalVisits, long visits, long filesDownloaded, long dataSourceId) {
Content dataSource = TskMockUtils.getDataSource(dataSourceId);
return new ResultDomain(domain, start, end, totalVisits,
- visits, filesDownloaded, 0L, dataSource);
+ visits, filesDownloaded, 0L, "", dataSource);
}
public static ResultDomain mockDomainResult(String domain) {
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED
index 823399e0d0..56a675e256 100755
--- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties-MERGED
@@ -205,9 +205,7 @@ DeleteCaseTask.progress.parsingManifest=Parsing manifest file {0}...
DeleteCaseTask.progress.releasingManifestLock=Releasing lock on the manifest file {0}...
DeleteCaseTask.progress.startMessage=Starting deletion...
DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes
-# {0} - item count
DeleteOrphanCaseNodesDialog.additionalInit.lblNodeCount.text=Znodes found: {0}
-# {0} - item count
DeleteOrphanCaseNodesDialog.additionalInit.znodesTextArea.countMessage=ZNODES FOUND: {0}
DeleteOrphanCaseNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service
# {0} - node path
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle_ja.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle_ja.properties
index ab5f7917c2..d751c3ed40 100644
--- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle_ja.properties
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle_ja.properties
@@ -1,7 +1,7 @@
-#Tue Aug 18 18:09:21 UTC 2020
-DeleteOrphanCaseNodesDialog.additionalInit.lblNodeCount.text=Znodes found\: {0}
-DeleteOrphanCaseNodesDialog.additionalInit.znodesTextArea.countMessage=ZNODES FOUND\: {0}
+#Fri Feb 12 16:56:29 UTC 2021
+DeleteOrphanCaseNodesDialog.additionalInit.lblNodeCount.text=\u898b\u3064\u304b\u3063\u305fZnodes\uff1a{0}
+DeleteOrphanCaseNodesDialog.additionalInit.znodesTextArea.countMessage=\u898b\u3064\u304b\u3063\u305fZNODES\uff1a{0}
DeleteOrphanCaseNodesDialog.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
-DeleteOrphanCaseNodesDialog.descriptionText.text=\u4ee5\u4e0b\u306e\u30b1\u30fc\u30b9\u306b\u306f\u3001\u5b64\u7acb\u3057\u305fznode\u304c\u3042\u308a\u307e\u3059\u3002 \u524a\u9664\u3057\u307e\u3059\u304b\uff1f
+DeleteOrphanCaseNodesDialog.descriptionText.text=\u6b21\u306e\u30b1\u30fc\u30b9\u3067\u306f\u3001\u5b64\u7acb\u3057\u305fznode\u304c\u3042\u308a\u307e\u3059\u3002 \u305d\u308c\u3089\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f
DeleteOrphanCaseNodesDialog.okButton.text=OK
-DeleteOrphanCaseNodesDialog.titleText.text=\u6b21\u306eZnodes\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f
+DeleteOrphanCaseNodesDialog.titleText.text=\u6b21\u306eZnode\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle_ja.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle_ja.properties
index d053a583e1..db8d0dcd71 100644
--- a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle_ja.properties
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/Bundle_ja.properties
@@ -1,2 +1,4 @@
-#Tue Aug 18 18:09:21 UTC 2020
+#Fri Feb 12 16:56:29 UTC 2021
+AutoIngestSettingsPanel.MustRestart=\u65b0\u3057\u3044\u8a2d\u5b9a\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u518d\u8d77\u52d5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059
+AutoIngestSettingsPanel.restartRequiredLabel.text=\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u3067\u3059\u3002
MultiUserTestTool.unableToInitializeFilTypeDetector=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u691c\u51fa\u6a5f\u80fd\u3092\u521d\u671f\u5316\u3067\u304d\u307e\u305b\u3093
diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java
index 2f13a48fd2..9513163587 100644
--- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java
+++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/ImageGalleryController.java
@@ -659,7 +659,7 @@ public final class ImageGalleryController {
private static ListeningExecutorService getNewDBExecutor() {
return MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor(
- new ThreadFactoryBuilder().setNameFormat("DB-Worker-Thread-%d").build()));
+ new ThreadFactoryBuilder().setNameFormat("ImageGallery-DB-Worker-Thread-%d").build()));
}
/**
diff --git a/KeywordSearch/solr/bin/autopsy-solr.cmd b/KeywordSearch/solr/bin/autopsy-solr.cmd
index 018a626694..37dbc22a03 100755
--- a/KeywordSearch/solr/bin/autopsy-solr.cmd
+++ b/KeywordSearch/solr/bin/autopsy-solr.cmd
@@ -62,7 +62,7 @@ IF NOT DEFINED SOLR_SSL_ENABLED (
)
IF "%SOLR_SSL_ENABLED%"=="true" (
- set "SOLR_JETTY_CONFIG=--lib="%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*""
+ set "SOLR_JETTY_CONFIG=--lib='%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*'"
if !JAVA_MAJOR_VERSION! GEQ 9 (
set "SOLR_JETTY_CONFIG=!SOLR_JETTY_CONFIG! --module=https"
) else (
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AdHocSearchPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AdHocSearchPanel.java
index 6190f392e8..c9aa061400 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AdHocSearchPanel.java
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/AdHocSearchPanel.java
@@ -148,7 +148,7 @@ abstract class AdHocSearchPanel extends javax.swing.JPanel {
}
/**
- * Get a list of data source display name.
+ * Get a list of data source display names.
*
* @return The list of data source name
*/
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED
index 02244f9477..72de1c17d8 100755
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties-MERGED
@@ -9,8 +9,20 @@ DropdownListSearchPanel.selected=Ad Hoc Search data source filter is selected
DropdownSingleTermSearchPanel.selected=Ad Hoc Search data source filter is selected
DropdownSingleTermSearchPanel.warning.text=Boundary characters ^ and $ do not match word boundaries. Consider\nreplacing with an explicit list of boundary characters, such as [ \\.,]
DropdownSingleTermSearchPanel.warning.title=Warning
+ExtractAllTermsReport.description.text=Extracts all unique words out of the current case. NOTE: The extracted words are lower-cased.
+ExtractAllTermsReport.error.noOpenCase=No currently open case.
+ExtractAllTermsReport.export.error=Error During Unique Word Extraction
+ExtractAllTermsReport.exportComplete=Unique Word Extraction Complete
+ExtractAllTermsReport.getName.text=Extract Unique Words
+# {0} - Number of extracted terms
+ExtractAllTermsReport.numberExtractedTerms=Extracted {0} terms...
+ExtractAllTermsReport.search.ingestInProgressBody=Keyword Search Ingest is currently running.
Not all files have been indexed and unique word extraction might yield incomplete results.
Do you want to proceed with unique word extraction anyway?
+# {0} - Keyword search commit frequency
+ExtractAllTermsReport.search.noFilesInIdxMsg=No files are in index yet. Try again later. Index is updated every {0} minutes.
+ExtractAllTermsReport.search.noFilesInIdxMsg2=No files are in index yet. Try again later
+ExtractAllTermsReport.search.searchIngestInProgressTitle=Keyword Search Ingest in Progress
+ExtractAllTermsReport.startExport=Starting Unique Word Extraction
ExtractedContentPanel.setMarkup.panelTxt=
Loading text... Please wait
-# {0} - Content name
ExtractedContentPanel.SetMarkup.progress.loading=Loading text for {0}
GlobalEditListPanel.editKeyword.title=Edit Keyword
GlobalEditListPanel.warning.text=Boundary characters ^ and $ do not match word boundaries. Consider\nreplacing with an explicit list of boundary characters, such as [ \\.,]
@@ -218,6 +230,7 @@ Server.deleteCore.exception.msg=Failed to delete Solr colelction {0}
Server.exceptionMessage.unableToBackupCollection=Unable to backup Solr collection
Server.exceptionMessage.unableToCreateCollection=Unable to create Solr collection
Server.exceptionMessage.unableToRestoreCollection=Unable to restore Solr collection
+Server.getAllTerms.error=Extraction of all unique Solr terms failed:
Server.start.exception.cantStartSolr.msg=Could not start Solr server process
Server.start.exception.cantStartSolr.msg2=Could not start Solr server process
Server.isRunning.exception.errCheckSolrRunning.msg=Error checking if Solr server is running
@@ -232,7 +245,7 @@ Server.query.exception.msg=Error running query: {0}
Server.query2.exception.msg=Error running query: {0}
Server.queryTerms.exception.msg=Error running terms query: {0}
Server.connect.exception.msg=Failed to connect to Solr server: {0}
-Server.openCore.exception.msg=Keyword search service not yet running
+Server.openCore.exception.msg=Local keyword search service not yet running
Server.openCore.exception.cantOpen.msg=Could not create or open index
Server.openCore.exception.noIndexDir.msg=Index directory could not be created or is missing
Server.request.exception.exception.msg=Could not issue Solr request
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties
index 2f50e62095..d43448a582 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle_ja.properties
@@ -1,4 +1,4 @@
-#Tue Aug 18 18:09:21 UTC 2020
+#Fri Feb 12 16:56:29 UTC 2021
AbstractFileStringContentStream.getSize.exception.msg=\u6587\u5b57\u5217\u5168\u4f53\u304c\u5909\u63db\u3055\u308c\u308b\u307e\u3067\u3001\u5909\u63db\u3055\u308c\u305f\u6587\u5b57\u5217\u306e\u6587\u5b57\u6570\u306f\u308f\u304b\u308a\u307e\u305b\u3093
AbstractFileStringContentStream.getSrcInfo.text=\u30d5\u30a1\u30a4\u30eb\:{0}
AbstractFileTikaTextExtract.index.exception.tikaParse.msg=\u4f8b\u5916\: \u6b21\u306e\u30d5\u30a1\u30a4\u30eb\u306eTika\u89e3\u6790\u30bf\u30b9\u30af\u5b9f\u884c\u6642\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916\: {0}\u3001{1}
@@ -194,11 +194,13 @@ KeywordSearchGlobalLanguageSettingsPanel.languagesLabel.text=\u6709\u52b9\u5316\
KeywordSearchGlobalListSettingsPanel.component.featureName.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u4fdd\u5b58
KeywordSearchGlobalSearchSettingsPanel.chunksLabel.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u7d22\u5f15\u5185\u306e\u30c1\u30e3\u30f3\u30af\:
KeywordSearchGlobalSearchSettingsPanel.chunksValLabel.text=0
+KeywordSearchGlobalSearchSettingsPanel.customizeComponents.windowsOCR=OCR\u6587\u5b57\u8a8d\u8b58\u3092\u6709\u52b9\u306b\u3059\u308b\uff08Windows 64\u30d3\u30c3\u30c8\u304c\u5fc5\u8981\uff09
KeywordSearchGlobalSearchSettingsPanel.filesIndexedLabel.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u7d22\u5f15\u5185\u306e\u30d5\u30a1\u30a4\u30eb\:
KeywordSearchGlobalSearchSettingsPanel.filesIndexedValue.text=0
KeywordSearchGlobalSearchSettingsPanel.frequencyLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306e\u7d50\u679c\u66f4\u65b0\u983b\u5ea6\:
KeywordSearchGlobalSearchSettingsPanel.informationLabel.text=\u60c5\u5831
KeywordSearchGlobalSearchSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+KeywordSearchGlobalSearchSettingsPanel.ocrCheckBox.text=OCR\u6587\u5b57\u8a8d\u8b58\u3092\u6709\u52b9\u306b\u3059\u308b
KeywordSearchGlobalSearchSettingsPanel.settingsLabel.text=\u8a2d\u5b9a
KeywordSearchGlobalSearchSettingsPanel.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(\u691c\u7d22\u6642\u9593\u304c\u9577\u304f\u306a\u308a\u307e\u3059)
KeywordSearchGlobalSearchSettingsPanel.skipNSRLCheckBox.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306bNSRL(\u65e2\u77e5\u306e\u30d5\u30a1\u30a4\u30eb)\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30ad\u30fc\u30ef\u30fc\u30c9\u306b\u8ffd\u52a0\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044
@@ -322,11 +324,15 @@ SearchRunner.query.exception.msg=\u6b21\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884
SearchRunner.updateTimer.title.text=SearchRunner\u66f4\u65b0\u30bf\u30a4\u30de\u30fc
Server.addDoc.exception.msg=\u66f4\u65b0\u30cf\u30f3\u30c9\u30e9\u30fc\u7d4c\u7531\u3067\u6b21\u306e\u6587\u66f8\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\: {0}
Server.addDoc.exception.msg2=\u66f4\u65b0\u30cf\u30f3\u30c9\u30e9\u30fc\u7d4c\u7531\u3067\u6b21\u306e\u6587\u66f8\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\: {0}
+Server.addDocBatch.exception.msg=\u30d0\u30c3\u30c1\u51e6\u7406\u3055\u308c\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
Server.close.exception.msg=\u30b3\u30a2\u3092\u9589\u3058\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093
-Server.close.exception.msg2=\u30b3\u30a2\u3092\u9589\u3058\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093
Server.commit.exception.msg=\u7d22\u5f15\u3092\u78ba\u5b9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-Server.connect.exception.msg=\u6b21\u306eSolr\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\: {0}
-Server.deleteCore.exception.msg=Solr \u30b3\u30a2 {0} \u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+Server.connect.exception.msg=Solr\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093{0}
+Server.connectionInfoMissing.exception.msg=Solr\u30d0\u30fc\u30b8\u30e7\u30f3{0}\u30de\u30eb\u30c1\u30e6\u30fc\u30b6\u30fc\u63a5\u7d9a\u60c5\u5831\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+Server.deleteCore.exception.msg=Solr\u30b3\u30ec\u30af\u30b7\u30e7\u30f3{0}\u306e\u524a\u9664\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+Server.exceptionMessage.unableToBackupCollection=Solr\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3092\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3067\u304d\u307e\u305b\u3093
+Server.exceptionMessage.unableToCreateCollection=Solr\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093
+Server.exceptionMessage.unableToRestoreCollection=Solr\u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3092\u5fa9\u5143\u3067\u304d\u307e\u305b\u3093
Server.isRunning.exception.errCheckSolrRunning.msg=Solr\u30b5\u30fc\u30d0\u30fc\u304c\u5b9f\u884c\u4e2d\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
Server.isRunning.exception.errCheckSolrRunning.msg2=Solr\u30b5\u30fc\u30d0\u30fc\u304c\u5b9f\u884c\u4e2d\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
Server.openCore.exception.alreadyOpen.msg=\u958b\u3044\u3066\u3044\u308bSolr\u306e\u30b3\u30a2\u304c\u3059\u3067\u306b\u3042\u308a\u307e\u3059\u3002\u6700\u521d\u306b\u30b3\u30a2\u3092\u660e\u793a\u7684\u306b\u9589\u3058\u3066\u304f\u3060\u3055\u3044\u3002
@@ -342,9 +348,7 @@ Server.queryNumIdxDocs.exception.msg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\
Server.queryNumIdxFiles.exception.msg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u6570\u3092\u30af\u30a8\u30ea\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
Server.queryTerms.exception.msg=\u6b21\u306eterms(\u6574\u6570/\u6587\u5b57\u5217/\u914d\u5217)\u30af\u30a8\u30ea\u306e\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\: {0}
Server.request.exception.exception.msg=Solr\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u767a\u884c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-Server.commit.exception.msg=\u7d22\u5f15\u3092\u78ba\u5b9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-Server.addDoc.exception.msg=\u66f4\u65b0\u30cf\u30f3\u30c9\u30e9\u30fc\u7d4c\u7531\u3067\u6b21\u306e\u6587\u66f8\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
-Server.close.exception.msg=\u30b3\u30a2\u3092\u9589\u3058\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093
+Server.serverList.exception.msg=\u30b5\u30fc\u30d0\u30fc{0}\u304b\u3089Solr\u30b5\u30fc\u30d0\u30fc\u306e\u30ea\u30b9\u30c8\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093
Server.solrServerNoPortException.msg=\u7d22\u5f15\u751f\u6210\u30b5\u30fc\u30d0\u30fc\u306f\u30dd\u30fc\u30c8 {0} \u306b\u30d0\u30a4\u30f3\u30c9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30c7\u30d5\u30a9\u30eb\u30c8\u306e {1} \u30dd\u30fc\u30c8\u306b\u5909\u66f4\u3059\u308b\u3053\u3068\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
Server.start.exception.cantStartSolr.msg=Solr\u30b5\u30fc\u30d0\u30fc\u30d7\u30ed\u30bb\u30b9\u3092\u958b\u59cb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
Server.start.exception.cantStartSolr.msg2=Solr\u30b5\u30fc\u30d0\u30fc\u30d7\u30ed\u30bb\u30b9\u3092\u958b\u59cb\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
@@ -358,44 +362,11 @@ SolrSearch.creatingNewIndex.msg=\u65b0\u898f\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15
SolrSearch.findingIndexes.msg=\u65e2\u5b58\u306e\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u691c\u7d22\u4e2d\u3067\u3059
SolrSearch.indentifyingIndex.msg=\u4f7f\u7528\u3059\u308b\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u3092\u7279\u5b9a\u4e2d\u3067\u3059
SolrSearch.lookingForMetadata.msg=\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\u4e2d\u3067\u3059
-SolrSearch.openCore.msg=\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u3092\u8d77\u52d5\u4e2d\u3067\u3059
-SolrSearch.openGiantCore.msg=\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u3092\u8d77\u52d5\u4e2d\u3067\u3059\u3002\u3053\u306e\u30b1\u30fc\u30b9\u306e\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u306f\u975e\u5e38\u306b\u5927\u304d\u3044\u305f\u3081\u3001\u8d77\u52d5\u306b\u6642\u9593\u304c\u304b\u304b\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002
-SolrSearch.openLargeCore.msg=\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u3092\u8d77\u52d5\u4e2d\u3067\u3059\u3002\u3053\u308c\u306b\u306f\u6570\u5206\u304b\u304b\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002
+SolrSearch.openCore.msg=\u30c6\u30ad\u30b9\u30c8\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u958b\u304d\u307e\u3059\u3002 \u3053\u308c\u306b\u306f\u6570\u5206\u304b\u304b\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002
SolrSearch.readingIndexes.msg=\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u3067\u3059
-SolrSearchService.IndexReadOnlyDialog.msg=\u3053\u306e\u30b1\u30fc\u30b9\u306e\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u306f\u8aad\u307f\u53d6\u308a\u5c02\u7528\u3067\u3059\u3002
\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u7d50\u679c\u3092\u78ba\u8a8d\u3057\u3001\u5b8c\u5168\u4e00\u81f4\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u3068\u90e8\u5206\u4e00\u81f4\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u3092\u5b9f\u884c\u3067\u304d\u307e\u3059
\u304c\u3001\u7d22\u5f15\u306b\u65b0\u898f\u30c6\u30ad\u30b9\u30c8\u3092\u8ffd\u52a0\u307e\u305f\u306f\u6b63\u898f\u8868\u73fe\u691c\u7d22\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002\u305d\u306e\u4ee3\u308f\u308a\u306b\u3001\u3053\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4ee5\u524d\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3067
\u30b1\u30fc\u30b9\u3092\u958b\u3051\u307e\u3059\u3002
-SolrSearchService.IndexReadOnlyDialog.title=\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u306f\u8aad\u307f\u53d6\u308a\u5c02\u7528\u3067\u3059
SolrSearchService.ServiceName=Solr\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d3\u30b9
SolrSearchService.exceptionMessage.failedToDeleteIndexFiles={0} \u306e\u30c6\u30ad\u30b9\u30c8\u7d22\u5f15\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
SolrSearchService.exceptionMessage.noCurrentSolrCore=IndexMetadata\u306b\u306f\u73fe\u5728\u306eSolr\u306e\u30b3\u30a2\u304c\u542b\u307e\u308c\u3066\u3044\u306a\u304b\u3063\u305f\u305f\u3081\u3001\u30b1\u30fc\u30b9\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-# {0} - \u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc
-SolrSearchService.exceptionMessage.noIndexMetadata=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u304b\u3089\u6b21\u306eIndexMetaData\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
-SolrSearchService.ServiceName=Solr\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d3\u30b9
-DropdownSingleTermSearchPanel.dataSourceCheckBox.text=\u9078\u629e\u3057\u305f\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306b\u691c\u7d22\u3092\u5236\u9650:
-DropdownListSearchPanel.dataSourceCheckBox.text=\u9078\u629e\u3057\u305f\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306b\u691c\u7d22\u3092\u5236\u9650:
-DropdownSingleTermSearchPanel.ingestIndexLabel.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb:
-DropdownSingleTermSearchPanel.jSaveSearchResults.toolTipText=\u30ad\u30fc\u30ef\u30fc\u30c9\u30d2\u30c3\u30c8\u306b\u3088\u308b\u904e\u53bb\u306e\u691c\u7d22\u7d50\u679c\u306e\u5f62\u3067\u7d50\u679c\u3092\u4fdd\u5b58\u305b\u305a\u306b\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u3092\u5b9f\u884c
-DropdownSingleTermSearchPanel.jSaveSearchResults.text=\u691c\u7d22\u7d50\u679c\u3092\u4fdd\u5b58
-DropdownListSearchPanel.jSaveSearchResults.toolTipText=\u30ad\u30fc\u30ef\u30fc\u30c9\u30d2\u30c3\u30c8\u306b\u3088\u308b\u904e\u53bb\u306e\u691c\u7d22\u7d50\u679c\u306e\u5f62\u3067\u7d50\u679c\u3092\u4fdd\u5b58\u305b\u305a\u306b\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u3092\u5b9f\u884c
-DropdownListSearchPanel.jSaveSearchResults.text=\u691c\u7d22\u7d50\u679c\u3092\u4fdd\u5b58
-GlobalEditListPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
-KeywordSearchGlobalLanguageSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
-KeywordSearchGlobalSearchSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
-ExtractedContentPanel.jLabel1.text=\u30c6\u30ad\u30b9\u30c8\u30bd\u30fc\u30b9:
-ExtractedContentPanel.hitNextButton.text=
-ExtractedContentPanel.hitPreviousButton.text=
-ExtractedContentPanel.hitButtonsLabel.text=\u4e00\u81f4\u3059\u308b\u7d50\u679c
-ExtractedContentPanel.hitTotalLabel.text=-
-ExtractedContentPanel.hitOfLabel.text=/
-ExtractedContentPanel.hitCountLabel.text=-
-ExtractedContentPanel.hitLabel.toolTipText=
-ExtractedContentPanel.hitLabel.text=\u30da\u30fc\u30b8\u4e0a\u306e\u4e00\u81f4\u3059\u308b\u7d50\u679c:
-ExtractedContentPanel.pageNextButton.text=
-ExtractedContentPanel.pagePreviousButton.actionCommand=pagePreviousButton
-ExtractedContentPanel.pagePreviousButton.text=
-ExtractedContentPanel.pageButtonsLabel.text=\u30da\u30fc\u30b8
-ExtractedContentPanel.pageTotalLabel.text=-
-ExtractedContentPanel.pageOfLabel.text=/
-ExtractedContentPanel.pageCurLabel.text=-
-ExtractedContentPanel.pagesLabel.text=\u30da\u30fc\u30b8:
+SolrSearchService.exceptionMessage.noIndexMetadata=\u30b1\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u304b\u3089\u6b21\u306eIndexMetaData\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\: {0}
+SolrSearchService.exceptionMessage.unableToDeleteCollection=\u30b3\u30ec\u30af\u30b7\u30e7\u30f3{0}\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093
TextZoomPanel.zoomResetButton.text=\u30ea\u30bb\u30c3\u30c8
-
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractAllTermsReport.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractAllTermsReport.java
new file mode 100755
index 0000000000..b3a754d6b8
--- /dev/null
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractAllTermsReport.java
@@ -0,0 +1,134 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2021 Basis Technology Corp.
+ * Contact: carrier
sleuthkit org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.keywordsearch;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.logging.Level;
+import org.openide.util.NbBundle;
+import org.openide.util.lookup.ServiceProvider;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.autopsy.report.GeneralReportModule;
+import org.sleuthkit.autopsy.report.GeneralReportSettings;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
+
+/**
+ * Instances of this class plug in to the reporting infrastructure to provide a
+ * convenient way to extract all unique terms from Solr index.
+ */
+@ServiceProvider(service = GeneralReportModule.class)
+public class ExtractAllTermsReport implements GeneralReportModule {
+
+ private static final Logger logger = Logger.getLogger(ExtractAllTermsReport.class.getName());
+ private static final String OUTPUT_FILE_NAME = "Unique Words.txt";
+
+ @NbBundle.Messages({
+ "ExtractAllTermsReport.getName.text=Extract Unique Words"})
+ @Override
+ public String getName() {
+ return Bundle.ExtractAllTermsReport_getName_text();
+ }
+
+ @NbBundle.Messages({
+ "ExtractAllTermsReport.error.noOpenCase=No currently open case.",
+ "# {0} - Keyword search commit frequency",
+ "ExtractAllTermsReport.search.noFilesInIdxMsg=No files are in index yet. Try again later. Index is updated every {0} minutes.",
+ "ExtractAllTermsReport.search.noFilesInIdxMsg2=No files are in index yet. Try again later",
+ "ExtractAllTermsReport.search.searchIngestInProgressTitle=Keyword Search Ingest in Progress",
+ "ExtractAllTermsReport.search.ingestInProgressBody=Keyword Search Ingest is currently running.
Not all files have been indexed and unique word extraction might yield incomplete results.
Do you want to proceed with unique word extraction anyway?",
+ "ExtractAllTermsReport.startExport=Starting Unique Word Extraction",
+ "ExtractAllTermsReport.export.error=Error During Unique Word Extraction",
+ "ExtractAllTermsReport.exportComplete=Unique Word Extraction Complete"
+ })
+ @Override
+ public void generateReport(GeneralReportSettings settings, ReportProgressPanel progressPanel) {
+
+ if (!Case.isCaseOpen()) {
+ logger.log(Level.SEVERE, "No open case when attempting to run {0} report", Bundle.ExtractAllTermsReport_getName_text()); //NON-NLS
+ progressPanel.complete(ReportProgressPanel.ReportStatus.ERROR, Bundle.ExtractAllTermsReport_error_noOpenCase());
+ return;
+ }
+
+ progressPanel.setIndeterminate(true);
+ progressPanel.start();
+ progressPanel.updateStatusLabel("Extracting unique words...");
+
+ boolean isIngestRunning = IngestManager.getInstance().isIngestRunning();
+
+ int filesIndexed = 0;
+ try { // see if there are any indexed files
+ filesIndexed = KeywordSearch.getServer().queryNumIndexedFiles();
+ } catch (KeywordSearchModuleException | NoOpenCoreException ignored) {
+ }
+
+ if (filesIndexed == 0) {
+ if (isIngestRunning) {
+ progressPanel.complete(ReportProgressPanel.ReportStatus.ERROR, Bundle.ExtractAllTermsReport_search_noFilesInIdxMsg(KeywordSearchSettings.getUpdateFrequency().getTime()));
+ } else {
+ progressPanel.complete(ReportProgressPanel.ReportStatus.ERROR, Bundle.ExtractAllTermsReport_search_noFilesInIdxMsg2());
+ }
+ progressPanel.setIndeterminate(false);
+ return;
+ }
+
+ // check if keyword search module ingest is running (indexing, etc)
+ if (isIngestRunning) {
+ if (KeywordSearchUtil.displayConfirmDialog(Bundle.ExtractAllTermsReport_search_searchIngestInProgressTitle(),
+ Bundle.ExtractAllTermsReport_search_ingestInProgressBody(), KeywordSearchUtil.DIALOG_MESSAGE_TYPE.WARN) == false) {
+ progressPanel.cancel();
+ return;
+ }
+ }
+
+ final Server server = KeywordSearch.getServer();
+ try {
+ progressPanel.updateStatusLabel(Bundle.ExtractAllTermsReport_startExport());
+ Path outputFile = Paths.get(settings.getReportDirectoryPath(), getRelativeFilePath());
+ server.extractAllTermsForDataSource(outputFile, progressPanel);
+ } catch (KeywordSearchModuleException | NoOpenCoreException ex) {
+ logger.log(Level.SEVERE, "Exception while extracting unique terms", ex); //NON-NLS
+ progressPanel.setIndeterminate(false);
+ progressPanel.complete(ReportProgressPanel.ReportStatus.ERROR, Bundle.ExtractAllTermsReport_export_error());
+ return;
+ }
+
+ progressPanel.setIndeterminate(false);
+ progressPanel.complete(ReportProgressPanel.ReportStatus.COMPLETE, Bundle.ExtractAllTermsReport_exportComplete());
+ }
+
+ @Override
+ public boolean supportsDataSourceSelection() {
+ return false;
+ }
+
+ @NbBundle.Messages({
+ "ExtractAllTermsReport.description.text=Extracts all unique words out of the current case. NOTE: The extracted words are lower-cased."})
+ @Override
+ public String getDescription() {
+ return Bundle.ExtractAllTermsReport_description_text();
+ }
+
+ @Override
+ public String getRelativeFilePath() {
+ return OUTPUT_FILE_NAME;
+ }
+
+}
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java
index 99fef29810..dc9179291d 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/IndexFinder.java
@@ -21,10 +21,8 @@ package org.sleuthkit.autopsy.keywordsearch;
import java.io.File;
import java.nio.file.Paths;
import java.util.List;
-import java.util.logging.Level;
import org.apache.commons.lang.math.NumberUtils;
import org.sleuthkit.autopsy.casemodule.Case;
-import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.appservices.AutopsyService;
/**
@@ -32,7 +30,6 @@ import org.sleuthkit.autopsy.appservices.AutopsyService;
*/
class IndexFinder {
- private static final Logger logger = Logger.getLogger(IndexFinder.class.getName());
private static final String KWS_OUTPUT_FOLDER_NAME = "keywordsearch";
private static final String KWS_DATA_FOLDER_NAME = "data";
private static final String INDEX_FOLDER_NAME = "index";
@@ -48,7 +45,7 @@ class IndexFinder {
return CURRENT_SOLR_SCHEMA_VERSION;
}
- static Index findLatestVersionIndexDir(List allIndexes) {
+ static Index findLatestVersionIndex(List allIndexes) {
for (Index index : allIndexes) {
if (index.getSolrVersion().equals(CURRENT_SOLR_VERSION) && index.getSchemaVersion().equals(CURRENT_SOLR_SCHEMA_VERSION)) {
return index;
@@ -57,7 +54,7 @@ class IndexFinder {
return null;
}
- static Index createLatestVersionIndexDir(Case theCase) throws AutopsyService.AutopsyServiceException {
+ static Index createLatestVersionIndex(Case theCase) throws AutopsyService.AutopsyServiceException {
String indexFolderName = "solr" + CURRENT_SOLR_VERSION + "_schema" + CURRENT_SOLR_SCHEMA_VERSION;
// new index should be stored in "\ModuleOutput\keywordsearch\data\solrX_schemaY\index"
File targetDirPath = Paths.get(theCase.getModuleDirectory(), KWS_OUTPUT_FOLDER_NAME, KWS_DATA_FOLDER_NAME, indexFolderName, INDEX_FOLDER_NAME).toFile(); //NON-NLS
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java
index 7c11d326cc..36ad8c6a29 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java
@@ -36,6 +36,7 @@ import java.net.ServerSocket;
import java.net.SocketException;
import java.nio.charset.Charset;
import java.nio.file.Files;
+import java.nio.file.OpenOption;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -52,6 +53,7 @@ import java.util.logging.Level;
import javax.swing.AbstractAction;
import org.apache.commons.io.FileUtils;
import java.util.concurrent.TimeoutException;
+import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest;
@@ -66,8 +68,10 @@ import org.apache.solr.client.solrj.response.CollectionAdminResponse;
import org.apache.solr.client.solrj.request.CoreAdminRequest;
import org.apache.solr.client.solrj.response.CoreAdminResponse;
import org.apache.solr.client.solrj.impl.BaseHttpSolrClient.RemoteSolrException;
+import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.TermsResponse;
+import org.apache.solr.client.solrj.response.TermsResponse.Term;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrException;
@@ -80,6 +84,7 @@ import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.Case.CaseType;
import org.sleuthkit.autopsy.casemodule.CaseMetadata;
+import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.coreutils.FileUtil;
import org.sleuthkit.autopsy.coreutils.Logger;
@@ -90,6 +95,8 @@ import org.sleuthkit.autopsy.coreutils.ThreadUtils;
import org.sleuthkit.autopsy.healthmonitor.HealthMonitor;
import org.sleuthkit.autopsy.healthmonitor.TimingMetric;
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
+import org.sleuthkit.autopsy.report.GeneralReportSettings;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
import org.sleuthkit.datamodel.Content;
/**
@@ -672,6 +679,13 @@ public class Server {
synchronized void startLocalSolr(SOLR_VERSION version) throws KeywordSearchModuleException, SolrServerNoPortException, SolrServerException {
logger.log(Level.INFO, "Starting local Solr " + version + " server"); //NON-NLS
+ if (version == SOLR_VERSION.SOLR8) {
+ localSolrFolder = InstalledFileLocator.getDefault().locate("solr", Server.class.getPackage().getName(), false); //NON-NLS
+ } else {
+ // solr4
+ localSolrFolder = InstalledFileLocator.getDefault().locate("solr4", Server.class.getPackage().getName(), false); //NON-NLS
+ }
+
if (isLocalSolrRunning()) {
if (localServerVersion.equals(version)) {
// this version of local server is already running
@@ -717,12 +731,10 @@ public class Server {
try {
if (version == SOLR_VERSION.SOLR8) {
logger.log(Level.INFO, "Starting Solr 8 server"); //NON-NLS
- localSolrFolder = InstalledFileLocator.getDefault().locate("solr", Server.class.getPackage().getName(), false); //NON-NLS
curSolrProcess = runLocalSolr8ControlCommand(new ArrayList<>(Arrays.asList("start", "-p", //NON-NLS
Integer.toString(localSolrServerPort)))); //NON-NLS
} else {
// solr4
- localSolrFolder = InstalledFileLocator.getDefault().locate("solr4", Server.class.getPackage().getName(), false); //NON-NLS
logger.log(Level.INFO, "Starting Solr 4 server"); //NON-NLS
curSolrProcess = runLocalSolr4ControlCommand(new ArrayList<>(
Arrays.asList("-Dbootstrap_confdir=../solr/configsets/AutopsyConfig/conf", //NON-NLS
@@ -1780,6 +1792,34 @@ public class Server {
currentCoreLock.writeLock().unlock();
}
}
+
+ /**
+ * Extract all unique terms/words from current index.
+ *
+ * @param outputFile Absolute path to the output file
+ * @param progressPanel ReportProgressPanel to update
+ *
+ * @throws NoOpenCoreException
+ */
+ @NbBundle.Messages({
+ "Server.getAllTerms.error=Extraction of all unique Solr terms failed:"})
+ void extractAllTermsForDataSource(Path outputFile, ReportProgressPanel progressPanel) throws KeywordSearchModuleException, NoOpenCoreException {
+ try {
+ currentCoreLock.writeLock().lock();
+ if (null == currentCollection) {
+ throw new NoOpenCoreException();
+ }
+ try {
+ currentCollection.extractAllTermsForDataSource(outputFile, progressPanel);
+ } catch (Exception ex) {
+ // intentional "catch all" as Solr is known to throw all kinds of Runtime exceptions
+ logger.log(Level.SEVERE, "Extraction of all unique Solr terms failed: ", ex); //NON-NLS
+ throw new KeywordSearchModuleException(Bundle.Server_getAllTerms_error(), ex);
+ }
+ } finally {
+ currentCoreLock.writeLock().unlock();
+ }
+ }
/**
* Get the text contents of the given file as stored in SOLR.
@@ -2127,6 +2167,71 @@ public class Server {
queryClient.deleteByQuery(deleteQuery);
}
+
+ /**
+ * Extract all unique terms/words from current index. Gets 1,000 terms at a time and
+ * writes them to output file. Updates ReportProgressPanel status.
+ *
+ * @param outputFile Absolute path to the output file
+ * @param progressPanel ReportProgressPanel to update
+ * @throws IOException
+ * @throws SolrServerException
+ * @throws NoCurrentCaseException
+ * @throws KeywordSearchModuleException
+ */
+ @NbBundle.Messages({
+ "# {0} - Number of extracted terms",
+ "ExtractAllTermsReport.numberExtractedTerms=Extracted {0} terms..."
+ })
+ private void extractAllTermsForDataSource(Path outputFile, ReportProgressPanel progressPanel) throws IOException, SolrServerException, NoCurrentCaseException, KeywordSearchModuleException {
+
+ Files.deleteIfExists(outputFile);
+ OpenOption[] options = new OpenOption[] { java.nio.file.StandardOpenOption.CREATE, java.nio.file.StandardOpenOption.APPEND };
+
+ // step through the terms
+ int termStep = 1000;
+ long numExtractedTerms = 0;
+ String firstTerm = "";
+ while (true) {
+ SolrQuery query = new SolrQuery();
+ query.setRequestHandler("/terms");
+ query.setTerms(true);
+ query.setTermsLimit(termStep);
+ query.setTermsLower(firstTerm);
+ query.setTermsLowerInclusive(false);
+
+ // Returned terms sorted by "index" order, which is the fastest way. Per Solr documentation:
+ // "Retrieving terms in index order is very fast since the implementation directly uses Lucene’s TermEnum to iterate over the term dictionary."
+ // All other sort criteria return very inconsistent and overlapping resuts.
+ query.setTermsSortString("index");
+
+ // "text" field is the schema field that we populate with (lowercased) terms
+ query.addTermsField(Server.Schema.TEXT.toString());
+ query.setTermsMinCount(0);
+
+ // Unfortunatelly Solr "terms queries" do not support any filtering so we can't filter by data source this way.
+ // query.addFilterQuery(Server.Schema.IMAGE_ID.toString() + ":" + dataSourceId);
+
+ QueryRequest request = new QueryRequest(query);
+ TermsResponse response = request.process(queryClient).getTermsResponse();
+ List terms = response.getTerms(Server.Schema.TEXT.toString());
+
+ if (terms == null || terms.isEmpty()) {
+ numExtractedTerms += terms.size();
+ progressPanel.updateStatusLabel(Bundle.ExtractAllTermsReport_numberExtractedTerms(numExtractedTerms));
+ break;
+ }
+
+ // set the first term for the next query
+ firstTerm = terms.get(terms.size()-1).getTerm();
+
+ List listTerms = terms.stream().map(Term::getTerm).collect(Collectors.toList());
+ Files.write(outputFile, listTerms, options);
+
+ numExtractedTerms += termStep;
+ progressPanel.updateStatusLabel(Bundle.ExtractAllTermsReport_numberExtractedTerms(numExtractedTerms));
+ }
+ }
/**
* Add a Solr document for indexing. Documents get batched instead of
@@ -2163,7 +2268,6 @@ public class Server {
*
* @throws KeywordSearchModuleException
*/
- // ELTODO DECIDE ON SYNCHRONIZATION
private void sendBufferedDocs(List docBuffer) throws KeywordSearchModuleException {
if (docBuffer.isEmpty()) {
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java
index be3794c60e..218be24de8 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java
@@ -309,14 +309,14 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService {
// new case that doesn't have an existing index. create new index folder
progressUnitsCompleted++;
progress.progress(Bundle.SolrSearch_creatingNewIndex_msg(), progressUnitsCompleted);
- currentVersionIndex = IndexFinder.createLatestVersionIndexDir(theCase);
+ currentVersionIndex = IndexFinder.createLatestVersionIndex(theCase);
// add current index to the list of indexes that exist for this case
indexes.add(currentVersionIndex);
} else {
// check if one of the existing indexes is for latest Solr version and schema
progressUnitsCompleted++;
progress.progress(Bundle.SolrSearch_checkingForLatestIndex_msg(), progressUnitsCompleted);
- currentVersionIndex = IndexFinder.findLatestVersionIndexDir(indexes);
+ currentVersionIndex = IndexFinder.findLatestVersionIndex(indexes);
if (currentVersionIndex == null) {
// found existing index(es) but none were for latest Solr version and schema version
progressUnitsCompleted++;
diff --git a/NEWS.txt b/NEWS.txt
index b51c0948de..d437c75034 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -3,6 +3,7 @@ Keyword Search:
- A major upgrade from Solr 4 to Solr 8.6.3. Single user cases continue to use the embedded server.
Multi-user clusters need to install a new Solr 8 server and can now create a Solr cloud with multiple servers.
-- NOTE: Cases created with Autopsy 4.18 cannot be opened by previous versions of Autopsy. Autopsy 4.18 can open older cases though.
+-- See http://sleuthkit.org/autopsy/docs/user-docs/4.18.0/upgrade_solr8_page.html for more details.
- Improved text indexing speed by not doing language detection on unknown file formats and unallocated space.
Domain Discovery:
diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED
index 86bf343c8f..77d6eb550f 100755
--- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED
+++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle.properties-MERGED
@@ -88,7 +88,7 @@ ExtractZone_progress_Msg=Extracting :Zone.Identifer files
ExtractZone_Restricted=Restricted Sites Zone
ExtractZone_Trusted=Trusted Sites Zone
OpenIDE-Module-Display-Category=Ingest Module
-OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\n\The module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy.
+OpenIDE-Module-Long-Description=Recent Activity ingest module.\n\nThe module extracts useful information about the recent user activity on the disk image being ingested, such as:\n\n- Recently open documents,\n- Web activity (sites visited, stored cookies, book marked sites, search engine queries, file downloads),\n- Recently attached devices,\n- Installed programs.\n\nThe module currently supports Windows only disk images.\nThe plugin is also fully functional when deployed on Windows version of Autopsy.
OpenIDE-Module-Name=RecentActivity
OpenIDE-Module-Short-Description=Recent Activity finder ingest module
Chrome.moduleName=Chromium
diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle_ja.properties b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle_ja.properties
index c088d66978..e1ea4fb368 100644
--- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle_ja.properties
+++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/Bundle_ja.properties
@@ -1,4 +1,4 @@
-#Tue Aug 18 18:09:21 UTC 2020
+#Fri Feb 12 16:56:29 UTC 2021
Chrome.getBookmark.errMsg.errAnalyzeFile={0}\:\u30d5\u30a1\u30a4\u30eb\:{1}\u3092\u89e3\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
Chrome.getBookmark.errMsg.errAnalyzingFile={0}\:\u30d5\u30a1\u30a4\u30eb\:{1}\u3092\u89e3\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
Chrome.getBookmark.errMsg.errAnalyzingFile3={0}\:\u30d5\u30a1\u30a4\u30eb\:{1}\u3092\u89e3\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
@@ -13,12 +13,15 @@ Chrome.getHistory.errMsg.errAnalyzingFile={0}\:\u30d5\u30a1\u30a4\u30eb\:{1}\u30
Chrome.getHistory.errMsg.errGettingFiles=Chrome\u5c65\u6b74\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
Chrome.getLogin.errMsg.errAnalyzingFiles={0}\:\u30d5\u30a1\u30a4\u30eb\:{1}\u3092\u89e3\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
Chrome.getLogin.errMsg.errGettingFiles=Chrome\u5c65\u6b74\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-Chrome.moduleName=Chrome
+Chrome.moduleName=Chromium
Chrome.parentModuleName=\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3
ChromeCacheExtract_adding_artifacts_msg=Chrome\u30ad\u30e3\u30c3\u30b7\u30e5\uff1a\u5206\u6790\u306e\u305f\u3081\u306b%d\u500b\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002
ChromeCacheExtract_adding_extracted_files_msg=Chrome\u30ad\u30e3\u30c3\u30b7\u30e5\uff1a\u5206\u6790\u306e\u305f\u3081\u306b%d\u500b\u306e\u62bd\u51fa\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002
ChromeCacheExtract_loading_files_msg=Chrome\u30ad\u30e3\u30c3\u30b7\u30e5\uff1a %s\u304b\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002
DataSourceUsage_DJU_Drone_DAT=DJI\u5185\u8535SD\u30ab\u30fc\u30c9
+DomainCategoryRunner_Progress_Message_Domain_Types=\u30c9\u30e1\u30a4\u30f3\u30bf\u30a4\u30d7\u306e\u691c\u7d22
+DomainCategoryRunner_moduleName_text=DomainCategoryRunner
+DomainCategoryRunner_parentModuleName=\u6700\u8fd1\u306e\u6d3b\u52d5
Extract.dbConn.errMsg.failedToQueryDb={0}\:\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30af\u30a8\u30ea\u5b9f\u884c\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
ExtractIE.getBookmark.errMsg.errGettingBookmarks={0}\: Internet Explorer\u30d6\u30c3\u30af\u30de\u30fc\u30af\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
ExtractIE.getCookie.errMsg.errGettingFile={0}\:Internet Explorer\u306ecookie\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
@@ -36,22 +39,30 @@ ExtractIE.parentModuleName.noSpace=\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u3
ExtractIE.parsePascoOutput.errMsg.errParsing={0}\:Internet Explorer\u5c65\u6b74\u30a8\u30f3\u30c8\u30ea{1}\u3092\u30d1\u30fc\u30b9\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
ExtractIE.parsePascoOutput.errMsg.errParsingEntry={0}\: Internet Explorer\u5c65\u6b74\u30a8\u30f3\u30c8\u30ea\u3092\u30d1\u30fc\u30b9\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
ExtractIE.parsePascoOutput.errMsg.notFound={0}\:Pasco\u30a2\u30a6\u30c8\u30d7\u30c3\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\uff1a{1}
+ExtractIE_executePasco_errMsg_errorRunningPasco={0}\uff1aInternet Explorer\u306eWeb\u5c65\u6b74\u306e\u5206\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ExtractPrefetch_errMsg_prefetchParsingFailed={0}\uff1a\u30d7\u30ea\u30d5\u30a7\u30c3\u30c1\u30fb\u30d5\u30a1\u30a4\u30eb\u306e\u5206\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
ExtractPrefetch_module_name=Windows Prefetch Extractor
+ExtractRecycleBin_Recyle_Bin_Display_Name=\u3054\u307f\u7bb1
ExtractRegistry.analyzeRegFiles.errMsg.errReadingRegFile={0}\:\u30ec\u30b8\u30b9\u30c8\u30ea\u30d5\u30a1\u30a4\u30eb - {1}\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
ExtractRegistry.analyzeRegFiles.errMsg.errWritingTemp={0}\:\u30ec\u30b8\u30b9\u30c8\u30ea\u30d5\u30a1\u30a4\u30eb{1}\u3092\u89e3\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
ExtractRegistry.analyzeRegFiles.failedParsingResults={0}\:\u30ec\u30b8\u30b9\u30c8\u30ea\u30d5\u30a1\u30a4\u30eb\u7d50\u679c\u306e\u30d1\u30fc\u30b9\u306b\u5931\u6557\u3057\u307e\u3057\u305f{1}
-ExtractRegistry.execRegRip.errMsg.failedAnalyzeRegFile={0}\:\u30ec\u30b8\u30b9\u30c8\u30ea\u30d5\u30a1\u30a4\u30eb\u306e\u89e3\u6790\u306b\u5931\u6557\u3057\u307e\u3057\u305f {1}
+ExtractRegistry.execRegRip.errMsg.failedAnalyzeRegFile={0}\uff1a\u30ec\u30b8\u30b9\u30c8\u30ea\u30d5\u30a1\u30a4\u30eb{1}\u306e\u5206\u6790\u306b\u5931\u6557\u3057\u307e\u3057\u305f
ExtractRegistry.findRegFiles.errMsg.errReadingFile=\u30ec\u30b8\u30b9\u30c8\u30ea\u30d5\u30a1\u30a4\u30eb\uff1a{0}\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
ExtractRegistry.moduleName.text=\u30ec\u30b8\u30b9\u30c8\u30ea
ExtractRegistry.parentModuleName.noSpace=\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3
ExtractRegistry.programName=\u30ec\u30b8\u30b9\u30c8\u30ea\u30ea\u30c3\u30d1\u30fc
-ExtractSru_error_finding_export_srudb_program=export_srudb\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u691c\u7d22\u306b\u5931\u6557\u3057\u307e\u3057\u305f
-ExtractSru_module_name=\u30b7\u30b9\u30c6\u30e0\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u91cf\u62bd\u51fa
-ExtractSru_process_error_executing_export_srudb_program=export_srudb\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u30a8\u30e9\u30fc
+ExtractSru_error_finding_export_srudb_program=export_srudb\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u691c\u7d22\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ExtractSru_module_name=\u30b7\u30b9\u30c6\u30e0\u30fb\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u91cf\u62bd\u51fa\u6a5f\u80fd
+ExtractSru_process_error_executing_export_srudb_program=export_srudb\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
ExtractSru_process_errormsg_find_software_hive=SOFTWARE HIVE\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
ExtractSru_process_errormsg_find_srudb_dat=srudb.dat\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
ExtractSru_process_errormsg_write_software_hive=SOFTWARE HIVE\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304d\u8fbc\u3081\u307e\u305b\u3093
-ExtractSru_process_errormsg_write_srudb_dat=srudb.dat\u30d5\u30a1\u30a4\u30eb\u306b\u66f8\u304d\u8fbc\u3081\u307e\u305b\u3093
+ExtractSru_process_errormsg_write_srudb_dat=srudb.dat\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304d\u8fbc\u3081\u307e\u305b\u3093
+ExtractWebAccountType.moduleName.text=Web\u30a2\u30ab\u30a6\u30f3\u30c8\u30bf\u30a4\u30d7
+ExtractWebAccountType.parentModuleName=\u6700\u8fd1\u306e\u6d3b\u52d5
+ExtractWebAccountType.role.admin=\u7ba1\u7406\u8005\u306e\u5f79\u5272
+ExtractWebAccountType.role.moderator=\u30e2\u30c7\u30ec\u30fc\u30bf\u30fc\u306e\u5f79\u5272
+ExtractWebAccountType.role.user=\u30e6\u30fc\u30b6\u30fc\u306e\u5f79\u5272
Firefox.getBookmark.errMsg.errAnalyzeFile={0}\:\u30d5\u30a1\u30a4\u30eb\:{1}\u306e\u89e3\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
Firefox.getBookmark.errMsg.errFetchFiles=Firefox\u306e\u30d6\u30c3\u30af\u30de\u30fc\u30af\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
Firefox.getCookie.errMsg.errAnalyzeFile={0}\:\u30d5\u30a1\u30a4\u30eb\:{1}\u3092\u89e3\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
@@ -72,6 +83,12 @@ OpenIDE-Module-Display-Category=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8
OpenIDE-Module-Long-Description=\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3002\n\n\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306e\u30c7\u30a3\u30b9\u30af\u30a4\u30e1\u30fc\u30b8\u304b\u3089\u6709\u7528\u306a\u6700\u8fd1\u306e\u30e6\u30fc\u30b6\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3092\u62bd\u51fa\u3057\u307e\u3059\u3002\u4f8b\u3048\u3070\uff1a\n\n-\u6700\u8fd1\u958b\u3044\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3001\n-\u30a6\u30a7\u30d6\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\uff08\u8a2a\u308c\u305f\u30b5\u30a4\u30c8\u3001\u4fdd\u5b58\u3055\u308c\u305fCookie\u3001\u30d6\u30c3\u30af\u30de\u30fc\u30af\u3055\u308c\u305f\u30b5\u30a4\u30c8\u3001\u30b5\u30fc\u30c1\u30a8\u30f3\u30b8\u30f3\u30af\u30a8\u30ea\u3001\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\uff09\u3001\n-\u6700\u8fd1\u63a5\u7d9a\u3057\u305f\u30c7\u30d0\u30a4\u30b9\u3001\n-\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u305f\u30d7\u30ed\u30b0\u30e9\u30e0\u3002\n\n\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u73fe\u5728Windows\u306e\u30c7\u30a3\u30b9\u30af\u30a4\u30e1\u30fc\u30b8\u3057\u304b\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002\n\u30d7\u30e9\u30b0\u30a4\u30f3\u306fWindows\u7248\u306eAutopsy\u3092\u5229\u7528\u3059\u308b\u3068\u5168\u3066\u306e\u6a5f\u80fd\u304c\u4f7f\u3048\u307e\u3059\u3002
OpenIDE-Module-Name=\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3
OpenIDE-Module-Short-Description=\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u30d5\u30a1\u30a4\u30f3\u30c0\u30fc\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
+Progress_Message_Chrome_AutoFill=Chrome\u81ea\u52d5\u5165\u529b\u30d6\u30e9\u30a6\u30b6{0}
+Progress_Message_Chrome_Bookmarks=Chrome\u30d6\u30c3\u30af\u30de\u30fc\u30af\u30d6\u30e9\u30a6\u30b6{0}
+Progress_Message_Chrome_Cookies=Chrome\u30af\u30c3\u30ad\u30fc\u30d6\u30e9\u30a6\u30b6{0}
+Progress_Message_Chrome_Downloads=Chrome\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u30d6\u30e9\u30a6\u30b6{0}
+Progress_Message_Chrome_History=Chrome\u5c65\u6b74\u30d6\u30e9\u30a6\u30b6{0}
+Progress_Message_Chrome_Logins=Chrome\u30ed\u30b0\u30a4\u30f3\u30d6\u30e9\u30a6\u30b6{0}
RAImageIngestModule.complete.errMsg.failed={0} \u5b8c\u4e86\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f - \u8a73\u7d30\u306f\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044
RAImageIngestModule.getDesc=\u30a6\u30a7\u30d6\u30d6\u30e9\u30a6\u30b8\u30f3\u30b0\u3001\u6700\u8fd1\u958b\u3044\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3001\u6700\u8fd1\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u305f\u30d7\u30ed\u30b0\u30e9\u30e0\u7b49\u306e\u6700\u8fd1\u306e\u30e6\u30fc\u30b6\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u3092\u62bd\u51fa\u3057\u307e\u3059\u3002
RAImageIngestModule.getName=\u6700\u8fd1\u306e\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3
@@ -100,7 +117,7 @@ Recently_Used_Artifacts_Mmc=Windows\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30ebMRU
Recently_Used_Artifacts_Office_Trustrecords=Office\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u4f8b\u5916\u304c\u8a31\u53ef\u3055\u308c\u305f\u305f\u3081\u3001TrustRecords\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f
Recently_Used_Artifacts_Officedocs=Office MRU\u306b\u3088\u308b\u3068\u6700\u8fd1\u958b\u3044\u3066\u307e\u3059
Recently_Used_Artifacts_Winrar=WinRAR MRU\u306b\u3088\u308b\u3068\u6700\u8fd1\u958b\u3044\u3066\u307e\u3059
-Registry_System_Bam=\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30fb\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u30fb\u30e2\u30c7\u30ec\u30fc\u30bf\u30fc\uff08BAM\uff09\u306b\u3088\u3046\u3068\u6700\u8fd1\u5b9f\u884c\u3055\u308c\u3066\u307e\u3059
+Registry_System_Bam=\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30fb\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u30fb\u30e2\u30c7\u30ec\u30fc\u30bf\u30fc\uff08BAM\uff09\u306b\u3088\u308b\u3068\u6700\u8fd1\u5b9f\u884c\u3055\u308c\u307e\u3057\u305f
SearchEngineURLQueryAnalyzer.domainSubStr.none=\u7121\u3057
SearchEngineURLQueryAnalyzer.engineName.none=\u7121\u3057
SearchEngineURLQueryAnalyzer.init.exception.msg={0}\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f
diff --git a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java
index f464ed0b63..4a735e890d 100644
--- a/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java
+++ b/RecentActivity/src/org/sleuthkit/autopsy/recentactivity/ExtractRegistry.java
@@ -2318,8 +2318,9 @@ class ExtractRegistry extends Extract {
// "Default Admin User", "Custom Limited Acct"
// and "Default Guest Acct"
value = userInfo.get(ACCOUNT_TYPE_KEY);
- if (value != null && !value.isEmpty()) {
- osAccount.setIsAdmin(value.toLowerCase().contains("Admin"));
+ if (value != null && !value.isEmpty() && value.toLowerCase().contains("admin")) {
+ attributes.add(createOsAccountAttribute(ATTRIBUTE_TYPE.TSK_IS_ADMIN,
+ 1, osAccount, host, regFile));
}
value = userInfo.get(USER_COMMENT_KEY);
diff --git a/release_scripts/localization_scripts/lastupdated.properties b/release_scripts/localization_scripts/lastupdated.properties
index db7e961472..c31c7c9180 100644
--- a/release_scripts/localization_scripts/lastupdated.properties
+++ b/release_scripts/localization_scripts/lastupdated.properties
@@ -1,2 +1,2 @@
-# in format of bundles..lastupdated=
-bundles.ja.lastupdated=d9a37c48f4bd0dff014eead73a0eb730c875ed9f
\ No newline at end of file
+#Fri Feb 12 16:56:29 UTC 2021
+bundles.ja.lastupdated=c2a4ececfba59d230d1a263f7124e67f88e8d3e6
diff --git a/test/script/tskdbdiff.py b/test/script/tskdbdiff.py
index 0d4e7f7ab9..85087892b1 100644
--- a/test/script/tskdbdiff.py
+++ b/test/script/tskdbdiff.py
@@ -329,7 +329,8 @@ class TskDbDiff(object):
id_legacy_artifact_types = build_id_legacy_artifact_types_table(conn.cursor(), isMultiUser)
id_reports_table = build_id_reports_table(conn.cursor(), isMultiUser)
id_images_table = build_id_image_names_table(conn.cursor(), isMultiUser)
- id_obj_path_table = build_id_obj_path_table(id_files_table, id_objects_table, id_artifact_types_table, id_reports_table, id_images_table)
+ id_accounts_table = build_id_accounts_table(conn.cursor(), isMultiUser)
+ id_obj_path_table = build_id_obj_path_table(id_files_table, id_objects_table, id_artifact_types_table, id_reports_table, id_images_table, id_accounts_table)
if isMultiUser: # Use PostgreSQL
os.environ['PGPASSWORD']=pgSettings.password
@@ -352,7 +353,7 @@ class TskDbDiff(object):
if 'INSERT INTO image_gallery_groups_seen' in dump_line:
dump_line = ''
continue;
- dump_line = normalize_db_entry(dump_line, id_obj_path_table, id_vs_parts_table, id_vs_info_table, id_fs_info_table, id_objects_table, id_reports_table, id_images_table, id_legacy_artifact_types)
+ dump_line = normalize_db_entry(dump_line, id_obj_path_table, id_vs_parts_table, id_vs_info_table, id_fs_info_table, id_objects_table, id_reports_table, id_images_table, id_legacy_artifact_types, id_accounts_table)
db_log.write('%s\n' % dump_line)
dump_line = ''
postgreSQL_db.close()
@@ -366,7 +367,7 @@ class TskDbDiff(object):
for line in conn.iterdump():
if 'INSERT INTO "image_gallery_groups_seen"' in line:
continue
- line = normalize_db_entry(line, id_obj_path_table, id_vs_parts_table, id_vs_info_table, id_fs_info_table, id_objects_table, id_reports_table, id_images_table, id_legacy_artifact_types)
+ line = normalize_db_entry(line, id_obj_path_table, id_vs_parts_table, id_vs_info_table, id_fs_info_table, id_objects_table, id_reports_table, id_images_table, id_legacy_artifact_types, id_accounts_table)
db_log.write('%s\n' % line)
# Now sort the file
srtcmdlst = ["sort", dump_file, "-o", dump_file]
@@ -419,7 +420,7 @@ class PGSettings(object):
return self.password
-def normalize_db_entry(line, files_table, vs_parts_table, vs_info_table, fs_info_table, objects_table, reports_table, images_table, artifact_table):
+def normalize_db_entry(line, files_table, vs_parts_table, vs_info_table, fs_info_table, objects_table, reports_table, images_table, artifact_table, accounts_table):
""" Make testing more consistent and reasonable by doctoring certain db entries.
Args:
@@ -442,6 +443,7 @@ def normalize_db_entry(line, files_table, vs_parts_table, vs_info_table, fs_info
ig_groups_index = line.find('INSERT INTO "image_gallery_groups"') > -1 or line.find('INSERT INTO image_gallery_groups ') > -1
ig_groups_seen_index = line.find('INSERT INTO "image_gallery_groups_seen"') > -1 or line.find('INSERT INTO image_gallery_groups_seen ') > -1
os_account_index = line.find('INSERT INTO "tsk_os_accounts"') > -1 or line.find('INSERT INTO tsk_os_accounts') > -1
+ os_account_attr_index = line.find('INSERT INTO "tsk_os_account_attributes"') > -1 or line.find('INSERT INTO tsk_os_account_attributes') > -1
parens = line[line.find('(') + 1 : line.rfind(')')]
no_space_parens = parens.replace(" ", "")
@@ -569,6 +571,8 @@ def normalize_db_entry(line, files_table, vs_parts_table, vs_info_table, fs_info
parent_path = fs_info_table[parent_id]
elif parent_id in images_table.keys():
parent_path = images_table[parent_id]
+ elif parent_id in accounts_table.keys():
+ parent_path = accounts_table[parent_id]
elif parent_id == 'NULL':
parent_path = "NULL"
@@ -636,7 +640,29 @@ def normalize_db_entry(line, files_table, vs_parts_table, vs_info_table, fs_info
newLine = ('INSERT INTO "tsk_event_descriptions" VALUES(' + ','.join(fields_list[1:]) + ');') # remove report_id
return newLine
elif os_account_index:
- newLine = ('INSERT INTO "tsk_os_accounts" VALUES(' + ','.join(fields_list[1:]) + ');') # remove id
+ newLine = ('INSERT INTO "tsk_os_accounts" VALUES(' + ','.join(fields_list[1:]) + ');') # remove id since value that would be substituted is in diff line already
+ return newLine
+ elif os_account_attr_index:
+ #substitue the account object id for a non changing value
+ os_account_id = int(fields_list[1])
+ fields_list[1] = accounts_table[os_account_id]
+ #substitue the source object id for a non changing value
+ source_obj_id = int(fields_list[3])
+ if source_obj_id in files_table.keys():
+ fields_list[3] = files_table[source_obj_id]
+ elif source_obj_id in vs_parts_table.keys():
+ fields_list[3] = vs_parts_table[source_obj_id]
+ elif source_obj_id in vs_info_table.keys():
+ fields_list[3] = vs_info_table[source_obj_id]
+ elif source_obj_id in fs_info_table.keys():
+ fields_list[3] = fs_info_table[source_obj_id]
+ elif source_obj_id in images_table.keys():
+ fields_list[3] = images_table[source_obj_id]
+ elif source_obj_id in accounts_table.keys():
+ fields_list[3] = accounts_table[source_obj_id]
+ elif source_obj_id == 'NULL':
+ fields_list[3] = "NULL"
+ newLine = ('INSERT INTO "tsk_os_account_attributes" VALUES(' + ','.join(fields_list[1:]) + ');') # remove id
return newLine
else:
return line
@@ -758,8 +784,18 @@ def build_id_reports_table(db_cursor, isPostgreSQL):
mapping = dict([(row[0], row[1]) for row in sql_select_execute(db_cursor, isPostgreSQL, "SELECT obj_id, path FROM reports")])
return mapping
+def build_id_accounts_table(db_cursor, isPostgreSQL):
+ """Build the map of object ids to OS account SIDs.
-def build_id_obj_path_table(files_table, objects_table, artifacts_table, reports_table, images_table):
+ Args:
+ db_cursor: the database cursor
+ """
+ # for each row in the db, take the object id and account SID then creates a tuple in the dictionary
+ # with the object id as the key and the OS Account's SID as the value
+ mapping = dict([(row[0], row[1]) for row in sql_select_execute(db_cursor, isPostgreSQL, "SELECT os_account_obj_id, unique_id FROM tsk_os_accounts")])
+ return mapping
+
+def build_id_obj_path_table(files_table, objects_table, artifacts_table, reports_table, images_table, accounts_table):
"""Build the map of object ids to artifact ids.
Args:
@@ -767,6 +803,8 @@ def build_id_obj_path_table(files_table, objects_table, artifacts_table, reports
objects_table: obj_id, par_obj_id, type
artifacts_table: obj_id, artifact_type_name
reports_table: obj_id, path
+ images_table: obj_id, name
+ accounts_table: obj_id, unique_id
"""
# make a copy of files_table and update it with new data from artifacts_table and reports_table
mapping = files_table.copy()
@@ -786,6 +824,8 @@ def build_id_obj_path_table(files_table, objects_table, artifacts_table, reports
elif par_obj_id in images_table.keys():
path = images_table[par_obj_id]
mapping[k] = path + "/" + artifacts_table[k]
+ elif k in accounts_table.keys(): # For an OS Account object ID we use its unique_id field which is the account SID
+ mapping[k] = accounts_table[k]
elif v[0] not in mapping.keys():
if v[0] in artifacts_table.keys():
par_obj_id = objects_table[v[0]]