diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/services/Blackboard.java b/Core/src/org/sleuthkit/autopsy/casemodule/services/Blackboard.java index 70b10b0f0e..58b4f41d6e 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/services/Blackboard.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/services/Blackboard.java @@ -1,14 +1,14 @@ /* - * Sleuth Kit Data Model + * Autopsy Forensic Browser * - * Copyright 2011-2016 Basis Technology Corp. + * Copyright 2015-2018 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 + * 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, @@ -65,7 +65,7 @@ public final class Blackboard implements Closeable { throw new BlackboardException("Keyword search service not found"); } try { - searchService.indexArtifact(artifact); + searchService.index(artifact); } catch (TskCoreException ex) { throw new BlackboardException("Error indexing artifact", ex); } diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/FileTypeViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/FileTypeViewer.java similarity index 77% rename from Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/FileTypeViewer.java rename to Core/src/org/sleuthkit/autopsy/contentviewers/FileTypeViewer.java index b3ae7210a2..a2096dd2d9 100644 --- a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/FileTypeViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/FileTypeViewer.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.sleuthkit.autopsy.corecomponentinterfaces; +package org.sleuthkit.autopsy.contentviewers; import java.awt.Component; import java.util.List; @@ -26,7 +26,7 @@ import org.sleuthkit.datamodel.AbstractFile; * Defines an interface for application specific content viewer * */ -public interface FileTypeViewer { +interface FileTypeViewer { /** * Returns list of MIME types supported by this viewer @@ -45,6 +45,11 @@ public interface FileTypeViewer { /** * Clears the data in the panel + * + * IMPORTANT IF MAKING THIS PUBLIC: I (RC) am not sure that this method + * belongs in this interface. If we are not going to use setFile(null) as a + * reset method as in DataContentViewer and DataResultViewer, then this is + * fine. Otherwise, it is ambiguous. */ void resetComponent(); } diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/FileViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/FileViewer.java index 98cee5bc59..53be8ddbcd 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/FileViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/FileViewer.java @@ -31,7 +31,6 @@ import org.sleuthkit.autopsy.corecomponentinterfaces.DataContentViewer; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.modules.filetypeid.FileTypeDetector; import org.sleuthkit.datamodel.AbstractFile; -import org.sleuthkit.autopsy.corecomponentinterfaces.FileTypeViewer; /** * Generic Application content viewer diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaFileViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaFileViewer.java index afb5152c14..92da0733d8 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaFileViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaFileViewer.java @@ -24,7 +24,6 @@ import java.awt.Dimension; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; -import org.sleuthkit.autopsy.corecomponentinterfaces.FileTypeViewer; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.AbstractFile; diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/PListViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/PListViewer.java index 0d310c30fc..bf69817c2c 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/PListViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/PListViewer.java @@ -58,7 +58,6 @@ import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.TskCoreException; import org.xml.sax.SAXException; -import org.sleuthkit.autopsy.corecomponentinterfaces.FileTypeViewer; /** * PListViewer - a file viewer for binary plist files. diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/SQLiteViewer.java b/Core/src/org/sleuthkit/autopsy/contentviewers/SQLiteViewer.java index 5dd6ee8141..7cc6980f0c 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/SQLiteViewer.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/SQLiteViewer.java @@ -50,7 +50,6 @@ import org.sleuthkit.autopsy.datamodel.ContentUtils; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; -import org.sleuthkit.autopsy.corecomponentinterfaces.FileTypeViewer; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; /** diff --git a/Core/src/org/sleuthkit/autopsy/ingest/IngestServices.java b/Core/src/org/sleuthkit/autopsy/ingest/IngestServices.java index 94db5ad51e..630102f674 100644 --- a/Core/src/org/sleuthkit/autopsy/ingest/IngestServices.java +++ b/Core/src/org/sleuthkit/autopsy/ingest/IngestServices.java @@ -197,6 +197,7 @@ public final class IngestServices { * * @deprecated Use getCase instead. */ + @Deprecated public Case getCurrentCase() { return Case.getCurrentCase(); } diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java index 3fea1a51ee..186bf19e15 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/SolrSearchService.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2018 Basis Technology Corp. + * Copyright 2015-2018 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -68,63 +68,70 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { private static final Logger logger = Logger.getLogger(SolrSearchService.class.getName()); /** - * Adds an artifact to the keyword search text index as a concantenation of - * all of its attributes. + * Indexes the given content for keyword search. * - * @param artifact The artifact to index. + * IMPORTANT: Currently, there are two correct uses for this code: + * + * 1) Indexing an artifact created during while either the file level ingest + * module pipeline or the first stage data source level ingest module + * pipeline of an ingest job is running. + * + * 2) Indexing a report. * - * @throws org.sleuthkit.datamodel.TskCoreException - */ - @Override - public void indexArtifact(BlackboardArtifact artifact) throws TskCoreException { - if (artifact == null) { - return; - } - - // We only support artifact indexing for Autopsy versions that use - // the negative range for artifact ids. - if (artifact.getArtifactID() > 0) { - return; - } - final Ingester ingester = Ingester.getDefault(); - - try { - ingester.indexMetaDataOnly(artifact); - ingester.indexText(new ArtifactTextExtractor(), artifact, null); - } catch (Ingester.IngesterException ex) { - throw new TskCoreException(ex.getCause().getMessage(), ex); - } - } - - /** - * Add the given Content object to the text index. * @param content The content to index. - * @throws TskCoreException + * + * @throws TskCoreException If there is a problem indexing the content. */ @Override public void index(Content content) throws TskCoreException { + /* + * TODO (JIRA-1099): The following code has some issues that need to be + * resolved. For artifacts, it is assumed that the posting of artifacts + * is only occuring during an ingest job with an enabled keyword search + * ingest module handling index commits; it also assumes that the + * artifacts are only posted by modules in the either the file level + * ingest pipeline or the first stage data source level ingest pipeline, + * so that the artifacts will be searched during a periodic or final + * keyword search. It also assumes that the only other type of Content + * for which this API will be called are Reports generated at a time + * when doing a commit is required and desirable, i.e., in a context + * other than an ingest job. + */ if (content == null) { return; } final Ingester ingester = Ingester.getDefault(); - - try { - ingester.indexText(new TikaTextExtractor(), content, null); - } catch (Ingester.IngesterException ex) { + if (content instanceof BlackboardArtifact) { + BlackboardArtifact artifact = (BlackboardArtifact) content; + if (artifact.getArtifactID() > 0) { + /* + * Artifact indexing is only supported for artifacts that use + * negative artifact ids to avoid overlapping with the object + * ids of other types of Content. + */ + return; + } try { - // Try the StringsTextExtractor if Tika extractions fails. - ingester.indexText(new StringsTextExtractor(), content, null); - } catch (Ingester.IngesterException ex1) { - throw new TskCoreException(ex.getCause().getMessage(), ex1); - } + ingester.indexMetaDataOnly(artifact); + ingester.indexText(new ArtifactTextExtractor(), artifact, null); + } catch (Ingester.IngesterException ex) { + throw new TskCoreException(ex.getCause().getMessage(), ex); + } + } else { + try { + ingester.indexText(new TikaTextExtractor(), content, null); + } catch (Ingester.IngesterException ex) { + try { + // Try the StringsTextExtractor if Tika extractions fails. + ingester.indexText(new StringsTextExtractor(), content, null); + } catch (Ingester.IngesterException ex1) { + throw new TskCoreException(ex.getCause().getMessage(), ex1); + } + } + ingester.commit(); } - - // TODO: Review whether this is the right thing to do. We typically use - // a combination of autoCommit and the SearchRunner to ensure that data - // is committed but that might not be sufficient for reports (or artifacts). - ingester.commit(); } - + /** * Tries to connect to the keyword search service. * @@ -205,7 +212,7 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { */ KeywordSearch.getServer().deleteCore(index.getIndexName(), metadata); if (!FileUtil.deleteDir(new File(index.getIndexPath()).getParentFile())) { - throw new KeywordSearchServiceException(Bundle.SolrSearchService_exceptionMessage_failedToDeleteIndexFiles(index.getIndexPath())); + throw new KeywordSearchServiceException(Bundle.SolrSearchService_exceptionMessage_failedToDeleteIndexFiles(index.getIndexPath())); } } return; //only one core exists for each combination of solr and schema version @@ -213,9 +220,9 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { //this code this code will only execute if an index for the current core was not found logger.log(Level.WARNING, NbBundle.getMessage(SolrSearchService.class, - "SolrSearchService.exceptionMessage.noCurrentSolrCore")); + "SolrSearchService.exceptionMessage.noCurrentSolrCore")); throw new KeywordSearchServiceException(NbBundle.getMessage(SolrSearchService.class, - "SolrSearchService.exceptionMessage.noCurrentSolrCore")); + "SolrSearchService.exceptionMessage.noCurrentSolrCore")); } @Override @@ -231,6 +238,7 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { * Creates/opens the Solr core/text index for a case * * @param context The case context. + * * @throws * org.sleuthkit.autopsy.appservices.AutopsyService.AutopsyServiceException */ @@ -366,7 +374,7 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { } else { progress.switchToIndeterminate(Bundle.SolrSearch_openGiantCore_msg()); } - + KeywordSearch.getServer().openCoreForCase(theCase, currentVersionIndex); } catch (KeywordSearchModuleException ex) { throw new AutopsyServiceException(String.format("Failed to open or create core for %s", caseDirPath), ex); @@ -379,6 +387,7 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { * Closes the open core. * * @param context + * * @throws * org.sleuthkit.autopsy.appservices.AutopsyService.AutopsyServiceException */ @@ -403,4 +412,36 @@ public class SolrSearchService implements KeywordSearchService, AutopsyService { throw new AutopsyServiceException(String.format("Failed to close core for %s", context.getCase().getCaseDirectory()), ex); } } + + /** + * Adds an artifact to the keyword search text index as a concantenation of + * all of its attributes. + * + * @param artifact The artifact to index. + * + * @throws org.sleuthkit.datamodel.TskCoreException + * @deprecated Call index(Content) instead. + */ + @Deprecated + @Override + public void indexArtifact(BlackboardArtifact artifact) throws TskCoreException { + if (artifact == null) { + return; + } + + // We only support artifact indexing for Autopsy versions that use + // the negative range for artifact ids. + if (artifact.getArtifactID() > 0) { + return; + } + final Ingester ingester = Ingester.getDefault(); + + try { + ingester.indexMetaDataOnly(artifact); + ingester.indexText(new ArtifactTextExtractor(), artifact, null); + } catch (Ingester.IngesterException ex) { + throw new TskCoreException(ex.getCause().getMessage(), ex); + } + } + }