Autopsy  4.16.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
DomainSearchThumbnailLoader.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2020 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.discovery.search;
20 
21 import com.google.common.cache.CacheLoader;
22 import java.awt.Image;
23 import java.util.List;
24 import java.util.ArrayList;
25 import java.util.Collections;
27 import org.sleuthkit.datamodel.BlackboardArtifact;
28 import org.sleuthkit.datamodel.AbstractFile;
29 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_CACHE;
30 import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD;
31 import org.sleuthkit.datamodel.BlackboardAttribute;
32 import org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
33 import org.sleuthkit.datamodel.Content;
34 import org.sleuthkit.datamodel.DataSource;
35 import org.sleuthkit.datamodel.SleuthkitCase;
36 import org.sleuthkit.datamodel.TskCoreException;
37 
38 import org.openide.util.ImageUtilities;
39 
47 public class DomainSearchThumbnailLoader extends CacheLoader<DomainSearchThumbnailRequest, Image> {
48 
49  private static final String UNSUPPORTED_IMAGE = "org/sleuthkit/autopsy/images/image-extraction-not-supported.png";
50  private static final String JPG_EXTENSION = "jpg";
51  private static final String JPG_MIME_TYPE = "image/jpeg";
53 
58  this(new DomainSearchArtifactsCache());
59  }
60 
69  this.artifactsCache = artifactsCache;
70  }
71 
72  @Override
73  public Image load(DomainSearchThumbnailRequest thumbnailRequest) throws TskCoreException, DiscoveryException {
74  final SleuthkitCase caseDb = thumbnailRequest.getSleuthkitCase();
75  final DomainSearchArtifactsRequest webDownloadsRequest = new DomainSearchArtifactsRequest(
76  caseDb, thumbnailRequest.getDomain(), TSK_WEB_DOWNLOAD);
77  final List<BlackboardArtifact> webDownloads = artifactsCache.get(webDownloadsRequest);
78  final List<AbstractFile> webDownloadPictures = getJpegsFromWebDownload(caseDb, webDownloads);
79  Collections.sort(webDownloadPictures, (file1, file2) -> Long.compare(file1.getCrtime(), file2.getCrtime()));
80  for (int i = webDownloadPictures.size() - 1; i >= 0; i--) {
81  // Get the most recent image, according to creation time.
82  final AbstractFile mostRecent = webDownloadPictures.get(i);
83 
84  final Image candidateThumbnail = ImageUtils.getThumbnail(mostRecent, thumbnailRequest.getIconSize());
85  if (candidateThumbnail != ImageUtils.getDefaultThumbnail()) {
86  return candidateThumbnail;
87  }
88  }
90  caseDb, thumbnailRequest.getDomain(), TSK_WEB_CACHE);
91  final List<BlackboardArtifact> webCacheArtifacts = artifactsCache.get(webCacheRequest);
92  final List<AbstractFile> webCachePictures = getJpegsFromWebCache(caseDb, webCacheArtifacts);
93  Collections.sort(webCachePictures, (file1, file2) -> Long.compare(file1.getSize(), file2.getSize()));
94  for (int i = webCachePictures.size() - 1; i >= 0; i--) {
95  // Get the largest image, according to file size.
96  final AbstractFile largest = webCachePictures.get(i);
97  final Image candidateThumbnail = ImageUtils.getThumbnail(largest, thumbnailRequest.getIconSize());
98  if (candidateThumbnail != ImageUtils.getDefaultThumbnail()) {
99  return candidateThumbnail;
100  }
101  }
102  return ImageUtilities.loadImage(UNSUPPORTED_IMAGE, false);
103  }
104 
116  private List<AbstractFile> getJpegsFromWebDownload(SleuthkitCase caseDb, List<BlackboardArtifact> artifacts) throws TskCoreException {
117  final List<AbstractFile> jpegs = new ArrayList<>();
118  for (BlackboardArtifact artifact : artifacts) {
119  final Content sourceContent = caseDb.getContentById(artifact.getObjectID());
120  addIfJpeg(jpegs, sourceContent);
121  }
122  return jpegs;
123  }
124 
134  private List<AbstractFile> getJpegsFromWebCache(SleuthkitCase caseDb, List<BlackboardArtifact> artifacts) throws TskCoreException {
135  final BlackboardAttribute.Type TSK_PATH_ID = new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_PATH_ID);
136  final List<AbstractFile> jpegs = new ArrayList<>();
137  for (BlackboardArtifact artifact : artifacts) {
138  final BlackboardAttribute tskPathId = artifact.getAttribute(TSK_PATH_ID);
139  if (tskPathId != null) {
140  final Content sourceContent = caseDb.getContentById(tskPathId.getValueLong());
141  addIfJpeg(jpegs, sourceContent);
142  }
143  }
144  return jpegs;
145  }
146 
154  private void addIfJpeg(List<AbstractFile> files, Content sourceContent) {
155  if ((sourceContent instanceof AbstractFile) && !(sourceContent instanceof DataSource)) {
156  final AbstractFile file = (AbstractFile) sourceContent;
157  if (JPG_EXTENSION.equals(file.getNameExtension())
158  || JPG_MIME_TYPE.equals(file.getMIMEType())) {
159  files.add(file);
160  }
161  }
162  }
163 }
List< BlackboardArtifact > get(DomainSearchArtifactsRequest request)
List< AbstractFile > getJpegsFromWebDownload(SleuthkitCase caseDb, List< BlackboardArtifact > artifacts)
void addIfJpeg(List< AbstractFile > files, Content sourceContent)
static BufferedImage getThumbnail(Content content, int iconSize)
List< AbstractFile > getJpegsFromWebCache(SleuthkitCase caseDb, List< BlackboardArtifact > artifacts)

Copyright © 2012-2020 Basis Technology. Generated on: Tue Sep 22 2020
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.