19package org.sleuthkit.autopsy.datamodel;
21import java.beans.PropertyChangeEvent;
22import java.beans.PropertyChangeListener;
23import java.util.ArrayList;
24import java.util.Arrays;
25import java.util.EnumSet;
27import java.util.Observable;
28import java.util.Observer;
30import java.util.logging.Level;
31import org.openide.nodes.AbstractNode;
32import org.openide.nodes.ChildFactory;
33import org.openide.nodes.Children;
34import org.openide.nodes.Node;
35import org.openide.nodes.Sheet;
36import org.openide.util.NbBundle;
37import org.openide.util.lookup.Lookups;
38import org.sleuthkit.autopsy.casemodule.Case;
39import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
40import org.sleuthkit.autopsy.coreutils.Logger;
41import org.sleuthkit.autopsy.ingest.IngestManager;
42import static org.sleuthkit.autopsy.ingest.IngestManager.IngestModuleEvent.CONTENT_CHANGED;
43import org.sleuthkit.datamodel.AbstractFile;
44import org.sleuthkit.datamodel.Content;
45import org.sleuthkit.datamodel.ContentVisitor;
46import org.sleuthkit.datamodel.Directory;
47import org.sleuthkit.datamodel.File;
48import org.sleuthkit.datamodel.FsContent;
49import org.sleuthkit.datamodel.LayoutFile;
50import org.sleuthkit.datamodel.SleuthkitCase;
51import org.sleuthkit.datamodel.TskCoreException;
52import org.sleuthkit.datamodel.TskData;
53import org.sleuthkit.datamodel.VirtualDirectory;
63 @NbBundle.Messages({
"DeletedContent.fsDelFilter.text=File System",
64 "DeletedContent.allDelFilter.text=All"})
68 Bundle.DeletedContent_fsDelFilter_text()),
70 Bundle.DeletedContent_allDelFilter_text());
92 return this.displayName;
97 return visitor.
visit(
this);
107 this.filteringDSObjId = dsObjId;
110 long filteringDataSourceObjId() {
111 return this.filteringDSObjId;
115 public <T> T accept(AutopsyItemVisitor<T> visitor) {
116 return visitor.visit(
this);
125 @NbBundle.Messages(
"DeletedContent.deletedContentsNode.name=Deleted Files")
126 private static final String
NAME = Bundle.DeletedContent_deletedContentsNode_name();
128 DeletedContentsNode(SleuthkitCase
skCase,
long datasourceObjId) {
131 super.setDisplayName(
NAME);
132 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-icon-deleted.png");
142 return visitor.
visit(
this);
147 "DeletedContent.createSheet.name.displayName=Name",
148 "DeletedContent.createSheet.name.desc=no description"})
150 Sheet sheet = super.createSheet();
151 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
152 if (sheetSet ==
null) {
153 sheetSet = Sheet.createPropertiesSet();
158 Bundle.DeletedContent_createSheet_name_displayName(),
159 Bundle.DeletedContent_createSheet_name_desc(),
166 return getClass().getName();
180 this.datasourceObjId = dsObjId;
188 private static final class DeletedContentsChildrenObservable
extends Observable {
197 DeletedContentsChildrenObservable() {
210 private final PropertyChangeListener
pcl = (PropertyChangeEvent evt) -> {
211 String eventType = evt.getPropertyName();
249 if (evt.getNewValue() ==
null) {
264 protected boolean createKeys(List<DeletedContent.DeletedContentFilter> list) {
265 list.addAll(Arrays.asList(
DeletedContent.DeletedContentFilter.values()));
282 super(Children.create(
new DeletedContentChildren(
filter,
skCase,
null, dsObjId),
true), Lookups.singleton(
filter.getDisplayName()));
284 this.datasourceObjId = dsObjId;
289 super(Children.create(
new DeletedContentChildren(
filter,
skCase, o, dsObjId),
true), Lookups.singleton(
filter.getDisplayName()));
291 this.datasourceObjId = dsObjId;
293 o.addObserver(
new DeletedContentNodeObserver());
297 super.setName(
filter.getName());
299 String tooltip =
filter.getDisplayName();
300 this.setShortDescription(tooltip);
301 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/file-icon-deleted.png");
309 public void update(Observable o, Object arg) {
318 super.setDisplayName(
filter.getDisplayName() +
" (" + count +
")");
323 return visitor.
visit(
this);
328 "DeletedContent.createSheet.filterType.displayName=Type",
329 "DeletedContent.createSheet.filterType.desc=no description"})
331 Sheet sheet = super.createSheet();
332 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
333 if (sheetSet ==
null) {
334 sheetSet = Sheet.createPropertiesSet();
339 Bundle.DeletedContent_createSheet_filterType_displayName(),
340 Bundle.DeletedContent_createSheet_filterType_desc(),
341 filter.getDisplayName()));
361 static class DeletedContentChildren
extends BaseChildFactory<AbstractFile> {
363 private final SleuthkitCase
skCase;
371 super(
filter.getName(),
new ViewsKnownAndSlackFilter<>());
378 private final Observer observer =
new DeletedContentChildrenObserver();
381 protected List<AbstractFile>
makeKeys() {
389 public void update(Observable o, Object arg) {
395 protected void onAdd() {
411 case FS_DELETED_FILTER:
412 query =
"dir_flags = " + TskData.TSK_FS_NAME_FLAG_ENUM.UNALLOC.getValue()
413 +
" AND meta_flags != " + TskData.TSK_FS_META_FLAG_ENUM.ORPHAN.getValue()
414 +
" AND type = " + TskData.TSK_DB_FILES_TYPE_ENUM.FS.getFileType();
417 case ALL_DELETED_FILTER:
420 +
"(dir_flags = " + TskData.TSK_FS_NAME_FLAG_ENUM.UNALLOC.getValue()
422 +
"meta_flags = " + TskData.TSK_FS_META_FLAG_ENUM.ORPHAN.getValue()
424 +
" AND type = " + TskData.TSK_DB_FILES_TYPE_ENUM.FS.getFileType()
426 +
" OR type = " + TskData.TSK_DB_FILES_TYPE_ENUM.CARVED.getFileType()
427 +
" OR (dir_flags = " + TskData.TSK_FS_NAME_FLAG_ENUM.UNALLOC.getValue()
428 +
" AND type = " + TskData.TSK_DB_FILES_TYPE_ENUM.LAYOUT_FILE.getFileType() +
" )"
439 logger.log(Level.SEVERE,
"Unsupported filter type to get deleted content: {0}",
filter);
449 private List<AbstractFile> runFsQuery() {
450 List<AbstractFile> ret =
new ArrayList<>();
452 String query = makeQuery(filter, datasourceObjId);
454 ret = skCase.findAllFilesWhere(query);
455 }
catch (TskCoreException e) {
456 logger.log(Level.SEVERE,
"Error getting files for the deleted content view using: " + query, e);
471 static long calculateItems(SleuthkitCase sleuthkitCase,
DeletedContent.DeletedContentFilter filter,
long datasourceObjId) {
473 return sleuthkitCase.countFilesWhere(makeQuery(filter, datasourceObjId));
474 }
catch (TskCoreException ex) {
475 logger.log(Level.SEVERE,
"Error getting deleted files search view count", ex);
481 protected Node createNodeForKey(AbstractFile key) {
482 return key.accept(
new ContentVisitor.Default<AbstractNode>() {
483 public FileNode visit(AbstractFile f) {
484 return new FileNode(f, false);
487 public FileNode visit(FsContent f) {
488 return new FileNode(f,
false);
492 public FileNode visit(LayoutFile f) {
493 return new FileNode(f,
false);
497 public FileNode visit(File f) {
498 return new FileNode(f,
false);
502 public FileNode visit(Directory f) {
503 return new FileNode(f,
false);
507 public FileNode visit(VirtualDirectory f) {
508 return new FileNode(f,
false);
512 protected AbstractNode defaultVisit(Content di) {
513 throw new UnsupportedOperationException(
"Not supported for this type of Displayable Item: " + di.toString());
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
synchronized static Logger getLogger(String name)
static final Logger logger
abstract List< T > makeKeys()
final DeletedContent.DeletedContentFilter filter
final long datasourceObjId
void update(Observable o, Object arg)
void update(Observable o, Object arg)
static final Set< IngestManager.IngestJobEvent > INGEST_JOB_EVENTS_OF_INTEREST
final PropertyChangeListener pcl
static final Set< Case.Events > CASE_EVENTS_OF_INTEREST
static final Set< IngestManager.IngestModuleEvent > INGEST_MODULE_EVENTS_OF_INTEREST
boolean createKeys(List< DeletedContent.DeletedContentFilter > list)
static volatile boolean maxFilesDialogShown
DeletedContentsChildren(SleuthkitCase skCase, long dsObjId)
final long datasourceObjId
Node createNodeForKey(DeletedContent.DeletedContentFilter key)
SleuthkitCase getSleuthkitCase()
final long filteringDSObjId
DeletedContent(SleuthkitCase skCase, long dsObjId)
DeletedContent(SleuthkitCase skCase)
DisplayableItemNode(Children children)
static synchronized IngestManager getInstance()
void removeIngestModuleEventListener(final PropertyChangeListener listener)
void removeIngestJobEventListener(final PropertyChangeListener listener)
void addIngestModuleEventListener(final PropertyChangeListener listener)
void addIngestJobEventListener(final PropertyChangeListener listener)
DeletedContentFilter(int id, String name, String displayName)
public< T > T accept(AutopsyItemVisitor< T > visitor)
T visit(DataSourceFilesNode in)