19 package org.sleuthkit.autopsy.modules.interestingitems;
 
   21 import java.util.ArrayList;
 
   22 import java.util.Collections;
 
   23 import java.util.List;
 
   25 import java.util.concurrent.ConcurrentHashMap;
 
   26 import java.util.logging.Level;
 
   27 import org.openide.util.NbBundle;
 
   28 import org.openide.util.NbBundle.Messages;
 
   50     "FilesIdentifierIngestModule.getFilesError=Error getting interesting files sets from file." 
   52 final class FilesIdentifierIngestModule implements FileIngestModule {
 
   54     private static final Object sharedResourcesLock = 
new Object();
 
   55     private static final Logger logger = Logger.getLogger(FilesIdentifierIngestModule.class.getName());
 
   56     private static final IngestModuleReferenceCounter refCounter = 
new IngestModuleReferenceCounter();
 
   57     private static final Map<Long, List<FilesSet>> interestingFileSetsByJob = 
new ConcurrentHashMap<>();
 
   58     private final FilesIdentifierIngestJobSettings settings;
 
   59     private final IngestServices services = IngestServices.getInstance();
 
   60     private IngestJobContext context;
 
   61     private Blackboard blackboard;
 
   69     FilesIdentifierIngestModule(FilesIdentifierIngestJobSettings settings) {
 
   70         this.settings = settings;
 
   77     public void startUp(IngestJobContext context) 
throws IngestModuleException {
 
   78         this.context = context;
 
   79         synchronized (FilesIdentifierIngestModule.sharedResourcesLock) {
 
   80             if (FilesIdentifierIngestModule.refCounter.incrementAndGet(context.getJobId()) == 1) {
 
   86                 List<FilesSet> filesSets = 
new ArrayList<>();
 
   88                     for (FilesSet set : FilesSetsManager.getInstance().getInterestingFilesSets().values()) {
 
   89                         if (settings.interestingFilesSetIsEnabled(set.getName())) {
 
   93                 } 
catch (FilesSetsManager.FilesSetsManagerException ex) {
 
   94                     throw new IngestModuleException(Bundle.FilesIdentifierIngestModule_getFilesError(), ex);
 
   96                 FilesIdentifierIngestModule.interestingFileSetsByJob.put(context.getJobId(), filesSets);
 
  105     @Messages({
"FilesIdentifierIngestModule.indexError.message=Failed to index interesting file hit artifact for keyword search."})
 
  106     public ProcessResult process(AbstractFile file) {
 
  107         blackboard = Case.getCurrentCase().getServices().getBlackboard();
 
  110         if (file.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.SLACK)) {
 
  111             return ProcessResult.OK;
 
  115         List<FilesSet> filesSets = FilesIdentifierIngestModule.interestingFileSetsByJob.get(this.context.getJobId());
 
  116         for (FilesSet filesSet : filesSets) {
 
  117             String ruleSatisfied = filesSet.fileIsMemberOf(file);
 
  118             if (ruleSatisfied != null) {
 
  122                     String moduleName = InterestingItemsIngestModuleFactory.getModuleName();
 
  123                     BlackboardArtifact artifact = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
 
  130                     BlackboardAttribute setNameAttribute = 
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME, moduleName, filesSet.getName());
 
  131                     artifact.addAttribute(setNameAttribute);
 
  135                     BlackboardAttribute ruleNameAttribute = 
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY, moduleName, ruleSatisfied);
 
  136                     artifact.addAttribute(ruleNameAttribute);
 
  140                         blackboard.indexArtifact(artifact);
 
  141                     } 
catch (Blackboard.BlackboardException ex) {
 
  142                         logger.log(Level.SEVERE, 
"Unable to index blackboard artifact " + artifact.getArtifactID(), ex); 
 
  143                         MessageNotifyUtil.Notify.error(Bundle.FilesIdentifierIngestModule_indexError_message(), artifact.getDisplayName());
 
  146                     services.fireModuleDataEvent(
new ModuleDataEvent(moduleName, BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT, Collections.singletonList(artifact)));
 
  149                     StringBuilder detailsSb = 
new StringBuilder();
 
  150                     detailsSb.append(
"File: " + file.getParentPath() + file.getName() + 
"<br/>\n");
 
  151                     detailsSb.append(
"Rule Set: " + filesSet.getName());
 
  153                     services.postMessage(IngestMessage.createDataMessage(InterestingItemsIngestModuleFactory.getModuleName(),
 
  154                             "Interesting File Match: " + filesSet.getName() + 
"(" + file.getName() +
")",
 
  155                             detailsSb.toString(),
 
  159                 } 
catch (TskCoreException ex) {
 
  160                     FilesIdentifierIngestModule.logger.log(Level.SEVERE, 
"Error posting to the blackboard", ex); 
 
  164         return ProcessResult.OK;
 
  171     public void shutDown() {
 
  172         if (context != null) {
 
  173             if (refCounter.decrementAndGet(
this.context.getJobId()) == 0) {
 
  177                 FilesIdentifierIngestModule.interestingFileSetsByJob.remove(this.context.getJobId());