19 package org.sleuthkit.autopsy.casemodule;
22 import java.nio.file.Path;
23 import javax.swing.JPanel;
24 import java.util.ArrayList;
25 import java.util.Calendar;
26 import java.util.List;
27 import java.util.logging.Level;
28 import java.util.UUID;
29 import javax.swing.filechooser.FileFilter;
30 import org.openide.util.NbBundle;
31 import org.openide.util.lookup.ServiceProvider;
32 import org.openide.util.lookup.ServiceProviders;
52 @ServiceProviders(value = {
53 @ServiceProvider(service = DataSourceProcessor.class)
55 @ServiceProvider(service = AutoIngestDataSourceProcessor.class)}
59 private final static String DATA_SOURCE_TYPE = NbBundle.getMessage(
ImageDSProcessor.class,
"ImageDSProcessor.dsType.text");
61 private static final List<String> allExt =
new ArrayList<>();
65 private static final String ALL_DESC = NbBundle.getMessage(
ImageDSProcessor.class,
"ImageDSProcessor.allDesc.text");
67 private static final List<FileFilter> filtersList =
new ArrayList<>();
71 private Image image = null;
87 filtersList.add(allFilter);
88 filtersList.add(rawFilter);
89 filtersList.add(encaseFilter);
92 if (!System.getProperty(
"os.name").toLowerCase().contains(
"mac")) {
93 filtersList.add(virtualMachineFilter);
113 static List<FileFilter> getFileFiltersList() {
125 return DATA_SOURCE_TYPE;
184 ingestStream =
new DefaultIngestStream();
185 readConfigSettings();
188 new String[]{imagePath}, sectorSize, timeZone, md5, sha1, sha256, deviceId);
189 }
catch (TskCoreException ex) {
190 logger.log(Level.SEVERE,
"Error adding data source with path " + imagePath +
" to database", ex);
191 final List<String> errors =
new ArrayList<>();
192 errors.add(ex.getMessage());
197 doAddImageProcess(deviceId, imagePath, sectorSize, timeZone, ignoreFatOrphanFiles, md5, sha1, sha256, progressMonitor, callback);
222 readConfigSettings();
227 new String[]{imagePath}, sectorSize, timeZone, md5, sha1, sha256, deviceId);
228 }
catch (TskCoreException ex) {
229 logger.log(Level.SEVERE,
"Error adding data source with path " + imagePath +
" to database", ex);
230 final List<String> errors =
new ArrayList<>();
231 errors.add(ex.getMessage());
239 }
catch (TskCoreException ex) {
240 logger.log(Level.SEVERE,
"Error starting ingest modules", ex);
241 final List<String> errors =
new ArrayList<>();
242 errors.add(ex.getMessage());
248 doAddImageProcess(deviceId, imagePath, sectorSize, timeZone, ignoreFatOrphanFiles, md5, sha1, sha256, progress, callBack);
255 if (!setDataSourceOptionsCalled) {
257 deviceId = UUID.randomUUID().toString();
262 md5 = configPanel.getMd5();
266 sha1 = configPanel.getSha1();
267 if (sha1.isEmpty()) {
270 sha256 = configPanel.getSha256();
271 if (sha256.isEmpty()) {
309 ingestStream =
new DefaultIngestStream();
312 new String[]{imagePath}, sectorSize, timeZone,
"",
"",
"", deviceId);
313 }
catch (TskCoreException ex) {
314 logger.log(Level.SEVERE,
"Error adding data source with path " + imagePath +
" to database", ex);
315 final List<String> errors =
new ArrayList<>();
316 errors.add(ex.getMessage());
321 doAddImageProcess(deviceId, imagePath, 0, timeZone, ignoreFatOrphanFiles, null, null, null, progressMonitor, callback);
356 if (ingestStream == null) {
357 String message =
"Ingest stream was not initialized before running the add image process on " + imagePath;
358 logger.log(Level.SEVERE, message);
359 final List<String> errors =
new ArrayList<>();
365 String message =
"Image was not added to database before running the add image process on " + imagePath;
366 logger.log(Level.SEVERE, message);
367 final List<String> errors =
new ArrayList<>();
373 AddImageTask.ImageDetails imageDetails =
new AddImageTask.ImageDetails(deviceId, image, sectorSize, timeZone, ignoreFatOrphanFiles, md5, sha1, sha256, null);
374 addImageTask =
new AddImageTask(imageDetails,
376 new StreamingAddDataSourceCallbacks(ingestStream),
377 new StreamingAddImageTaskCallback(ingestStream, callback));
378 new Thread(addImageTask).start();
390 if (null != addImageTask) {
391 addImageTask.cancelTask();
393 if (ingestStream != null) {
407 ignoreFatOrphanFiles =
false;
409 setDataSourceOptionsCalled =
false;
413 for (FileFilter filter : filters) {
414 if (filter.accept(file)) {
425 if (!isAcceptedByFiler(dataSourcePath.toFile(), filtersList)) {
436 }
catch (Exception ex) {
446 this.deviceId = deviceId;
447 this.imagePath = dataSourcePath.toString();
449 this.timeZone = Calendar.getInstance().getTimeZone().getID();
450 this.ignoreFatOrphanFiles =
false;
451 setDataSourceOptionsCalled =
true;
453 ingestStream =
new DefaultIngestStream();
456 new String[]{imagePath}, sectorSize, timeZone,
"",
"",
"", deviceId);
457 }
catch (TskCoreException ex) {
458 logger.log(Level.SEVERE,
"Error adding data source with path " + imagePath +
" to database", ex);
459 final List<String> errors =
new ArrayList<>();
460 errors.add(ex.getMessage());
465 doAddImageProcess(deviceId, dataSourcePath.toString(), sectorSize, timeZone, ignoreFatOrphanFiles, null, null, null, progressMonitor, callBack);
470 this.deviceId = deviceId;
471 this.imagePath = dataSourcePath.toString();
473 this.timeZone = Calendar.getInstance().getTimeZone().getID();
474 this.ignoreFatOrphanFiles =
false;
475 setDataSourceOptionsCalled =
true;
480 new String[]{imagePath}, sectorSize, timeZone, md5, sha1, sha256, deviceId);
481 }
catch (TskCoreException ex) {
482 logger.log(Level.SEVERE,
"Error adding data source with path " + imagePath +
" to database", ex);
483 final List<String> errors =
new ArrayList<>();
484 errors.add(ex.getMessage());
492 }
catch (TskCoreException ex) {
493 logger.log(Level.SEVERE,
"Error starting ingest modules", ex);
494 final List<String> errors =
new ArrayList<>();
495 errors.add(ex.getMessage());
500 doAddImageProcess(deviceId, dataSourcePath.toString(), sectorSize, timeZone, ignoreFatOrphanFiles, null, null, null, progressMonitor, callBack);
519 this.deviceId = UUID.randomUUID().toString();
520 this.imagePath = imagePath;
522 this.timeZone = Calendar.getInstance().getTimeZone().getID();
523 this.ignoreFatOrphanFiles = ignoreFatOrphanFiles;
524 setDataSourceOptionsCalled =
true;
IngestStream openIngestStream(DataSource dataSource, IngestJobSettings settings)
static synchronized IngestManager getInstance()
boolean getNoFatOrphans()
void readConfigSettings()
void process(String deviceId, Path dataSourcePath, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callBack)
String getDataSourceType()
static boolean isAcceptedByFiler(File file, List< FileFilter > filters)
boolean supportsIngestStream()
static final String RAW_IMAGE_DESC
static final String VIRTUAL_MACHINE_DESC
static synchronized ImageFilePanel createInstance(String context, List< FileFilter > fileChooserFilters)
IngestStream processWithIngestStream(String deviceId, Path dataSourcePath, IngestJobSettings settings, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callBack)
AddImageTask addImageTask
void run(String deviceId, String imagePath, String timeZone, boolean ignoreFatOrphanFiles, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback)
static final String ENCASE_IMAGE_DESC
void done(DataSourceProcessorResult result, List< String > errList, List< Content > newDataSources)
boolean ignoreFatOrphanFiles
static final List< String > VIRTUAL_MACHINE_EXTS
static final List< String > ENCASE_IMAGE_EXTS
SleuthkitCase getSleuthkitCase()
void setDataSourceOptions(String imagePath, String timeZone, boolean ignoreFatOrphanFiles)
void doAddImageProcess(String deviceId, String imagePath, int sectorSize, String timeZone, boolean ignoreFatOrphanFiles, String md5, String sha1, String sha256, DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback)
boolean setDataSourceOptionsCalled
static boolean imageHasFileSystem(Path dataSourcePath)
void run(DataSourceProcessorProgressMonitor progressMonitor, DataSourceProcessorCallback callback)
static Case getCurrentCase()
synchronized static Logger getLogger(String name)
void runWithIngestStream(IngestJobSettings settings, DataSourceProcessorProgressMonitor progress, DataSourceProcessorCallback callBack)
static Case getCurrentCaseThrows()
final ImageFilePanel configPanel
static final List< String > RAW_IMAGE_EXTS
int canProcess(Path dataSourcePath)