def testOffsetAndLengthRestrictResult(self): args = vfs_plugin.ApiGetFileBlobArgs( client_id=self.client_id, file_path=self.file_path, offset=2, length=3) result = self.handler.Handle(args, context=self.context) self.assertTrue(hasattr(result, "GenerateContent")) self.assertEqual(next(result.GenerateContent()), b"odb")
def testNewestFileContentIsReturnedByDefault(self): args = vfs_plugin.ApiGetFileBlobArgs( client_id=self.client_id, file_path=self.file_path) result = self.handler.Handle(args, context=self.context) self.assertTrue(hasattr(result, "GenerateContent")) self.assertEqual(next(result.GenerateContent()), b"Goodbye World")
def testReturnsOlderVersionIfTimestampIsSupplied(self): args = vfs_plugin.ApiGetFileBlobArgs(client_id=self.client_id, file_path=self.file_path, timestamp=self.time_1) result = self.handler.Handle(args, context=self.context) self.assertTrue(hasattr(result, "GenerateContent")) self.assertEqual(next(result.GenerateContent()), b"Hello World")
def testVfsMethodsAreAccessChecked(self): args = api_vfs.ApiListFilesArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.ListFiles, "CheckClientAccess", args=args) args = api_vfs.ApiGetVfsFilesArchiveArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.GetVfsFilesArchive, "CheckClientAccess", args=args) args = api_vfs.ApiGetFileDetailsArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.GetFileDetails, "CheckClientAccess", args=args) args = api_vfs.ApiGetFileTextArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.GetFileText, "CheckClientAccess", args=args) args = api_vfs.ApiGetFileBlobArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.GetFileBlob, "CheckClientAccess", args=args) args = api_vfs.ApiGetFileVersionTimesArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.GetFileVersionTimes, "CheckClientAccess", args=args) args = api_vfs.ApiGetFileDownloadCommandArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.GetFileDownloadCommand, "CheckClientAccess", args=args) args = api_vfs.ApiCreateVfsRefreshOperationArgs( client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.CreateVfsRefreshOperation, "CheckClientAccess", args=args) args = api_vfs.ApiGetVfsTimelineArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.GetVfsTimeline, "CheckClientAccess", args=args) args = api_vfs.ApiGetVfsTimelineAsCsvArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.GetVfsTimelineAsCsv, "CheckClientAccess", args=args) args = api_vfs.ApiUpdateVfsFileContentArgs(client_id=self.client_id) self.CheckMethodIsAccessChecked(self.router.UpdateVfsFileContent, "CheckClientAccess", args=args)
def testRaisesOnNonExistentPath(self): args = vfs_plugin.ApiGetFileBlobArgs( client_id=self.client_id, file_path="fs/os/foo/bar") with self.assertRaises(vfs_plugin.FileNotFoundError) as context: self.handler.Handle(args, context=self.context) exception = context.exception self.assertEqual(exception.client_id, self.client_id) self.assertEqual(exception.path_type, rdf_objects.PathInfo.PathType.OS) self.assertCountEqual(exception.components, ["foo", "bar"])
def testRaisesOnExistingPathWithoutContent(self): path_info = rdf_objects.PathInfo.OS(components=["foo", "bar"]) data_store.REL_DB.WritePathInfos(self.client_id, [path_info]) args = vfs_plugin.ApiGetFileBlobArgs( client_id=self.client_id, file_path="fs/os/foo/bar") with self.assertRaises(vfs_plugin.FileContentNotFoundError) as context: self.handler.Handle(args, context=self.context) exception = context.exception self.assertEqual(exception.client_id, self.client_id) self.assertEqual(exception.path_type, rdf_objects.PathInfo.PathType.OS) self.assertCountEqual(exception.components, ["foo", "bar"]) self.assertIsNone(exception.timestamp)
def testLargeFileIsReturnedInMultipleChunks(self): chars = [b"a", b"b", b"x"] # Overwrite CHUNK_SIZE in handler for smaller test streams. self.handler.CHUNK_SIZE = 5 client_path = db.ClientPath.OS(self.client_id, ["c", "Downloads", "huge.txt"]) vfs_test_lib.CreateFile( client_path, content=b"".join([c * self.handler.CHUNK_SIZE for c in chars])) args = vfs_plugin.ApiGetFileBlobArgs( client_id=self.client_id, file_path="fs/os/c/Downloads/huge.txt") result = self.handler.Handle(args, context=self.context) self.assertTrue(hasattr(result, "GenerateContent")) for chunk, char in zip(result.GenerateContent(), chars): self.assertEqual(chunk, char * self.handler.CHUNK_SIZE)
def testLargeFileIsReturnedInMultipleChunks(self): chars = ["a", "b", "x"] huge_file_path = "fs/os/c/Downloads/huge.txt" # Overwrite CHUNK_SIZE in handler for smaller test streams. self.handler.CHUNK_SIZE = 5 # Create a file that requires several chunks to load. with aff4.FACTORY.Create(self.client_id.Add(huge_file_path), aff4.AFF4MemoryStream, mode="w", token=self.token) as fd: for char in chars: fd.Write(char * self.handler.CHUNK_SIZE) args = vfs_plugin.ApiGetFileBlobArgs(client_id=self.client_id, file_path=huge_file_path) result = self.handler.Handle(args, token=self.token) self.assertTrue(hasattr(result, "GenerateContent")) for chunk, char in zip(result.GenerateContent(), chars): self.assertEqual(chunk, char * self.handler.CHUNK_SIZE)
def testRaisesIfFirstComponentNotInAllowlist(self): args = vfs_plugin.ApiGetFileBlobArgs( client_id=self.client_id, file_path="/analysis") with self.assertRaises(ValueError): self.handler.Handle(args, context=self.context)
def testRaisesOnRootPath(self): args = vfs_plugin.ApiGetFileBlobArgs( client_id=self.client_id, file_path="/") with self.assertRaises(ValueError): self.handler.Handle(args, context=self.context)
def testRaisesOnEmptyPath(self): args = vfs_plugin.ApiGetFileBlobArgs(client_id=self.client_id, file_path="") with self.assertRaises(ValueError): self.handler.Handle(args, token=self.token)