19package org.sleuthkit.autopsy.datasourcesummary.datamodel;
21import java.nio.file.Paths;
22import java.text.DateFormat;
23import java.text.SimpleDateFormat;
24import java.util.ArrayList;
25import java.util.Collections;
27import java.util.Locale;
29import java.util.Objects;
30import java.util.stream.Collectors;
31import org.apache.commons.lang.StringUtils;
32import org.sleuthkit.autopsy.datasourcesummary.datamodel.SleuthkitCaseProvider.SleuthkitCaseProviderException;
33import org.sleuthkit.datamodel.AbstractFile;
34import org.sleuthkit.datamodel.BlackboardArtifact;
35import org.sleuthkit.datamodel.BlackboardAttribute;
36import org.sleuthkit.datamodel.Content;
37import org.sleuthkit.datamodel.DataSource;
38import org.sleuthkit.datamodel.SleuthkitCase;
39import org.sleuthkit.datamodel.TskCoreException;
40import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
47 private final static BlackboardAttribute.Type
DATETIME_ACCESSED_ATT =
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED);
48 private final static BlackboardAttribute.Type
DOMAIN_ATT =
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN);
49 private final static BlackboardAttribute.Type
PATH_ATT =
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH);
50 private final static BlackboardAttribute.Type
ASSOCATED_ATT =
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT);
51 private final static BlackboardAttribute.Type
EMAIL_FROM_ATT =
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM);
52 private final static BlackboardAttribute.Type
MSG_DATEIME_SENT_ATT =
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT);
53 private final static BlackboardArtifact.Type
ASSOCATED_OBJ_ART =
new BlackboardArtifact.Type(ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT);
55 private static final DateFormat
DATETIME_FORMAT =
new SimpleDateFormat(
"yyyy/MM/dd HH:mm:ss", Locale.getDefault());
73 throw new IllegalArgumentException(
"Unable to construct RecentFileSummary object. SleuthkitCaseProvider cannot be null");
87 private static <T extends RecentFileDetails> List<T>
getSortedLimited(List<T> fileDetails,
int limit) {
88 Map<String, T> fileDetailsMap = fileDetails.stream()
89 .filter(details -> details !=
null)
90 .collect(Collectors.toMap(
91 d -> d.getPath().toUpperCase(),
93 (d1, d2) -> Long.compare(d1.getDateAsLong(), d2.getDateAsLong()) > 0 ? d1 : d2));
95 return fileDetailsMap.values().stream()
96 .sorted((a, b) -> -Long.compare(a.getDateAsLong(), b.getDateAsLong()))
98 .collect(Collectors.toList());
112 if (StringUtils.isBlank(path) || lastOpened ==
null || lastOpened == 0) {
134 if (dataSource ==
null) {
135 return Collections.emptyList();
140 List<RecentFileDetails> details =
provider.get().getBlackboard()
141 .getArtifacts(ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID(), dataSource.getId()).stream()
143 .filter(d -> d !=
null)
144 .collect(Collectors.toList());
161 if (StringUtils.isBlank(path) || accessedTime ==
null || accessedTime == 0) {
175 throw new IllegalArgumentException(
"Invalid count: value must be greater than 0.");
194 if (dataSource ==
null) {
195 return Collections.emptyList();
200 List<RecentDownloadDetails> details =
provider.get().getBlackboard()
201 .getArtifacts(ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID(), dataSource.getId()).stream()
203 .filter(d -> d !=
null)
204 .collect(Collectors.toList());
222 if (dataSource ==
null) {
223 return Collections.emptyList();
228 SleuthkitCase skCase =
provider.get();
230 List<BlackboardArtifact> associatedArtifacts = skCase.getBlackboard()
233 List<RecentAttachmentDetails> details =
new ArrayList<>();
234 for (BlackboardArtifact artifact : associatedArtifacts) {
237 if (thisDetails !=
null) {
238 details.add(thisDetails);
256 BlackboardAttribute attribute = artifact.getAttribute(
ASSOCATED_ATT);
257 if (attribute ==
null) {
262 BlackboardArtifact messageArtifact = skCase.getBlackboardArtifact(attribute.getValueLong());
268 Content content = artifact.getParent();
269 if (!(content instanceof AbstractFile)) {
273 AbstractFile abstractFile = (AbstractFile) content;
276 String path = Paths.get(abstractFile.getParentPath(), abstractFile.getName()).toString();
280 if (date ==
null || date == 0 || StringUtils.isBlank(path)) {
296 final int artifactTypeID = nodeArtifact.getArtifactTypeID();
297 return artifactTypeID == ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()
298 || artifactTypeID == ARTIFACT_TYPE.TSK_MESSAGE.getTypeID();
305 public static class RecentFileDetails {
363 public static class RecentDownloadDetails
extends RecentFileDetails {
394 public static class RecentAttachmentDetails
extends RecentFileDetails {
425 if (!(obj instanceof RecentAttachmentDetails)) {
428 RecentAttachmentDetails compareObj = (RecentAttachmentDetails) obj;
430 return compareObj.
getSender().equals(this.sender)
438 hash = 73 * hash + Objects.hashCode(this.sender);
static String getStringOrNull(BlackboardArtifact artifact, Type attributeType)
static Long getLongOrNull(BlackboardArtifact artifact, Type attributeType)
boolean equals(Object obj)
final BlackboardArtifact artifact
BlackboardArtifact getArtifact()
static final BlackboardAttribute.Type EMAIL_FROM_ATT
List< RecentAttachmentDetails > getRecentAttachments(DataSource dataSource, int maxCount)
static final BlackboardAttribute.Type ASSOCATED_ATT
static final BlackboardAttribute.Type DOMAIN_ATT
static RecentAttachmentDetails getRecentAttachment(BlackboardArtifact artifact, SleuthkitCase skCase)
final SleuthkitCaseProvider provider
static final BlackboardAttribute.Type DATETIME_ACCESSED_ATT
static boolean isMessageArtifact(BlackboardArtifact nodeArtifact)
static< T extends RecentFileDetails > List< T > getSortedLimited(List< T > fileDetails, int limit)
List< RecentFileDetails > getRecentlyOpenedDocuments(DataSource dataSource, int maxCount)
List< RecentDownloadDetails > getRecentDownloads(DataSource dataSource, int maxCount)
RecentFilesSummary(SleuthkitCaseProvider provider)
static RecentFileDetails getRecentlyOpenedDocument(BlackboardArtifact artifact)
static RecentDownloadDetails getRecentDownload(BlackboardArtifact artifact)
static final DateFormat DATETIME_FORMAT
static final BlackboardAttribute.Type PATH_ATT
static final BlackboardAttribute.Type MSG_DATEIME_SENT_ATT
static void throwOnNonPositiveCount(int count)
static final BlackboardArtifact.Type ASSOCATED_OBJ_ART
SleuthkitCaseProvider DEFAULT