mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 16:06:15 +00:00
Merge.
This commit is contained in:
commit
022dbe81fb
@ -19,22 +19,16 @@
|
|||||||
package org.sleuthkit.autopsy.modules.filetypeid;
|
package org.sleuthkit.autopsy.modules.filetypeid;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import org.apache.tika.Tika;
|
import org.apache.tika.Tika;
|
||||||
import org.apache.tika.io.TikaInputStream;
|
import org.apache.tika.io.TikaInputStream;
|
||||||
import org.apache.tika.mime.MimeTypes;
|
import org.apache.tika.mime.MimeTypes;
|
||||||
import org.sleuthkit.autopsy.casemodule.Case;
|
|
||||||
import org.sleuthkit.autopsy.casemodule.services.Blackboard;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
|
||||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
|
||||||
import org.sleuthkit.datamodel.ReadContentInputStream;
|
import org.sleuthkit.datamodel.ReadContentInputStream;
|
||||||
import org.sleuthkit.datamodel.TskCoreException;
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
import org.sleuthkit.datamodel.TskData;
|
import org.sleuthkit.datamodel.TskData;
|
||||||
@ -278,52 +272,30 @@ public class FileTypeDetector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines whether or not the a file matches a user-defined custom file
|
* Determines whether or not a file matches a user-defined custom file type.
|
||||||
* type. If the file matches and corresponds to an interesting files type
|
|
||||||
* rule, this method has the side effect of creating an interesting files
|
|
||||||
* hit artifact and indexing that artifact for keyword search.
|
|
||||||
*
|
*
|
||||||
* @param file The file to test.
|
* @param file The file to test.
|
||||||
*
|
*
|
||||||
* @return The file type name string or null, if no match is detected.
|
* @return The MIME type as a string if a match is found; otherwise null.
|
||||||
*
|
|
||||||
* @throws TskCoreException
|
|
||||||
*/
|
*/
|
||||||
private String detectUserDefinedType(AbstractFile file) {
|
private String detectUserDefinedType(AbstractFile file) {
|
||||||
|
String retValue = null;
|
||||||
|
|
||||||
for (FileType fileType : userDefinedFileTypes) {
|
for (FileType fileType : userDefinedFileTypes) {
|
||||||
if (fileType.matches(file)) {
|
if (fileType.matches(file)) {
|
||||||
if (fileType.createInterestingFileHit()) {
|
retValue = fileType.getMimeType();
|
||||||
try {
|
break;
|
||||||
BlackboardArtifact artifact;
|
|
||||||
artifact = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
|
|
||||||
Collection<BlackboardAttribute> attributes = new ArrayList<>();
|
|
||||||
BlackboardAttribute setNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, FileTypeIdModuleFactory.getModuleName(), fileType.getInterestingFilesSetName());
|
|
||||||
attributes.add(setNameAttribute);
|
|
||||||
BlackboardAttribute ruleNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY, FileTypeIdModuleFactory.getModuleName(), fileType.getMimeType());
|
|
||||||
attributes.add(ruleNameAttribute);
|
|
||||||
artifact.addAttributes(attributes);
|
|
||||||
try {
|
|
||||||
Case.getCurrentCase().getServices().getBlackboard().indexArtifact(artifact);
|
|
||||||
} catch (Blackboard.BlackboardException ex) {
|
|
||||||
logger.log(Level.SEVERE, String.format("Unable to index TSK_INTERESTING_FILE_HIT blackboard artifact %d (file obj_id=%d)", artifact.getArtifactID(), file.getId()), ex); //NON-NLS
|
|
||||||
}
|
|
||||||
} catch (TskCoreException ex) {
|
|
||||||
logger.log(Level.SEVERE, String.format("Unable to create TSK_INTERESTING_FILE_HIT artifact for file (obj_id=%d)", file.getId()), ex); //NON-NLS
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fileType.getMimeType();
|
return retValue;
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines whether or not the a file matches a custom file type defined
|
* Determines whether or not a file matches a custom file type defined by Autopsy.
|
||||||
* by Autopsy.
|
|
||||||
*
|
*
|
||||||
* @param file The file to test.
|
* @param file The file to test.
|
||||||
*
|
*
|
||||||
* @return The file type name string or null, if no match is detected.
|
* @return The MIME type as a string if a match is found; otherwise null.
|
||||||
*/
|
*/
|
||||||
private String detectAutopsyDefinedType(AbstractFile file) {
|
private String detectAutopsyDefinedType(AbstractFile file) {
|
||||||
for (FileType fileType : autopsyDefinedFileTypes) {
|
for (FileType fileType : autopsyDefinedFileTypes) {
|
||||||
@ -395,7 +367,7 @@ public class FileTypeDetector {
|
|||||||
*
|
*
|
||||||
* @throws TskCoreException if detection is required and there is a problem
|
* @throws TskCoreException if detection is required and there is a problem
|
||||||
* writing the result to the case database.
|
* writing the result to the case database.
|
||||||
* @deprecated Use detectMIMEType instead, and call AbstractFile.setMIMEType
|
* @deprecated Use getMIMEType instead, and call AbstractFile.setMIMEType
|
||||||
* and AbstractFile.save to save the result to the file object and the
|
* and AbstractFile.save to save the result to the file object and the
|
||||||
* database.
|
* database.
|
||||||
*/
|
*/
|
||||||
@ -419,7 +391,7 @@ public class FileTypeDetector {
|
|||||||
* @throws TskCoreException if detection is required and there is a problem
|
* @throws TskCoreException if detection is required and there is a problem
|
||||||
* writing the result to the case database.
|
* writing the result to the case database.
|
||||||
*
|
*
|
||||||
* @deprecated Use detectMIMEType instead, and call AbstractFile.setMIMEType
|
* @deprecated Use getMIMEType instead, and call AbstractFile.setMIMEType
|
||||||
* and AbstractFile.save to save the result to the file object and the
|
* and AbstractFile.save to save the result to the file object and the
|
||||||
* database.
|
* database.
|
||||||
*/
|
*/
|
||||||
@ -441,7 +413,7 @@ public class FileTypeDetector {
|
|||||||
* were uncertain, octet-stream is returned.
|
* were uncertain, octet-stream is returned.
|
||||||
*
|
*
|
||||||
* @throws TskCoreException
|
* @throws TskCoreException
|
||||||
* @deprecated Use detectMIMEType instead.
|
* @deprecated Use getMIMEType instead.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public String detect(AbstractFile file) throws TskCoreException {
|
public String detect(AbstractFile file) throws TskCoreException {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2013-2015 Basis Technology Corp.
|
* Copyright 2013-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -18,9 +18,14 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.modules.filetypeid;
|
package org.sleuthkit.autopsy.modules.filetypeid;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.Case;
|
||||||
|
import org.sleuthkit.autopsy.casemodule.services.Blackboard;
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.ingest.FileIngestModule;
|
import org.sleuthkit.autopsy.ingest.FileIngestModule;
|
||||||
import org.sleuthkit.autopsy.ingest.IngestJobContext;
|
import org.sleuthkit.autopsy.ingest.IngestJobContext;
|
||||||
@ -29,6 +34,9 @@ import org.sleuthkit.autopsy.ingest.IngestServices;
|
|||||||
import org.sleuthkit.datamodel.AbstractFile;
|
import org.sleuthkit.datamodel.AbstractFile;
|
||||||
import org.sleuthkit.autopsy.ingest.IngestModule.ProcessResult;
|
import org.sleuthkit.autopsy.ingest.IngestModule.ProcessResult;
|
||||||
import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter;
|
import org.sleuthkit.autopsy.ingest.IngestModuleReferenceCounter;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||||
|
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||||
|
import org.sleuthkit.datamodel.TskCoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detects the type of a file based on signature (magic) values. Posts results
|
* Detects the type of a file based on signature (magic) values. Posts results
|
||||||
@ -91,7 +99,12 @@ public class FileTypeIdIngestModule implements FileIngestModule {
|
|||||||
*/
|
*/
|
||||||
try {
|
try {
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
fileTypeDetector.getMIMEType(file);
|
String mimeType = fileTypeDetector.getMIMEType(file);
|
||||||
|
file.setMIMEType(mimeType);
|
||||||
|
FileType fileType = detectUserDefinedFileType(file);
|
||||||
|
if (fileType != null && fileType.createInterestingFileHit()) {
|
||||||
|
createInterestingFileHit(file, fileType);
|
||||||
|
}
|
||||||
addToTotals(jobId, (System.currentTimeMillis() - startTime));
|
addToTotals(jobId, (System.currentTimeMillis() - startTime));
|
||||||
return ProcessResult.OK;
|
return ProcessResult.OK;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -100,6 +113,57 @@ public class FileTypeIdIngestModule implements FileIngestModule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether or not a file matches a user-defined custom file type.
|
||||||
|
*
|
||||||
|
* @param file The file to test.
|
||||||
|
*
|
||||||
|
* @return The file type if a match is found; otherwise null.
|
||||||
|
*
|
||||||
|
* @throws CustomFileTypesException If there is an issue getting an instance
|
||||||
|
* of CustomFileTypesManager.
|
||||||
|
*/
|
||||||
|
private FileType detectUserDefinedFileType(AbstractFile file) throws CustomFileTypesManager.CustomFileTypesException {
|
||||||
|
FileType retValue = null;
|
||||||
|
|
||||||
|
CustomFileTypesManager customFileTypesManager = CustomFileTypesManager.getInstance();
|
||||||
|
List<FileType> fileTypesList = customFileTypesManager.getUserDefinedFileTypes();
|
||||||
|
for (FileType fileType : fileTypesList) {
|
||||||
|
if (fileType.matches(file)) {
|
||||||
|
retValue = fileType;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an Interesting File hit using the specified file type rule.
|
||||||
|
*
|
||||||
|
* @param file The file from which to generate an artifact.
|
||||||
|
* @param fileType The file type rule for categorizing the hit.
|
||||||
|
*/
|
||||||
|
private void createInterestingFileHit(AbstractFile file, FileType fileType) {
|
||||||
|
try {
|
||||||
|
BlackboardArtifact artifact;
|
||||||
|
artifact = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
|
||||||
|
Collection<BlackboardAttribute> attributes = new ArrayList<>();
|
||||||
|
BlackboardAttribute setNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, FileTypeIdModuleFactory.getModuleName(), fileType.getInterestingFilesSetName());
|
||||||
|
attributes.add(setNameAttribute);
|
||||||
|
BlackboardAttribute ruleNameAttribute = new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY, FileTypeIdModuleFactory.getModuleName(), fileType.getMimeType());
|
||||||
|
attributes.add(ruleNameAttribute);
|
||||||
|
artifact.addAttributes(attributes);
|
||||||
|
try {
|
||||||
|
Case.getCurrentCase().getServices().getBlackboard().indexArtifact(artifact);
|
||||||
|
} catch (Blackboard.BlackboardException ex) {
|
||||||
|
logger.log(Level.SEVERE, String.format("Unable to index TSK_INTERESTING_FILE_HIT blackboard artifact %d (file obj_id=%d)", artifact.getArtifactID(), file.getId()), ex); //NON-NLS
|
||||||
|
}
|
||||||
|
} catch (TskCoreException ex) {
|
||||||
|
logger.log(Level.SEVERE, String.format("Unable to create TSK_INTERESTING_FILE_HIT artifact for file (obj_id=%d)", file.getId()), ex); //NON-NLS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void shutDown() {
|
public void shutDown() {
|
||||||
/**
|
/**
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2017 Basis Technology Corp.
|
* Copyright 2011-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -284,15 +284,6 @@ class AccountsText implements IndexedText {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NbBundle.Messages({"AccountsText.getMarkup.noMatchMsg="
|
|
||||||
+ "<html><pre><span style\\\\='background\\\\:yellow'>There were no keyword hits on this page. <br />"
|
|
||||||
+ "The keyword could have been in the file name."
|
|
||||||
+ " <br />Advance to another page if present, or to view the original text, choose File Text"
|
|
||||||
+ " <br />in the drop down menu to the right...</span></pre></html>",
|
|
||||||
"AccountsText.getMarkup.queryFailedMsg="
|
|
||||||
+ "<html><pre><span style\\\\='background\\\\:yellow'>Failed to retrieve keyword hit results."
|
|
||||||
+ " <br />Confirm that Autopsy can connect to the Solr server. "
|
|
||||||
+ "<br /></span></pre></html>"})
|
|
||||||
public String getText() {
|
public String getText() {
|
||||||
try {
|
try {
|
||||||
loadPageInfo(); //inits once
|
loadPageInfo(); //inits once
|
||||||
@ -321,7 +312,7 @@ class AccountsText implements IndexedText {
|
|||||||
return "<html><pre>" + highlightedText + "</pre></html>"; //NON-NLS
|
return "<html><pre>" + highlightedText + "</pre></html>"; //NON-NLS
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
logger.log(Level.SEVERE, "Error getting highlighted text for Solr doc id " + this.solrObjectId + ", chunkID " + this.currentPage, ex); //NON-NLS
|
logger.log(Level.SEVERE, "Error getting highlighted text for Solr doc id " + this.solrObjectId + ", chunkID " + this.currentPage, ex); //NON-NLS
|
||||||
return Bundle.AccountsText_getMarkup_queryFailedMsg();
|
return Bundle.IndexedText_errorMessage_errorGettingText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,11 +54,6 @@ AbstractKeywordSearchPerformer.search.noFilesInIdxMsg=<html>No files are in inde
|
|||||||
AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=<html>No files were indexed.<br />Re-ingest the image with the Keyword Search Module enabled. </html>
|
AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=<html>No files were indexed.<br />Re-ingest the image with the Keyword Search Module enabled. </html>
|
||||||
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.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=Indexed Text
|
ExtractedContentViewer.getTitle=Indexed 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=<span>Failed to retrieve indexed text for keyword hit. Advance to another page if present, or to view the original text, choose File Text in the drop down menu to the right. Alternatively, you may choose to extract file content and search for the hit using an external application (e.g. a text editor).</span>
|
|
||||||
HighlightedMatchesSource.getMarkup.queryFailedMsg=<html><pre><span style\\\\\='background\\\\\:yellow'>Failed to retrieve keyword hit results. <br />Confirm that Autopsy can connect to the Solr server. <br /></span></pre></html>
|
|
||||||
HighlightedMatchesSource.toString=Search Results
|
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.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.reportStopPortError=Indexing server stop port {0} is not available. Consider changing {1} in {2} property file in the application user folder.
|
||||||
@ -272,7 +267,6 @@ KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.text=No periodic searche
|
|||||||
SolrConnectionCheck.HostnameOrPort=Invalid hostname and/or port number.
|
SolrConnectionCheck.HostnameOrPort=Invalid hostname and/or port number.
|
||||||
SolrConnectionCheck.Hostname=Invalid hostname.
|
SolrConnectionCheck.Hostname=Invalid hostname.
|
||||||
SolrConnectionCheck.MissingHostname=Missing hostname.
|
SolrConnectionCheck.MissingHostname=Missing hostname.
|
||||||
RawText.getText.error.msg=Error getting text
|
|
||||||
GlobalListsManagementPanel.newListButton.text=New List
|
GlobalListsManagementPanel.newListButton.text=New List
|
||||||
GlobalListsManagementPanel.importButton.text=Import List
|
GlobalListsManagementPanel.importButton.text=Import List
|
||||||
GlobalListsManagementPanel.keywordListsLabel.text=Keyword Lists:
|
GlobalListsManagementPanel.keywordListsLabel.text=Keyword Lists:
|
||||||
|
@ -46,7 +46,6 @@ AbstractKeywordSearchPerformer.search.noFilesIdxdMsg=<html>\u30a4\u30f3\u30c7\u3
|
|||||||
ExtractedContentPanel.setMarkup.panelTxt=<span style\='font-style\:italic'>\u30c6\u30ad\u30b9\u30c8\u30ed\u30fc\u30c9\u4e2d...\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002</span>
|
ExtractedContentPanel.setMarkup.panelTxt=<span style\='font-style\:italic'>\u30c6\u30ad\u30b9\u30c8\u30ed\u30fc\u30c9\u4e2d...\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002</span>
|
||||||
ExtractedContentViewer.toolTip=\u30d5\u30a1\u30a4\u30eb\u3084\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u7d50\u679c\u304b\u3089\u62bd\u51fa\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8\u3092\u8868\u793a\u3002\u3053\u306e\u30d3\u30e5\u30fc\u30a2\u3092\u6709\u52b9\u5316\u3059\u308b\u306b\u306f\u3001\u30d5\u30a1\u30a4\u30eb\u306b\u5bfe\u3057\u3066\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
|
ExtractedContentViewer.toolTip=\u30d5\u30a1\u30a4\u30eb\u3084\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u7d50\u679c\u304b\u3089\u62bd\u51fa\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8\u3092\u8868\u793a\u3002\u3053\u306e\u30d3\u30e5\u30fc\u30a2\u3092\u6709\u52b9\u5316\u3059\u308b\u306b\u306f\u3001\u30d5\u30a1\u30a4\u30eb\u306b\u5bfe\u3057\u3066\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
|
||||||
ExtractedContentViewer.getTitle=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8
|
ExtractedContentViewer.getTitle=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u305f\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\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306b\u6709\u52b9\u5316\u3055\u308c\u3066\u3044\u306a\u304b\u3063\u305f\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002</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\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306b\u6709\u52b9\u5316\u3055\u308c\u3066\u3044\u306a\u304b\u3063\u305f\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002</p>
|
||||||
HighlightedMatchesSource.toString=\u691c\u7d22\u7d50\u679c
|
HighlightedMatchesSource.toString=\u691c\u7d22\u7d50\u679c
|
||||||
Installer.reportPortError=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b5\u30fc\u30d0\u30fc\u30dd\u30fc\u30c8 {0} \u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002\u4f7f\u7528\u3057\u3066\u3044\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c {1} \u3092\u30d6\u30ed\u30c3\u30af\u3057\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30e6\u30fc\u30b6\u30fc\u30d5\u30a9\u30eb\u30c0\u30fc\u5185\u306e{3}\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u306e{2}\u3092\u5909\u66f4\u3059\u308b\u691c\u8a0e\u3092\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3082\u3057\u4ed6\u306e\u51e6\u7406\u304c\u554f\u984c\u306e\u539f\u56e0\u3067\u3042\u308c\u3070\u3001\u30b7\u30b9\u30c6\u30e0\u3092\u518d\u8d77\u52d5\u3057\u3066\u4e0b\u3055\u3044\u3002
|
Installer.reportPortError=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b5\u30fc\u30d0\u30fc\u30dd\u30fc\u30c8 {0} \u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002\u4f7f\u7528\u3057\u3066\u3044\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c {1} \u3092\u30d6\u30ed\u30c3\u30af\u3057\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30e6\u30fc\u30b6\u30fc\u30d5\u30a9\u30eb\u30c0\u30fc\u5185\u306e{3}\u30d7\u30ed\u30d1\u30c6\u30a3\u30d5\u30a1\u30a4\u30eb\u306e{2}\u3092\u5909\u66f4\u3059\u308b\u691c\u8a0e\u3092\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3082\u3057\u4ed6\u306e\u51e6\u7406\u304c\u554f\u984c\u306e\u539f\u56e0\u3067\u3042\u308c\u3070\u3001\u30b7\u30b9\u30c6\u30e0\u3092\u518d\u8d77\u52d5\u3057\u3066\u4e0b\u3055\u3044\u3002
|
||||||
@ -200,7 +199,6 @@ KeywordSearchIngestModule.doInBackGround.finalizeMsg=- \u6700\u7d42\u51e6\u7406\
|
|||||||
KeywordSearchIngestModule.doInBackGround.pendingMsg=\uff08\u30da\u30f3\u30c7\u30a3\u30f3\u30b0\uff09
|
KeywordSearchIngestModule.doInBackGround.pendingMsg=\uff08\u30da\u30f3\u30c7\u30a3\u30f3\u30b0\uff09
|
||||||
SearchRunner.doInBackGround.cancelMsg=\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09
|
SearchRunner.doInBackGround.cancelMsg=\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09
|
||||||
Server.addDoc.exception.msg2=\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u4f7f\u7528\u3057\u307e\u3057\u305f\u304c\u3001\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u6b21\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\uff1a{0}
|
Server.addDoc.exception.msg2=\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u4f7f\u7528\u3057\u307e\u3057\u305f\u304c\u3001\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306b\u6b21\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\uff1a{0}
|
||||||
ExtractedContentViewer.getSolrContent.txtBodyItal=<span style\=''font-style\:italic''>{0}</span>
|
|
||||||
KeywordSearchJobSettingsPanel.keywordSearchEncodings.text=-
|
KeywordSearchJobSettingsPanel.keywordSearchEncodings.text=-
|
||||||
KeywordSearchJobSettingsPanel.languagesValLabel.text=-
|
KeywordSearchJobSettingsPanel.languagesValLabel.text=-
|
||||||
KeywordSearchJobSettingsPanel.encodingsLabel.text=\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\uff1a
|
KeywordSearchJobSettingsPanel.encodingsLabel.text=\u30a8\u30f3\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\uff1a
|
||||||
@ -261,7 +259,6 @@ KeywordSearchModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8a2d\u5b9a\
|
|||||||
SearchRunner.Searcher.done.err.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u3092\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
|
SearchRunner.Searcher.done.err.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u3092\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
|
||||||
KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.text=\u5b9a\u671f\u7684\u691c\u7d22\u7121\u3057
|
KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.text=\u5b9a\u671f\u7684\u691c\u7d22\u7121\u3057
|
||||||
KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.toolTipText=\u5168\u4f53\u7684\u306b\u4e00\u756a\u901f\u3044\u3067\u3059\u304c\u3001\u51e6\u7406\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u7d50\u679c\u306f\u8868\u793a\u3055\u308c\u307e\u305b\u3093
|
KeywordSearchGlobalSearchSettingsPanel.timeRadioButton5.toolTipText=\u5168\u4f53\u7684\u306b\u4e00\u756a\u901f\u3044\u3067\u3059\u304c\u3001\u51e6\u7406\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u7d50\u679c\u306f\u8868\u793a\u3055\u308c\u307e\u305b\u3093
|
||||||
HighlightedMatchesSource.getMarkup.queryFailedMsg=<html><pre><span style\\\\\='background\\\\\:yellow'>\u30ad\u30fc\u30ef\u30fc\u30c9\u306b\u30d2\u30c3\u30c8\u3057\u305f\u7d50\u679c\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002<br />Autopsy\u304cSolr\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br /></span></pre></html>\
|
|
||||||
KeywordSearch.openCore.notification.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f
|
KeywordSearch.openCore.notification.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f
|
||||||
KeywordSearch.closeCore.notification.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u9589\u3058\u308b\u969b\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
|
KeywordSearch.closeCore.notification.msg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u9589\u3058\u308b\u969b\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
|
||||||
KeywordSearchListsManagementPanel.fileExtensionFilterLb2=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u30a8\u30f3\u30b1\u30fc\u30b9\u3059\u308b(txt)
|
KeywordSearchListsManagementPanel.fileExtensionFilterLb2=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u30a8\u30f3\u30b1\u30fc\u30b9\u3059\u308b(txt)
|
||||||
@ -272,7 +269,7 @@ SolrConnectionCheck.HostnameOrPort=hostname\u3084\u30dd\u30fc\u30c8\u756a\u53f7\
|
|||||||
SolrConnectionCheck.Hostname=hostname\u304c\u7121\u52b9\u3067\u3059\u3002
|
SolrConnectionCheck.Hostname=hostname\u304c\u7121\u52b9\u3067\u3059\u3002
|
||||||
SolrConnectionCheck.Port=\u30dd\u30fc\u30c8\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059\u3002
|
SolrConnectionCheck.Port=\u30dd\u30fc\u30c8\u756a\u53f7\u304c\u7121\u52b9\u3067\u3059\u3002
|
||||||
SolrConnectionCheck.MissingHostname=hostname\u304c\u6b20\u3051\u3066\u307e\u3059\u3002
|
SolrConnectionCheck.MissingHostname=hostname\u304c\u6b20\u3051\u3066\u307e\u3059\u3002
|
||||||
RawText.getText.error.msg=\u30c6\u30ad\u30b9\u30c8\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
|
ExtractedContentViewer.getText.error.msg=\u30c6\u30ad\u30b9\u30c8\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
|
||||||
GlobalListsManagementPanel.exportButton.text=\u30ea\u30b9\u30c8\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
|
GlobalListsManagementPanel.exportButton.text=\u30ea\u30b9\u30c8\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
|
||||||
GlobalListsManagementPanel.deleteListButton.text=\u30ea\u30b9\u30c8\u3092\u524a\u9664
|
GlobalListsManagementPanel.deleteListButton.text=\u30ea\u30b9\u30c8\u3092\u524a\u9664
|
||||||
GlobalListsManagementPanel.copyListButton.text=\u30ea\u30b9\u30c8\u3092\u30b3\u30d4\u30fc
|
GlobalListsManagementPanel.copyListButton.text=\u30ea\u30b9\u30c8\u3092\u30b3\u30d4\u30fc
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-17 Basis Technology Corp.
|
* Copyright 2011-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -24,6 +24,7 @@ import java.awt.event.ActionListener;
|
|||||||
import java.awt.event.ItemEvent;
|
import java.awt.event.ItemEvent;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CancellationException;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.swing.JTextPane;
|
import javax.swing.JTextPane;
|
||||||
@ -647,8 +648,6 @@ class ExtractedContentPanel extends javax.swing.JPanel {
|
|||||||
return source.getText();
|
return source.getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NbBundle.Messages({
|
|
||||||
"ExtractedContentPanel.SetMarkup.error=There was an error getting the text for the selected source."})
|
|
||||||
@Override
|
@Override
|
||||||
protected void done() {
|
protected void done() {
|
||||||
super.done();
|
super.done();
|
||||||
@ -663,11 +662,9 @@ class ExtractedContentPanel extends javax.swing.JPanel {
|
|||||||
setPanelText("", false);
|
setPanelText("", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (InterruptedException | ExecutionException ex) {
|
} catch (InterruptedException | CancellationException | ExecutionException ex) {
|
||||||
logger.log(Level.SEVERE, "Error getting marked up text", ex); //NON-NLS
|
logger.log(Level.SEVERE, "Error getting marked up text", ex); //NON-NLS
|
||||||
setPanelText(Bundle.ExtractedContentPanel_SetMarkup_error(), true);
|
setPanelText(Bundle.IndexedText_errorMessage_errorGettingText(), true);
|
||||||
} // catch and ignore if we were cancelled
|
|
||||||
catch (java.util.concurrent.CancellationException ex) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateControls(source);
|
updateControls(source);
|
||||||
|
@ -40,7 +40,6 @@ import org.apache.solr.client.solrj.SolrRequest.METHOD;
|
|||||||
import org.apache.solr.client.solrj.response.QueryResponse;
|
import org.apache.solr.client.solrj.response.QueryResponse;
|
||||||
import org.apache.solr.common.SolrDocumentList;
|
import org.apache.solr.common.SolrDocumentList;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import org.openide.util.NbBundle.Messages;
|
|
||||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
import org.sleuthkit.autopsy.coreutils.Version;
|
import org.sleuthkit.autopsy.coreutils.Version;
|
||||||
import org.sleuthkit.autopsy.keywordsearch.KeywordQueryFilter.FilterType;
|
import org.sleuthkit.autopsy.keywordsearch.KeywordQueryFilter.FilterType;
|
||||||
@ -103,13 +102,13 @@ class HighlightedText implements IndexedText {
|
|||||||
/**
|
/**
|
||||||
* This constructor is used when keyword hits are accessed from the ad-hoc
|
* This constructor is used when keyword hits are accessed from the ad-hoc
|
||||||
* search results. In that case we have the entire QueryResults object and
|
* search results. In that case we have the entire QueryResults object and
|
||||||
need to arrange the paging.
|
* need to arrange the paging.
|
||||||
*
|
*
|
||||||
* @param solrObjectId The solrObjectId of the content whose text will be
|
* @param solrObjectId The solrObjectId of the content whose text will be
|
||||||
* highlighted.
|
* highlighted.
|
||||||
* @param QueryResults The QueryResults for the ad-hoc search from whose
|
* @param QueryResults The QueryResults for the ad-hoc search from whose
|
||||||
results a selection was made leading to this
|
* results a selection was made leading to this
|
||||||
HighlightedText.
|
* HighlightedText.
|
||||||
*/
|
*/
|
||||||
HighlightedText(long solrObjectId, QueryResults hits) {
|
HighlightedText(long solrObjectId, QueryResults hits) {
|
||||||
this.solrObjectId = solrObjectId;
|
this.solrObjectId = solrObjectId;
|
||||||
@ -139,7 +138,6 @@ class HighlightedText implements IndexedText {
|
|||||||
* This method figures out which pages / chunks have hits. Invoking it a
|
* This method figures out which pages / chunks have hits. Invoking it a
|
||||||
* second time has no effect.
|
* second time has no effect.
|
||||||
*/
|
*/
|
||||||
@Messages({"HighlightedText.query.exception.msg=Could not perform the query to get chunk info and get highlights:"})
|
|
||||||
synchronized private void loadPageInfo() throws TskCoreException, KeywordSearchModuleException, NoOpenCoreException {
|
synchronized private void loadPageInfo() throws TskCoreException, KeywordSearchModuleException, NoOpenCoreException {
|
||||||
if (isPageInfoLoaded) {
|
if (isPageInfoLoaded) {
|
||||||
return;
|
return;
|
||||||
@ -157,7 +155,6 @@ class HighlightedText implements IndexedText {
|
|||||||
this.numberPages = 1;
|
this.numberPages = 1;
|
||||||
this.currentPage = 1;
|
this.currentPage = 1;
|
||||||
numberOfHitsPerPage.put(1, 0);
|
numberOfHitsPerPage.put(1, 0);
|
||||||
pages.add(1);
|
|
||||||
currentHitPerPage.put(1, 0);
|
currentHitPerPage.put(1, 0);
|
||||||
isPageInfoLoaded = true;
|
isPageInfoLoaded = true;
|
||||||
}
|
}
|
||||||
@ -206,10 +203,10 @@ class HighlightedText implements IndexedText {
|
|||||||
isLiteral = hits.getQuery().isLiteral();
|
isLiteral = hits.getQuery().isLiteral();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Organize the hits by page, filter as needed.
|
* Organize the hits by page, filter as needed. We process *every*
|
||||||
* We process *every* keyword here because in the case of a regular
|
* keyword here because in the case of a regular expression search there
|
||||||
* expression search there may be multiple different keyword
|
* may be multiple different keyword hits located in different chunks
|
||||||
* hits located in different chunks for the same file/artifact.
|
* for the same file/artifact.
|
||||||
*/
|
*/
|
||||||
for (Keyword k : hits.getKeywords()) {
|
for (Keyword k : hits.getKeywords()) {
|
||||||
for (KeywordHit hit : hits.getResults(k)) {
|
for (KeywordHit hit : hits.getResults(k)) {
|
||||||
@ -427,7 +424,7 @@ class HighlightedText implements IndexedText {
|
|||||||
return "<html><pre>" + highlightedContent + "</pre></html>"; //NON-NLS
|
return "<html><pre>" + highlightedContent + "</pre></html>"; //NON-NLS
|
||||||
} catch (TskCoreException | KeywordSearchModuleException | NoOpenCoreException ex) {
|
} catch (TskCoreException | KeywordSearchModuleException | NoOpenCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Error getting highlighted text for Solr doc id " + solrObjectId + ", chunkID " + chunkID + ", highlight query: " + highlightField, ex); //NON-NLS
|
logger.log(Level.SEVERE, "Error getting highlighted text for Solr doc id " + solrObjectId + ", chunkID " + chunkID + ", highlight query: " + highlightField, ex); //NON-NLS
|
||||||
return NbBundle.getMessage(this.getClass(), "HighlightedMatchesSource.getMarkup.queryFailedMsg");
|
return Bundle.IndexedText_errorMessage_errorGettingText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -465,12 +462,13 @@ class HighlightedText implements IndexedText {
|
|||||||
* to a Solr query. We expect there to only ever be
|
* to a Solr query. We expect there to only ever be
|
||||||
* a single document.
|
* a single document.
|
||||||
*
|
*
|
||||||
* @return Either a string with the keyword highlighted via HTML span tags or a string
|
* @return Either a string with the keyword highlighted via HTML span tags
|
||||||
* indicating that we did not find a hit in the document.
|
* or a string indicating that we did not find a hit in the
|
||||||
|
* document.
|
||||||
*/
|
*/
|
||||||
static String attemptManualHighlighting(SolrDocumentList solrDocumentList, String highlightField, Collection<String> keywords) {
|
static String attemptManualHighlighting(SolrDocumentList solrDocumentList, String highlightField, Collection<String> keywords) {
|
||||||
if (solrDocumentList.isEmpty()) {
|
if (solrDocumentList.isEmpty()) {
|
||||||
return NbBundle.getMessage(HighlightedText.class, "HighlightedMatchesSource.getMarkup.noMatchMsg");
|
return Bundle.IndexedText_errorMessage_errorGettingText();
|
||||||
}
|
}
|
||||||
|
|
||||||
// It doesn't make sense for there to be more than a single document in
|
// It doesn't make sense for there to be more than a single document in
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2017 Basis Technology Corp.
|
* Copyright 2011-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -18,12 +18,19 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.keywordsearch;
|
package org.sleuthkit.autopsy.keywordsearch;
|
||||||
|
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface to provide HTML text to display in ExtractedContentViewer. There is
|
* Interface to provide HTML text to display in ExtractedContentViewer. There is
|
||||||
* a SOLR implementation of this that interfaces with SOLR to highlight the
|
* a SOLR implementation of this that interfaces with SOLR to highlight the
|
||||||
* keyword hits and a version that does not do markup so that you can simply
|
* keyword hits and a version that does not do markup so that you can simply
|
||||||
* view the stored text.
|
* view the stored text.
|
||||||
*/
|
*/
|
||||||
|
@NbBundle.Messages({
|
||||||
|
"IndexedText.errorMessage.errorGettingText=<span style='font-style:italic'>Error retrieving indexed text.</span>",
|
||||||
|
"IndexedText.warningMessage.knownFile=<span style='font-style:italic'>This file is a known file (based on MD5 hash) and does not have indexed text.</span>",
|
||||||
|
"IndexedText.warningMessage.noTextAvailable=<span style='font-style:italic'>No indexed text for this file.</span>"
|
||||||
|
})
|
||||||
interface IndexedText {
|
interface IndexedText {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Autopsy Forensic Browser
|
* Autopsy Forensic Browser
|
||||||
*
|
*
|
||||||
* Copyright 2011-2017 Basis Technology Corp.
|
* Copyright 2011-2018 Basis Technology Corp.
|
||||||
* Contact: carrier <at> sleuthkit <dot> org
|
* Contact: carrier <at> sleuthkit <dot> org
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@ -18,7 +18,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.keywordsearch;
|
package org.sleuthkit.autopsy.keywordsearch;
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import org.apache.solr.client.solrj.SolrServerException;
|
import org.apache.solr.client.solrj.SolrServerException;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
@ -153,10 +152,10 @@ class RawText implements IndexedText {
|
|||||||
} else if (this.blackboardArtifact != null) {
|
} else if (this.blackboardArtifact != null) {
|
||||||
return getArtifactText();
|
return getArtifactText();
|
||||||
}
|
}
|
||||||
} catch (SolrServerException ex) {
|
} catch (SolrServerException | NoOpenCoreException ex) {
|
||||||
logger.log(Level.SEVERE, "Couldn't get extracted content", ex); //NON-NLS
|
logger.log(Level.SEVERE, "Couldn't get extracted text", ex); //NON-NLS
|
||||||
}
|
}
|
||||||
return NbBundle.getMessage(this.getClass(), "RawText.getText.error.msg");
|
return Bundle.IndexedText_errorMessage_errorGettingText();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NbBundle.Messages({
|
@NbBundle.Messages({
|
||||||
@ -186,7 +185,6 @@ class RawText implements IndexedText {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getNumberPages() {
|
public int getNumberPages() {
|
||||||
return numPages;
|
return numPages;
|
||||||
@ -207,11 +205,8 @@ class RawText implements IndexedText {
|
|||||||
} else {
|
} else {
|
||||||
hasChunks = true;
|
hasChunks = true;
|
||||||
}
|
}
|
||||||
} catch (KeywordSearchModuleException ex) {
|
} catch (KeywordSearchModuleException | NoOpenCoreException ex) {
|
||||||
logger.log(Level.WARNING, "Could not get number of chunks: ", ex); //NON-NLS
|
logger.log(Level.SEVERE, "Could not get number of chunks: ", ex); //NON-NLS
|
||||||
|
|
||||||
} catch (NoOpenCoreException ex) {
|
|
||||||
logger.log(Level.WARNING, "Could not get number of chunks: ", ex); //NON-NLS
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,31 +220,32 @@ class RawText implements IndexedText {
|
|||||||
* chunks. This means we need to address the content
|
* chunks. This means we need to address the content
|
||||||
* pages specially.
|
* pages specially.
|
||||||
*
|
*
|
||||||
* @return the extracted content
|
* @return the extracted text
|
||||||
*
|
*
|
||||||
* @throws SolrServerException if something goes wrong
|
* @throws NoOpenCoreException If no Solr core is available.
|
||||||
|
* @throws SolrServerException If there's a Solr communication or parsing
|
||||||
|
* issue.
|
||||||
*/
|
*/
|
||||||
private String getContentText(int currentPage, boolean hasChunks) throws SolrServerException {
|
private String getContentText(int currentPage, boolean hasChunks) throws NoOpenCoreException, SolrServerException {
|
||||||
final Server solrServer = KeywordSearch.getServer();
|
final Server solrServer = KeywordSearch.getServer();
|
||||||
|
|
||||||
if (hasChunks == false) {
|
if (hasChunks == false) {
|
||||||
//if no chunks, it is safe to assume there is no text content
|
//if no chunks, it is safe to assume there is no text content
|
||||||
//because we are storing extracted text in chunks only
|
//because we are storing extracted text in chunks only
|
||||||
//and the non-chunk stores meta-data only
|
//and the non-chunk stores meta-data only
|
||||||
String name = content.getName();
|
|
||||||
String msg = null;
|
String msg = null;
|
||||||
|
|
||||||
if (content instanceof AbstractFile) {
|
if (content instanceof AbstractFile) {
|
||||||
//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 = TskData.FileKnown.KNOWN.equals(((AbstractFile) content).getKnown());
|
boolean isKnown = TskData.FileKnown.KNOWN.equals(((AbstractFile) content).getKnown());
|
||||||
if (isKnown && KeywordSearchSettings.getSkipKnown()) {
|
if (isKnown && KeywordSearchSettings.getSkipKnown()) {
|
||||||
msg = NbBundle.getMessage(this.getClass(), "ExtractedContentViewer.getSolrContent.knownFileMsg", name);
|
msg = Bundle.IndexedText_warningMessage_knownFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (msg == null) {
|
if (msg == null) {
|
||||||
msg = NbBundle.getMessage(this.getClass(), "ExtractedContentViewer.getSolrContent.noTxtYetMsg", name);
|
msg = Bundle.IndexedText_warningMessage_noTextAvailable();
|
||||||
}
|
}
|
||||||
String htmlMsg = NbBundle.getMessage(this.getClass(), "ExtractedContentViewer.getSolrContent.txtBodyItal", msg);
|
return msg;
|
||||||
return htmlMsg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int chunkId = currentPage;
|
int chunkId = currentPage;
|
||||||
@ -262,33 +258,46 @@ class RawText implements IndexedText {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//not cached
|
//not cached
|
||||||
try {
|
|
||||||
String indexedText = solrServer.getSolrContent(this.objectId, chunkId);
|
String indexedText = solrServer.getSolrContent(this.objectId, chunkId);
|
||||||
if (indexedText == null) indexedText = "";
|
if (indexedText == null) {
|
||||||
|
if (content instanceof AbstractFile) {
|
||||||
|
return Bundle.IndexedText_errorMessage_errorGettingText();
|
||||||
|
} else {
|
||||||
|
return Bundle.IndexedText_warningMessage_noTextAvailable();
|
||||||
|
}
|
||||||
|
} else if (indexedText.isEmpty()) {
|
||||||
|
return Bundle.IndexedText_warningMessage_noTextAvailable();
|
||||||
|
}
|
||||||
|
|
||||||
cachedString = EscapeUtil.escapeHtml(indexedText).trim();
|
cachedString = EscapeUtil.escapeHtml(indexedText).trim();
|
||||||
StringBuilder sb = new StringBuilder(cachedString.length() + 20);
|
StringBuilder sb = new StringBuilder(cachedString.length() + 20);
|
||||||
sb.append("<pre>").append(cachedString).append("</pre>"); //NON-NLS
|
sb.append("<pre>").append(cachedString).append("</pre>"); //NON-NLS
|
||||||
cachedString = sb.toString();
|
cachedString = sb.toString();
|
||||||
cachedChunk = chunkId;
|
cachedChunk = chunkId;
|
||||||
} catch (NoOpenCoreException ex) {
|
|
||||||
logger.log(Level.SEVERE, "No open core", ex); //NON-NLS
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return cachedString;
|
return cachedString;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getArtifactText() throws SolrServerException{
|
/**
|
||||||
try {
|
* Get extracted artifact for a node from Solr
|
||||||
|
*
|
||||||
|
* @return the extracted text
|
||||||
|
*
|
||||||
|
* @throws NoOpenCoreException If no Solr core is available.
|
||||||
|
* @throws SolrServerException If there's a Solr communication or parsing
|
||||||
|
* issue.
|
||||||
|
*/
|
||||||
|
private String getArtifactText() throws NoOpenCoreException, SolrServerException {
|
||||||
String indexedText = KeywordSearch.getServer().getSolrContent(this.objectId, 1);
|
String indexedText = KeywordSearch.getServer().getSolrContent(this.objectId, 1);
|
||||||
if (indexedText == null) indexedText = "";
|
if (indexedText == null || indexedText.isEmpty()) {
|
||||||
|
return Bundle.IndexedText_errorMessage_errorGettingText();
|
||||||
|
}
|
||||||
|
|
||||||
indexedText = EscapeUtil.escapeHtml(indexedText).trim();
|
indexedText = EscapeUtil.escapeHtml(indexedText).trim();
|
||||||
StringBuilder sb = new StringBuilder(indexedText.length() + 20);
|
StringBuilder sb = new StringBuilder(indexedText.length() + 20);
|
||||||
sb.append("<pre>").append(indexedText).append("</pre>"); //NON-NLS
|
sb.append("<pre>").append(indexedText).append("</pre>"); //NON-NLS
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
} catch (NoOpenCoreException ex) {
|
|
||||||
logger.log(Level.SEVERE, "No open core", ex); //NON-NLS
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user