20 package org.sleuthkit.autopsy.commonfilesearch;
22 import java.sql.ResultSet;
23 import java.sql.SQLException;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.List;
30 import java.util.stream.Collectors;
31 import java.util.stream.Stream;
32 import org.openide.util.NbBundle;
37 import org.
sleuthkit.datamodel.SleuthkitCase.CaseDbQuery;
48 @SuppressWarnings(
"PMD.AbstractNaming")
49 abstract class CommonFilesMetadataBuilder {
51 private final Map<Long, String> dataSourceIdToNameMap;
52 private final boolean filterByMedia;
53 private final boolean filterByDoc;
54 private static final String filterByMimeTypesWhereClause =
" and mime_type in (%s)";
63 private static final Set<String> MEDIA_PICS_VIDEO_MIME_TYPES = Stream.of(
69 "image/vnd.adobe.photoshop",
84 "application/vnd.ms-asf",
85 "application/vnd.rn-realmedia",
86 "application/x-shockwave-flash"
87 ).collect(Collectors.toSet());
97 private static final Set<String> TEXT_FILES_MIME_TYPES = Stream.of(
105 "application/javascript",
108 "application/x-msoffice",
109 "application/x-ooxml",
110 "application/msword",
111 "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
112 "application/vnd.ms-powerpoint",
113 "application/vnd.openxmlformats-officedocument.presentationml.presentation",
114 "application/vnd.ms-excel",
115 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
116 "application/vnd.oasis.opendocument.presentation",
117 "application/vnd.oasis.opendocument.spreadsheet",
118 "application/vnd.oasis.opendocument.text"
119 ).collect(Collectors.toSet());
130 CommonFilesMetadataBuilder(Map<Long, String> dataSourceIdMap,
boolean filterByMediaMimeType,
boolean filterByDocMimeType) {
131 dataSourceIdToNameMap = dataSourceIdMap;
132 filterByMedia = filterByMediaMimeType;
133 filterByDoc = filterByDocMimeType;
145 static final String SELECT_PREFIX =
"SELECT obj_id, md5, data_source_obj_id from tsk_files where";
157 protected abstract String buildSqlSelectStatement();
169 public CommonFilesMetadata findCommonFiles() throws TskCoreException, NoCurrentCaseException, SQLException {
171 Map<String, Md5Metadata> commonFiles =
new HashMap<>();
173 SleuthkitCase sleuthkitCase = Case.getOpenCase().getSleuthkitCase();
174 String selectStatement = this.buildSqlSelectStatement();
177 CaseDbQuery query = sleuthkitCase.executeQuery(selectStatement);
178 ResultSet resultSet = query.getResultSet()) {
180 while (resultSet.next()) {
181 Long objectId = resultSet.getLong(1);
182 String md5 = resultSet.getString(2);
183 Long dataSourceId = resultSet.getLong(3);
184 String dataSource = this.dataSourceIdToNameMap.get(dataSourceId);
186 if (md5 == null || HashUtility.isNoDataMd5(md5)) {
190 if (commonFiles.containsKey(md5)) {
191 final Md5Metadata md5Metadata = commonFiles.get(md5);
192 md5Metadata.addFileInstanceMetadata(
new FileInstanceMetadata(objectId, dataSource));
194 final List<FileInstanceMetadata> fileInstances =
new ArrayList<>();
195 fileInstances.add(
new FileInstanceMetadata(objectId, dataSource));
196 Md5Metadata md5Metadata =
new Md5Metadata(md5, fileInstances);
197 commonFiles.put(md5, md5Metadata);
202 return new CommonFilesMetadata(commonFiles);
215 String determineMimeTypeFilter() {
217 Set<String> mimeTypesToFilterOn =
new HashSet<>();
218 String mimeTypeString =
"";
220 mimeTypesToFilterOn.addAll(MEDIA_PICS_VIDEO_MIME_TYPES);
223 mimeTypesToFilterOn.addAll(TEXT_FILES_MIME_TYPES);
225 StringBuilder mimeTypeFilter =
new StringBuilder(mimeTypesToFilterOn.size());
226 if (!mimeTypesToFilterOn.isEmpty()) {
227 for (String mimeType : mimeTypesToFilterOn) {
228 mimeTypeFilter.append(
'"').append(mimeType).append(
"\",");
230 mimeTypeString = mimeTypeFilter.toString().substring(0, mimeTypeFilter.length() - 1);
231 mimeTypeString = String.format(filterByMimeTypesWhereClause,
new Object[]{mimeTypeString});
233 return mimeTypeString;
237 "CommonFilesMetadataBuilder.buildTabTitle.titleAll=Common Files (All Data Sources, %s)",
238 "CommonFilesMetadataBuilder.buildTabTitle.titleSingle=Common Files (Match Within Data Source: %s, %s)"
240 protected abstract String buildTabTitle();
243 "CommonFilesMetadataBuilder.buildCategorySelectionString.doc=Documents",
244 "CommonFilesMetadataBuilder.buildCategorySelectionString.media=Media",
245 "CommonFilesMetadataBuilder.buildCategorySelectionString.all=All File Categories"
247 protected String buildCategorySelectionString() {
248 if (!this.filterByDoc && !this.filterByMedia) {
249 return Bundle.CommonFilesMetadataBuilder_buildCategorySelectionString_all();
251 List<String> filters =
new ArrayList<>();
252 if (this.filterByDoc) {
253 filters.add(Bundle.CommonFilesMetadataBuilder_buildCategorySelectionString_doc());
255 if (this.filterByMedia) {
256 filters.add(Bundle.CommonFilesMetadataBuilder_buildCategorySelectionString_media());
258 return String.join(
", ", filters);