def testDownloadHuntResultCollection(self): """Check we can download files references in HuntResultCollection.""" # Create a collection with URNs to some files. fd = results.HuntResultCollection(self.collection_urn) with data_store.DB.GetMutationPool() as pool: fd.AddAsMessage( rdfvalue.RDFURN(self.out.Add("testfile1")), self.client_id, mutation_pool=pool) fd.AddAsMessage( rdf_client_fs.StatEntry( pathspec=rdf_paths.PathSpec(path="testfile2", pathtype="OS")), self.client_id, mutation_pool=pool) fd.AddAsMessage( rdf_file_finder.FileFinderResult( stat_entry=rdf_client_fs.StatEntry( pathspec=rdf_paths.PathSpec(path="testfile5", pathtype="OS"))), self.client_id, mutation_pool=pool) fd.AddAsMessage( collectors.ArtifactFilesDownloaderResult( downloaded_file=rdf_client_fs.StatEntry( pathspec=rdf_paths.PathSpec(path="testfile6", pathtype="OS"))), self.client_id, mutation_pool=pool) self._VerifyDownload()
def testExportsOriginalResultAnywayIfItIsNotStatEntry(self): result = collectors.ArtifactFilesDownloaderResult( original_result=export_test_lib.DataAgnosticConverterTestValue()) converter = file.ArtifactFilesDownloaderResultConverter() converted = list(converter.Convert(self.metadata, result)) # Test that something gets exported and that this something wasn't # produced by ArtifactFilesDownloaderResultConverter. self.assertLen(converted, 1) self.assertNotIsInstance(converted[0], file.ExportedArtifactFilesDownloaderResult)
def testIncludesFileStatEntryFoundPathspecIntoYieldedResult(self): result = collectors.ArtifactFilesDownloaderResult( original_result=self.file_stat, found_pathspec=self.file_stat.pathspec) converter = file.ArtifactFilesDownloaderResultConverter() converted = list(converter.Convert(self.metadata, result)) downloader_exports = [ v for v in converted if isinstance(v, file.ExportedArtifactFilesDownloaderResult) ] self.assertLen(downloader_exports, 1) self.assertEqual(downloader_exports[0].found_path, "/tmp/bar.exe")
def testIncludesRegistryStatEntryFoundPathspecIntoYieldedResult(self): result = collectors.ArtifactFilesDownloaderResult( original_result=self.registry_stat, found_pathspec=rdf_paths.PathSpec(path="foo", pathtype="OS")) converter = file.ArtifactFilesDownloaderResultConverter() converted = list(converter.Convert(self.metadata, result)) downloader_exports = [ v for v in converted if isinstance(v, file.ExportedArtifactFilesDownloaderResult) ] self.assertLen(downloader_exports, 1) self.assertEqual(downloader_exports[0].found_path, "foo")
def testExportsOriginalResultIfOriginalResultIsNotRegistryOrFileStatEntry( self): stat = rdf_client_fs.StatEntry(pathspec=rdf_paths.PathSpec( path="some/path", pathtype=rdf_paths.PathSpec.PathType.TMPFILE)) result = collectors.ArtifactFilesDownloaderResult(original_result=stat) converter = file.ArtifactFilesDownloaderResultConverter() converted = list(converter.Convert(self.metadata, result)) # Test that something gets exported and that this something wasn't # produced by ArtifactFilesDownloaderResultConverter. self.assertLen(converted, 1) self.assertNotIsInstance(converted[0], file.ExportedArtifactFilesDownloaderResult)
def testDownloadCollectionIgnoresArtifactResultsWithoutFiles(self): # Create a collection with URNs to some files. fd = sequential_collection.GeneralIndexedCollection(self.collection_urn) with data_store.DB.GetMutationPool() as pool: fd.Add(collectors.ArtifactFilesDownloaderResult(), mutation_pool=pool) with utils.TempDirectory() as tmpdir: export_utils.DownloadCollection( self.collection_urn, tmpdir, overwrite=True, dump_client_info=True, token=self.token, max_threads=2) expected_outdir = os.path.join(tmpdir, self.out.Path()[1:]) self.assertFalse(os.path.exists(expected_outdir))
def _AddTestData(self, fd): with data_store.DB.GetMutationPool() as pool: fd.Add(rdfvalue.RDFURN(self.out.Add("testfile1")), mutation_pool=pool) fd.Add(rdf_client_fs.StatEntry( pathspec=rdf_paths.PathSpec(path="testfile2", pathtype="OS")), mutation_pool=pool) fd.Add(rdf_file_finder.FileFinderResult( stat_entry=rdf_client_fs.StatEntry(pathspec=rdf_paths.PathSpec( path="testfile5", pathtype="OS"))), mutation_pool=pool) fd.Add(collectors.ArtifactFilesDownloaderResult( downloaded_file=rdf_client_fs.StatEntry( pathspec=rdf_paths.PathSpec(path="testfile6", pathtype="OS"))), mutation_pool=pool)
def testYieldsOneResultForRegistryStatEntryIfNoPathspecsWereFound(self): result = collectors.ArtifactFilesDownloaderResult( original_result=self.registry_stat) converter = file.ArtifactFilesDownloaderResultConverter() converted = list(converter.Convert(self.metadata, result)) downloader_exports = [ v for v in converted if isinstance(v, file.ExportedArtifactFilesDownloaderResult) ] self.assertLen(downloader_exports, 1) self.assertEqual(downloader_exports[0].original_registry_key.type, "REG_SZ") self.assertEqual(downloader_exports[0].original_registry_key.data, b"C:\\Windows\\Sidebar.exe")
def testShowsGenerateArchiveButtonForArtifactDownloaderHunt(self): stat_entry = rdf_client_fs.StatEntry( pathspec=rdf_paths.PathSpec( path="/foo/bar", pathtype=rdf_paths.PathSpec.PathType.OS)) values = [ collectors.ArtifactFilesDownloaderResult(downloaded_file=stat_entry) ] self.CreateGenericHuntWithCollection(values=values) self.Open("/") self.Click("css=a[grrtarget=hunts]") self.Click("css=td:contains('GenericHunt')") self.Click("css=li[heading=Results]") self.WaitUntil(self.IsTextPresent, "Files referenced in this collection can be downloaded")
def testShowsPerFileDownloadButtonForArtifactDownloaderHunt(self): stat_entry = rdf_client_fs.StatEntry( pathspec=rdf_paths.PathSpec( path="/foo/bar", pathtype=rdf_paths.PathSpec.PathType.OS)) values = [ collectors.ArtifactFilesDownloaderResult(downloaded_file=stat_entry) ] self.CreateGenericHuntWithCollection(values=values) self.Open("/") self.Click("css=a[grrtarget=hunts]") self.Click("css=td:contains('GenericHunt')") self.Click("css=li[heading=Results]") self.WaitUntil( self.IsElementPresent, "css=grr-results-collection button:has(span.glyphicon-download)")
def testYieldsOneResultAndOneOriginalValueForFileStatEntry(self): result = collectors.ArtifactFilesDownloaderResult( original_result=self.file_stat) converter = file.ArtifactFilesDownloaderResultConverter() converted = list(converter.Convert(self.metadata, result)) default_exports = [ v for v in converted if not isinstance(v, file.ExportedArtifactFilesDownloaderResult) ] self.assertLen(default_exports, 1) self.assertLen(default_exports, 1) downloader_exports = [ v for v in converted if isinstance(v, file.ExportedArtifactFilesDownloaderResult) ] self.assertLen(downloader_exports, 1) self.assertEqual(downloader_exports[0].original_file.basename, "bar.exe")