19 package org.sleuthkit.autopsy.datamodel;
 
   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.Objects;
 
   30 import java.util.logging.Level;
 
   31 import org.openide.nodes.ChildFactory;
 
   32 import org.openide.nodes.Children;
 
   33 import org.openide.nodes.Node;
 
   34 import org.openide.nodes.Sheet;
 
   35 import org.openide.util.NbBundle;
 
   36 import org.openide.util.lookup.Lookups;
 
   45 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT;
 
   46 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_DATA_SOURCE_USAGE;
 
   47 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG;
 
   48 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO;
 
   49 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT;
 
   50 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT;
 
   51 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT;
 
   52 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT;
 
   53 import static org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_DOWNLOAD_SOURCE;
 
   66     public static final String 
NAME = NbBundle.getMessage(
RootNode.class, 
"ExtractedContentNode.name.text");
 
   86         this.datasourceObjId = objId;
 
   87         this.blackboard = skCase.getBlackboard();
 
   92         return visitor.
visit(
this);
 
   99     static String getIconFilePath(
int typeID) {
 
  100         String filePath = 
"org/sleuthkit/autopsy/images/"; 
 
  101         if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID()) {
 
  102             return filePath + 
"bookmarks.png"; 
 
  103         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID()) {
 
  104             return filePath + 
"cookies.png"; 
 
  105         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()) {
 
  106             return filePath + 
"history.png"; 
 
  107         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID()) {
 
  108             return filePath + 
"downloads.png"; 
 
  109         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID()) {
 
  110             return filePath + 
"recent_docs.png"; 
 
  111         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID()) {
 
  112             return filePath + 
"gps_trackpoint.png"; 
 
  113         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID()) {
 
  114             return filePath + 
"programs.png"; 
 
  115         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()) {
 
  116             return filePath + 
"usb_devices.png"; 
 
  117         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) {
 
  118             return filePath + 
"mail-icon-16.png"; 
 
  119         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EXTRACTED_TEXT.getTypeID()) {
 
  120             return filePath + 
"text-file.png"; 
 
  121         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID()) {
 
  122             return filePath + 
"searchquery.png"; 
 
  123         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID()) {
 
  124             return filePath + 
"camera-icon-16.png"; 
 
  125         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_INFO.getTypeID()) {
 
  126             return filePath + 
"computer.png"; 
 
  127         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID()) {
 
  128             return filePath + 
"account-icon-16.png"; 
 
  129         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID()) {
 
  130             return filePath + 
"contact.png"; 
 
  131         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) {
 
  132             return filePath + 
"message.png"; 
 
  133         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()) {
 
  134             return filePath + 
"calllog.png"; 
 
  135         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID()) {
 
  136             return filePath + 
"calendar.png"; 
 
  137         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID()) {
 
  138             return filePath + 
"speeddialentry.png"; 
 
  139         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID()) {
 
  140             return filePath + 
"bluetooth.png"; 
 
  141         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID()) {
 
  142             return filePath + 
"gpsfav.png"; 
 
  143         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID()) {
 
  144             return filePath + 
"gps-lastlocation.png"; 
 
  145         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID()) {
 
  146             return filePath + 
"gps-search.png"; 
 
  147         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_PROG_RUN.getTypeID()) {
 
  148             return filePath + 
"installed.png"; 
 
  149         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID() || 
 
  150                 typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_SUSPECTED.getTypeID()) {
 
  151             return filePath + 
"encrypted-file.png"; 
 
  152         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID()) {
 
  153             return filePath + 
"mismatch-16.png"; 
 
  154         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID()) {
 
  155             return filePath + 
"gps_trackpoint.png"; 
 
  156         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_REMOTE_DRIVE.getTypeID()) {
 
  157             return filePath + 
"drive_network.png"; 
 
  158         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_FACE_DETECTED.getTypeID()) {
 
  159             return filePath + 
"face.png"; 
 
  160         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WIFI_NETWORK.getTypeID()) {
 
  161             return filePath + 
"network-wifi.png"; 
 
  162         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_WIFI_NETWORK_ADAPTER.getTypeID()) {
 
  163             return filePath + 
"network-wifi.png"; 
 
  164         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_SIM_ATTACHED.getTypeID()) {
 
  165             return filePath + 
"sim_card.png"; 
 
  166         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_ADAPTER.getTypeID()) {
 
  167             return filePath + 
"Bluetooth.png"; 
 
  168         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_INFO.getTypeID()) {
 
  169             return filePath + 
"devices.png"; 
 
  170         } 
