diff --git a/.gitignore b/.gitignore index 418d944b1e4a56160e5d5a5962645ece844c85a3..1400fb33be2ddd01055bb85bcf945bfdcd1d00b2 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,8 @@ !/CoreLibs/nbproject/project.xml !/CoreLibs/nbproject/project.properties +/Core/test/qa-functional/data/ + /KeywordSearch/release/ /KeywordSearch/build/ /KeywordSearch/dist/ diff --git a/Core/build.xml b/Core/build.xml index 3555ff071145fa339ddd5c9d0066f815845b1464..0a7cf98b7a8a7959dcecc7a0ab3d2240f61eeed9 100644 --- a/Core/build.xml +++ b/Core/build.xml @@ -83,8 +83,9 @@ </target> <target name="getImageFile"> - <mkdir dir="${basedir}/test/qa-functional/data"/> - <get src="https://drive.google.com/uc?id=0BxdBkzm5VKGNT0dGY0dqcHVsU3M" dest="${test-input}/filter_test1.img" skipexisting="true"/> + <mkdir dir="${basedir}/test/qa-functional/data"/> + <get src="https://drive.google.com/uc?id=0BxdBkzm5VKGNT0dGY0dqcHVsU3M" dest="${test-input}/filter_test1.img" skipexisting="true"/> + <get src="https://drive.google.com/uc?id=1bghoSm7z7nhmGIxlllyY1MMlbLntxm7n" dest="${test-input}/local_files_test.zip" skipexisting="true"/> </target> <target name="get-deps" depends="init-ivy,getTSKJars,get-thirdparty-dependencies,get-InternalPythonModules, download-binlist, getImageFile"> <mkdir dir="${ext.dir}"/> diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/IngestFileFiltersTest.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/IngestFileFiltersTest.java index e9cab64a20d2012726c07dbc83c4c7c3397a52b2..5d5a48eaa9d212964f8bd87c304d2daac59f2c34 100644 --- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/IngestFileFiltersTest.java +++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/IngestFileFiltersTest.java @@ -36,10 +36,12 @@ import org.openide.util.Exceptions; import org.python.icu.impl.Assert; import org.sleuthkit.autopsy.casemodule.ImageDSProcessor; +import org.sleuthkit.autopsy.casemodule.LocalFilesDSProcessor; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.casemodule.services.FileManager; import org.sleuthkit.autopsy.datasourceprocessors.AutoIngestDataSourceProcessor; import org.sleuthkit.autopsy.ingest.IngestJobSettings.IngestType; +import org.sleuthkit.autopsy.modules.embeddedfileextractor.EmbeddedFileExtractorModuleFactory; import org.sleuthkit.autopsy.modules.filetypeid.FileTypeIdModuleFactory; import org.sleuthkit.autopsy.modules.interestingitems.FilesSet; import org.sleuthkit.autopsy.modules.interestingitems.FilesSet.Rule; @@ -61,6 +63,7 @@ public class IngestFileFiltersTest extends NbTestCase { private static final Path CASE_DIRECTORY_PATH = Paths.get(System.getProperty("java.io.tmpdir"), "IngestFileFiltersTest"); private static final File CASE_DIR = new File(CASE_DIRECTORY_PATH.toString()); private final Path IMAGE_PATH = Paths.get(this.getDataDir().toString(),"filter_test1.img"); + private final Path ZIPFILE_PATH = Paths.get(this.getDataDir().toString(), "local_files_test.zip"); public static Test suite() { NbModuleSuite.Configuration conf = NbModuleSuite.createConfiguration(IngestFileFiltersTest.class). @@ -75,58 +78,14 @@ public IngestFileFiltersTest(String name) { @Override public void setUp() { - // Delete the test directory, if it exists - if (CASE_DIRECTORY_PATH.toFile().exists()) { - try { - FileUtils.deleteDirectory(CASE_DIRECTORY_PATH.toFile()); - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - Assert.fail(ex); - } - } - assertFalse("Unable to delete existing test directory", CASE_DIRECTORY_PATH.toFile().exists()); - - // Create the test directory - CASE_DIRECTORY_PATH.toFile().mkdirs(); - assertTrue("Unable to create test directory", CASE_DIRECTORY_PATH.toFile().exists()); - - try { - Case.createAsCurrentCase(Case.CaseType.SINGLE_USER_CASE, CASE_DIRECTORY_PATH.toString(), new CaseDetails("IngestFiltersTest")); - } catch (CaseActionException ex) { - Exceptions.printStackTrace(ex); - Assert.fail(ex); - } - assertTrue(CASE_DIR.exists()); + createCase(); ImageDSProcessor dataSourceProcessor = new ImageDSProcessor(); - try { - ProcessorCallback callBack = DataSourceProcessorRunner.runDataSourceProcessor(dataSourceProcessor, IMAGE_PATH); - List<Content> dataSourceContent = callBack.getDataSourceContent(); - assertEquals(1, dataSourceContent.size()); - List<String> errorMessages = callBack.getErrorMessages(); - assertEquals(0, errorMessages.size()); - } catch (AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException | InterruptedException ex) { - Exceptions.printStackTrace(ex); - Assert.fail(ex); - - } + addDataSourceToCase(dataSourceProcessor, IMAGE_PATH); } @Override public void tearDown() { - try { - Case.closeCurrentCase(); - //Seems like we need some time to close the case. - try { - Thread.sleep(2000); - } catch (Exception ex) { - - } - - FileUtils.deleteDirectory(CASE_DIR); - } catch (CaseActionException | IOException ex) { - Exceptions.printStackTrace(ex); - } - assertFalse(CASE_DIR.exists()); + closeCase(); } public void testBasicDir() { @@ -337,6 +296,41 @@ public void testCarvingNoUnallocatedSpace() { } } + public void testEmbeddedModule() { + //Close the current case + closeCase(); + createCase(); + LocalFilesDSProcessor dataSourceProcessor = new LocalFilesDSProcessor(); + addDataSourceToCase(dataSourceProcessor, ZIPFILE_PATH); + + //Build the filter to find jpg files + HashMap<String, Rule> rules = new HashMap<>(); + //Extension condition for jpg files + rules.put("rule1", new Rule("FindJpgExtention", new ExtensionCondition("jpg"), new MetaTypeCondition(MetaTypeCondition.Type.FILES), null, null, null, null)); + //Extension condition for zip files, because we want test jpg extension filter for extracted files from a zip file + rules.put("rule2", new Rule("ZipExtention", new ExtensionCondition("zip"), new MetaTypeCondition(MetaTypeCondition.Type.FILES), null, null, null, null)); + FilesSet embeddedFilter = new FilesSet("Filter", "Filter to files with .jpg extension.", false, false, rules); + + try { + Case openCase = Case.getOpenCase(); + ArrayList<IngestModuleTemplate> templates = new ArrayList<>(); + templates.add(getIngestModuleTemplate(new FileTypeIdModuleFactory())); + templates.add(getIngestModuleTemplate(new EmbeddedFileExtractorModuleFactory())); + runIngestJob(openCase.getDataSources(), templates, embeddedFilter); + FileManager fileManager = Case.getOpenCase().getServices().getFileManager(); + //get all .jpg files in zip file + List<AbstractFile> results = fileManager.findFiles("%.jpg%", ZIPFILE_PATH.getFileName().toString()); + assertEquals(10, results.size()); + for (AbstractFile file : results) { + String errMsg = String.format("File %s (objId=%d) unexpectedly blocked by the file filter.", file.getName(), file.getId()); + assertTrue(errMsg, file.getMIMEType() != null && !file.getMIMEType().isEmpty()); + } + } catch (NoCurrentCaseException | TskCoreException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + } + private void runIngestJob(List<Content> datasources, ArrayList<IngestModuleTemplate> templates, FilesSet filter) { IngestJobSettings ingestJobSettings = new IngestJobSettings(IngestFileFiltersTest.class.getCanonicalName(), IngestType.FILES_ONLY, templates, filter); try { @@ -357,4 +351,60 @@ private IngestModuleTemplate getIngestModuleTemplate(IngestModuleFactoryAdapter template.setEnabled(true); return template; } - } + + private void createCase() { + // Delete the test directory, if it exists + if (CASE_DIRECTORY_PATH.toFile().exists()) { + try { + FileUtils.deleteDirectory(CASE_DIRECTORY_PATH.toFile()); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + } + assertFalse("Unable to delete existing test directory", CASE_DIRECTORY_PATH.toFile().exists()); + + // Create the test directory + CASE_DIRECTORY_PATH.toFile().mkdirs(); + assertTrue("Unable to create test directory", CASE_DIRECTORY_PATH.toFile().exists()); + + try { + Case.createAsCurrentCase(Case.CaseType.SINGLE_USER_CASE, CASE_DIRECTORY_PATH.toString(), new CaseDetails("IngestFiltersTest")); + } catch (CaseActionException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + } + assertTrue(CASE_DIR.exists()); + } + + private void closeCase() { + try { + Case.closeCurrentCase(); + //Seems like we need some time to close the case. + try { + Thread.sleep(2000); + } catch (Exception ex) { + + } + + FileUtils.deleteDirectory(CASE_DIR); + } catch (CaseActionException | IOException ex) { + Exceptions.printStackTrace(ex); + } + assertFalse(CASE_DIR.exists()); + } + + private void addDataSourceToCase(AutoIngestDataSourceProcessor dataSourceProcessor, Path dataSourcePath) { + try { + ProcessorCallback callBack = DataSourceProcessorRunner.runDataSourceProcessor(dataSourceProcessor, dataSourcePath); + List<Content> dataSourceContent = callBack.getDataSourceContent(); + assertEquals(1, dataSourceContent.size()); + List<String> errorMessages = callBack.getErrorMessages(); + assertEquals(0, errorMessages.size()); + } catch (AutoIngestDataSourceProcessor.AutoIngestDataSourceProcessorException | InterruptedException ex) { + Exceptions.printStackTrace(ex); + Assert.fail(ex); + + } + } +}