19 package org.sleuthkit.autopsy.modules.interestingitems;
21 import java.io.Serializable;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
26 import java.util.UUID;
27 import java.util.regex.Pattern;
28 import org.openide.util.NbBundle;
40 public final class FilesSet implements Serializable {
47 private final Map<String, Rule>
rules =
new HashMap<>();
61 public FilesSet(String name, String description,
boolean ignoreKnownFiles,
boolean ignoreUnallocatedSpace, Map<String, Rule> rules) {
62 if ((name == null) || (name.isEmpty())) {
63 throw new IllegalArgumentException(
"Interesting files set name cannot be null or empty");
66 this.description = (description != null ? description :
"");
70 this.rules.putAll(rules);
121 return new HashMap<>(this.
rules);
133 if ((this.ignoreKnownFiles) && (file.getKnown() == TskData.FileKnown.KNOWN)) {
137 if ((this.ignoreUnallocatedSpace)
138 && (file.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS)
139 || file.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.SLACK)
140 || file.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS))) {
144 for (
Rule rule : rules.values()) {
145 if (rule.isSatisfied(file)) {
146 return rule.getName();
163 public final static class Rule implements Serializable {
165 private static final long serialVersionUID = 1L;
174 private final List<FileAttributeCondition>
conditions =
new ArrayList<>();
190 this.uuid = UUID.randomUUID().toString();
191 if (metaTypeCondition == null) {
192 throw new IllegalArgumentException(
"Interesting files set rule meta-type condition cannot be null");
202 this.conditions.add(this.metaTypeCondition);
205 if (this.fileSizeCondition != null) {
206 this.conditions.add(this.fileSizeCondition);
210 if (this.fileNameCondition != null) {
211 this.conditions.add(fileNameCondition);
215 if (this.mimeTypeCondition != null) {
216 this.conditions.add(mimeTypeCondition);
220 if (this.pathCondition != null) {
221 this.conditions.add(this.pathCondition);
224 if (this.dateCondition != null) {
225 this.conditions.add(this.dateCondition);
277 for (FileAttributeCondition condition : conditions) {
278 if (!condition.passes(file)) {
286 "# {0} - daysIncluded",
287 "FilesSet.rule.dateRule.toString=(modified within {0} day(s))"
293 if (fileNameCondition != null) {
294 return this.ruleName +
" (" + fileNameCondition.getTextToMatch() +
")";
295 }
else if (this.pathCondition != null) {
296 return this.ruleName +
" (" + pathCondition.
getTextToMatch() +
")";
297 }
else if (this.mimeTypeCondition != null) {
298 return this.ruleName +
" (" + mimeTypeCondition.
getMimeType() +
")";
299 }
else if (this.fileSizeCondition != null) {
302 }
else if (this.dateCondition != null) {
303 return this.ruleName + Bundle.FilesSet_rule_dateRule_toString(dateCondition.
getDaysIncluded());
305 return this.ruleName +
" ()";
335 static interface FileAttributeCondition
extends Serializable {
344 boolean passes(AbstractFile file);
352 private static final long serialVersionUID = 1L;
365 public boolean passes(AbstractFile file) {
366 return this.mimeType.equals(file.getMIMEType());
386 private static final long serialVersionUID = 1L;
402 this.symbol = symbol;
409 return LESS_THAN_EQUAL;
419 return GREATER_THAN_EQUAL;
421 throw new IllegalArgumentException(
"Invalid symbol");
460 throw new IllegalArgumentException(
"Invalid name for size unit.");
508 public boolean passes(AbstractFile file) {
509 long fileSize = file.getSize();
513 return fileSize > conditionSize;
514 case GREATER_THAN_EQUAL:
515 return fileSize >= conditionSize;
516 case LESS_THAN_EQUAL:
517 return fileSize <= conditionSize;
519 return fileSize < conditionSize;
521 return fileSize == conditionSize;
535 private static final long serialVersionUID = 1L;
557 public boolean passes(AbstractFile file) {
560 return file.isFile();
562 return file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR
563 || file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_VIRT_DIR;
564 case FILES_AND_DIRECTORIES:
565 return file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_REG
566 || file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR
567 || file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_VIRT_DIR;
588 static interface TextCondition
extends FileAttributeCondition {
595 String getTextToMatch();
613 boolean textMatches(String textToMatch);
657 AbstractTextCondition(List<String> values) {
680 return this.textMatcher.
isRegex();
696 public abstract boolean passes(AbstractFile file);
707 private static final long serialVersionUID = 1L;
728 public boolean passes(AbstractFile file) {
729 return this.
textMatches(file.getParentPath() +
"/");
739 static interface FileNameCondition
extends TextCondition {
749 private static final long serialVersionUID = 1L;
770 public boolean passes(AbstractFile file) {
811 public boolean passes(AbstractFile file) {
812 long dateThreshold = System.currentTimeMillis() / 1000 - daysIncluded *
SECS_PER_DAY;
813 return file.getCrtime() > dateThreshold || file.getMtime() > dateThreshold;
825 private static final long serialVersionUID = 1L;
862 public boolean passes(AbstractFile file) {
873 private static List<String>
normalize(List<String> extensions) {
874 List<String> values =
new ArrayList<>(extensions);
876 for (
int i=0; i < values.size(); i++) {
891 return extension.startsWith(
".") ? extension.substring(1) : extension;
934 private static final long serialVersionUID = 1L;
959 return subject.equalsIgnoreCase(textToMatch);
969 private static final long serialVersionUID = 1L;
981 this.pattern = Pattern.compile(Pattern.quote(textToMatch), Pattern.CASE_INSENSITIVE);
996 return pattern.matcher(subject).find();
1006 private static final long serialVersionUID = 1L;
1022 return String.join(
",", this.valuesToMatch);
1032 for (String value : valuesToMatch) {
1033 if (value.equalsIgnoreCase(subject)) {
1047 private static final long serialVersionUID = 1L;
1062 return this.regex.pattern();
1073 return this.regex.matcher(subject).find();
String fileIsMemberOf(AbstractFile file)
ExtensionCondition(Pattern extension)
ParentPathCondition(Pattern path)
boolean passes(AbstractFile file)
static String normalize(String extension)
FileSizeCondition(COMPARATOR comparator, SIZE_UNIT unit, int sizeValue)
boolean textMatches(String textToMatch)
MetaTypeCondition getMetaTypeCondition()
COMPARATOR(String symbol)
final COMPARATOR comparator
ParentPathCondition getPathCondition()
FilesSet(String name, String description, boolean ignoreKnownFiles, boolean ignoreUnallocatedSpace, Map< String, Rule > rules)
abstract boolean passes(AbstractFile file)
boolean textMatches(String subject)
static SIZE_UNIT fromName(String name)
final ParentPathCondition pathCondition
DateCondition getDateCondition()
ParentPathCondition(String path)
Rule(String ruleName, FileNameCondition fileNameCondition, MetaTypeCondition metaTypeCondition, ParentPathCondition pathCondition, MimeTypeCondition mimeTypeCondition, FileSizeCondition fileSizeCondition, DateCondition dateCondition)
final MetaTypeCondition metaTypeCondition
boolean passes(AbstractFile file)
boolean textMatches(String subject)
MimeTypeCondition(String mimeType)
boolean isSatisfied(AbstractFile file)
final TextMatcher textMatcher
FullNameCondition(Pattern name)
final FileSizeCondition fileSizeCondition
static final long serialVersionUID
ExtensionCondition(List< String > extensions)
boolean passes(AbstractFile file)
final DateCondition dateCondition
final boolean ignoreUnallocatedSpace
boolean textMatches(String subject)
final List< String > valuesToMatch
final boolean ignoreKnownFiles
COMPARATOR getComparator()
MimeTypeCondition getMimeTypeCondition()
boolean passes(AbstractFile file)
static final long SECS_PER_DAY
Map< String, Rule > getRules()
boolean textMatches(String subject)
SIZE_UNIT(long size, String name)
final Map< String, Rule > rules
FileSizeCondition getFileSizeCondition()
boolean ignoresKnownFiles()
boolean passes(AbstractFile file)
ExtensionCondition(String extension)
static List< String > normalize(List< String > extensions)
boolean passes(AbstractFile file)
FileNameCondition getFileNameCondition()
FullNameCondition(String name)
boolean ingoresUnallocatedSpace()
static COMPARATOR fromSymbol(String symbol)
final List< FileAttributeCondition > conditions
final MimeTypeCondition mimeTypeCondition
final FileNameCondition fileNameCondition
boolean textMatches(String subject)