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);
101 boolean ignoresKnownFiles() {
120 Map<String, Rule> getRules() {
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 static class Rule
implements Serializable {
165 private static final long serialVersionUID = 1L;
166 private final String uuid;
167 private final String ruleName;
168 private final FileNameCondition fileNameCondition;
169 private final MetaTypeCondition metaTypeCondition;
170 private final ParentPathCondition pathCondition;
171 private final MimeTypeCondition mimeTypeCondition;
172 private final FileSizeCondition fileSizeCondition;
173 private final DateCondition dateCondition;
174 private final List<FileAttributeCondition> conditions =
new ArrayList<>();
188 Rule(String ruleName, FileNameCondition fileNameCondition, MetaTypeCondition metaTypeCondition, ParentPathCondition pathCondition, MimeTypeCondition mimeTypeCondition, FileSizeCondition fileSizeCondition, DateCondition dateCondition) {
190 this.uuid = UUID.randomUUID().toString();
191 if (metaTypeCondition == null) {
192 throw new IllegalArgumentException(
"Interesting files set rule meta-type condition cannot be null");
195 this.ruleName = ruleName;
201 this.metaTypeCondition = metaTypeCondition;
202 this.conditions.add(this.metaTypeCondition);
204 this.fileSizeCondition = fileSizeCondition;
205 if (this.fileSizeCondition != null) {
206 this.conditions.add(this.fileSizeCondition);
209 this.fileNameCondition = fileNameCondition;
210 if (this.fileNameCondition != null) {
211 this.conditions.add(fileNameCondition);
214 this.mimeTypeCondition = mimeTypeCondition;
215 if (this.mimeTypeCondition != null) {
216 this.conditions.add(mimeTypeCondition);
219 this.pathCondition = pathCondition;
220 if (this.pathCondition != null) {
221 this.conditions.add(this.pathCondition);
223 this.dateCondition = dateCondition;
224 if (this.dateCondition != null) {
225 this.conditions.add(this.dateCondition);
243 FileNameCondition getFileNameCondition() {
244 return this.fileNameCondition;
252 MetaTypeCondition getMetaTypeCondition() {
253 return this.metaTypeCondition;
261 ParentPathCondition getPathCondition() {
262 return this.pathCondition;
265 DateCondition getDateCondition() {
266 return this.dateCondition;
276 boolean isSatisfied(AbstractFile file) {
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) {
300 return this.ruleName +
" (" + fileSizeCondition.getComparator().getSymbol() +
" " + fileSizeCondition.getSizeValue()
301 +
" " + fileSizeCondition.getUnit().getName() +
")";
302 }
else if (this.dateCondition != null) {
303 return this.ruleName + Bundle.FilesSet_rule_dateRule_toString(dateCondition.getDaysIncluded());
305 return this.ruleName +
" ()";
313 public String getUuid() {
320 MimeTypeCondition getMimeTypeCondition() {
321 return mimeTypeCondition;
327 FileSizeCondition getFileSizeCondition() {
328 return fileSizeCondition;
335 static interface FileAttributeCondition
extends Serializable {
344 boolean passes(AbstractFile file);
350 static final class MimeTypeCondition
implements FileAttributeCondition {
352 private static final long serialVersionUID = 1L;
353 private final String mimeType;
360 MimeTypeCondition(String mimeType) {
361 this.mimeType = mimeType;
365 public boolean passes(AbstractFile file) {
366 return this.mimeType.equals(file.getMIMEType());
374 String getMimeType() {
375 return this.mimeType;
384 static final class FileSizeCondition
implements FileAttributeCondition {
386 private static final long serialVersionUID = 1L;
391 static enum COMPARATOR {
394 LESS_THAN_EQUAL(
"≤"),
397 GREATER_THAN_EQUAL(
"≥");
399 private String symbol;
401 COMPARATOR(String symbol) {
402 this.symbol = symbol;
405 public static COMPARATOR fromSymbol(String symbol) {
406 if (symbol.equals(
"<=") || symbol.equals(
"≤")) {
407 return LESS_THAN_EQUAL;
408 }
else if (symbol.equals(
"<")) {
410 }
else if (symbol.equals(
"==") || symbol.equals(
"=")) {
412 }
else if (symbol.equals(
">")) {
414 }
else if (symbol.equals(
">=") || symbol.equals(
"≥")) {
415 return GREATER_THAN_EQUAL;
417 throw new IllegalArgumentException(
"Invalid symbol");
424 public String getSymbol() {
432 static enum SIZE_UNIT {
435 KILOBYTE(1024,
"Kilobytes"),
436 MEGABYTE(1024 * 1024,
"Megabytes"),
437 GIGABYTE(1024 * 1024 * 1024,
"Gigabytes");
441 private SIZE_UNIT(
long size, String name) {
446 public long getSize() {
450 public static SIZE_UNIT fromName(String name) {
451 for (SIZE_UNIT unit : SIZE_UNIT.values()) {
452 if (unit.getName().equals(name)) {
456 throw new IllegalArgumentException(
"Invalid name for size unit.");
466 private final COMPARATOR comparator;
467 private final SIZE_UNIT unit;
468 private final int sizeValue;
470 FileSizeCondition(COMPARATOR comparator, SIZE_UNIT unit,
int sizeValue) {
471 this.comparator = comparator;
473 this.sizeValue = sizeValue;
481 COMPARATOR getComparator() {
490 SIZE_UNIT getUnit() {
504 public boolean passes(AbstractFile file) {
505 long fileSize = file.getSize();
506 long conditionSize = this.getUnit().getSize() * this.getSizeValue();
507 switch (this.getComparator()) {
509 return fileSize > conditionSize;
510 case GREATER_THAN_EQUAL:
511 return fileSize >= conditionSize;
512 case LESS_THAN_EQUAL:
513 return fileSize <= conditionSize;
515 return fileSize < conditionSize;
517 return fileSize == conditionSize;
529 static final class MetaTypeCondition
implements FileAttributeCondition {
531 private static final long serialVersionUID = 1L;
537 FILES_AND_DIRECTORIES,
541 private final Type type;
548 MetaTypeCondition(Type type) {
553 public boolean passes(AbstractFile file) {
556 return file.isFile();
558 return file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR
559 || file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_VIRT_DIR;
560 case FILES_AND_DIRECTORIES:
561 return file.getMetaType() == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_REG
562 || 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;
584 static interface TextCondition
extends FileAttributeCondition {
591 String getTextToMatch();
609 boolean textMatches(String textToMatch);
662 return this.textMatcher.
isRegex();
678 public abstract boolean passes(AbstractFile file);
687 static final class ParentPathCondition
extends AbstractTextCondition {
689 private static final long serialVersionUID = 1L;
696 ParentPathCondition(String path) {
705 ParentPathCondition(Pattern path) {
710 public boolean passes(AbstractFile file) {
711 return this.textMatches(file.getParentPath() +
"/");
721 static interface FileNameCondition
extends TextCondition {
729 static final class FullNameCondition
extends AbstractTextCondition implements FileNameCondition {
731 private static final long serialVersionUID = 1L;
738 FullNameCondition(String name) {
747 FullNameCondition(Pattern name) {
752 public boolean passes(AbstractFile file) {
762 static final class DateCondition
implements FileAttributeCondition {
764 private final static long SECS_PER_DAY = 60 * 60 * 24;
766 private int daysIncluded;
774 DateCondition(
int days) {
783 int getDaysIncluded() {
788 public boolean passes(AbstractFile file) {
789 long dateThreshold = System.currentTimeMillis() / 1000 - daysIncluded * SECS_PER_DAY;
790 if (file.getCrtime() > dateThreshold || file.getMtime() > dateThreshold) {
803 static final class ExtensionCondition
extends AbstractTextCondition implements FileNameCondition {
805 private static final long serialVersionUID = 1L;
812 ExtensionCondition(String extension) {
816 super(extension.startsWith(
".") ? extension.substring(1) : extension,
false);
825 ExtensionCondition(Pattern extension) {
830 public boolean passes(AbstractFile file) {
874 private static final long serialVersionUID = 1L;
899 return subject.equalsIgnoreCase(textToMatch);
909 private static final long serialVersionUID = 1L;
921 this.pattern = Pattern.compile(Pattern.quote(textToMatch), Pattern.CASE_INSENSITIVE);
936 return pattern.matcher(subject).find();
945 private static final long serialVersionUID = 1L;
960 return this.regex.pattern();
971 return this.regex.matcher(subject).find();
String fileIsMemberOf(AbstractFile file)
boolean textMatches(String textToMatch)
FilesSet(String name, String description, boolean ignoreKnownFiles, boolean ignoreUnallocatedSpace, Map< String, Rule > rules)
abstract boolean passes(AbstractFile file)
boolean textMatches(String subject)
boolean textMatches(String subject)
final TextMatcher textMatcher
static final long serialVersionUID
final boolean ignoreUnallocatedSpace
boolean textMatches(String subject)
final boolean ignoreKnownFiles
boolean textMatches(String subject)
final Map< String, Rule > rules
boolean ingoresUnallocatedSpace()