Autopsy  4.5.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
ExtractedContent.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2016 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.datamodel;
20 
21 import java.beans.PropertyChangeEvent;
22 import java.beans.PropertyChangeListener;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.Comparator;
26 import java.util.EnumSet;
27 import java.util.HashMap;
28 import java.util.List;
29 import java.util.logging.Level;
30 import org.openide.nodes.ChildFactory;
31 import org.openide.nodes.Children;
32 import org.openide.nodes.Node;
33 import org.openide.nodes.Sheet;
34 import org.openide.util.NbBundle;
35 import org.openide.util.lookup.Lookups;
40 import org.sleuthkit.datamodel.BlackboardArtifact;
41 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT;
42 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG;
43 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO;
44 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT;
45 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT;
46 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT;
47 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT;
48 import org.sleuthkit.datamodel.SleuthkitCase;
49 import org.sleuthkit.datamodel.TskCoreException;
50 import org.sleuthkit.datamodel.TskException;
51 
56 public class ExtractedContent implements AutopsyVisitableItem {
57 
58  private SleuthkitCase skCase; // set to null after case has been closed
59  public static final String NAME = NbBundle.getMessage(RootNode.class, "ExtractedContentNode.name.text");
60 
61  public ExtractedContent(SleuthkitCase skCase) {
62  this.skCase = skCase;
63  }
64 
65  @Override
66  public <T> T accept(AutopsyItemVisitor<T> v) {
67  return v.visit(this);
68  }
69 
70  public SleuthkitCase getSleuthkitCase() {
71  return skCase;
72  }
73 
74  static String getIconFilePath(int typeID) {
75  String filePath = "org/sleuthkit/autopsy/images/"; //NON-NLS
76  if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID()) {
77  return filePath + "bookmarks.png"; //NON-NLS
78  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID()) {
79  return filePath + "cookies.png"; //NON-NLS
80  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()) {
81  return filePath + "history.png"; //NON-NLS
82  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID()) {
83  return filePath + "downloads.png"; //NON-NLS
84  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID()) {
85  return filePath + "recent_docs.png"; //NON-NLS
86  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID()) {
87  return filePath + "gps_trackpoint.png"; //NON-NLS
88  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID()) {
89  return filePath + "programs.png"; //NON-NLS
90  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()) {
91  return filePath + "usb_devices.png"; //NON-NLS
92  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) {
93  return filePath + "mail-icon-16.png"; //NON-NLS
94  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EXTRACTED_TEXT.getTypeID()) {
95  return filePath + "text-file.png"; //NON-NLS
96  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID()) {
97  return filePath + "searchquery.png"; //NON-NLS
98  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID()) {
99  return filePath + "camera-icon-16.png"; //NON-NLS
100  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_INFO.getTypeID()) {
101  return filePath + "computer.png"; //NON-NLS
102  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID()) {
103  return filePath + "account-icon-16.png"; //NON-NLS
104  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID()) {
105  return filePath + "contact.png"; //NON-NLS
106  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) {
107  return filePath + "message.png"; //NON-NLS
108  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()) {
109  return filePath + "calllog.png"; //NON-NLS
110  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID()) {
111  return filePath + "calendar.png"; //NON-NLS
112  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID()) {
113  return filePath + "speeddialentry.png"; //NON-NLS
114  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID()) {
115  return filePath + "bluetooth.png"; //NON-NLS
116  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID()) {
117  return filePath + "gpsfav.png"; //NON-NLS
118  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID()) {
119  return filePath + "gps-lastlocation.png"; //NON-NLS
120  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID()) {
121  return filePath + "gps-search.png"; //NON-NLS
122  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_PROG_RUN.getTypeID()) {
123  return filePath + "installed.png"; //NON-NLS
124  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID() ||
125  typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_SUSPECTED.getTypeID()) {
126  return filePath + "encrypted-file.png"; //NON-NLS
127  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID()) {
128  return filePath + "mismatch-16.png"; //NON-NLS
129  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID()) {
130  return filePath + "gps_trackpoint.png"; //NON-NLS
131  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_REMOTE_DRIVE.getTypeID()) {
132  return filePath + "drive_network.png"; //NON-NLS
133  } else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_FACE_DETECTED.getTypeID()) {
134  return filePath + "face.png"; //NON-NLS
135  }
136  return filePath + "artifact-icon.png"; //NON-NLS
137  }
138 
139  public class RootNode extends DisplayableItemNode {
140 
141  public RootNode(SleuthkitCase skCase) {
142  super(Children.create(new TypeFactory(), true), Lookups.singleton(NAME));
143  super.setName(NAME);
144  super.setDisplayName(NAME);
145  this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/extracted_content.png"); //NON-NLS
146  }
147 
148  @Override
149  public boolean isLeafTypeNode() {
150  return false;
151  }
152 
153  @Override
154  public <T> T accept(DisplayableItemNodeVisitor<T> v) {
155  return v.visit(this);
156  }
157 
158  @Override
159  protected Sheet createSheet() {
160  Sheet s = super.createSheet();
161  Sheet.Set ss = s.get(Sheet.PROPERTIES);
162  if (ss == null) {
163  ss = Sheet.createPropertiesSet();
164  s.put(ss);
165  }
166 
167  ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.name"),
168  NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.displayName"),
169  NbBundle.getMessage(this.getClass(), "ExtractedContentNode.createSheet.name.desc"),
170  NAME));
171  return s;
172  }
173 
174  @Override
175  public String getItemType() {
176  return getClass().getName();
177  }
178  }
179 
185  private class TypeFactory extends ChildFactory.Detachable<BlackboardArtifact.Type> {
186 
187  private final ArrayList<BlackboardArtifact.Type> doNotShow = new ArrayList<>();
188  // maps the artifact type to its child node
189  private final HashMap<BlackboardArtifact.Type, TypeNode> typeNodeList = new HashMap<>();
190 
191  public TypeFactory() {
192  super();
193 
194  // these are shown in other parts of the UI tree
195  doNotShow.add(new BlackboardArtifact.Type(TSK_GEN_INFO));
196  doNotShow.add(new BlackboardArtifact.Type(TSK_EMAIL_MSG));
197  doNotShow.add(new BlackboardArtifact.Type(TSK_HASHSET_HIT));
198  doNotShow.add(new BlackboardArtifact.Type(TSK_KEYWORD_HIT));
199  doNotShow.add(new BlackboardArtifact.Type(TSK_INTERESTING_FILE_HIT));
200  doNotShow.add(new BlackboardArtifact.Type(TSK_INTERESTING_ARTIFACT_HIT));
201  doNotShow.add(new BlackboardArtifact.Type(TSK_ACCOUNT));
202  }
203 
204  private final PropertyChangeListener pcl = (PropertyChangeEvent evt) -> {
205  String eventType = evt.getPropertyName();
206  if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
212  try {
219  final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue();
220  if (null != event && !(this.doNotShow.contains(event.getBlackboardArtifactType()))) {
221  refresh(true);
222  }
223  } catch (IllegalStateException notUsed) {
227  }
228  } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
229  || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
235  try {
237  refresh(true);
238  } catch (IllegalStateException notUsed) {
242  }
243  } else if (eventType.equals(Case.Events.CURRENT_CASE.toString())) {
244  // case was closed. Remove listeners so that we don't get called with a stale case handle
245  if (evt.getNewValue() == null) {
246  removeNotify();
247  skCase = null;
248  }
249  }
250  };
251 
252  @Override
253  protected void addNotify() {
257  }
258 
259  @Override
260  protected void removeNotify() {
264  typeNodeList.clear();
265  }
266 
267  @Override
268  protected boolean createKeys(List<BlackboardArtifact.Type> list) {
269  //TEST COMMENT
270  if (skCase != null) {
271  try {
272  List<BlackboardArtifact.Type> types = skCase.getArtifactTypesInUse();
273  types.removeAll(doNotShow);
274  Collections.sort(types,
275  new Comparator<BlackboardArtifact.Type>() {
276  @Override
277  public int compare(BlackboardArtifact.Type a, BlackboardArtifact.Type b) {
278  return a.getDisplayName().compareTo(b.getDisplayName());
279  }
280  });
281  list.addAll(types);
282 
283  // the create node method will get called only for new types
284  // refresh the counts if we already created them from a previous update
285  for (BlackboardArtifact.Type art : types) {
286  TypeNode node = typeNodeList.get(art);
287  if (node != null) {
288  node.updateDisplayName();
289  }
290  }
291  } catch (TskCoreException ex) {
292  Logger.getLogger(TypeFactory.class.getName()).log(Level.SEVERE, "Error getting list of artifacts in use: " + ex.getLocalizedMessage()); //NON-NLS
293  }
294  }
295  return true;
296  }
297 
298  @Override
299  protected Node createNodeForKey(BlackboardArtifact.Type key) {
300  TypeNode node = new TypeNode(key);
301  typeNodeList.put(key, node);
302  return node;
303  }
304  }
305 
312  public class TypeNode extends DisplayableItemNode {
313 
314  private final BlackboardArtifact.Type type;
315  private long childCount = 0;
316 
317  TypeNode(BlackboardArtifact.Type type) {
318  super(Children.create(new ArtifactFactory(type), true), Lookups.singleton(type.getDisplayName()));
319  super.setName(type.getTypeName());
320  this.type = type;
321  this.setIconBaseWithExtension(ExtractedContent.getIconFilePath(type.getTypeID())); //NON-NLS
322  updateDisplayName();
323  }
324 
325  final void updateDisplayName() {
326  if (skCase == null) {
327  return;
328  }
329 
330  // NOTE: This completely destroys our lazy-loading ideal
331  // a performance increase might be had by adding a
332  // "getBlackboardArtifactCount()" method to skCase
333  try {
334  this.childCount = skCase.getBlackboardArtifactsTypeCount(type.getTypeID());
335  } catch (TskException ex) {
336  Logger.getLogger(TypeNode.class.getName())
337  .log(Level.WARNING, "Error getting child count", ex); //NON-NLS
338  }
339  super.setDisplayName(type.getDisplayName() + " \u200E(\u200E" + childCount + ")\u200E");
340  }
341 
342  @Override
343  protected Sheet createSheet() {
344  Sheet s = super.createSheet();
345  Sheet.Set ss = s.get(Sheet.PROPERTIES);
346  if (ss == null) {
347  ss = Sheet.createPropertiesSet();
348  s.put(ss);
349  }
350 
351  ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.name"),
352  NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.displayName"),
353  NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.artType.desc"),
354  type.getDisplayName()));
355 
356  ss.put(new NodeProperty<>(NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.name"),
357  NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.displayName"),
358  NbBundle.getMessage(this.getClass(), "ArtifactTypeNode.createSheet.childCnt.desc"),
359  childCount));
360 
361  return s;
362  }
363 
364  @Override
365  public <T> T accept(DisplayableItemNodeVisitor<T> v) {
366  return v.visit(this);
367  }
368 
369  @Override
370  public boolean isLeafTypeNode() {
371  return true;
372  }
373 
374  @Override
375  public String getItemType() {
376  return getClass().getName() + type.getDisplayName();
377  }
378  }
379 
383  private class ArtifactFactory extends ChildFactory.Detachable<BlackboardArtifact> {
384 
385  private BlackboardArtifact.Type type;
386 
387  public ArtifactFactory(BlackboardArtifact.Type type) {
388  super();
389  this.type = type;
390  }
391 
392  private final PropertyChangeListener pcl = new PropertyChangeListener() {
393  @Override
394  public void propertyChange(PropertyChangeEvent evt) {
395  String eventType = evt.getPropertyName();
396  if (eventType.equals(IngestManager.IngestModuleEvent.DATA_ADDED.toString())) {
403  try {
411  final ModuleDataEvent event = (ModuleDataEvent) evt.getOldValue();
412  if (null != event && event.getBlackboardArtifactType().equals(type)) {
413  refresh(true);
414  }
415  } catch (IllegalStateException notUsed) {
419  }
420  } else if (eventType.equals(IngestManager.IngestJobEvent.COMPLETED.toString())
421  || eventType.equals(IngestManager.IngestJobEvent.CANCELLED.toString())) {
428  try {
430  refresh(true);
431  } catch (IllegalStateException notUsed) {
435  }
436  }
437  }
438  };
439 
440  @Override
441  protected void addNotify() {
444  }
445 
446  @Override
447  protected void removeNotify() {
450  }
451 
452  @Override
453  protected boolean createKeys(List<BlackboardArtifact> list) {
454  if (skCase != null) {
455  try {
456  List<BlackboardArtifact> arts = skCase.getBlackboardArtifacts(type.getTypeID());
457  list.addAll(arts);
458  } catch (TskException ex) {
459  Logger.getLogger(ArtifactFactory.class.getName()).log(Level.SEVERE, "Couldn't get blackboard artifacts from database", ex); //NON-NLS
460  }
461  }
462  return true;
463  }
464 
465  @Override
466  protected Node createNodeForKey(BlackboardArtifact key) {
467  return new BlackboardArtifactNode(key);
468  }
469  }
470 }
boolean createKeys(List< BlackboardArtifact.Type > list)
void removeIngestModuleEventListener(final PropertyChangeListener listener)
static synchronized IngestManager getInstance()
final ArrayList< BlackboardArtifact.Type > doNotShow
void removeIngestJobEventListener(final PropertyChangeListener listener)
void addIngestJobEventListener(final PropertyChangeListener listener)
void addIngestModuleEventListener(final PropertyChangeListener listener)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition: Case.java:419
final HashMap< BlackboardArtifact.Type, TypeNode > typeNodeList
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition: Case.java:464

Copyright © 2012-2016 Basis Technology. Generated on: Tue Feb 20 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.