19 package org.sleuthkit.autopsy.centralrepository.datamodel;
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.HashSet;
24 import java.util.List;
26 import java.util.logging.Level;
27 import org.openide.util.NbBundle.Messages;
35 import org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
37 import org.
sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
39 import org.
sleuthkit.datamodel.InvalidAccountIDException;
50 private static final List<String>
domainsToSkip = Arrays.asList(
"localhost",
"127.0.0.1");
62 @Messages({
"CorrelationAttributeUtil.emailaddresses.text=Email Addresses"})
64 return Bundle.CorrelationAttributeUtil_emailaddresses_text();
75 add(ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID());
76 add(ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID());
77 add(ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID());
78 add(ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID());
79 add(ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID());
80 add(ARTIFACT_TYPE.TSK_WIFI_NETWORK.getTypeID());
81 add(ARTIFACT_TYPE.TSK_WIFI_NETWORK_ADAPTER.getTypeID());
82 add(ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID());
83 add(ARTIFACT_TYPE.TSK_BLUETOOTH_ADAPTER.getTypeID());
84 add(ARTIFACT_TYPE.TSK_DEVICE_INFO.getTypeID());
85 add(ARTIFACT_TYPE.TSK_SIM_ATTACHED.getTypeID());
86 add(ARTIFACT_TYPE.TSK_WEB_FORM_ADDRESS.getTypeID());
87 add(ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID());
104 if(SOURCE_TYPES_FOR_CR_INSERT.contains(artifact.getArtifactTypeID())) {
111 return new ArrayList<>();
139 List<CorrelationAttributeInstance> correlationAttrs =
new ArrayList<>();
142 if (sourceArtifact != null) {
143 int artifactTypeID = sourceArtifact.getArtifactTypeID();
144 if (artifactTypeID == ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) {
145 BlackboardAttribute setNameAttr = sourceArtifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME));
149 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID()
150 || artifactTypeID == ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID()
151 || artifactTypeID == ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID()
152 || artifactTypeID == ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()) {
153 BlackboardAttribute domainAttr = sourceArtifact.getAttribute(
new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DOMAIN));
154 if ((domainAttr != null)
155 && ! domainsToSkip.contains(domainAttr.getValueString())) {
158 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()) {
162 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_WIFI_NETWORK.getTypeID()) {
165 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_WIFI_NETWORK_ADAPTER.getTypeID()
166 || artifactTypeID == ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID()
167 || artifactTypeID == ARTIFACT_TYPE.TSK_BLUETOOTH_ADAPTER.getTypeID()) {
170 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_DEVICE_INFO.getTypeID()) {
175 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_SIM_ATTACHED.getTypeID()) {
179 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_WEB_FORM_ADDRESS.getTypeID()) {
183 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID()) {
186 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_CONTACT.getTypeID()
187 || artifactTypeID == ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()
188 || artifactTypeID == ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) {
193 logger.log(Level.WARNING, String.format(
"Error normalizing correlation attribute (%s)", artifact), ex);
194 return correlationAttrs;
196 catch (InvalidAccountIDException ex) {
197 logger.log(Level.WARNING, String.format(
"Invalid account identifier (artifactID: %d)", artifact.getId()));
198 return correlationAttrs;
201 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", artifact), ex);
202 return correlationAttrs;
203 }
catch (TskCoreException ex) {
204 logger.log(Level.SEVERE, String.format(
"Error getting querying case database (%s)", artifact), ex);
205 return correlationAttrs;
207 logger.log(Level.SEVERE,
"Error getting current case", ex);
208 return correlationAttrs;
210 return correlationAttrs;
233 if (null != artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER))) {
234 value = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)).getValueString();
235 }
else if (null != artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM))) {
236 value = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)).getValueString();
237 }
else if (null != artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO))) {
238 value = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)).getValueString();
249 if (corrAttr != null) {
250 corrAttrInstances.add(corrAttr);
269 BlackboardArtifact sourceArtifact = null;
270 if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() == artifact.getArtifactTypeID()) {
271 BlackboardAttribute assocArtifactAttr = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT));
272 if (assocArtifactAttr != null) {
276 sourceArtifact = artifact;
278 return sourceArtifact;
294 private static void makeCorrAttrFromAcctArtifact(List<CorrelationAttributeInstance> corrAttrInstances, BlackboardArtifact acctArtifact)
throws InvalidAccountIDException, TskCoreException, CentralRepoException {
297 BlackboardAttribute accountTypeAttribute = acctArtifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE));
298 String accountTypeStr = accountTypeAttribute.getValueString();
302 Account.Type predefinedAccountType = Account.Type.PREDEFINED_ACCOUNT_TYPES.stream().filter(type -> type.getTypeName().equalsIgnoreCase(accountTypeStr)).findAny().orElse(null);
305 if (Account.Type.DEVICE.getTypeName().equalsIgnoreCase(accountTypeStr) ==
false && predefinedAccountType != null) {
314 BlackboardAttribute accountIdAttribute = acctArtifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ID));
315 String accountIdStr = accountIdAttribute.getValueString();
321 if (corrAttr != null) {
323 corrAttr.setAccountId(crAccount.
getId());
324 corrAttrInstances.add(corrAttr);
346 private static void makeCorrAttrFromArtifactAttr(List<CorrelationAttributeInstance> corrAttrInstances, BlackboardArtifact artifact, ATTRIBUTE_TYPE artAttrType,
int typeId)
throws CentralRepoException, TskCoreException {
347 BlackboardAttribute attribute = artifact.getAttribute(
new BlackboardAttribute.Type(artAttrType));
348 if (attribute != null) {
349 String value = attribute.getValueString();
350 if ((null != value) && (value.isEmpty() ==
false)) {
353 corrAttrInstances.add(inst);
379 AbstractFile bbSourceFile = currentCase.
getSleuthkitCase().getAbstractFileById(artifact.getObjectID());
380 if (null == bbSourceFile) {
381 logger.log(Level.SEVERE,
"Error creating artifact instance. Abstract File was null.");
391 bbSourceFile.getParentPath() + bbSourceFile.
getName(),
393 TskData.FileKnown.UNKNOWN,
394 bbSourceFile.getId());
396 }
catch (TskCoreException ex) {
397 logger.log(Level.SEVERE, String.format(
"Error getting querying case database (%s)", artifact), ex);
399 }
catch (CentralRepoException ex) {
400 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", artifact), ex);
403 logger.log(Level.WARNING, String.format(
"Error creating correlation attribute instance (%s)", artifact), ex);
405 }
catch (NoCurrentCaseException ex) {
406 logger.log(Level.SEVERE,
"Error getting current case", ex);
440 if (null == correlationCase) {
445 }
catch (TskCoreException ex) {
446 logger.log(Level.SEVERE, String.format(
"Error getting querying case database (%s)", file), ex);
448 }
catch (CentralRepoException ex) {
449 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", file), ex);
451 }
catch (NoCurrentCaseException ex) {
452 logger.log(Level.SEVERE,
"Error getting current case", ex);
459 }
catch (CentralRepoException ex) {
460 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", file), ex);
463 logger.log(Level.WARNING, String.format(
"Error creating correlation attribute instance (%s)", file), ex);
473 if (correlationAttributeInstance == null && file.getMd5Hash() != null) {
474 String filePath = (file.getParentPath() + file.getName()).toLowerCase();
477 }
catch (CentralRepoException ex) {
478 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", file), ex);
481 logger.log(Level.WARNING, String.format(
"Error creating correlation attribute instance (%s)", file), ex);
486 return correlationAttributeInstance;
514 String md5 = file.getMd5Hash();
515 if (md5 == null || md5.isEmpty() || HashUtility.isNoDataMd5(md5)) {
528 file.getParentPath() + file.
getName(),
530 TskData.FileKnown.UNKNOWN,
533 }
catch (TskCoreException ex) {
534 logger.log(Level.SEVERE, String.format(
"Error querying case database (%s)", file), ex);
536 }
catch (CentralRepoException ex) {
537 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", file), ex);
540 logger.log(Level.WARNING, String.format(
"Error creating correlation attribute instance (%s)", file), ex);
542 }
catch (NoCurrentCaseException ex) {
543 logger.log(Level.SEVERE,
"Error getting current case", ex);
560 switch (file.getType()) {
573 return file.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.ALLOC);
575 logger.log(Level.WARNING,
"Unexpected file type {0}", file.getType().getName());
static final int EMAIL_TYPE_ID
static final int USBID_TYPE_ID
static String getEmailAddressAttrDisplayName()
static CorrelationAttributeInstance makeCorrAttr(BlackboardArtifact artifact, CorrelationAttributeInstance.Type correlationType, String value)
static final int ICCID_TYPE_ID
CorrelationAttributeUtil()
static CorrelationDataSource fromTSKDataSource(CorrelationCase correlationCase, Content dataSource)
static CorrelationAttributeInstance makeCorrAttrFromFile(AbstractFile file)
CorrelationCase getCase(Case autopsyCase)
static final int IMEI_TYPE_ID
static final Logger logger
static List< CorrelationAttributeInstance > makeCorrAttrsForCorrelation(BlackboardArtifact artifact)
static boolean isSupportedAbstractFileType(AbstractFile file)
static void makeCorrAttrsFromCommunicationArtifacts(List< CorrelationAttributeInstance > corrAttrInstances, BlackboardArtifact artifact)
static final int DOMAIN_TYPE_ID
static final int PHONE_TYPE_ID
static CorrelationAttributeInstance getCorrAttrForFile(AbstractFile file)
SleuthkitCase getSleuthkitCase()
static void makeCorrAttrFromArtifactAttr(List< CorrelationAttributeInstance > corrAttrInstances, BlackboardArtifact artifact, ATTRIBUTE_TYPE artAttrType, int typeId)
CorrelationAttributeInstance getCorrelationAttributeInstance(CorrelationAttributeInstance.Type type, CorrelationCase correlationCase, CorrelationDataSource correlationDataSource, String value, String filePath)
static final List< String > domainsToSkip
static final int MAC_TYPE_ID
int getCorrelationTypeId()
static BlackboardArtifact getCorrAttrSourceArtifact(BlackboardArtifact artifact)
static List< CorrelationAttributeInstance > makeCorrAttrsToSave(BlackboardArtifact artifact)
static final int IMSI_TYPE_ID
synchronized static Logger getLogger(String name)
static void makeCorrAttrFromAcctArtifact(List< CorrelationAttributeInstance > corrAttrInstances, BlackboardArtifact acctArtifact)
CorrelationAttributeInstance.Type getCorrelationTypeById(int typeId)
static Case getCurrentCaseThrows()
static final int SSID_TYPE_ID
CentralRepoAccountType getAccountTypeByName(String accountTypeName)
static CentralRepository getInstance()
static final Set< Integer > SOURCE_TYPES_FOR_CR_INSERT
static final int FILES_TYPE_ID
CentralRepoAccount getOrCreateAccount(CentralRepoAccount.CentralRepoAccountType crAccountType, String accountUniqueID)