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;
59 this.skCase = typesRoot.getSleuthkitCase();
69 return visitor.
visit(
this);
78 private final PropertyChangeListener
pcl;
84 this.pcl = (PropertyChangeEvent evt) -> {
85 String eventType = evt.getPropertyName();
98 typesRoot.updateShowCounts();
107 if (evt.getNewValue() == null) {
130 private static final String
FNAME = NbBundle.getMessage(FileTypesByExtNode.class,
"FileTypesByExtNode.fname.text");
146 this(
skCase, filter, null);
159 Lookups.singleton(filter == null ? FNAME : filter.getDisplayName()));
160 this.filter = filter;
163 if (filter == null) {
164 super.setName(FNAME);
165 super.setDisplayName(FNAME);
168 super.setName(filter.getDisplayName());
169 super.setDisplayName(filter.getDisplayName());
171 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file_types.png");
175 public boolean isLeafTypeNode() {
181 return visitor.
visit(
this);
185 protected Sheet createSheet() {
186 Sheet sheet = super.createSheet();
187 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
188 if (sheetSet == null) {
189 sheetSet = Sheet.createPropertiesSet();
193 String extensions =
"";
194 for (String ext : filter.getFilter()) {
195 extensions +=
"'" + ext +
"', ";
197 extensions = extensions.substring(0, extensions.lastIndexOf(
','));
198 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));
200 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()));
206 public String getItemType() {
211 if (filter == null) {
212 return getClass().getName();
215 return getClass().getName() + filter.getName();
217 return getClass().getName();
247 protected boolean createKeys(List<FileTypesByExtension.SearchFilterInterface> list) {
268 return new FileExtensionNode(key, skCase, notifier);
277 class FileExtensionNode
extends FileTypes.BGCountUpdatingNode {
289 super(typesRoot, Children.create(
new FileExtensionNodeChildren(filter, skCase, o),
true),
290 Lookups.singleton(filter.getDisplayName()));
291 this.filter = filter;
292 super.setName(filter.getDisplayName());
294 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-filter-icon.png");
300 public <T> T accept(DisplayableItemNodeVisitor<T> visitor) {
301 return visitor.visit(
this);
305 protected Sheet createSheet() {
306 Sheet sheet = super.createSheet();
307 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
308 if (sheetSet == null) {
309 sheetSet = Sheet.createPropertiesSet();
312 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.filterType.name"),
313 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.filterType.displayName"),
314 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.filterType.desc"),
315 filter.getDisplayName()));
317 sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.name"),
318 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.displayName"),
319 NbBundle.getMessage(
this.getClass(),
"FileTypesByExtNode.createSheet.fileExt.desc"),
320 String.join(
", ", filter.getFilter())));
325 public boolean isLeafTypeNode() {
335 public String getItemType() {
340 String getDisplayNameBase() {
341 return filter.getDisplayName();
345 long calculateChildCount() throws TskCoreException {
346 return skCase.countFilesWhere(
createQuery(filter));
351 if (filter.getFilter().isEmpty()) {
355 throw new IllegalArgumentException(
"Empty filter list passed to createQuery()");
358 return "(dir_type = " + TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue() +
")"
360 ?
" AND (known IS NULL OR known != " + TskData.FileKnown.KNOWN.getFileKnownValue() +
")"
362 +
" AND (extension IN (" + filter.getFilter().stream()
363 .map(String::toLowerCase)
364 .map(s ->
"'"+StringUtils.substringAfter(s,
".")+
"'")
365 .collect(Collectors.joining(
", ")) +
"))";
393 if (notifier != null) {
394 notifier.addObserver(
this);
400 if (notifier != null) {
401 notifier.deleteObserver(
this);
406 public void update(Observable o, Object arg) {
414 .stream().map(f ->
new FileTypesKey(f)).collect(Collectors.toList()));
415 }
catch (TskCoreException ex) {
416 logger.log(Level.SEVERE,
"Couldn't get search results", ex);
428 @Messages({
"FileTypeExtensionFilters.tskDatabaseFilter.text=Databases"})
431 TSK_IMAGE_FILTER(0,
"TSK_IMAGE_FILTER",
434 TSK_VIDEO_FILTER(1,
"TSK_VIDEO_FILTER",
435 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskVideoFilter.text"),
437 TSK_AUDIO_FILTER(2,
"TSK_AUDIO_FILTER",
438 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskAudioFilter.text"),
440 TSK_ARCHIVE_FILTER(3,
"TSK_ARCHIVE_FILTER",
441 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskArchiveFilter.text"),
443 TSK_DATABASE_FILTER(4,
"TSK_DATABASE_FILTER",
444 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskDatabaseFilter.text"),
446 TSK_DOCUMENT_FILTER(5,
"TSK_DOCUMENT_FILTER",
447 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.tskDocumentFilter.text"),
448 Arrays.asList(
".htm",
".html",
".doc",
".docx",
".odt",
".xls",
".xlsx",
".ppt",
".pptx",
".pdf",
".txt",
".rtf")),
449 TSK_EXECUTABLE_FILTER(6,
"TSK_EXECUTABLE_FILTER",
453 private final int id;
458 private RootFilter(
int id, String name, String displayName, List<String> filter) {
461 this.displayName = displayName;
462 this.filter = filter;
467 return visitor.
visit(
this);
482 return this.displayName;
492 public static enum DocumentFilter implements AutopsyVisitableItem, SearchFilterInterface {
494 AUT_DOC_HTML(0,
"AUT_DOC_HTML",
495 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocHtmlFilter.text"),
496 Arrays.asList(
".htm",
".html")),
497 AUT_DOC_OFFICE(1,
"AUT_DOC_OFFICE",
498 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocOfficeFilter.text"),
499 Arrays.asList(
".doc",
".docx",
".odt",
".xls",
".xlsx",
".ppt",
".pptx")),
500 AUT_DOC_PDF(2,
"AUT_DOC_PDF",
501 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autoDocPdfFilter.text"),
502 Arrays.asList(
".pdf")),
503 AUT_DOC_TXT(3,
"AUT_DOC_TXT",
504 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocTxtFilter.text"),
505 Arrays.asList(
".txt")),
506 AUT_DOC_RTF(4,
"AUT_DOC_RTF",
507 NbBundle.getMessage(
FileTypesByExtension.class,
"FileTypeExtensionFilters.autDocRtfFilter.text"),
508 Arrays.asList(
".rtf"));
510 private final int id;
515 private DocumentFilter(
int id, String name, String displayName, List<String> filter) {
518 this.displayName = displayName;
519 this.filter = filter;
524 return visitor.
visit(
this);
539 return this.displayName;
549 public static enum ExecutableFilter implements AutopsyVisitableItem, SearchFilterInterface {
557 private final int id;
565 this.displayName = displayName;
566 this.filter = filter;
571 return visitor.
visit(
this);
586 return this.displayName;
595 interface SearchFilterInterface {
597 public String getName();
601 public String getDisplayName();
603 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
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
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
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
boolean createKeys(List< FileTypesByExtension.SearchFilterInterface > list)
FileTypesByExtNodeChildren(SleuthkitCase skCase, FileTypesByExtension.RootFilter filter, FileTypesByExtObservable o)
Node createNodeForKey(FileTypesKey key)
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)
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
public< T > T accept(AutopsyItemVisitor< T > visitor)
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()