19 package org.sleuthkit.autopsy.modules.fileextmismatch;
 
   21 import java.text.MessageFormat;
 
   22 import java.util.Collections;
 
   23 import java.util.HashMap;
 
   25 import java.util.logging.Level;
 
   26 import org.openide.util.NbBundle;
 
   27 import org.openide.util.NbBundle.Messages;
 
   51     "CannotRunFileTypeDetection=Unable to run file type detection.",
 
   52     "FileExtMismatchIngestModule.readError.message=Could not read settings." 
   58     private final FileExtMismatchDetectorModuleSettings 
settings;
 
   59     private HashMap<String, Set<String>> mimeTypeToExtsMap = 
new HashMap<>();
 
   61     private static final HashMap<Long, IngestJobTotals> totalsForIngestJobs = 
new HashMap<>();
 
   68         private long processTime = 0;
 
   69         private long numFiles = 0;
 
   78     private static synchronized void addToTotals(
long ingestJobId, 
long processTimeInc) {
 
   80         if (ingestJobTotals == null) {
 
   82             totalsForIngestJobs.put(ingestJobId, ingestJobTotals);
 
   87         totalsForIngestJobs.put(ingestJobId, ingestJobTotals);
 
   91         this.settings = settings;
 
   96         jobId = context.getJobId();
 
  100             mimeTypeToExtsMap = FileExtMismatchSettings.readSettings().getMimeTypeToExtsMap();
 
  102         } 
catch (FileExtMismatchSettings.FileExtMismatchSettingsException ex) {
 
  110     @Messages({
"FileExtMismatchIngestModule.indexError.message=Failed to index file extension mismatch artifact for keyword search."})
 
  115             logger.log(Level.WARNING, 
"Exception while getting open case.", ex); 
 
  118         if (this.settings.skipKnownFiles() && (abstractFile.getKnown() == FileKnown.KNOWN)) {
 
  123         if ((abstractFile.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS)
 
  124                 || (abstractFile.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS)
 
  125                 || (abstractFile.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.SLACK)
 
  126                 || (abstractFile.isFile() == 
false)) {
 
  131         if ((abstractFile.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.UNALLOC))
 
  132                 || (abstractFile.isDirNameFlagSet(TskData.TSK_FS_NAME_FLAG_ENUM.UNALLOC))) {
 
  137             long startTime = System.currentTimeMillis();
 
  139             boolean mismatchDetected = compareSigTypeToExt(abstractFile);
 
  141             addToTotals(jobId, System.currentTimeMillis() - startTime);
 
  143             if (mismatchDetected) {
 
  144                 String justification = MessageFormat.format(
"File has MIME type of {0}", detector.
getMIMEType(abstractFile));
 
  147                 BlackboardArtifact bart = abstractFile.newAnalysisResult(
 
  148                         BlackboardArtifact.Type.TSK_EXT_MISMATCH_DETECTED, Score.SCORE_LIKELY_NOTABLE, 
 
  149                         null, null, justification, Collections.emptyList())
 
  150                         .getAnalysisResult();
 
  159                 } 
catch (Blackboard.BlackboardException ex) {
 
  160                     logger.log(Level.SEVERE, 
"Unable to index blackboard artifact " + bart.getArtifactID(), ex); 
 
  166         } 
catch (TskException ex) {
 
  167             logger.log(Level.WARNING, 
"Error matching file signature", ex); 
 
  180         String currActualExt = abstractFile.getNameExtension();
 
  183         if (settings.skipFilesWithNoExtension() && currActualExt.isEmpty()) {
 
  186         String currActualSigType = detector.
getMIMEType(abstractFile);
 
  187         if (settings.getCheckType() != CHECK_TYPE.ALL) {
 
  188             if (settings.getCheckType() == CHECK_TYPE.NO_TEXT_FILES) {
 
  189                 if (!currActualExt.isEmpty() && currActualSigType.equals(
"text/plain")) { 
 
  193             if (settings.getCheckType() == CHECK_TYPE.ONLY_MEDIA_AND_EXE) {
 
  194                 if (!FileExtMismatchDetectorModuleSettings.MEDIA_AND_EXE_MIME_TYPES.contains(currActualSigType)) {
 
  201         Set<String> allowedExtSet = mimeTypeToExtsMap.get(currActualSigType);
 
  202         if (allowedExtSet != null) {
 
  204             for (String e : allowedExtSet) {
 
  205                 if (e.equals(currActualExt)) {
 
  220             synchronized (
this) {
 
  221                 jobTotals = totalsForIngestJobs.remove(jobId);
 
  223             if (jobTotals != null) {
 
  224                 StringBuilder detailsSb = 
new StringBuilder();
 
  225                 detailsSb.append(
"<table border='0' cellpadding='4' width='280'>"); 
 
  227                 detailsSb.append(
"<tr><td>").append( 
 
  228                         NbBundle.getMessage(
this.getClass(), 
"FileExtMismatchIngestModule.complete.totalProcTime"))
 
  229                         .append(
"</td><td>").append(jobTotals.
processTime).append(
"</td></tr>\n"); 
 
  230                 detailsSb.append(
"<tr><td>").append( 
 
  231                         NbBundle.getMessage(
this.getClass(), 
"FileExtMismatchIngestModule.complete.totalFiles"))
 
  232                         .append(
"</td><td>").append(jobTotals.
numFiles).append(
"</td></tr>\n"); 
 
  233                 detailsSb.append(
"</table>"); 
 
  236                         NbBundle.getMessage(this.getClass(),
 
  237                                 "FileExtMismatchIngestModule.complete.svcMsg.text"),
 
  238                         detailsSb.toString()));
 
synchronized long decrementAndGet(long jobId)
 
FileTypeDetector detector
 
synchronized long incrementAndGet(long jobId)
 
static IngestMessage createMessage(MessageType messageType, String source, String subject, String detailsHtml)
 
String getMIMEType(AbstractFile file)
 
boolean compareSigTypeToExt(AbstractFile abstractFile)
 
void postMessage(final IngestMessage message)
 
SleuthkitCase getSleuthkitCase()
 
static void error(String title, String message)
 
void startUp(IngestJobContext context)
 
final FileExtMismatchDetectorModuleSettings settings
 
synchronized static Logger getLogger(String name)
 
static Case getCurrentCaseThrows()
 
ProcessResult process(AbstractFile abstractFile)
 
static Blackboard blackboard
 
static synchronized void addToTotals(long ingestJobId, long processTimeInc)
 
static synchronized IngestServices getInstance()