19 package org.sleuthkit.autopsy.datamodel;
21 import java.beans.PropertyChangeEvent;
22 import java.beans.PropertyChangeListener;
23 import java.text.MessageFormat;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.EnumSet;
27 import java.util.HashMap;
28 import java.util.List;
31 import java.util.logging.Level;
32 import org.apache.commons.lang3.StringUtils;
33 import org.openide.nodes.AbstractNode;
34 import org.openide.nodes.ChildFactory;
35 import org.openide.nodes.Children;
36 import org.openide.nodes.Node;
37 import org.openide.nodes.Sheet;
38 import org.openide.util.NbBundle;
39 import org.openide.util.WeakListeners;
40 import org.openide.util.lookup.Lookups;
49 import org.
sleuthkit.datamodel.BlackboardArtifact.Category;
73 @NbBundle.Messages({
"ScoreContent_badFilter_text=Bad Items",
74 "ScoreContent_susFilter_text=Suspicious Items"})
77 BAD_ITEM_FILTER(0,
"BAD_ITEM_FILTER",
78 Bundle.ScoreContent_badFilter_text()),
79 SUS_ITEM_FILTER(1,
"SUS_ITEM_FILTER",
80 Bundle.ScoreContent_susFilter_text());
89 this.displayName = displayName;
102 return this.displayName;
107 return visitor.
visit(
this);
126 this.filteringDSObjId = dsObjId;
132 long filteringDataSourceObjId() {
137 public <T> T accept(AutopsyItemVisitor<T> visitor) {
138 return visitor.visit(
this);
165 private static PropertyChangeListener
getPcl(
final Runnable onRefresh,
final Runnable onRemove) {
166 return (PropertyChangeEvent evt) -> {
167 String eventType = evt.getPropertyName();
172 if (onRefresh != null) {
182 if (evt.getNewValue() == null && onRemove != null) {
189 if (onRefresh != null) {
209 String aggregateScoreFilter =
"";
211 case SUS_ITEM_FILTER:
212 aggregateScoreFilter =
" tsk_aggregate_score.significance = " + Significance.LIKELY_NOTABLE.getId() +
" AND (tsk_aggregate_score.priority = " + Priority.NORMAL.getId() +
" OR tsk_aggregate_score.priority = " + Priority.OVERRIDE.getId() +
" )";
215 case BAD_ITEM_FILTER:
216 aggregateScoreFilter =
" tsk_aggregate_score.significance = " + Significance.NOTABLE.getId() +
" AND (tsk_aggregate_score.priority = " + Priority.NORMAL.getId() +
" OR tsk_aggregate_score.priority = " + Priority.OVERRIDE.getId() +
" )";
220 throw new IllegalArgumentException(MessageFormat.format(
"Unsupported filter type to get suspect content: {0}", filter));
224 String query =
" obj_id IN (SELECT tsk_aggregate_score.obj_id FROM tsk_aggregate_score WHERE " + aggregateScoreFilter +
") ";
226 if (filteringDSObjId > 0) {
240 String eventType = evt.getPropertyName();
246 if (null != event && Category.ANALYSIS_RESULT.equals(event.getBlackboardArtifactType().getCategory())) {
263 @NbBundle.Messages(
"ScoreContent_ScoreContentNode_name=Score")
264 private static final String
NAME = Bundle.ScoreContent_ScoreContentNode_name();
267 super(Children.create(
new ScoreContentsChildren(skCase, datasourceObjId),
true), Lookups.singleton(NAME));
269 super.setDisplayName(NAME);
270 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/red-circle-exclamation.png");
280 return visitor.
visit(
this);
285 "ScoreContent_createSheet_name_displayName=Name",
286 "ScoreContent_createSheet_name_desc=no description"})
288 Sheet sheet = super.createSheet();
289 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
290 if (sheetSet == null) {
291 sheetSet = Sheet.createPropertiesSet();
296 Bundle.ScoreContent_createSheet_name_displayName(),
297 Bundle.ScoreContent_createSheet_name_desc(),
304 return getClass().getName();
322 private final PropertyChangeListener
weakPcl = WeakListeners.propertyChange(pcl, null);
328 this.datasourceObjId = dsObjId;
360 protected boolean createKeys(List<ScoreContent.ScoreContentFilter> list) {
362 typeNodeMap.values().forEach(nd -> nd.updateDisplayName());
383 super(Children.create(
new ScoreContentChildren(
filter, skCase, dsObjId),
true), Lookups.singleton(
filter.getDisplayName()));
385 this.datasourceObjId = dsObjId;
390 super.setName(
filter.getName());
392 String tooltip =
filter.getDisplayName();
393 this.setShortDescription(tooltip);
395 case SUS_ITEM_FILTER:
396 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/yellow-circle-yield.png");
399 case BAD_ITEM_FILTER:
400 this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/red-circle-exclamation.png");
407 void updateDisplayName() {
412 }
catch (TskCoreException ex) {
413 logger.log(Level.WARNING,
"An error occurred while fetching file counts", ex);
415 super.setDisplayName(
filter.getDisplayName() +
" (" + count +
")");
432 return visitor.
visit(
this);
437 "ScoreContent_createSheet_filterType_displayName=Type",
438 "ScoreContent_createSheet_filterType_desc=no description"})
440 Sheet sheet = super.createSheet();
441 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
442 if (sheetSet == null) {
443 sheetSet = Sheet.createPropertiesSet();
448 Bundle.ScoreContent_createSheet_filterType_displayName(),
449 Bundle.ScoreContent_createSheet_filterType_desc(),
450 filter.getDisplayName()));
473 private final PropertyChangeListener pcl =
getPcl(
474 () -> ScoreContentChildren.this.refresh(
false),
475 () -> ScoreContentChildren.this.removeNotify());
477 private final PropertyChangeListener weakPcl = WeakListeners.propertyChange(pcl, null);
479 private final SleuthkitCase
skCase;
486 super(filter.getName(),
new ViewsKnownAndSlackFilter<>());
488 this.filter = filter;
493 protected void onAdd() {
501 protected void onRemove() {
518 private List<AbstractFile> runFsQuery() {
519 List<AbstractFile> ret =
new ArrayList<>();
524 ret = skCase.findAllFilesWhere(query);
525 }
catch (TskCoreException | IllegalArgumentException e) {
526 logger.log(Level.SEVERE,
"Error getting files for the deleted content view using: " + StringUtils.defaultString(query,
"<null>"), e);
534 protected List<AbstractFile> makeKeys() {
540 return key.accept(
new ContentVisitor.Default<AbstractNode>() {
541 public FileNode visit(AbstractFile f) {
542 return new FileNode(f, false);
545 public FileNode visit(FsContent f) {
546 return new FileNode(f,
false);
550 public FileNode visit(LayoutFile f) {
551 return new FileNode(f,
false);
555 public FileNode visit(File f) {
556 return new FileNode(f,
false);
560 public FileNode visit(Directory f) {
561 return new FileNode(f,
false);
565 public FileNode visit(VirtualDirectory f) {
566 return new FileNode(f,
false);
570 public AbstractNode visit(SlackFile sf) {
571 return new FileNode(sf,
false);
575 public AbstractNode visit(LocalFile lf) {
576 return new FileNode(lf,
false);
580 public AbstractNode visit(DerivedFile df) {
581 return new FileNode(df,
false);
585 protected AbstractNode defaultVisit(Content di) {
586 if (di instanceof AbstractFile) {
587 return visit((AbstractFile) di);
589 throw new UnsupportedOperationException(
"Not supported for this type of Displayable Item: " + di.toString());
void registerForIngestModuleEvents()
boolean createKeys(List< ScoreContent.ScoreContentFilter > list)
final PropertyChangeListener pcl
void removeIngestModuleEventListener(final PropertyChangeListener listener)
static boolean isRefreshRequired(PropertyChangeEvent evt)
SleuthkitCase getSleuthkitCase()
static synchronized IngestManager getInstance()
public< T > T accept(AutopsyItemVisitor< T > visitor)
static final Set< IngestManager.IngestModuleEvent > INGEST_MODULE_EVENTS_OF_INTEREST
ScoreContent(SleuthkitCase skCase, long dsObjId)
ScoreContent(SleuthkitCase skCase)
final long filteringDSObjId
final Map< ScoreContentFilter, ScoreContentsChildren.ScoreContentNode > typeNodeMap
void unregisterEventListener()
void removeIngestJobEventListener(final PropertyChangeListener listener)
Node createNodeForKey(ScoreContent.ScoreContentFilter key)
static long calculateItems(SleuthkitCase sleuthkitCase, ScoreContent.ScoreContentFilter filter, long datasourceObjId)
void addIngestJobEventListener(final PropertyChangeListener listener)
ScoreContentsChildren(SleuthkitCase skCase, long dsObjId)
final long datasourceObjId
static String getFileFilter(ScoreContent.ScoreContentFilter filter, long filteringDSObjId)
final ScoreContent.ScoreContentFilter filter
static final Logger logger
T visit(DataSourceFilesNode in)
BLACKBOARD_ARTIFACT_TAG_ADDED
ScoreContentFilter(int id, String name, String displayName)
void addIngestModuleEventListener(final PropertyChangeListener listener)
static final Set< Case.Events > CASE_EVENTS_OF_INTEREST
boolean isRefreshRequired(PropertyChangeEvent evt)
synchronized static Logger getLogger(String name)
static final Set< IngestManager.IngestJobEvent > INGEST_JOB_EVENTS_OF_INTEREST
static Case getCurrentCaseThrows()
final long datasourceObjId
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
final RefreshThrottler refreshThrottler
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
final PropertyChangeListener weakPcl
BLACKBOARD_ARTIFACT_TAG_DELETED
static PropertyChangeListener getPcl(final Runnable onRefresh, final Runnable onRemove)