else if (typeID == BlackboardArtifact.ARTIFACT_TYPE.TSK_VERIFICATION_FAILED.getTypeID()) {
 
  171             return filePath + 
"validationFailed.png"; 
 
  173         return filePath + 
"artifact-icon.png"; 
 
  179             super(Children.create(
new TypeFactory(), 
true), Lookups.singleton(NAME));
 
  181             super.setDisplayName(NAME);
 
  182             this.setIconBaseWithExtension(
"org/sleuthkit/autopsy/images/extracted_content.png"); 
 
  192             return visitor.
visit(
this);
 
  197             Sheet sheet = super.createSheet();
 
  198             Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
 
  199             if (sheetSet == null) {
 
  200                 sheetSet = Sheet.createPropertiesSet();
 
  204             sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(), 
"ExtractedContentNode.createSheet.name.name"),
 
  205                     NbBundle.getMessage(
this.getClass(), 
"ExtractedContentNode.createSheet.name.displayName"),
 
  206                     NbBundle.getMessage(
this.getClass(), 
"ExtractedContentNode.createSheet.name.desc"),
 
  213             return getClass().getName();
 
  222     private class TypeFactory extends ChildFactory.Detachable<BlackboardArtifact.Type> {
 
  224         private final ArrayList<BlackboardArtifact.Type> 
doNotShow = 
new ArrayList<>();
 
  232             doNotShow.add(
new BlackboardArtifact.Type(TSK_GEN_INFO));
 
  233             doNotShow.add(
new BlackboardArtifact.Type(TSK_EMAIL_MSG));
 
  234             doNotShow.add(
new BlackboardArtifact.Type(TSK_HASHSET_HIT));
 
  235             doNotShow.add(
new BlackboardArtifact.Type(TSK_KEYWORD_HIT));
 
  236             doNotShow.add(
new BlackboardArtifact.Type(TSK_INTERESTING_FILE_HIT));
 
  237             doNotShow.add(
new BlackboardArtifact.Type(TSK_INTERESTING_ARTIFACT_HIT));
 
  238             doNotShow.add(
new BlackboardArtifact.Type(TSK_ACCOUNT));
 
  239             doNotShow.add(
new BlackboardArtifact.Type(TSK_DATA_SOURCE_USAGE));
 
  240             doNotShow.add(
new BlackboardArtifact.Type(TSK_DOWNLOAD_SOURCE) );
 
  243         private final PropertyChangeListener 
pcl = (PropertyChangeEvent evt) -> {
 
  244             String eventType = evt.getPropertyName();
 
  259                     if (null != event && !(this.
doNotShow.contains(event.getBlackboardArtifactType()))) {
 
  284                 if (evt.getNewValue() == null) {
 
  303             typeNodeList.clear();
 
  307         protected boolean createKeys(List<BlackboardArtifact.Type> list) {
 
  308             if (skCase != null) {
 
  311                             blackboard.getArtifactTypesInUse(datasourceObjId) :
 
  312                             skCase.getArtifactTypesInUse() ;
 
  315                     Collections.sort(types,
 
  316                             new Comparator<BlackboardArtifact.Type>() {
 
  318                         public int compare(BlackboardArtifact.Type a, BlackboardArtifact.Type b) {
 
  319                             return a.getDisplayName().compareTo(b.getDisplayName());
 
  326                     for (BlackboardArtifact.Type art : types) {
 
  327                         TypeNode node = typeNodeList.get(art);
 
  329                             node.updateDisplayName();
 
  332                 } 
catch (TskCoreException ex) {
 
  333                     Logger.
getLogger(
TypeFactory.class.getName()).log(Level.SEVERE, 
"Error getting list of artifacts in use: " + ex.getLocalizedMessage()); 
 
  342             typeNodeList.put(key, node);
 
  355         private final BlackboardArtifact.Type 
type;
 
  360             super.setName(
type.getTypeName());
 
  366         final void updateDisplayName() {
 
  367             if (skCase == null) {
 
  377                         skCase.getBlackboardArtifactsTypeCount(
type.getTypeID());
 
  378             } 
catch (TskException ex) {
 
  379                 Logger.getLogger(TypeNode.class.getName())
 
  380                         .log(Level.WARNING, 
"Error getting child count", ex); 
 
  382             super.setDisplayName(
type.getDisplayName() + 
" \u200E(\u200E" + childCount + 
")\u200E");
 
  387             Sheet sheet = super.createSheet();
 
  388             Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
 
  389             if (sheetSet == null) {
 
  390                 sheetSet = Sheet.createPropertiesSet();
 
  394             sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(), 
"ArtifactTypeNode.createSheet.artType.name"),
 
  395                     NbBundle.getMessage(
this.getClass(), 
"ArtifactTypeNode.createSheet.artType.displayName"),
 
  396                     NbBundle.getMessage(
this.getClass(), 
"ArtifactTypeNode.createSheet.artType.desc"),
 
  397                     type.getDisplayName()));
 
  399             sheetSet.put(
new NodeProperty<>(NbBundle.getMessage(
this.getClass(), 
"ArtifactTypeNode.createSheet.childCnt.name"),
 
  400                     NbBundle.getMessage(
this.getClass(), 
"ArtifactTypeNode.createSheet.childCnt.displayName"),
 
  401                     NbBundle.getMessage(
this.getClass(), 
"ArtifactTypeNode.createSheet.childCnt.desc"),
 
  409             return visitor.
visit(
this);
 
  419             return getClass().getName() + 
type.getDisplayName();
 
  428         private BlackboardArtifact.Type 
type;
 
  435         private final PropertyChangeListener 
pcl = 
new PropertyChangeListener() {
 
  437             public void propertyChange(PropertyChangeEvent evt) {
 
  438                 String eventType = evt.getPropertyName();
 
  455                         if (null != event && event.getBlackboardArtifactType().equals(
type)) {
 
  496         protected boolean createKeys(List<BlackboardArtifact> list) {
 
  497             if (skCase != null) {
 
  499                     List<BlackboardArtifact> arts = 
 
  502                             skCase.getBlackboardArtifacts(
type.getTypeID());
 
  504                 } 
catch (TskException ex) {
 
void removeIngestModuleEventListener(final PropertyChangeListener listener)
static synchronized IngestManager getInstance()
T visit(DataSourcesNode in)
void removeIngestJobEventListener(final PropertyChangeListener listener)
void addIngestJobEventListener(final PropertyChangeListener listener)
static Boolean getGroupItemsInTreeByDataSource()
void addIngestModuleEventListener(final PropertyChangeListener listener)
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)