19 package org.sleuthkit.autopsy.datamodel;
21 import java.beans.PropertyChangeEvent;
22 import java.beans.PropertyChangeListener;
23 import java.util.Arrays;
24 import java.util.Collections;
25 import java.util.EnumSet;
26 import java.util.List;
27 import java.util.Observable;
28 import java.util.Observer;
30 import java.util.logging.Level;
31 import java.util.stream.Collectors;
32 import org.apache.commons.lang.StringUtils;
33 import org.openide.nodes.ChildFactory;
34 import org.openide.nodes.Children;
35 import org.openide.nodes.Node;
36 import org.openide.nodes.Sheet;
37 import org.openide.util.Exceptions;
38 import org.openide.util.NbBundle;
39 import org.openide.util.NbBundle.Messages;
40 import org.openide.util.lookup.Lookups;
78 return visitor.
visit(
this);
81 long filteringDataSourceObjId() {
82 return typesRoot.filteringDataSourceObjId();
91 private final PropertyChangeListener
pcl;
103 this.pcl = (PropertyChangeEvent evt) -> {
104 String eventType = evt.getPropertyName();
117 typesRoot.updateShowCounts();
126 if (evt.getNewValue() == null) {
151 typesRoot.updateShowCounts();
157 String eventType = evt.getPropertyName();
176 if ((moduleContentEvent.getSource() instanceof AbstractFile) ==
false) {
179 AbstractFile abstractFile = (AbstractFile) moduleContentEvent.getSource();
180 if (!abstractFile.getNameExtension().isEmpty()) {
194 private static final String
FNAME = NbBundle.getMessage(FileTypesByExtNode.class,
"FileTypesByExtNode.fname.text");
210 this(skCase, filter, null);
223 Lookups.singleton(filter == null ? FNAME : filter.getDisplayName()));
224 this.filter = filter;
227 if (filter == null) {
228 super.setName(FNAME);
229 super.setDisplayName(FNAME);
232 super.setName(filter.getDisplayName());
233 super.setDisplayName(filter.getDisplayName());
235 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file_types.png");
239 public boolean isLeafTypeNode() {
245 return visitor.
visit(
this);
249 protected Sheet createSheet() {
250 Sheet sheet = super.createSheet();
251 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
252 if (sheetSet == null) {
253 sheetSet = Sheet.createPropertiesSet();
257 String extensions =
"";
258 for (String ext : filter.getFilter()) {
259 extensions +=
"'" + ext +
"', ";
261 extensions = extensions.substring(0, extensions.lastIndexOf(
','));
262 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.name"), NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.displayName"), NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.desc"), extensions));
264 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.name.name"), NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.name.displayName"), NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.name.desc"), getDisplayName()));
270 public String getItemType() {
275 if (filter == null) {
276 return getClass().getName();
279 return getClass().getName() + filter.getName();
281 return getClass().getName();
311 protected boolean createKeys(List<FileTypesByExtension.SearchFilterInterface> list) {
332 return new FileExtensionNode(key, skCase, notifier);
341 final class FileExtensionNode
extends FileTypes.BGCountUpdatingNode {
353 super(typesRoot, Children.create(
new FileExtensionNodeChildren(filter, skCase, o, filter.getDisplayName()),
true),
354 Lookups.singleton(filter.getDisplayName()));
355 this.filter = filter;
356 super.setName(filter.getDisplayName());
358 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-filter-icon.png");
364 public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
365 return visitor.visit(
this);
369 protected Sheet createSheet() {
370 Sheet sheet = super.createSheet();
371 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
372 if (sheetSet == null) {
373 sheetSet = Sheet.createPropertiesSet();
376 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.filterType.name"),
377 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.filterType.displayName"),
378 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.filterType.desc"),
379 filter.getDisplayName()));
381 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.name"),
382 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.displayName"),
383 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.desc"),
384 String.join(
", ", filter.getFilter())));
389 public boolean isLeafTypeNode() {
399 public String getItemType() {
404 String getDisplayNameBase() {
405 return filter.getDisplayName();
409 long calculateChildCount() throws TskCoreException {
411 return Case.getCurrentCaseThrows().getSleuthkitCase().countFilesWhere(
createQuery(filter));
412 }
catch (NoCurrentCaseException ex) {
413 throw new TskCoreException(
"No open case.", ex);
419 if (filter.getFilter().isEmpty()) {
423 throw new IllegalArgumentException(
"Empty filter list passed to createQuery()");
426 return "(dir_type = " + TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue() +
")"
428 ?
" AND (known IS NULL OR known != " + TskData.FileKnown.KNOWN.getFileKnownValue() +
")"
430 + (filteringDataSourceObjId() > 0
431 ?
" AND data_source_obj_id = " + filteringDataSourceObjId()
433 +
" AND (extension IN (" + filter.getFilter().stream()
434 .map(String::toLowerCase)
435 .map(s ->
"'" + StringUtils.substringAfter(s,
".") +
"'")
436 .collect(Collectors.joining(
", ")) +
"))";
457 super(nodeName,
new ViewsKnownAndSlackFilter<>());
465 if (notifier != null) {
466 notifier.addObserver(
this);
472 if (notifier != null) {
473 notifier.deleteObserver(
this);
478 public void update(Observable o, Object arg) {
491 .stream().map(f ->
new FileTypesKey(f)).collect(Collectors.toList());
492 }
catch (TskCoreException ex) {
493 logger.log(Level.SEVERE,
"Couldn't get search results", ex);
495 return Collections.emptyList();
500 @Messages({
"FileTypeExtensionFilters.tskDatabaseFilter.text=Databases"})
503 TSK_IMAGE_FILTER(0,
"TSK_IMAGE_FILTER",
506 TSK_VIDEO_FILTER(1,
"TSK_VIDEO_FILTER",
507 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskVideoFilter.text"),
509 TSK_AUDIO_FILTER(2,
"TSK_AUDIO_FILTER",
510 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskAudioFilter.text"),
512 TSK_ARCHIVE_FILTER(3,
"TSK_ARCHIVE_FILTER",
513 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskArchiveFilter.text"),
515 TSK_DATABASE_FILTER(4,
"TSK_DATABASE_FILTER",
516 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskDatabaseFilter.text"),
518 TSK_DOCUMENT_FILTER(5,
"TSK_DOCUMENT_FILTER",
519 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskDocumentFilter.text"),
520 Arrays.asList(
".htm",
".html",
".doc",
".docx",
".odt",
".xls",
".xlsx",
".ppt",
".pptx",
".pdf",
".txt",
".rtf")),
521 TSK_EXECUTABLE_FILTER(6,
"TSK_EXECUTABLE_FILTER",
525 private final int id;
530 private RootFilter(
int id, String name, String displayName, List<String> filter) {
533 this.displayName = displayName;
534 this.filter = filter;
539 return visitor.
visit(
this);
554 return this.displayName;
559 return Collections.unmodifiableList(this.filter);
564 public static enum DocumentFilter implements AutopsyVisitableItem, SearchFilterInterface {
566 AUT_DOC_HTML(0,
"AUT_DOC_HTML",
567 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocHtmlFilter.text"),
568 Arrays.asList(
".htm",
".html")),
569 AUT_DOC_OFFICE(1,
"AUT_DOC_OFFICE",
570 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocOfficeFilter.text"),
571 Arrays.asList(
".doc",
".docx",
".odt",
".xls",
".xlsx",
".ppt",
".pptx")),
572 AUT_DOC_PDF(2,
"AUT_DOC_PDF",
573 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autoDocPdfFilter.text"),
574 Arrays.asList(
".pdf")),
575 AUT_DOC_TXT(3,
"AUT_DOC_TXT",
576 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocTxtFilter.text"),
577 Arrays.asList(
".txt")),
578 AUT_DOC_RTF(4,
"AUT_DOC_RTF",
579 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocRtfFilter.text"),
580 Arrays.asList(
".rtf"));
582 private final int id;
587 private DocumentFilter(
int id, String name, String displayName, List<String> filter) {
590 this.displayName = displayName;
591 this.filter = filter;
596 return visitor.
visit(
this);
611 return this.displayName;
616 return Collections.unmodifiableList(this.filter);
621 public static enum ExecutableFilter implements AutopsyVisitableItem, SearchFilterInterface {
629 private final int id;
637 this.displayName = displayName;
638 this.filter = filter;
643 return visitor.
visit(
this);
658 return this.displayName;
663 return Collections.unmodifiableList(this.filter);
667 interface SearchFilterInterface {
669 public String getName();
673 public String getDisplayName();
675 public List<String> getFilter();
void registerForIngestModuleEvents()
static List< String > getDatabaseExtensions()
static final Set< IngestManager.IngestJobEvent > INGEST_JOB_EVENTS_OF_INTEREST
void update(Observable o, Object arg)
static List< String > getArchiveExtensions()
static synchronized IngestManager getInstance()
final List< String > filter
static List< String > getExecutableExtensions()
final List< String > filter
public< T > T accept(AutopsyItemVisitor< T > visitor)
public< T > T accept(AutopsyItemVisitor< T > visitor)
DisplayableItemNode(Children children)
static List< String > getVideoExtensions()
final FileTypes typesRoot
final Observable notifier
static final Set< IngestManager.IngestModuleEvent > INGEST_MODULE_EVENTS_OF_INTEREST
final PropertyChangeListener pcl
void unregisterEventListener()
final List< String > filter
static boolean hideKnownFilesInViewsTree()
void removeIngestJobEventListener(final PropertyChangeListener listener)
List< String > getFilter()
final Set< Case.Events > CASE_EVENTS_OF_INTEREST
boolean isRefreshRequired(PropertyChangeEvent evt)
final FileTypesByExtension.SearchFilterInterface filter
final FileTypesByExtObservable notifier
String createQuery(FileTypesByExtension.SearchFilterInterface filter)
static final Logger logger
FileTypesByExtObservable()
void addIngestJobEventListener(final PropertyChangeListener listener)
final FileTypesByExtension.RootFilter filter
FileExtensionNodeChildren(FileTypesByExtension.SearchFilterInterface filter, SleuthkitCase skCase, Observable o, String nodeName)
boolean createKeys(List< FileTypesByExtension.SearchFilterInterface > list)
FileTypesByExtNodeChildren(SleuthkitCase skCase, FileTypesByExtension.RootFilter filter, FileTypesByExtObservable o)
Node createNodeForKey(FileTypesKey key)
SleuthkitCase getSleuthkitCase()
RootFilter(int id, String name, String displayName, List< String > filter)
T visit(DataSourceFilesNode in)
FileTypesByExtension(FileTypes typesRoot)
Node createNodeForKey(FileTypesByExtension.SearchFilterInterface key)
DocumentFilter(int id, String name, String displayName, List< String > filter)
static List< String > getAudioExtensions()
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
List< FileTypesKey > makeKeys()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
public< T > T accept(AutopsyItemVisitor< T > visitor)
final RefreshThrottler refreshThrottler
SleuthkitCase getSleuthkitCase()
ExecutableFilter(int id, String name, String displayName, List< String > filter)
static final String FNAME
final SleuthkitCase skCase
final SleuthkitCase skCase
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
static List< String > getImageExtensions()
List< String > getFilter()
List< String > getFilter()