Sleuth Kit Java Bindings (JNI)  4.11.0
Java bindings for using The Sleuth Kit
BlackboardArtifact.java
Go to the documentation of this file.
1 /*
2  * Sleuth Kit Data Model
3  *
4  * Copyright 2011-2021 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.datamodel;
20 
21 import java.io.Serializable;
22 import java.io.UnsupportedEncodingException;
23 import java.sql.SQLException;
24 import java.text.MessageFormat;
25 import java.util.ArrayList;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.HashMap;
29 import java.util.HashSet;
30 import java.util.List;
31 import java.util.Map;
32 import java.util.Objects;
33 import java.util.ResourceBundle;
34 import java.util.Set;
35 import java.util.stream.Collectors;
36 import java.util.stream.Stream;
41 
53 public abstract class BlackboardArtifact implements Content {
54 
55  private static final ResourceBundle bundle = ResourceBundle.getBundle("org.sleuthkit.datamodel.Bundle");
56  private final long artifactId;
57  private final long sourceObjId; // refers to objID of parent/source object
58  private final long artifactObjId; // objId of the artifact in tsk_objects. TBD: replace artifactID with this
59  private final Long dataSourceObjId; // objId of the data source in tsk_objects.
60  private final int artifactTypeId;
61  private final String artifactTypeName;
62  private final String displayName;
63  private ReviewStatus reviewStatus;
64  private final SleuthkitCase sleuthkitCase;
65  private final List<BlackboardAttribute> attrsCache = new ArrayList<BlackboardAttribute>();
66  private boolean loadedCacheFromDb = false;
67  private volatile Content parent;
68  private volatile String uniquePath;
69 
70  private byte[] contentBytes = null;
71 
72  private volatile boolean checkedHasChildren;
73  private volatile boolean hasChildren;
74  private volatile int childrenCount;
75 
96  BlackboardArtifact(SleuthkitCase sleuthkitCase, long artifactID, long sourceObjId, long artifactObjId, Long dataSourceObjId, int artifactTypeID, String artifactTypeName, String displayName, ReviewStatus reviewStatus) {
97 
98  this.sleuthkitCase = sleuthkitCase;
99  this.artifactId = artifactID;
100  this.sourceObjId = sourceObjId;
101  this.artifactObjId = artifactObjId;
102  this.artifactTypeId = artifactTypeID;
103  this.dataSourceObjId = dataSourceObjId;
104  this.artifactTypeName = artifactTypeName;
105  this.displayName = displayName;
106  this.reviewStatus = reviewStatus;
107 
108  this.checkedHasChildren = false;
109  this.hasChildren = false;
110  this.childrenCount = -1;
111 
112  }
113 
134  BlackboardArtifact(SleuthkitCase sleuthkitCase, long artifactID, long sourceObjId, long artifactObjID, Long dataSourceObjID, int artifactTypeID, String artifactTypeName, String displayName, ReviewStatus reviewStatus, boolean isNew) {
135  this(sleuthkitCase, artifactID, sourceObjId, artifactObjID, dataSourceObjID, artifactTypeID, artifactTypeName, displayName, reviewStatus);
136  if (isNew) {
137  /*
138  * If this object represents a newly created artifact, then its
139  * collection of attributes has already been populated and there is
140  * no need to fetch them form the case database.
141  */
142  this.loadedCacheFromDb = true;
143  }
144  }
145 
153  return sleuthkitCase;
154  }
155 
161  public long getArtifactID() {
162  return this.artifactId;
163  }
164 
171  public long getObjectID() {
172  return this.sourceObjId;
173  }
174 
180  Long getDataSourceObjectID() {
181  return this.dataSourceObjId;
182  }
183 
189  public int getArtifactTypeID() {
190  return this.artifactTypeId;
191  }
192 
199  BlackboardArtifact.Type standardTypesValue = BlackboardArtifact.Type.STANDARD_TYPES.get(getArtifactTypeID());
200  if (standardTypesValue != null) {
201  return standardTypesValue;
202  } else {
204  }
205  }
206 
212  public String getArtifactTypeName() {
213  return this.artifactTypeName;
214  }
215 
221  public String getDisplayName() {
222  return this.displayName;
223  }
224 
232  public String getShortDescription() throws TskCoreException {
233  BlackboardAttribute attr = null;
234  StringBuilder shortDescription = new StringBuilder("");
235  if(BlackboardArtifact.Type.STANDARD_TYPES.get(artifactTypeId) != null) {
236  switch (ARTIFACT_TYPE.fromID(artifactTypeId)) {
237  case TSK_WIFI_NETWORK_ADAPTER:
239  break;
240  case TSK_WIFI_NETWORK:
242  break;
243  case TSK_REMOTE_DRIVE:
245  break;
246  case TSK_SERVICE_ACCOUNT:
247  case TSK_SCREEN_SHOTS:
248  case TSK_DELETED_PROG:
249  case TSK_METADATA:
250  case TSK_OS_INFO:
251  case TSK_PROG_NOTIFICATIONS:
252  case TSK_PROG_RUN:
253  case TSK_RECENT_OBJECT:
254  case TSK_USER_DEVICE_EVENT:
255  case TSK_WEB_SEARCH_QUERY:
257  break;
258  case TSK_BLUETOOTH_PAIRING:
260  break;
261  case TSK_ACCOUNT:
263  break;
264  case TSK_WEB_CATEGORIZATION:
265  case TSK_BLUETOOTH_ADAPTER:
266  case TSK_GPS_AREA:
267  case TSK_GPS_BOOKMARK:
268  case TSK_GPS_LAST_KNOWN_LOCATION:
269  case TSK_GPS_ROUTE:
270  case TSK_GPS_SEARCH:
271  case TSK_GPS_TRACK:
272  case TSK_WEB_FORM_AUTOFILL:
274  break;
275  case TSK_WEB_ACCOUNT_TYPE:
277  break;
278  case TSK_HASHSET_HIT:
279  case TSK_INTERESTING_ARTIFACT_HIT:
280  case TSK_INTERESTING_FILE_HIT:
281  case TSK_YARA_HIT:
283  break;
284  case TSK_ENCRYPTION_DETECTED:
285  case TSK_ENCRYPTION_SUSPECTED:
286  case TSK_OBJECT_DETECTED:
287  case TSK_USER_CONTENT_SUSPECTED:
288  case TSK_VERIFICATION_FAILED:
290  break;
291  case TSK_DATA_SOURCE_USAGE:
292  case TSK_CALENDAR_ENTRY:
294  break;
295  case TSK_WEB_BOOKMARK: //web_bookmark, web_cookie, web_download, and web_history are the same attribute for now
296  case TSK_WEB_COOKIE:
297  case TSK_WEB_DOWNLOAD:
298  case TSK_WEB_HISTORY:
299  case TSK_WEB_CACHE:
301  break;
302  case TSK_KEYWORD_HIT:
304  break;
305  case TSK_DEVICE_ATTACHED:
307  break;
308  case TSK_CONTACT: //contact, message, and calllog are the same attributes for now
309  case TSK_MESSAGE:
310  case TSK_CALLLOG:
311  case TSK_SPEED_DIAL_ENTRY:
312  case TSK_WEB_FORM_ADDRESS:
313  //get the first of these attributes which exists and is non null
314  final ATTRIBUTE_TYPE[] typesThatCanHaveName = {ATTRIBUTE_TYPE.TSK_NAME,
326  ATTRIBUTE_TYPE.TSK_LOCATION}; //in the order we want to use them
327  for (ATTRIBUTE_TYPE t : typesThatCanHaveName) {
328  attr = getAttribute(new BlackboardAttribute.Type(t));
329  if (attr != null && !attr.getDisplayString().isEmpty()) {
330  break;
331  }
332  }
333  break;
334  default:
335  break;
336  }
337  }
338  if (attr != null) {
339  shortDescription.append(attr.getAttributeType().getDisplayName()).append(": ").append(attr.getDisplayString());
340  } else {
341  shortDescription.append(getDisplayName());
342  }
343  //get the first of these date attributes which exists and is non null
344  final ATTRIBUTE_TYPE[] typesThatCanHaveDate = {ATTRIBUTE_TYPE.TSK_DATETIME,
351  ATTRIBUTE_TYPE.TSK_DATETIME_END}; //in the order we want to use them
352  BlackboardAttribute date;
353  for (ATTRIBUTE_TYPE t : typesThatCanHaveDate) {
354  date = getAttribute(new BlackboardAttribute.Type(t));
355  if (date != null && !date.getDisplayString().isEmpty()) {
356  shortDescription.append(" ");
357  shortDescription.append(MessageFormat.format(bundle.getString("BlackboardArtifact.shortDescriptionDate.text"), date.getDisplayString())); //NON-NLS
358  break;
359  }
360  }
361  return shortDescription.toString();
362  }
363 
371  return reviewStatus;
372  }
373 
382  public void setReviewStatus(ReviewStatus newStatus) throws TskCoreException {
383  getSleuthkitCase().setReviewStatus(this, newStatus);
384  reviewStatus = newStatus;
385  }
386 
398  public void addAttribute(BlackboardAttribute attribute) throws TskCoreException {
399  attribute.setArtifactId(artifactId);
400  attribute.setCaseDatabase(getSleuthkitCase());
401  getSleuthkitCase().addBlackboardAttribute(attribute, this.artifactTypeId);
402  attrsCache.add(attribute);
403  }
404 
413  public List<BlackboardAttribute> getAttributes() throws TskCoreException {
414  ArrayList<BlackboardAttribute> attributes;
415  if (false == loadedCacheFromDb) {
416  attributes = getSleuthkitCase().getBlackboardAttributes(this);
417  attrsCache.clear();
418  attrsCache.addAll(attributes);
419  loadedCacheFromDb = true;
420  } else {
421  attributes = new ArrayList<BlackboardAttribute>(attrsCache);
422  }
423  return attributes;
424  }
425 
441  List<BlackboardAttribute> attributes = this.getAttributes();
442  for (BlackboardAttribute attribute : attributes) {
443  if (attribute.getAttributeType().equals(attributeType)) {
444  return attribute;
445  }
446  }
447  return null;
448  }
449 
459  public void addAttributes(Collection<BlackboardAttribute> attributes) throws TskCoreException {
460  if (attributes.isEmpty()) {
461  return;
462  }
463  for (BlackboardAttribute attribute : attributes) {
464  attribute.setArtifactId(artifactId);
465  attribute.setCaseDatabase(getSleuthkitCase());
466  }
467  getSleuthkitCase().addBlackboardAttributes(attributes, artifactTypeId);
468  attrsCache.addAll(attributes);
469  }
470 
486  public void addAttributes(Collection<BlackboardAttribute> attributes, final SleuthkitCase.CaseDbTransaction caseDbTransaction) throws TskCoreException {
487 
488  if (Objects.isNull(attributes) || attributes.isEmpty()) {
489  throw new TskCoreException("Illegal argument passed to addAttributes: null or empty attributes passed to addAttributes");
490  }
491  if (Objects.isNull(caseDbTransaction)) {
492  throw new TskCoreException("Illegal argument passed to addAttributes: null caseDbTransaction passed to addAttributes");
493  }
494  try {
495  for (final BlackboardAttribute attribute : attributes) {
496  attribute.setArtifactId(artifactId);
497  attribute.setCaseDatabase(getSleuthkitCase());
498  getSleuthkitCase().addBlackBoardAttribute(attribute, artifactTypeId, caseDbTransaction.getConnection());
499  }
500  attrsCache.addAll(attributes);
501  } catch (SQLException ex) {
502  throw new TskCoreException("Error adding blackboard attributes", ex);
503  }
504  }
505 
512  @Override
513  public String getUniquePath() throws TskCoreException {
514  // Return the path of the parent file
515  // It is possible that multiple threads could be doing this calculation
516  // simultaneously, but it's worth the potential extra processing to prevent deadlocks.
517  if (uniquePath == null) {
518  String tempUniquePath = "";
519  Content myParent = getParent();
520  if (myParent != null) {
521  tempUniquePath = myParent.getUniquePath();
522  }
523 
524  // Don't update uniquePath until it is complete.
525  uniquePath = tempUniquePath;
526  }
527  return uniquePath;
528  }
529 
530  @Override
532  if (parent == null) {
533  parent = getSleuthkitCase().getContentById(sourceObjId);
534  }
535  return parent;
536  }
537 
545  @Override
546  public ArrayList<BlackboardArtifact> getAllArtifacts() throws TskCoreException {
547  // Currently we don't have any artifacts derived from an artifact.
548  return new ArrayList<BlackboardArtifact>();
549  }
550 
551  @Override
552  public List<AnalysisResult> getAllAnalysisResults() throws TskCoreException {
553  return sleuthkitCase.getBlackboard().getAnalysisResults(artifactObjId);
554  }
555 
556  @Override
557  public List<DataArtifact> getAllDataArtifacts() throws TskCoreException {
558  return sleuthkitCase.getBlackboard().getDataArtifactsBySource(artifactObjId);
559  }
560 
561  @Override
563  return sleuthkitCase.getScoringManager().getAggregateScore(artifactObjId);
564 
565  }
566 
567  @Override
568  public List<AnalysisResult> getAnalysisResults(BlackboardArtifact.Type artifactType) throws TskCoreException {
569  return sleuthkitCase.getBlackboard().getAnalysisResults(artifactObjId, artifactType.getTypeID()); //NON-NLS
570  }
571 
582  @Override
583  public ArrayList<BlackboardArtifact> getArtifacts(String artifactTypeName) throws TskCoreException {
584  // Currently we don't have any artifacts derived from an artifact.
585  return new ArrayList<BlackboardArtifact>();
586  }
587 
598  @Override
599  public ArrayList<BlackboardArtifact> getArtifacts(int artifactTypeID) throws TskCoreException {
600  // Currently we don't have any artifacts derived from an artifact.
601  return new ArrayList<BlackboardArtifact>();
602  }
603 
613  @Override
614  public ArrayList<BlackboardArtifact> getArtifacts(BlackboardArtifact.ARTIFACT_TYPE type) throws TskCoreException {
615  // Currently we don't have any artifacts derived from an artifact.
616  return new ArrayList<BlackboardArtifact>();
617  }
618 
626  @Override
627  public long getAllArtifactsCount() throws TskCoreException {
628  // Currently we don't have any artifacts derived from an artifact.
629  return 0;
630  }
631 
642  @Override
643  public long getArtifactsCount(String artifactTypeName) throws TskCoreException {
644  // Currently we don't have any artifacts derived from an artifact.
645  return 0;
646  }
647 
658  @Override
659  public long getArtifactsCount(int artifactTypeID) throws TskCoreException {
660  // Currently we don't have any artifacts derived from an artifact.
661  return 0;
662  }
663 
674  @Override
676  // Currently we don't have any artifacts derived from an artifact.
677  return 0;
678  }
679 
688  @Override
690  // Currently we don't have any artifacts derived from an artifact.
691  return null;
692  }
693 
707  @Override
709  // Currently we don't have any artifacts derived from an artifact.
710  if (create) {
711  throw new TskCoreException("Artifacts of artifacts are not supported.");
712  }
713 
714  return null;
715  }
716 
727  @Override
728  public ArrayList<BlackboardAttribute> getGenInfoAttributes(BlackboardAttribute.ATTRIBUTE_TYPE attr_type) throws TskCoreException {
729  // Currently we don't have any artifacts derived from an artifact.
730  return new ArrayList<>();
731  }
732 
740  @Override
741  public Set<String> getHashSetNames() throws TskCoreException {
742  // Currently we don't have any artifacts derived from an artifact.
743  return new HashSet<String>();
744  }
745 
758  @Deprecated
759  @Override
760  public BlackboardArtifact newArtifact(int artifactTypeID) throws TskCoreException {
761  throw new TskCoreException("Cannot create artifact of an artifact. Not supported.");
762  }
763 
764  @Override
765  public AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, Score score, String conclusion, String configuration, String justification, Collection<BlackboardAttribute> attributesList) throws TskCoreException {
766  CaseDbTransaction trans = sleuthkitCase.beginTransaction();
767  try {
768  AnalysisResultAdded resultAdded = sleuthkitCase.getBlackboard().newAnalysisResult(artifactType, this.getId(), this.getDataSource().getId(), score, conclusion, configuration, justification, attributesList, trans);
769 
770  trans.commit();
771  return resultAdded;
772  } catch (BlackboardException ex) {
773  trans.rollback();
774  throw new TskCoreException("Error adding analysis result.", ex);
775  }
776  }
777 
778  @Override
779  public AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, Score score, String conclusion, String configuration, String justification, Collection<BlackboardAttribute> attributesList, long dataSourceId) throws TskCoreException {
780  CaseDbTransaction trans = sleuthkitCase.beginTransaction();
781  try {
782  AnalysisResultAdded resultAdded = sleuthkitCase.getBlackboard().newAnalysisResult(artifactType, this.getId(), dataSourceId, score, conclusion, configuration, justification, attributesList, trans);
783 
784  trans.commit();
785  return resultAdded;
786  } catch (BlackboardException ex) {
787  trans.rollback();
788  throw new TskCoreException("Error adding analysis result.", ex);
789  }
790  }
791 
792  @Override
793  public DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection<BlackboardAttribute> attributesList, Long osAccountId) throws TskCoreException {
794  throw new TskCoreException("Cannot create data artifact of an artifact. Not supported.");
795  }
796 
797  @Override
798  public DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection<BlackboardAttribute> attributesList, Long osAccountId, long dataSourceId) throws TskCoreException {
799  throw new TskCoreException("Cannot create data artifact of an artifact. Not supported.");
800  }
801 
802  @Override
803  public DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection<BlackboardAttribute> attributesList) throws TskCoreException {
804  return newDataArtifact(artifactType, attributesList, null);
805  }
806 
818  @Deprecated
819  @Override
821  throw new TskCoreException("Cannot create artifact of an artifact. Not supported.");
822  }
823 
832  @Override
833  public <T> T accept(ContentVisitor<T> visitor) {
834  return visitor.visit(this);
835  }
836 
844  @Override
845  public boolean equals(Object object) {
846  if (object == null) {
847  return false;
848  }
849  if (getClass() != object.getClass()) {
850  return false;
851  }
852  final BlackboardArtifact other = (BlackboardArtifact) object;
853  return artifactId == other.getArtifactID();
854  }
855 
861  @Override
862  public int hashCode() {
863  int hash = 7;
864  hash = 41 * hash + (int) (this.artifactId ^ (this.artifactId >>> 32));
865  return hash;
866  }
867 
873  @Override
874  public String toString() {
875  return "BlackboardArtifact{" + "artifactID=" + artifactId + ", objID=" + getObjectID() + ", artifactObjID=" + artifactObjId + ", artifactTypeID=" + artifactTypeId + ", artifactTypeName=" + artifactTypeName + ", displayName=" + displayName + ", Case=" + getSleuthkitCase() + '}'; //NON-NLS
876  }
877 
888  @Override
889  public <T> T accept(SleuthkitItemVisitor<T> visitor) {
890  return visitor.visit(this);
891  }
892 
899  @Override
900  public long getSize() {
901 
902  if (contentBytes == null) {
903  try {
904  loadArtifactContent();
905  } catch (TskCoreException ex) {
906  return 0;
907  }
908  }
909 
910  return contentBytes.length;
911  }
912 
916  @Override
917  public void close() {
918  contentBytes = null;
919  }
920 
934  @Override
935  public final int read(byte[] buf, long offset, long len) throws TskCoreException {
936 
937  if (contentBytes == null) {
938  loadArtifactContent();
939  }
940 
941  if (0 == contentBytes.length) {
942  return 0;
943  }
944 
945  // Copy bytes
946  long readLen = Math.min(contentBytes.length - offset, len);
947  System.arraycopy(contentBytes, 0, buf, 0, (int) readLen);
948 
949  return (int) readLen;
950  }
951 
952  @Override
953  public String getName() {
954  return this.displayName + getArtifactID();
955  }
956 
957  @Override
959  return dataSourceObjId != null ? getSleuthkitCase().getContentById(dataSourceObjId) : null;
960  }
961 
968  private void loadArtifactContent() throws TskCoreException {
969  StringBuilder artifactContents = new StringBuilder();
970 
971  Content dataSource = null;
972  try {
973  dataSource = getDataSource();
974  } catch (TskCoreException ex) {
975  throw new TskCoreException("Unable to get datasource for artifact: " + this.toString(), ex);
976  }
977  if (dataSource == null) {
978  throw new TskCoreException("Datasource was null for artifact: " + this.toString());
979  }
980 
981  try {
982  for (BlackboardAttribute attribute : getAttributes()) {
983  artifactContents.append(attribute.getAttributeType().getDisplayName());
984  artifactContents.append(" : ");
985  artifactContents.append(attribute.getDisplayString());
986  artifactContents.append(System.lineSeparator());
987  }
988  } catch (TskCoreException ex) {
989  throw new TskCoreException("Unable to get attributes for artifact: " + this.toString(), ex);
990  }
991 
992  try {
993  contentBytes = artifactContents.toString().getBytes("UTF-8");
994  } catch (UnsupportedEncodingException ex) {
995  throw new TskCoreException("Failed to convert artifact string to bytes for artifact: " + this.toString(), ex);
996  }
997 
998  }
999 
1003  public static final class Type implements Serializable {
1004 
1005  private static final long serialVersionUID = 1L;
1006 
1010  public static final Type TSK_GEN_INFO = new BlackboardArtifact.Type(1, "TSK_GEN_INFO", bundle.getString("BlackboardArtifact.tskGenInfo.text"), Category.DATA_ARTIFACT);
1011 
1017  public static final Type TSK_WEB_BOOKMARK = new BlackboardArtifact.Type(2, "TSK_WEB_BOOKMARK", bundle.getString("BlackboardArtifact.tskWebBookmark.text"), Category.DATA_ARTIFACT);
1018 
1024  public static final Type TSK_WEB_COOKIE = new BlackboardArtifact.Type(3, "TSK_WEB_COOKIE", bundle.getString("BlackboardArtifact.tskWebCookie.text"), Category.DATA_ARTIFACT);
1025 
1031  public static final Type TSK_WEB_HISTORY = new BlackboardArtifact.Type(4, "TSK_WEB_HISTORY", bundle.getString("BlackboardArtifact.tskWebHistory.text"), Category.DATA_ARTIFACT);
1032 
1038  public static final Type TSK_WEB_DOWNLOAD = new BlackboardArtifact.Type(5, "TSK_WEB_DOWNLOAD", bundle.getString("BlackboardArtifact.tskWebDownload.text"), Category.DATA_ARTIFACT);
1039 
1043  public static final Type TSK_RECENT_OBJECT = new BlackboardArtifact.Type(6, "TSK_RECENT_OBJ", bundle.getString("BlackboardArtifact.tsk.recentObject.text"), Category.DATA_ARTIFACT);
1044 
1045  // 7 was used for deprecated TSK_GPS_TRACKPOINT.
1049  public static final Type TSK_INSTALLED_PROG = new BlackboardArtifact.Type(8, "TSK_INSTALLED_PROG", bundle.getString("BlackboardArtifact.tskInstalledProg.text"), Category.DATA_ARTIFACT);
1050 
1054  public static final Type TSK_KEYWORD_HIT = new BlackboardArtifact.Type(9, "TSK_KEYWORD_HIT", bundle.getString("BlackboardArtifact.tskKeywordHits.text"), Category.ANALYSIS_RESULT);
1055 
1059  public static final Type TSK_HASHSET_HIT = new BlackboardArtifact.Type(10, "TSK_HASHSET_HIT", bundle.getString("BlackboardArtifact.tskHashsetHit.text"), Category.ANALYSIS_RESULT);
1060 
1064  public static final Type TSK_DEVICE_ATTACHED = new BlackboardArtifact.Type(11, "TSK_DEVICE_ATTACHED", bundle.getString("BlackboardArtifact.tskDeviceAttached.text"), Category.DATA_ARTIFACT);
1065 
1070  public static final Type TSK_INTERESTING_FILE_HIT = new BlackboardArtifact.Type(12, "TSK_INTERESTING_FILE_HIT", bundle.getString("BlackboardArtifact.tskInterestingFileHit.text"), Category.ANALYSIS_RESULT);
1071 
1075  public static final Type TSK_EMAIL_MSG = new BlackboardArtifact.Type(13, "TSK_EMAIL_MSG", bundle.getString("BlackboardArtifact.tskEmailMsg.text"), Category.DATA_ARTIFACT);
1076 
1080  public static final Type TSK_EXTRACTED_TEXT = new BlackboardArtifact.Type(14, "TSK_EXTRACTED_TEXT", bundle.getString("BlackboardArtifact.tskExtractedText.text"), Category.DATA_ARTIFACT);
1081 
1085  public static final Type TSK_WEB_SEARCH_QUERY = new BlackboardArtifact.Type(15, "TSK_WEB_SEARCH_QUERY", bundle.getString("BlackboardArtifact.tskWebSearchQuery.text"), Category.DATA_ARTIFACT);
1086 
1090  public static final Type TSK_METADATA_EXIF = new BlackboardArtifact.Type(16, "TSK_METADATA_EXIF", bundle.getString("BlackboardArtifact.tskMetadataExif.text"), Category.ANALYSIS_RESULT);
1091 
1092  // 17 was used for deprecated TSK_TAG_FILE.
1093  // 18 was used for deprecated TSK_TAG_ARTIFACT.
1097  public static final Type TSK_OS_INFO = new BlackboardArtifact.Type(19, "TSK_OS_INFO", bundle.getString("BlackboardArtifact.tskOsInfo.text"), Category.DATA_ARTIFACT);
1098 
1099  // 20 was used for deprecated TSK_OS_ACCOUNT.
1103  public static final Type TSK_SERVICE_ACCOUNT = new BlackboardArtifact.Type(21, "TSK_SERVICE_ACCOUNT", bundle.getString("BlackboardArtifact.tskServiceAccount.text"), Category.DATA_ARTIFACT);
1104 
1105  // 22 was used for deprecated TSK_TOOL_OUTPUT.
1112  public static final Type TSK_CONTACT = new BlackboardArtifact.Type(23, "TSK_CONTACT", bundle.getString("BlackboardArtifact.tskContact.text"), Category.DATA_ARTIFACT);
1113 
1120  public static final Type TSK_MESSAGE = new BlackboardArtifact.Type(24, "TSK_MESSAGE", bundle.getString("BlackboardArtifact.tskMessage.text"), Category.DATA_ARTIFACT);
1121 
1128  public static final Type TSK_CALLLOG = new BlackboardArtifact.Type(25, "TSK_CALLLOG", bundle.getString("BlackboardArtifact.tskCalllog.text"), Category.DATA_ARTIFACT);
1129 
1133  public static final Type TSK_CALENDAR_ENTRY = new BlackboardArtifact.Type(26, "TSK_CALENDAR_ENTRY", bundle.getString("BlackboardArtifact.tskCalendarEntry.text"), Category.DATA_ARTIFACT);
1134 
1138  public static final Type TSK_SPEED_DIAL_ENTRY = new BlackboardArtifact.Type(27, "TSK_SPEED_DIAL_ENTRY", bundle.getString("BlackboardArtifact.tskSpeedDialEntry.text"), Category.DATA_ARTIFACT);
1139 
1143  public static final Type TSK_BLUETOOTH_PAIRING = new BlackboardArtifact.Type(28, "TSK_BLUETOOTH_PAIRING", bundle.getString("BlackboardArtifact.tskBluetoothPairing.text"), Category.DATA_ARTIFACT);
1144 
1148  public static final Type TSK_GPS_BOOKMARK = new BlackboardArtifact.Type(29, "TSK_GPS_BOOKMARK", bundle.getString("BlackboardArtifact.tskGpsBookmark.text"), Category.DATA_ARTIFACT);
1149 
1153  public static final Type TSK_GPS_LAST_KNOWN_LOCATION = new BlackboardArtifact.Type(30, "TSK_GPS_LAST_KNOWN_LOCATION", bundle.getString("BlackboardArtifact.tskGpsLastKnownLocation.text"), Category.DATA_ARTIFACT);
1154 
1158  public static final Type TSK_GPS_SEARCH = new BlackboardArtifact.Type(31, "TSK_GPS_SEARCH", bundle.getString("BlackboardArtifact.tskGpsSearch.text"), Category.DATA_ARTIFACT);
1159 
1163  public static final Type TSK_PROG_RUN = new BlackboardArtifact.Type(32, "TSK_PROG_RUN", bundle.getString("BlackboardArtifact.tskProgRun.text"), Category.DATA_ARTIFACT);
1164 
1168  public static final Type TSK_ENCRYPTION_DETECTED = new BlackboardArtifact.Type(33, "TSK_ENCRYPTION_DETECTED", bundle.getString("BlackboardArtifact.tskEncryptionDetected.text"), Category.ANALYSIS_RESULT);
1169 
1173  public static final Type TSK_EXT_MISMATCH_DETECTED = new BlackboardArtifact.Type(34, "TSK_EXT_MISMATCH_DETECTED", bundle.getString("BlackboardArtifact.tskExtMismatchDetected.text"), Category.ANALYSIS_RESULT);
1174 
1179  public static final Type TSK_INTERESTING_ARTIFACT_HIT = new BlackboardArtifact.Type(35, "TSK_INTERESTING_ARTIFACT_HIT", bundle.getString("BlackboardArtifact.tskInterestingArtifactHit.text"), Category.ANALYSIS_RESULT);
1180 
1186  public static final Type TSK_GPS_ROUTE = new BlackboardArtifact.Type(36, "TSK_GPS_ROUTE", bundle.getString("BlackboardArtifact.tskGpsRoute.text"), Category.DATA_ARTIFACT);
1187 
1191  public static final Type TSK_REMOTE_DRIVE = new BlackboardArtifact.Type(37, "TSK_REMOTE_DRIVE", bundle.getString("BlackboardArtifact.tskRemoteDrive.text"), Category.DATA_ARTIFACT);
1192 
1196  public static final Type TSK_FACE_DETECTED = new BlackboardArtifact.Type(38, "TSK_FACE_DETECTED", bundle.getString("BlackboardArtifact.tskFaceDetected.text"), Category.ANALYSIS_RESULT);
1197 
1201  public static final Type TSK_ACCOUNT = new BlackboardArtifact.Type(39, "TSK_ACCOUNT", bundle.getString("BlackboardArtifact.tskAccount.text"), Category.DATA_ARTIFACT);
1202 
1206  public static final Type TSK_ENCRYPTION_SUSPECTED = new BlackboardArtifact.Type(40, "TSK_ENCRYPTION_SUSPECTED", bundle.getString("BlackboardArtifact.tskEncryptionSuspected.text"), Category.ANALYSIS_RESULT);
1207 
1208  /*
1209  * A classifier detected an object in a media file.
1210  */
1211  public static final Type TSK_OBJECT_DETECTED = new BlackboardArtifact.Type(41, "TSK_OBJECT_DETECTED", bundle.getString("BlackboardArtifact.tskObjectDetected.text"), Category.ANALYSIS_RESULT);
1212 
1216  public static final Type TSK_WIFI_NETWORK = new BlackboardArtifact.Type(42, "TSK_WIFI_NETWORK", bundle.getString("BlackboardArtifact.tskWIFINetwork.text"), Category.DATA_ARTIFACT);
1217 
1221  public static final Type TSK_DEVICE_INFO = new BlackboardArtifact.Type(43, "TSK_DEVICE_INFO", bundle.getString("BlackboardArtifact.tskDeviceInfo.text"), Category.DATA_ARTIFACT);
1222 
1226  public static final Type TSK_SIM_ATTACHED = new BlackboardArtifact.Type(44, "TSK_SIM_ATTACHED", bundle.getString("BlackboardArtifact.tskSimAttached.text"), Category.DATA_ARTIFACT);
1227 
1231  public static final Type TSK_BLUETOOTH_ADAPTER = new BlackboardArtifact.Type(45, "TSK_BLUETOOTH_ADAPTER", bundle.getString("BlackboardArtifact.tskBluetoothAdapter.text"), Category.DATA_ARTIFACT);
1232 
1236  public static final Type TSK_WIFI_NETWORK_ADAPTER = new BlackboardArtifact.Type(46, "TSK_WIFI_NETWORK_ADAPTER", bundle.getString("BlackboardArtifact.tskWIFINetworkAdapter.text"), Category.DATA_ARTIFACT);
1237 
1241  public static final Type TSK_VERIFICATION_FAILED = new BlackboardArtifact.Type(47, "TSK_VERIFICATION_FAILED", bundle.getString("BlackboardArtifact.tskVerificationFailed.text"), Category.ANALYSIS_RESULT);
1242 
1246  public static final Type TSK_DATA_SOURCE_USAGE = new BlackboardArtifact.Type(48, "TSK_DATA_SOURCE_USAGE", bundle.getString("BlackboardArtifact.tskDataSourceUsage.text"), Category.ANALYSIS_RESULT);
1247 
1253  public static final Type TSK_WEB_FORM_AUTOFILL = new BlackboardArtifact.Type(49, "TSK_WEB_FORM_AUTOFILL", bundle.getString("BlackboardArtifact.tskWebFormAutofill.text"), Category.DATA_ARTIFACT);
1254 
1260  public static final Type TSK_WEB_FORM_ADDRESS = new BlackboardArtifact.Type(50, "TSK_WEB_FORM_ADDRESSES ", bundle.getString("BlackboardArtifact.tskWebFormAddresses.text"), Category.DATA_ARTIFACT);
1261 
1262  // 51 was used for deprecated TSK_DOWNLOAD_SOURCE
1266  public static final Type TSK_WEB_CACHE = new BlackboardArtifact.Type(52, "TSK_WEB_CACHE", bundle.getString("BlackboardArtifact.tskWebCache.text"), Category.DATA_ARTIFACT);
1267 
1271  public static final Type TSK_TL_EVENT = new BlackboardArtifact.Type(53, "TSK_TL_EVENT", bundle.getString("BlackboardArtifact.tskTLEvent.text"), Category.DATA_ARTIFACT);
1272 
1276  public static final Type TSK_CLIPBOARD_CONTENT = new BlackboardArtifact.Type(54, "TSK_CLIPBOARD_CONTENT", bundle.getString("BlackboardArtifact.tskClipboardContent.text"), Category.DATA_ARTIFACT);
1277 
1281  public static final Type TSK_ASSOCIATED_OBJECT = new BlackboardArtifact.Type(55, "TSK_ASSOCIATED_OBJECT", bundle.getString("BlackboardArtifact.tskAssociatedObject.text"), Category.DATA_ARTIFACT);
1282 
1286  public static final Type TSK_USER_CONTENT_SUSPECTED = new BlackboardArtifact.Type(56, "TSK_USER_CONTENT_SUSPECTED", bundle.getString("BlackboardArtifact.tskUserContentSuspected.text"), Category.ANALYSIS_RESULT);
1287 
1291  public static final Type TSK_METADATA = new BlackboardArtifact.Type(57, "TSK_METADATA", bundle.getString("BlackboardArtifact.tskMetadata.text"), Category.DATA_ARTIFACT);
1292 
1298  public static final Type TSK_GPS_TRACK = new BlackboardArtifact.Type(58, "TSK_GPS_TRACK", bundle.getString("BlackboardArtifact.tskTrack.text"), Category.DATA_ARTIFACT);
1299 
1303  public static final Type TSK_WEB_ACCOUNT_TYPE = new BlackboardArtifact.Type(59, "TSK_WEB_ACCOUNT_TYPE", bundle.getString("BlackboardArtifact.tskWebAccountType.text"), Category.ANALYSIS_RESULT);
1304 
1308  public static final Type TSK_SCREEN_SHOTS = new BlackboardArtifact.Type(60, "TSK_SCREEN_SHOTS", bundle.getString("BlackboardArtifact.tskScreenShots.text"), Category.DATA_ARTIFACT);
1309 
1313  public static final Type TSK_PROG_NOTIFICATIONS = new BlackboardArtifact.Type(62, "TSK_PROG_NOTIFICATIONS", bundle.getString("BlackboardArtifact.tskProgNotifications.text"), Category.DATA_ARTIFACT);
1314 
1318  public static final Type TSK_BACKUP_EVENT = new BlackboardArtifact.Type(63, "TSK_BACKUP_EVENT", bundle.getString("BlackboardArtifact.tskBackupEvent.text"), Category.DATA_ARTIFACT);
1319 
1323  public static final Type TSK_DELETED_PROG = new BlackboardArtifact.Type(64, "TSK_DELETED_PROG", bundle.getString("BlackboardArtifact.tskDeletedProg.text"), Category.DATA_ARTIFACT);
1324 
1328  public static final Type TSK_USER_DEVICE_EVENT = new BlackboardArtifact.Type(65, "TSK_USER_DEVICE_EVENT", bundle.getString("BlackboardArtifact.tskUserDeviceEvent.text"), Category.DATA_ARTIFACT);
1329 
1333  public static final Type TSK_YARA_HIT = new BlackboardArtifact.Type(66, "TSK_YARA_HIT", bundle.getString("BlackboardArtifact.tskYaraHit.text"), Category.ANALYSIS_RESULT);
1334 
1338  public static final Type TSK_GPS_AREA = new BlackboardArtifact.Type(67, "TSK_GPS_AREA", bundle.getString("BlackboardArtifact.tskGPSArea.text"), Category.DATA_ARTIFACT);
1339 
1343  public static final Type TSK_WEB_CATEGORIZATION = new BlackboardArtifact.Type(68, "TSK_WEB_CATEGORIZATION", bundle.getString("BlackboardArtifact.tskWebCategorization.text"), Category.ANALYSIS_RESULT);
1344 
1348  public static final Type TSK_PREVIOUSLY_SEEN = new BlackboardArtifact.Type(69, "TSK_PREVIOUSLY_SEEN", bundle.getString("BlackboardArtifact.tskPreviouslySeen.text"), Category.ANALYSIS_RESULT);
1349 
1353  public static final Type TSK_PREVIOUSLY_UNSEEN = new BlackboardArtifact.Type(70, "TSK_PREVIOUSLY_UNSEEN", bundle.getString("BlackboardArtifact.tskPreviouslyUnseen.text"), Category.ANALYSIS_RESULT);
1354 
1358  public static final Type TSK_PREVIOUSLY_NOTABLE = new BlackboardArtifact.Type(71, "TSK_PREVIOUSLY_NOTABLE", bundle.getString("BlackboardArtifact.tskPreviouslyNotable.text"), Category.ANALYSIS_RESULT);
1359 
1360  // NOTE: When adding a new standard BlackboardArtifact.Type, add the instance and then add to the STANDARD_TYPES map.
1364  static final Map<Integer, Type> STANDARD_TYPES = Collections.unmodifiableMap(Stream.of(
1365  TSK_GEN_INFO,
1366  TSK_WEB_BOOKMARK,
1367  TSK_WEB_COOKIE,
1368  TSK_WEB_HISTORY,
1369  TSK_WEB_DOWNLOAD,
1370  TSK_RECENT_OBJECT,
1371  TSK_INSTALLED_PROG,
1372  TSK_KEYWORD_HIT,
1373  TSK_HASHSET_HIT,
1374  TSK_DEVICE_ATTACHED,
1375  TSK_INTERESTING_FILE_HIT,
1376  TSK_EMAIL_MSG,
1377  TSK_EXTRACTED_TEXT,
1378  TSK_WEB_SEARCH_QUERY,
1379  TSK_METADATA_EXIF,
1380  TSK_OS_INFO,
1381  TSK_SERVICE_ACCOUNT,
1382  TSK_CONTACT,
1383  TSK_MESSAGE,
1384  TSK_CALLLOG,
1385  TSK_CALENDAR_ENTRY,
1386  TSK_SPEED_DIAL_ENTRY,
1387  TSK_BLUETOOTH_PAIRING,
1388  TSK_GPS_BOOKMARK,
1389  TSK_GPS_LAST_KNOWN_LOCATION,
1390  TSK_GPS_SEARCH,
1391  TSK_PROG_RUN,
1392  TSK_ENCRYPTION_DETECTED,
1393  TSK_EXT_MISMATCH_DETECTED,
1394  TSK_INTERESTING_ARTIFACT_HIT,
1395  TSK_GPS_ROUTE,
1396  TSK_REMOTE_DRIVE,
1397  TSK_FACE_DETECTED,
1398  TSK_ACCOUNT,
1399  TSK_ENCRYPTION_SUSPECTED,
1400  TSK_OBJECT_DETECTED,
1401  TSK_WIFI_NETWORK,
1402  TSK_DEVICE_INFO,
1403  TSK_SIM_ATTACHED,
1404  TSK_BLUETOOTH_ADAPTER,
1405  TSK_WIFI_NETWORK_ADAPTER,
1406  TSK_VERIFICATION_FAILED,
1407  TSK_DATA_SOURCE_USAGE,
1408  TSK_WEB_FORM_AUTOFILL,
1409  TSK_WEB_FORM_ADDRESS,
1410  TSK_WEB_CACHE,
1411  TSK_TL_EVENT,
1412  TSK_CLIPBOARD_CONTENT,
1413  TSK_ASSOCIATED_OBJECT,
1414  TSK_USER_CONTENT_SUSPECTED,
1415  TSK_METADATA,
1416  TSK_GPS_TRACK,
1417  TSK_WEB_ACCOUNT_TYPE,
1418  TSK_SCREEN_SHOTS,
1419  TSK_PROG_NOTIFICATIONS,
1420  TSK_BACKUP_EVENT,
1421  TSK_DELETED_PROG,
1422  TSK_USER_DEVICE_EVENT,
1423  TSK_YARA_HIT,
1424  TSK_GPS_AREA,
1425  TSK_WEB_CATEGORIZATION,
1426  TSK_PREVIOUSLY_SEEN,
1427  TSK_PREVIOUSLY_UNSEEN,
1428  TSK_PREVIOUSLY_NOTABLE
1429  ).collect(Collectors.toMap(type -> type.getTypeID(), type -> type)));
1430 
1431  private final String typeName;
1432  private final int typeID;
1433  private final String displayName;
1434  private final Category category;
1435 
1444  Type(int typeID, String typeName, String displayName, Category category) {
1445  this.typeID = typeID;
1446  this.typeName = typeName;
1447  this.displayName = displayName;
1448  this.category = category;
1449  }
1450 
1456  public Type(ARTIFACT_TYPE type) {
1457  this(type.getTypeID(), type.getLabel(), type.getDisplayName(), type.getCategory());
1458  }
1459 
1465  public String getTypeName() {
1466  return this.typeName;
1467  }
1468 
1474  public int getTypeID() {
1475  return this.typeID;
1476  }
1477 
1483  public String getDisplayName() {
1484  return this.displayName;
1485  }
1486 
1493  return category;
1494  }
1495 
1503  @Override
1504  public boolean equals(Object that) {
1505  if (this == that) {
1506  return true;
1507  } else if (!(that instanceof Type)) {
1508  return false;
1509  } else {
1510  return ((Type) that).sameType(this);
1511  }
1512  }
1513 
1521  private boolean sameType(Type that) {
1522  return this.typeName.equals(that.getTypeName())
1523  && this.displayName.equals(that.getDisplayName())
1524  && this.typeID == that.getTypeID();
1525  }
1526 
1532  @Override
1533  public int hashCode() {
1534  int hash = 11;
1535  hash = 83 * hash + Objects.hashCode(this.typeID);
1536  hash = 83 * hash + Objects.hashCode(this.displayName);
1537  hash = 83 * hash + Objects.hashCode(this.typeName);
1538  return hash;
1539  }
1540  }
1541 
1547  public enum ARTIFACT_TYPE implements SleuthkitVisitableItem {
1548 
1552  TSK_GEN_INFO(1, "TSK_GEN_INFO", //NON-NLS
1553  bundle.getString("BlackboardArtifact.tskGenInfo.text"), Category.DATA_ARTIFACT),
1559  TSK_WEB_BOOKMARK(2, "TSK_WEB_BOOKMARK", //NON-NLS
1560  bundle.getString("BlackboardArtifact.tskWebBookmark.text"), Category.DATA_ARTIFACT),
1566  TSK_WEB_COOKIE(3, "TSK_WEB_COOKIE",
1567  bundle.getString("BlackboardArtifact.tskWebCookie.text"), Category.DATA_ARTIFACT), //NON-NLS
1573  TSK_WEB_HISTORY(4, "TSK_WEB_HISTORY", //NON-NLS
1574  bundle.getString("BlackboardArtifact.tskWebHistory.text"), Category.DATA_ARTIFACT),
1580  TSK_WEB_DOWNLOAD(5, "TSK_WEB_DOWNLOAD", //NON-NLS
1581  bundle.getString("BlackboardArtifact.tskWebDownload.text"), Category.DATA_ARTIFACT),
1585  TSK_RECENT_OBJECT(6, "TSK_RECENT_OBJ", //NON-NLS
1586  bundle.getString("BlackboardArtifact.tsk.recentObject.text"), Category.DATA_ARTIFACT),
1592  @Deprecated
1593  TSK_GPS_TRACKPOINT(7, "TSK_GPS_TRACKPOINT", //NON-NLS
1594  bundle.getString("BlackboardArtifact.tskGpsTrackpoint.text"), Category.DATA_ARTIFACT),
1598  TSK_INSTALLED_PROG(8, "TSK_INSTALLED_PROG", //NON-NLS
1599  bundle.getString("BlackboardArtifact.tskInstalledProg.text"), Category.DATA_ARTIFACT),
1603  TSK_KEYWORD_HIT(9, "TSK_KEYWORD_HIT",
1604  bundle.getString("BlackboardArtifact.tskKeywordHits.text"), Category.ANALYSIS_RESULT),
1608  TSK_HASHSET_HIT(10, "TSK_HASHSET_HIT", //NON-NLS
1609  bundle.getString("BlackboardArtifact.tskHashsetHit.text"), Category.ANALYSIS_RESULT),
1613  TSK_DEVICE_ATTACHED(11, "TSK_DEVICE_ATTACHED", //NON-NLS
1614  bundle.getString("BlackboardArtifact.tskDeviceAttached.text"), Category.DATA_ARTIFACT),
1619  TSK_INTERESTING_FILE_HIT(12, "TSK_INTERESTING_FILE_HIT", //NON-NLS
1620  bundle.getString("BlackboardArtifact.tskInterestingFileHit.text"), Category.ANALYSIS_RESULT),
1621 
1624  TSK_EMAIL_MSG(13, "TSK_EMAIL_MSG", //NON-NLS
1625  bundle.getString("BlackboardArtifact.tskEmailMsg.text"), Category.DATA_ARTIFACT),
1629  TSK_EXTRACTED_TEXT(14, "TSK_EXTRACTED_TEXT", //NON-NLS
1630  bundle.getString("BlackboardArtifact.tskExtractedText.text"), Category.DATA_ARTIFACT),
1634  TSK_WEB_SEARCH_QUERY(15, "TSK_WEB_SEARCH_QUERY", //NON-NLS
1635  bundle.getString("BlackboardArtifact.tskWebSearchQuery.text"), Category.DATA_ARTIFACT),
1639  TSK_METADATA_EXIF(16, "TSK_METADATA_EXIF", //NON-NLS
1640  bundle.getString("BlackboardArtifact.tskMetadataExif.text"), Category.ANALYSIS_RESULT),
1646  @Deprecated
1647  TSK_TAG_FILE(17, "TSK_TAG_FILE", //NON-NLS
1648  bundle.getString("BlackboardArtifact.tagFile.text"), Category.ANALYSIS_RESULT),
1654  @Deprecated
1655  TSK_TAG_ARTIFACT(18, "TSK_TAG_ARTIFACT", //NON-NLS
1656  bundle.getString("BlackboardArtifact.tskTagArtifact.text"), Category.ANALYSIS_RESULT),
1660  TSK_OS_INFO(19, "TSK_OS_INFO", //NON-NLS
1661  bundle.getString("BlackboardArtifact.tskOsInfo.text"), Category.DATA_ARTIFACT),
1665  @Deprecated
1666  TSK_OS_ACCOUNT(20, "TSK_OS_ACCOUNT", //NON-NLS
1667  bundle.getString("BlackboardArtifact.tskOsAccount.text"), Category.DATA_ARTIFACT),
1671  TSK_SERVICE_ACCOUNT(21, "TSK_SERVICE_ACCOUNT", //NON-NLS
1672  bundle.getString("BlackboardArtifact.tskServiceAccount.text"), Category.DATA_ARTIFACT),
1678  @Deprecated
1679  TSK_TOOL_OUTPUT(22, "TSK_TOOL_OUTPUT", //NON-NLS
1680  bundle.getString("BlackboardArtifact.tskToolOutput.text"), Category.DATA_ARTIFACT),
1687  TSK_CONTACT(23, "TSK_CONTACT", //NON-NLS
1688  bundle.getString("BlackboardArtifact.tskContact.text"), Category.DATA_ARTIFACT),
1695  TSK_MESSAGE(24, "TSK_MESSAGE", //NON-NLS
1696  bundle.getString("BlackboardArtifact.tskMessage.text"), Category.DATA_ARTIFACT),
1703  TSK_CALLLOG(25, "TSK_CALLLOG", //NON-NLS
1704  bundle.getString("BlackboardArtifact.tskCalllog.text"), Category.DATA_ARTIFACT),
1708  TSK_CALENDAR_ENTRY(26, "TSK_CALENDAR_ENTRY", //NON-NLS
1709  bundle.getString("BlackboardArtifact.tskCalendarEntry.text"), Category.DATA_ARTIFACT),
1713  TSK_SPEED_DIAL_ENTRY(27, "TSK_SPEED_DIAL_ENTRY", //NON-NLS
1714  bundle.getString("BlackboardArtifact.tskSpeedDialEntry.text"), Category.DATA_ARTIFACT),
1718  TSK_BLUETOOTH_PAIRING(28, "TSK_BLUETOOTH_PAIRING", //NON-NLS
1719  bundle.getString("BlackboardArtifact.tskBluetoothPairing.text"), Category.DATA_ARTIFACT),
1723  TSK_GPS_BOOKMARK(29, "TSK_GPS_BOOKMARK", //NON-NLS
1724  bundle.getString("BlackboardArtifact.tskGpsBookmark.text"), Category.DATA_ARTIFACT),
1728  TSK_GPS_LAST_KNOWN_LOCATION(30, "TSK_GPS_LAST_KNOWN_LOCATION", //NON-NLS
1729  bundle.getString("BlackboardArtifact.tskGpsLastKnownLocation.text"), Category.DATA_ARTIFACT),
1733  TSK_GPS_SEARCH(31, "TSK_GPS_SEARCH", //NON-NLS
1734  bundle.getString("BlackboardArtifact.tskGpsSearch.text"), Category.DATA_ARTIFACT),
1738  TSK_PROG_RUN(32, "TSK_PROG_RUN", //NON-NLS
1739  bundle.getString("BlackboardArtifact.tskProgRun.text"), Category.DATA_ARTIFACT),
1743  TSK_ENCRYPTION_DETECTED(33, "TSK_ENCRYPTION_DETECTED", //NON-NLS
1744  bundle.getString("BlackboardArtifact.tskEncryptionDetected.text"), Category.ANALYSIS_RESULT),
1748  TSK_EXT_MISMATCH_DETECTED(34, "TSK_EXT_MISMATCH_DETECTED", //NON-NLS
1749  bundle.getString("BlackboardArtifact.tskExtMismatchDetected.text"), Category.ANALYSIS_RESULT),
1754  TSK_INTERESTING_ARTIFACT_HIT(35, "TSK_INTERESTING_ARTIFACT_HIT", //NON-NLS
1755  bundle.getString("BlackboardArtifact.tskInterestingArtifactHit.text"), Category.ANALYSIS_RESULT),
1761  TSK_GPS_ROUTE(36, "TSK_GPS_ROUTE", //NON-NLS
1762  bundle.getString("BlackboardArtifact.tskGpsRoute.text"), Category.DATA_ARTIFACT),
1766  TSK_REMOTE_DRIVE(37, "TSK_REMOTE_DRIVE", //NON-NLS
1767  bundle.getString("BlackboardArtifact.tskRemoteDrive.text"), Category.DATA_ARTIFACT),
1771  TSK_FACE_DETECTED(38, "TSK_FACE_DETECTED", //NON-NLS
1772  bundle.getString("BlackboardArtifact.tskFaceDetected.text"), Category.ANALYSIS_RESULT),
1776  TSK_ACCOUNT(39, "TSK_ACCOUNT", //NON-NLS
1777  bundle.getString("BlackboardArtifact.tskAccount.text"), Category.DATA_ARTIFACT),
1781  TSK_ENCRYPTION_SUSPECTED(40, "TSK_ENCRYPTION_SUSPECTED", //NON-NLS
1782  bundle.getString("BlackboardArtifact.tskEncryptionSuspected.text"), Category.ANALYSIS_RESULT),
1783  /*
1784  * A classifier detected an object in a media file.
1785  */
1786  TSK_OBJECT_DETECTED(41, "TSK_OBJECT_DETECTED", //NON-NLS
1787  bundle.getString("BlackboardArtifact.tskObjectDetected.text"), Category.ANALYSIS_RESULT),
1791  TSK_WIFI_NETWORK(42, "TSK_WIFI_NETWORK", //NON-NLS
1792  bundle.getString("BlackboardArtifact.tskWIFINetwork.text"), Category.DATA_ARTIFACT),
1796  TSK_DEVICE_INFO(43, "TSK_DEVICE_INFO", //NON-NLS
1797  bundle.getString("BlackboardArtifact.tskDeviceInfo.text"), Category.DATA_ARTIFACT),
1801  TSK_SIM_ATTACHED(44, "TSK_SIM_ATTACHED", //NON-NLS
1802  bundle.getString("BlackboardArtifact.tskSimAttached.text"), Category.DATA_ARTIFACT),
1806  TSK_BLUETOOTH_ADAPTER(45, "TSK_BLUETOOTH_ADAPTER", //NON-NLS
1807  bundle.getString("BlackboardArtifact.tskBluetoothAdapter.text"), Category.DATA_ARTIFACT),
1811  TSK_WIFI_NETWORK_ADAPTER(46, "TSK_WIFI_NETWORK_ADAPTER", //NON-NLS
1812  bundle.getString("BlackboardArtifact.tskWIFINetworkAdapter.text"), Category.DATA_ARTIFACT),
1816  TSK_VERIFICATION_FAILED(47, "TSK_VERIFICATION_FAILED", //NON-NLS
1817  bundle.getString("BlackboardArtifact.tskVerificationFailed.text"), Category.ANALYSIS_RESULT),
1821  TSK_DATA_SOURCE_USAGE(48, "TSK_DATA_SOURCE_USAGE", //NON-NLS
1822  bundle.getString("BlackboardArtifact.tskDataSourceUsage.text"), Category.ANALYSIS_RESULT),
1828  TSK_WEB_FORM_AUTOFILL(49, "TSK_WEB_FORM_AUTOFILL", //NON-NLS
1829  bundle.getString("BlackboardArtifact.tskWebFormAutofill.text"), Category.DATA_ARTIFACT),
1835  TSK_WEB_FORM_ADDRESS(50, "TSK_WEB_FORM_ADDRESSES ", //NON-NLS
1836  bundle.getString("BlackboardArtifact.tskWebFormAddresses.text"), Category.DATA_ARTIFACT),
1843  @Deprecated
1844  TSK_DOWNLOAD_SOURCE(51, "TSK_DOWNLOAD_SOURCE", //NON-NLS
1845  bundle.getString("BlackboardArtifact.tskDownloadSource.text"), Category.DATA_ARTIFACT),
1849  TSK_WEB_CACHE(52, "TSK_WEB_CACHE", //NON-NLS
1850  bundle.getString("BlackboardArtifact.tskWebCache.text"), Category.DATA_ARTIFACT),
1854  TSK_TL_EVENT(53, "TSK_TL_EVENT", //NON-NLS
1855  bundle.getString("BlackboardArtifact.tskTLEvent.text"), Category.DATA_ARTIFACT),
1859  TSK_CLIPBOARD_CONTENT(54, "TSK_CLIPBOARD_CONTENT", //NON-NLS
1860  bundle.getString("BlackboardArtifact.tskClipboardContent.text"), Category.DATA_ARTIFACT),
1864  TSK_ASSOCIATED_OBJECT(55, "TSK_ASSOCIATED_OBJECT", //NON-NLS
1865  bundle.getString("BlackboardArtifact.tskAssociatedObject.text"), Category.DATA_ARTIFACT),
1869  TSK_USER_CONTENT_SUSPECTED(56, "TSK_USER_CONTENT_SUSPECTED", //NON-NLS
1870  bundle.getString("BlackboardArtifact.tskUserContentSuspected.text"), Category.ANALYSIS_RESULT),
1874  TSK_METADATA(57, "TSK_METADATA", //NON-NLS
1875  bundle.getString("BlackboardArtifact.tskMetadata.text"), Category.DATA_ARTIFACT),
1881  TSK_GPS_TRACK(58, "TSK_GPS_TRACK",
1882  bundle.getString("BlackboardArtifact.tskTrack.text"), Category.DATA_ARTIFACT),
1886  TSK_WEB_ACCOUNT_TYPE(59, "TSK_WEB_ACCOUNT_TYPE",
1887  bundle.getString("BlackboardArtifact.tskWebAccountType.text"), Category.ANALYSIS_RESULT),
1891  TSK_SCREEN_SHOTS(60, "TSK_SCREEN_SHOTS",
1892  bundle.getString("BlackboardArtifact.tskScreenShots.text"), Category.DATA_ARTIFACT),
1896  TSK_PROG_NOTIFICATIONS(62, "TSK_PROG_NOTIFICATIONS",
1897  bundle.getString("BlackboardArtifact.tskProgNotifications.text"), Category.DATA_ARTIFACT),
1901  TSK_BACKUP_EVENT(63, "TSK_BACKUP_EVENT",
1902  bundle.getString("BlackboardArtifact.tskBackupEvent.text"), Category.DATA_ARTIFACT),
1906  TSK_DELETED_PROG(64, "TSK_DELETED_PROG",
1907  bundle.getString("BlackboardArtifact.tskDeletedProg.text"), Category.DATA_ARTIFACT),
1911  TSK_USER_DEVICE_EVENT(65, "TSK_USER_DEVICE_EVENT",
1912  bundle.getString("BlackboardArtifact.tskUserDeviceEvent.text"), Category.DATA_ARTIFACT),
1916  TSK_YARA_HIT(66, "TSK_YARA_HIT",
1917  bundle.getString("BlackboardArtifact.tskYaraHit.text"), Category.ANALYSIS_RESULT),
1921  TSK_GPS_AREA(67, "TSK_GPS_AREA",
1922  bundle.getString("BlackboardArtifact.tskGPSArea.text"), Category.DATA_ARTIFACT),
1923  TSK_WEB_CATEGORIZATION(68, "TSK_WEB_CATEGORIZATION",
1924  bundle.getString("BlackboardArtifact.tskWebCategorization.text"), Category.ANALYSIS_RESULT),
1928  TSK_PREVIOUSLY_SEEN(69, "TSK_PREVIOUSLY_SEEN",
1929  bundle.getString("BlackboardArtifact.tskPreviouslySeen.text"), Category.ANALYSIS_RESULT),
1933  TSK_PREVIOUSLY_UNSEEN(70, "TSK_PREVIOUSLY_UNSEEN",
1934  bundle.getString("BlackboardArtifact.tskPreviouslyUnseen.text"), Category.ANALYSIS_RESULT),
1938  TSK_PREVIOUSLY_NOTABLE(71, "TSK_PREVIOUSLY_NOTABLE",
1939  bundle.getString("BlackboardArtifact.tskPreviouslyNotable.text"), Category.ANALYSIS_RESULT);
1940 
1941 
1942  /*
1943  * To developers: For each new artifact, ensure that: - The enum value
1944  * has 1-line JavaDoc description - The artifact catalog
1945  * (artifact_catalog.dox) is updated to reflect the attributes it uses
1946  */
1947  private final String label;
1948  private final int typeId;
1949  private final String displayName;
1950  private final Category category;
1951 
1959  private ARTIFACT_TYPE(int typeId, String label, String displayName) {
1960  this(typeId, label, displayName, Category.DATA_ARTIFACT);
1961  }
1962 
1971  private ARTIFACT_TYPE(int typeId, String label, String displayName, Category category) {
1972  this.typeId = typeId;
1973  this.label = label;
1974  this.displayName = displayName;
1975  this.category = category;
1976  }
1977 
1983  public int getTypeID() {
1984  return this.typeId;
1985  }
1986 
1992  public String getLabel() {
1993  return this.label;
1994  }
1995 
2002  return this.category;
2003  }
2004 
2013  static public ARTIFACT_TYPE fromLabel(String label) {
2014  for (ARTIFACT_TYPE value : ARTIFACT_TYPE.values()) {
2015  if (value.getLabel().equals(label)) {
2016  return value;
2017  }
2018  }
2019  throw new IllegalArgumentException("No ARTIFACT_TYPE matching type: " + label);
2020  }
2021 
2032  static public ARTIFACT_TYPE fromID(int id) {
2033  for (ARTIFACT_TYPE value : ARTIFACT_TYPE.values()) {
2034  if (value.getTypeID() == id) {
2035  return value;
2036  }
2037  }
2038  throw new IllegalArgumentException("No ARTIFACT_TYPE matching type: " + id);
2039  }
2040 
2046  public String getDisplayName() {
2047  return displayName;
2048  }
2049 
2061  @Override
2062  public <T> T accept(SleuthkitItemVisitor<T> visitor) {
2063  return visitor.visit(this);
2064  }
2065 
2066  }
2067 
2075  public enum Category {
2076  // NOTE: The schema code defaults to '0', so that code must be updated too if DATA_ARTIFACT changes from being 0
2077  DATA_ARTIFACT(0, "DATA_ARTIFACT", ResourceBundle.getBundle("org.sleuthkit.datamodel.Bundle").getString("CategoryType.DataArtifact")), // artifact is data that is directly/indirectly extracted from a data source.
2078  ANALYSIS_RESULT(1, "ANALYSIS_RESULT", ResourceBundle.getBundle("org.sleuthkit.datamodel.Bundle").getString("CategoryType.AnalysisResult")); // artifacts represents outcome of analysis of data.
2079 
2080  private final Integer id;
2081  private final String name;
2082  private final String displayName;
2083 
2084  private final static Map<Integer, Category> idToCategory = new HashMap<Integer, Category>();
2085 
2086  static {
2087  for (Category status : values()) {
2088  idToCategory.put(status.getID(), status);
2089  }
2090  }
2091 
2099  private Category(Integer id, String name, String displayName) {
2100  this.id = id;
2101  this.name = name;
2102  this.displayName = displayName;
2103  }
2104 
2112  public static Category fromID(int id) {
2113  return idToCategory.get(id);
2114  }
2115 
2121  public Integer getID() {
2122  return id;
2123  }
2124 
2130  String getName() {
2131  return name;
2132  }
2133 
2139  public String getDisplayName() {
2140  return displayName;
2141  }
2142  }
2143 
2147  public enum ReviewStatus {
2148 
2149  APPROVED(1, "APPROVED", "ReviewStatus.Approved"), //approved by human user
2150  REJECTED(2, "REJECTED", "ReviewStatus.Rejected"), //rejected by humna user
2151  UNDECIDED(3, "UNDECIDED", "ReviewStatus.Undecided"); // not yet reviewed by human user
2152 
2153  private final Integer id;
2154  private final String name;
2155  private final String displayName;
2156  private final static Map<Integer, ReviewStatus> idToStatus = new HashMap<Integer, ReviewStatus>();
2157 
2158  static {
2159  for (ReviewStatus status : values()) {
2160  idToStatus.put(status.getID(), status);
2161  }
2162  }
2163 
2172  private ReviewStatus(Integer id, String name, String displayNameKey) {
2173  this.id = id;
2174  this.name = name;
2175  this.displayName = ResourceBundle.getBundle("org.sleuthkit.datamodel.Bundle").getString(displayNameKey);
2176  }
2177 
2185  public static ReviewStatus withID(int id) {
2186  return idToStatus.get(id);
2187  }
2188 
2194  public Integer getID() {
2195  return id;
2196  }
2197 
2203  String getName() {
2204  return name;
2205  }
2206 
2212  public String getDisplayName() {
2213  return displayName;
2214  }
2215  }
2216 
2238  @Deprecated
2239  protected BlackboardArtifact(SleuthkitCase sleuthkitCase, long artifactID, long objID, long artifactObjID, long dataSourceObjId, int artifactTypeID, String artifactTypeName, String displayName) {
2240  this(sleuthkitCase, artifactID, objID, artifactObjID, dataSourceObjId, artifactTypeID, artifactTypeName, displayName, ReviewStatus.UNDECIDED);
2241  }
2242 
2257  @Deprecated
2258  public List<BlackboardAttribute> getAttributes(final BlackboardAttribute.ATTRIBUTE_TYPE attributeType) throws TskCoreException {
2259  if (loadedCacheFromDb == false) {
2260  List<BlackboardAttribute> attrs = getSleuthkitCase().getBlackboardAttributes(this);
2261  attrsCache.clear();
2262  attrsCache.addAll(attrs);
2263  loadedCacheFromDb = true;
2264  }
2265  ArrayList<BlackboardAttribute> filteredAttributes = new ArrayList<BlackboardAttribute>();
2266  for (BlackboardAttribute attr : attrsCache) {
2267  if (attr.getAttributeType().getTypeID() == attributeType.getTypeID()) {
2268  filteredAttributes.add(attr);
2269  }
2270  }
2271  return filteredAttributes;
2272  }
2273 
2274  @Override
2275  public long getId() {
2276  return this.artifactObjId;
2277  }
2278 
2287  @Override
2288  public List<Long> getChildrenIds() throws TskCoreException {
2289  List<Long> childrenIDs = new ArrayList<Long>();
2290  childrenIDs.addAll(getSleuthkitCase().getAbstractFileChildrenIds(this));
2291  childrenIDs.addAll(getSleuthkitCase().getBlackboardArtifactChildrenIds(this));
2292 
2293  return childrenIDs;
2294  }
2295 
2296  @Override
2297  public int getChildrenCount() throws TskCoreException {
2298  if (childrenCount != -1) {
2299  return childrenCount;
2300  }
2301 
2302  childrenCount = this.getSleuthkitCase().getContentChildrenCount(this);
2303 
2304  hasChildren = childrenCount > 0;
2305  checkedHasChildren = true;
2306 
2307  return childrenCount;
2308  }
2309 
2310  @Override
2311  public boolean hasChildren() throws TskCoreException {
2312  if (checkedHasChildren == true) {
2313  return hasChildren;
2314  }
2315 
2316  childrenCount = this.getSleuthkitCase().getContentChildrenCount(this);
2317 
2318  hasChildren = childrenCount > 0;
2319  checkedHasChildren = true;
2320 
2321  return hasChildren;
2322  }
2323 
2332  @Override
2333  public List<Content> getChildren() throws TskCoreException {
2334  List<Content> children = new ArrayList<>();
2335  children.addAll(getSleuthkitCase().getAbstractFileChildren(this));
2336  children.addAll(getSleuthkitCase().getBlackboardArtifactChildren(this));
2337 
2338  return children;
2339  }
2340 }
ArrayList< BlackboardArtifact > getArtifacts(int artifactTypeID)
ArrayList< BlackboardAttribute > getBlackboardAttributes(final BlackboardArtifact artifact)
DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection< BlackboardAttribute > attributesList, Long osAccountId)
void addBlackboardAttributes(Collection< BlackboardAttribute > attributes, int artifactTypeId)
void addAttributes(Collection< BlackboardAttribute > attributes)
void addBlackboardAttribute(BlackboardAttribute attr, int artifactTypeId)
List< BlackboardAttribute > getAttributes(final BlackboardAttribute.ATTRIBUTE_TYPE attributeType)
final int read(byte[] buf, long offset, long len)
void addAttribute(BlackboardAttribute attribute)
List< AnalysisResult > getAnalysisResults(long sourceObjId)
ArrayList< BlackboardArtifact > getArtifacts(BlackboardArtifact.ARTIFACT_TYPE type)
AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, Score score, String conclusion, String configuration, String justification, Collection< BlackboardAttribute > attributesList)
public< T > T accept(SleuthkitItemVisitor< T > visitor)
void addAttributes(Collection< BlackboardAttribute > attributes, final SleuthkitCase.CaseDbTransaction caseDbTransaction)
BlackboardArtifact newArtifact(int artifactTypeID)
BlackboardAttribute getAttribute(BlackboardAttribute.Type attributeType)
long getArtifactsCount(String artifactTypeName)
List< AnalysisResult > getAnalysisResults(BlackboardArtifact.Type artifactType)
BlackboardArtifact getGenInfoArtifact(boolean create)
BlackboardArtifact.Type getArtifactType(String artTypeName)
AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, Score score, String conclusion, String configuration, String justification, Collection< BlackboardAttribute > attributesList, long dataSourceId)
ArrayList< BlackboardArtifact > getArtifacts(String artifactTypeName)
BlackboardArtifact(SleuthkitCase sleuthkitCase, long artifactID, long objID, long artifactObjID, long dataSourceObjId, int artifactTypeID, String artifactTypeName, String displayName)
AnalysisResultAdded newAnalysisResult(BlackboardArtifact.Type artifactType, long objId, Long dataSourceObjId, Score score, String conclusion, String configuration, String justification, Collection< BlackboardAttribute > attributesList)
DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection< BlackboardAttribute > attributesList, Long osAccountId, long dataSourceId)
ArrayList< BlackboardArtifact > getAllArtifacts()
long getArtifactsCount(BlackboardArtifact.ARTIFACT_TYPE type)
DataArtifact newDataArtifact(BlackboardArtifact.Type artifactType, Collection< BlackboardAttribute > attributesList)
ArrayList< BlackboardAttribute > getGenInfoAttributes(BlackboardAttribute.ATTRIBUTE_TYPE attr_type)
BlackboardArtifact newArtifact(BlackboardArtifact.ARTIFACT_TYPE type)
void setReviewStatus(BlackboardArtifact artifact, BlackboardArtifact.ReviewStatus newStatus)

Copyright © 2011-2021 Brian Carrier. (carrier -at- sleuthkit -dot- org)
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.