19package org.sleuthkit.autopsy.modules.interestingitems;
21import java.io.Serializable;
22import java.util.ArrayList;
23import java.util.Collections;
24import java.util.HashMap;
27import java.util.Map.Entry;
29import java.util.regex.Pattern;
30import org.openide.util.NbBundle;
31import org.openide.util.NbBundle.Messages;
32import org.sleuthkit.datamodel.AbstractFile;
33import org.sleuthkit.datamodel.TskData;
43public final class FilesSet implements Serializable {
54 private final Map<String, Rule>
rules;
97 if ((
name ==
null) || (
name.isEmpty())) {
98 throw new IllegalArgumentException(
"Interesting files set name cannot be null or empty");
102 throw new IllegalArgumentException(
"version number must be >= 0");
112 this.rules =
rules ==
null ? Collections.emptyMap() :
new HashMap<>(
rules);
123 if (this.rules !=
null) {
124 for (Entry<String, Rule> ruleEntry : this.rules.entrySet()) {
125 if (ruleEntry.getValue().isExclusive()) {
140 boolean isStandardSet() {
148 int getVersionNumber() {
167 return this.description;
180 return this.ignoreKnownFiles;
190 return this.ignoreUnallocatedSpace;
199 return new HashMap<>(this.rules);
212 "FileSet_fileIsMemberOf_noInclusiveRules_ruleName=Not Excluded"
215 if ((this.ignoreKnownFiles) && (file.getKnown() == TskData.FileKnown.KNOWN)) {
219 if ((this.ignoreUnallocatedSpace)
220 && (file.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS)
221 || file.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.SLACK)
222 || file.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS))) {
238 ruleName = Bundle.FileSet_fileIsMemberOf_noInclusiveRules_ruleName();
245 if (rule.isSatisfied(file)) {
246 ruleName = rule.getName();
253 if (rule.isSatisfied(file)) {
272 public final static class Rule implements Serializable {
284 private final List<FileAttributeCondition>
conditions =
new ArrayList<>();
306 this.uuid = UUID.randomUUID().toString();
308 throw new IllegalArgumentException(
"Interesting files set rule meta-type condition cannot be null");
318 this.conditions.add(this.metaTypeCondition);
321 if (this.fileSizeCondition !=
null) {
322 this.conditions.add(this.fileSizeCondition);
326 if (this.fileNameCondition !=
null) {
331 if (this.mimeTypeCondition !=
null) {
336 if (this.pathCondition !=
null) {
337 this.conditions.add(this.pathCondition);
340 if (this.dateCondition !=
null) {
341 this.conditions.add(this.dateCondition);
362 return this.fileNameCondition;
371 return this.metaTypeCondition;
380 return this.pathCondition;
384 return this.dateCondition;
405 if (!condition.passes(file)) {
413 "# {0} - daysIncluded",
414 "FilesSet.rule.dateRule.toString=(modified within {0} day(s))"
422 }
else if (this.pathCondition !=
null) {
423 return this.ruleName +
" (" +
pathCondition.getTextToMatch() +
")";
424 }
else if (this.mimeTypeCondition !=
null) {
426 }
else if (this.fileSizeCondition !=
null) {
429 }
else if (this.dateCondition !=
null) {
430 return this.ruleName + Bundle.FilesSet_rule_dateRule_toString(
dateCondition.getDaysIncluded());
432 return this.ruleName +
" ()";
492 public boolean passes(AbstractFile file) {
493 return this.mimeType.equals(file.getMIMEType());
502 return this.mimeType;
548 throw new IllegalArgumentException(
"Invalid symbol");
587 throw new IllegalArgumentException(
"Invalid name for size unit.");
635 public boolean passes(AbstractFile file) {
636 long fileSize = file.getSize();
640 return fileSize > conditionSize;
641 case GREATER_THAN_EQUAL:
642 return fileSize >= conditionSize;
643 case LESS_THAN_EQUAL:
644 return fileSize <= conditionSize;
646 return fileSize < conditionSize;
648 return fileSize == conditionSize;
684 public boolean passes(AbstractFile file) {
687 return file.isFile();
689 return file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR
690 || file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_VIRT_DIR;
691 case FILES_AND_DIRECTORIES:
692 return file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_REG
693 || file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR
694 || file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_VIRT_DIR;
748 private static abstract class AbstractTextCondition
implements TextCondition {
761 AbstractTextCondition(String text, Boolean partialMatch) {
763 this.textMatcher =
new FilesSet.Rule.CaseInsensitivePartialStringComparisionMatcher(text);
765 this.textMatcher =
new FilesSet.Rule.CaseInsensitiveStringComparisionMatcher(text);
775 this.textMatcher =
new FilesSet.Rule.RegexMatcher(regex);
783 AbstractTextCondition(List<String> values) {
784 this.textMatcher =
new FilesSet.Rule.CaseInsensitiveMultiValueStringComparisionMatcher(values);
806 return this.textMatcher.
isRegex();
822 public abstract boolean passes(AbstractFile file);
854 public boolean passes(AbstractFile file) {
855 return this.
textMatches(file.getParentPath() +
"/");
896 public boolean passes(AbstractFile file) {
936 public boolean passes(AbstractFile file) {
938 return file.getCrtime() > dateThreshold || file.getMtime() > dateThreshold;
987 public boolean passes(AbstractFile file) {
998 private static List<String>
normalize(List<String> extensions) {
999 List<String> values =
new ArrayList<>(extensions);
1001 for (
int i = 0; i < values.size(); i++) {
1002 values.set(i,
normalize(values.get(i)));
1016 return extension.startsWith(
".") ? extension.substring(1) : extension;
1057 private static class CaseInsensitiveStringComparisionMatcher
implements TextMatcher {
1068 CaseInsensitiveStringComparisionMatcher(String
textToMatch) {
1074 return this.textToMatch;
1092 private static class CaseInsensitivePartialStringComparisionMatcher
implements TextMatcher {
1104 CaseInsensitivePartialStringComparisionMatcher(String
textToMatch) {
1106 this.pattern = Pattern.compile(Pattern.quote(
textToMatch), Pattern.CASE_INSENSITIVE);
1111 return this.textToMatch;
1121 return pattern.matcher(subject).find();
1129 private static class CaseInsensitiveMultiValueStringComparisionMatcher
implements TextMatcher {
1141 CaseInsensitiveMultiValueStringComparisionMatcher(List<String>
valuesToMatch) {
1147 return String.join(
",", this.valuesToMatch);
1158 if (value.equalsIgnoreCase(subject)) {
1181 RegexMatcher(Pattern
regex) {
1187 return this.regex.pattern();
1198 return this.regex.matcher(subject).find();
final TextMatcher textMatcher
abstract boolean passes(AbstractFile file)
boolean textMatches(String textToMatch)
static final long serialVersionUID
final List< String > valuesToMatch
boolean textMatches(String subject)
static final long serialVersionUID
boolean textMatches(String subject)
boolean textMatches(String subject)
static final long serialVersionUID
boolean passes(AbstractFile file)
static final long SECS_PER_DAY
ExtensionCondition(Pattern extension)
boolean passes(AbstractFile file)
static String normalize(String extension)
ExtensionCondition(String extension)
ExtensionCondition(List< String > extensions)
static List< String > normalize(List< String > extensions)
static final long serialVersionUID
final COMPARATOR comparator
boolean passes(AbstractFile file)
COMPARATOR getComparator()
static final long serialVersionUID
FileSizeCondition(COMPARATOR comparator, SIZE_UNIT unit, int sizeValue)
FullNameCondition(Pattern name)
FullNameCondition(String name)
boolean passes(AbstractFile file)
static final long serialVersionUID
boolean passes(AbstractFile file)
MimeTypeCondition(String mimeType)
static final long serialVersionUID
boolean passes(AbstractFile file)
ParentPathCondition(String path)
ParentPathCondition(Pattern path)
static final long serialVersionUID
static final long serialVersionUID
boolean textMatches(String subject)
boolean isSatisfied(AbstractFile file)
FileSizeCondition getFileSizeCondition()
final FileSizeCondition fileSizeCondition
MetaTypeCondition getMetaTypeCondition()
final MetaTypeCondition metaTypeCondition
FileNameCondition getFileNameCondition()
final DateCondition dateCondition
MimeTypeCondition getMimeTypeCondition()
final MimeTypeCondition mimeTypeCondition
final FileNameCondition fileNameCondition
Rule(String ruleName, FileNameCondition fileNameCondition, MetaTypeCondition metaTypeCondition, ParentPathCondition pathCondition, MimeTypeCondition mimeTypeCondition, FileSizeCondition fileSizeCondition, DateCondition dateCondition, Boolean exclusive)
ParentPathCondition getPathCondition()
final List< FileAttributeCondition > conditions
static final long serialVersionUID
final ParentPathCondition pathCondition
DateCondition getDateCondition()
boolean ingoresUnallocatedSpace()
final boolean standardSet
final Map< String, Rule > rules
Map< String, Rule > exclusiveRules
FilesSet(String name, String description, boolean ignoreKnownFiles, boolean ignoreUnallocatedSpace, Map< String, Rule > rules, boolean standardSet, int versionNumber)
void divideInclusiveExclusive()
Map< String, Rule > inclusiveRules
final boolean ignoreKnownFiles
String fileIsMemberOf(AbstractFile file)
static final long serialVersionUID
final boolean ignoreUnallocatedSpace
Map< String, Rule > getRules()
FilesSet(String name, String description, boolean ignoreKnownFiles, boolean ignoreUnallocatedSpace, Map< String, Rule > rules)
boolean ignoresKnownFiles()
COMPARATOR(String symbol)
static COMPARATOR fromSymbol(String symbol)
static SIZE_UNIT fromName(String name)
SIZE_UNIT(long size, String name)
boolean passes(AbstractFile file)
boolean textMatches(String textToMatch)
boolean textMatches(String subject)