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.EnumSet;
25 import java.util.List;
26 import java.util.Observable;
27 import java.util.Observer;
29 import java.util.logging.Level;
30 import java.util.stream.Collectors;
31 import org.apache.commons.lang.StringUtils;
32 import org.openide.nodes.ChildFactory;
33 import org.openide.nodes.Children;
34 import org.openide.nodes.Node;
35 import org.openide.nodes.Sheet;
36 import org.openide.util.NbBundle;
37 import org.openide.util.NbBundle.Messages;
38 import org.openide.util.lookup.Lookups;
58 this.skCase = typesRoot.getSleuthkitCase();
77 private final PropertyChangeListener
pcl;
83 this.pcl = (PropertyChangeEvent evt) -> {
84 String eventType = evt.getPropertyName();
97 typesRoot.updateShowCounts();
99 }
catch (IllegalStateException notUsed) {
106 if (evt.getNewValue() == null) {
129 private static final String
FNAME = NbBundle.getMessage(FileTypesByExtNode.class,
"FileTypesByExtNode.fname.text");
145 this(
skCase, filter, null);
158 Lookups.singleton(filter == null ? FNAME : filter.getDisplayName()));
159 this.filter = filter;
162 if (filter == null) {
163 super.setName(FNAME);
164 super.setDisplayName(FNAME);
167 super.setName(filter.getDisplayName());
168 super.setDisplayName(filter.getDisplayName());
170 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file_types.png");
174 public boolean isLeafTypeNode() {
180 return v.
visit(
this);
184 protected Sheet createSheet() {
185 Sheet s = super.createSheet();
186 Sheet.Set ss = s.get(Sheet.PROPERTIES);
188 ss = Sheet.createPropertiesSet();
192 String extensions =
"";
193 for (String ext : filter.getFilter()) {
194 extensions +=
"'" + ext +
"', ";
196 extensions = extensions.substring(0, extensions.lastIndexOf(
','));
197 ss.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));
199 ss.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()));
205 public String getItemType() {
210 if (filter == null) {
211 return getClass().getName();
214 return getClass().getName() + filter.getName();
216 return getClass().getName();
246 protected boolean createKeys(List<FileTypesByExtension.SearchFilterInterface> list) {
267 return new FileExtensionNode(key, skCase, notifier);
276 class FileExtensionNode
extends FileTypes.BGCountUpdatingNode {
288 super(typesRoot, Children.create(
new FileExtensionNodeChildren(filter, skCase, o),
true),
289 Lookups.singleton(filter.getDisplayName()));
290 this.filter = filter;
291 super.setName(filter.getDisplayName());
293 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-filter-icon.png");
299 public <T> T accept(DisplayableItemNodeVisitor<T> v) {
300 return v.visit(
this);
304 protected Sheet createSheet() {
305 Sheet s = super.createSheet();
306 Sheet.Set ss = s.get(Sheet.PROPERTIES);
308 ss = Sheet.createPropertiesSet();
311 ss.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.filterType.name"),
312 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.filterType.displayName"),
313 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.filterType.desc"),
314 filter.getDisplayName()));
316 ss.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.name"),
317 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.displayName"),
318 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.desc"),
319 String.join(
", ", filter.getFilter())));
324 public boolean isLeafTypeNode() {
334 public String getItemType() {
339 String getDisplayNameBase() {
340 return filter.getDisplayName();
344 long calculateChildCount() throws TskCoreException {
345 return skCase.countFilesWhere(
createQuery(filter));
350 if (filter.getFilter().isEmpty()) {
354 throw new IllegalArgumentException(
"Empty filter list passed to createQuery()");
357 return "(dir_type = " + TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue() +
")"
359 ?
" AND (known IS NULL OR known != " + TskData.FileKnown.KNOWN.getFileKnownValue() +
")"
361 +
" AND (extension IN (" + filter.getFilter().stream()
362 .map(String::toLowerCase)
363 .map(s ->
"'"+StringUtils.substringAfter(s,
".")+
"'")
364 .collect(Collectors.joining(
", ")) +
"))";
392 if (notifier != null) {
393 notifier.addObserver(
this);
399 if (notifier != null) {
400 notifier.deleteObserver(
this);
405 public void update(Observable o, Object arg) {
413 .stream().map(f ->
new FileTypesKey(f)).collect(Collectors.toList()));
414 }
catch (TskCoreException ex) {
415 logger.log(Level.SEVERE,
"Couldn't get search results", ex);
427 @Messages({
"FileTypeExtensionFilters.tskDatabaseFilter.text=Databases"})
430 TSK_IMAGE_FILTER(0,
"TSK_IMAGE_FILTER",
433 TSK_VIDEO_FILTER(1,
"TSK_VIDEO_FILTER",
434 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskVideoFilter.text"),
436 TSK_AUDIO_FILTER(2,
"TSK_AUDIO_FILTER",
437 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskAudioFilter.text"),
439 TSK_ARCHIVE_FILTER(3,
"TSK_ARCHIVE_FILTER",
440 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskArchiveFilter.text"),
442 TSK_DATABASE_FILTER(4,
"TSK_DATABASE_FILTER",
443 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskDatabaseFilter.text"),
445 TSK_DOCUMENT_FILTER(5,
"TSK_DOCUMENT_FILTER",
446 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskDocumentFilter.text"),
447 Arrays.asList(
".htm",
".html",
".doc",
".docx",
".odt",
".xls",
".xlsx",
".ppt",
".pptx",
".pdf",
".txt",
".rtf")),
448 TSK_EXECUTABLE_FILTER(6,
"TSK_EXECUTABLE_FILTER",
452 private final int id;
457 private RootFilter(
int id, String name, String displayName, List<String> filter) {
460 this.displayName = displayName;
461 this.filter = filter;
466 return v.
visit(
this);
481 return this.displayName;
491 public static enum DocumentFilter implements AutopsyVisitableItem, SearchFilterInterface {
493 AUT_DOC_HTML(0,
"AUT_DOC_HTML",
494 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocHtmlFilter.text"),
495 Arrays.asList(
".htm",
".html")),
496 AUT_DOC_OFFICE(1,
"AUT_DOC_OFFICE",
497 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocOfficeFilter.text"),
498 Arrays.asList(
".doc",
".docx",
".odt",
".xls",
".xlsx",
".ppt",
".pptx")),
499 AUT_DOC_PDF(2,
"AUT_DOC_PDF",
500 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autoDocPdfFilter.text"),
501 Arrays.asList(
".pdf")),
502 AUT_DOC_TXT(3,
"AUT_DOC_TXT",
503 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocTxtFilter.text"),
504 Arrays.asList(
".txt")),
505 AUT_DOC_RTF(4,
"AUT_DOC_RTF",
506 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocRtfFilter.text"),
507 Arrays.asList(
".rtf"));
509 private final int id;
514 private DocumentFilter(
int id, String name, String displayName, List<String> filter) {
517 this.displayName = displayName;
518 this.filter = filter;
523 return v.
visit(
this);
538 return this.displayName;
548 public static enum ExecutableFilter implements AutopsyVisitableItem, SearchFilterInterface {
556 private final int id;
564 this.displayName = displayName;
565 this.filter = filter;
570 return v.
visit(
this);
585 return this.displayName;
594 interface SearchFilterInterface {
596 public String getName();
600 public String getDisplayName();
602 public List<String> getFilter();
static List< String > getDatabaseExtensions()
void removeIngestModuleEventListener(final PropertyChangeListener listener)
boolean createKeys(List< FileTypesKey > list)
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
DisplayableItemNode(Children children)
static List< String > getVideoExtensions()
final FileTypes typesRoot
final Observable notifier
final PropertyChangeListener pcl
final List< String > filter
static boolean hideKnownFilesInViewsTree()
T visit(DataSourcesNode in)
void removeIngestJobEventListener(final PropertyChangeListener listener)
List< String > getFilter()
final Set< Case.Events > CASE_EVENTS_OF_INTEREST
public< T > T accept(AutopsyItemVisitor< T > v)
final FileTypesByExtension.SearchFilterInterface filter
final FileTypesByExtObservable notifier
String createQuery(FileTypesByExtension.SearchFilterInterface filter)
static final Logger logger
FileTypesByExtObservable()
void addIngestJobEventListener(final PropertyChangeListener listener)
public< T > T accept(AutopsyItemVisitor< T > v)
final FileTypesByExtension.RootFilter filter
boolean createKeys(List< FileTypesByExtension.SearchFilterInterface > list)
FileTypesByExtNodeChildren(SleuthkitCase skCase, FileTypesByExtension.RootFilter filter, FileTypesByExtObservable o)
Node createNodeForKey(FileTypesKey key)
public< T > T accept(AutopsyItemVisitor< T > v)
RootFilter(int id, String name, String displayName, List< String > filter)
FileTypesByExtension(FileTypes typesRoot)
Node createNodeForKey(FileTypesByExtension.SearchFilterInterface key)
DocumentFilter(int id, String name, String displayName, List< String > filter)
static List< String > getAudioExtensions()
void addIngestModuleEventListener(final PropertyChangeListener listener)
FileExtensionNodeChildren(FileTypesByExtension.SearchFilterInterface filter, SleuthkitCase skCase, Observable o)
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
final SleuthkitCase skCase
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()