19 package org.sleuthkit.autopsy.modules.filetypeid;
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.SortedSet;
24 import java.util.logging.Level;
25 import org.apache.tika.Tika;
26 import org.apache.tika.mime.MediaType;
27 import org.apache.tika.mime.MimeTypes;
28 import org.openide.util.NbBundle;
45 private static final Tika
tika =
new Tika();
63 userDefinedFileTypes = UserDefinedFileTypesManager.getInstance().getFileTypes();
64 }
catch (UserDefinedFileTypesManager.UserDefinedFileTypesException ex) {
65 throw new FileTypeDetectorInitException(
"Error loading user-defined file types", ex);
75 List<String> list =
new ArrayList<>();
76 if (userDefinedFileTypes != null) {
77 for (FileType fileType : userDefinedFileTypes) {
78 list.add(fileType.getMimeType());
105 for (FileType fileType : userDefinedFileTypes) {
106 if (fileType.getMimeType().equals(mimeType)) {
121 String[] split = mimeType.split(
"/");
122 if (split.length == 2) {
123 String type = split[0];
124 String subtype = split[1];
125 MediaType mediaType =
new MediaType(type, subtype);
126 SortedSet<MediaType> m = MimeTypes.getDefaultMimeTypes().getMediaTypeRegistry().getTypes();
127 return m.contains(mediaType);
148 public String
getFileType(AbstractFile file)
throws TskCoreException {
149 return detect(file,
true);
164 public String
detect(AbstractFile file)
throws TskCoreException {
165 return detect(file,
false);
184 private String
detect(AbstractFile file,
boolean addToCaseDb)
throws TskCoreException {
189 String mimeType = file.getMIMEType();
190 if (null != mimeType) {
199 if (!file.isFile() || file.getSize() <= 0
200 || (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS)
201 || (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS)
202 || (file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.VIRTUAL_DIR)) {
203 mimeType = MimeTypes.OCTET_STREAM;
209 if (null == mimeType) {
217 if (null == mimeType) {
220 int len = file.read(buffer, 0, BUFFER_SIZE);
221 if (len < BUFFER_SIZE) {
223 System.arraycopy(buffer, 0, buf, 0, len);
227 String tikaType = tika.detect(buf, file.getName());
232 mimeType = tikaType.replace(
"tika-",
"");
234 }
catch (Exception ignored) {
242 mimeType = MimeTypes.OCTET_STREAM;
275 BlackboardArtifact getInfoArt = file.getGenInfoArtifact();
276 @SuppressWarnings(
"deprecation")
277 BlackboardAttribute batt =
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_FILE_TYPE_SIG,
FileTypeIdModuleFactory.getModuleName(), mimeType);
278 getInfoArt.addAttribute(batt);
299 for (FileType fileType : userDefinedFileTypes) {
300 if (fileType.matches(file)) {
301 if (postToBlackBoard && fileType.alertOnMatch()) {
305 BlackboardArtifact artifact;
306 artifact = file.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT);
307 BlackboardAttribute setNameAttribute =
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME,
FileTypeIdModuleFactory.getModuleName(), fileType.getFilesSetName());
308 artifact.addAttribute(setNameAttribute);
315 BlackboardAttribute ruleNameAttribute =
new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY,
FileTypeIdModuleFactory.getModuleName(), fileType.getMimeType());
316 artifact.addAttribute(ruleNameAttribute);
324 logger.log(Level.SEVERE, String.format(
"Unable to index blackboard artifact %d", artifact.getArtifactID()), ex);
326 NbBundle.getMessage(
Blackboard.class,
"Blackboard.unableToIndexArtifact.exception.msg"), artifact.getDisplayName());
329 return fileType.getMimeType();
361 super(message, throwable);
380 @SuppressWarnings(
"deprecation")
static final int BUFFER_SIZE
void indexArtifact(BlackboardArtifact artifact)
static final long serialVersionUID
final List< FileType > userDefinedFileTypes
boolean isDetectable(String mimeType)
SleuthkitCase getSleuthkitCase()
boolean isDetectableAsUserDefinedType(String mimeType)
String detectUserDefinedType(AbstractFile file, boolean postToBlackBoard)
Blackboard getBlackboard()
static void error(String title, String message)
String detect(AbstractFile file)
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
static final Logger logger
List< String > getUserDefinedTypes()
String getFileType(AbstractFile file)
String detect(AbstractFile file, boolean addToCaseDb)
boolean isDetectableByTika(String mimeType)
String detectAndPostToBlackboard(AbstractFile file)