From f698c99c6c7370b9d9de45f134d225e80cdb5cb7 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Fri, 21 Apr 2017 09:57:05 +0200 Subject: [PATCH] convert test_deltatar to revised crypto --- testing/test_deltatar.py | 174 +++++++++++++++++++++++++++++++++------------- 1 files changed, 125 insertions(+), 49 deletions(-) diff --git a/testing/test_deltatar.py b/testing/test_deltatar.py index 0d61301..e1646be 100644 --- a/testing/test_deltatar.py +++ b/testing/test_deltatar.py @@ -29,8 +29,10 @@ from functools import partial from unittest import skip, SkipTest import deltatar.tarfile as tarfile -from tarfile import TarFile +from deltatar.tarfile import TarFile from deltatar.deltatar import DeltaTar, NO_MATCH, MATCH, PARENT_MATCH +from deltatar.deltatar import PDTCRYPT_EXTENSION as deltatar_PDTCRYPT_EXTENSION +import deltatar.crypto as crypto from . import BaseTest from . import new_volume_handler @@ -42,7 +44,7 @@ class DeltaTarTest(BaseTest): MODE = '' MODE_COMPRESSES = False - PASSWORD = None + ENCRYPTION = None # (password : str, paramversion : int) option GIT_DIR = '.git' @@ -82,7 +84,9 @@ class DeltaTarTest(BaseTest): ''' Creates a full backup without any filtering and restores it. ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -108,7 +112,9 @@ class DeltaTarTest(BaseTest): ''' Creates a full backup and checks the index' checksum of files ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -154,10 +160,11 @@ class DeltaTarTest(BaseTest): raise SkipTest('compression information is lost when creating ' 'multiple volumes with no Stream') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) - self.hash = dict() os.makedirs('source_dir2') self.hash["source_dir2/big"] = self.create_file("source_dir2/big", 100000) @@ -207,10 +214,11 @@ class DeltaTarTest(BaseTest): raise SkipTest('this test only works for uncompressed ' 'or concat compressed modes') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) - self.hash = dict() os.makedirs('source_dir2') self.hash["source_dir2/big"] = self.create_file("source_dir2/big", 3*1024*1024) @@ -255,7 +263,9 @@ class DeltaTarTest(BaseTest): Tests that the index file for a full backup can store extra_data and that this data can be retrieved. ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) extra_data = dict( @@ -282,7 +292,9 @@ class DeltaTarTest(BaseTest): Tests that the index file for a diff backup can store extra_data and that this data can be retrieved. ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) extra_data = dict( @@ -315,7 +327,9 @@ class DeltaTarTest(BaseTest): Creates a full backup without any filtering with multiple volumes and restore it. ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) shutil.copytree(self.GIT_DIR, "source_dir2") @@ -351,10 +365,11 @@ class DeltaTarTest(BaseTest): raise SkipTest('this test only works for uncompressed ' 'or concat compressed modes') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) - self.hash = dict() os.makedirs('source_dir2') self.hash["source_dir2/big"] = self.create_file("source_dir2/big", 100000) @@ -405,15 +420,22 @@ class DeltaTarTest(BaseTest): fo = open(tar_path, 'rb') fo.seek(offset) def new_volume_handler(mode, tarobj, base_name, volume_number): + suf = DeltaTar._DeltaTar__file_extensions_dict[mode] + if self.ENCRYPTION is not None: + # deltatar module is shadowed here + suf += "." + deltatar_PDTCRYPT_EXTENSION tarobj.open_volume(datetime.now().strftime( - "backup_dir/bfull-%Y-%m-%d-%H%M-002.tar") +\ - DeltaTar._DeltaTar__file_extensions_dict[mode]) # pylint: disable=no-member + "backup_dir/bfull-%Y-%m-%d-%H%M-002.tar") + suf) new_volume_handler = partial(new_volume_handler, self.MODE) + crypto_ctx = None + if self.ENCRYPTION is not None: + crypto_ctx = crypto.Decrypt (password) + tarobj = TarFile.open(mode="r" + self.MODE, fileobj=fo, - concat_compression=True, new_volume_handler=new_volume_handler, - password=self.PASSWORD) + encryption=crypto_ctx) + member = tarobj.next() member.path = deltatar.unprefixed(member.path) member.name = deltatar.unprefixed(member.name) @@ -424,6 +446,7 @@ class DeltaTarTest(BaseTest): os.unlink("huge") + def test_restore_from_index(self): ''' Restores a full backup using an index file. @@ -432,7 +455,9 @@ class DeltaTarTest(BaseTest): raise SkipTest('this test only works for uncompressed ' 'or concat compressed modes') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -462,7 +487,9 @@ class DeltaTarTest(BaseTest): raise SkipTest('this test only works for uncompressed ' 'or concat compressed modes') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -489,7 +516,9 @@ class DeltaTarTest(BaseTest): ''' Tests create backup basic filtering. ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger, included_files=["test", "small"], excluded_files=["test/huge"]) @@ -527,7 +556,10 @@ class DeltaTarTest(BaseTest): return True filter_func = partial(filter_func, visited_paths) - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger, included_files=["test", "small"], excluded_files=["test/huge"], @@ -567,7 +599,10 @@ class DeltaTarTest(BaseTest): return False filter_func = partial(filter_func, visited_paths) - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger, included_files=["test", "small"], excluded_files=["test/huge"], @@ -604,7 +639,9 @@ class DeltaTarTest(BaseTest): raise SkipTest('this test only works for uncompressed ' 'or concat compressed modes') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -647,7 +684,10 @@ class DeltaTarTest(BaseTest): return True filter_func = partial(filter_func, visited_paths) - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -678,7 +718,9 @@ class DeltaTarTest(BaseTest): ''' Creates a backup, and then filter when doing the tar based restore. ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -718,7 +760,10 @@ class DeltaTarTest(BaseTest): return True filter_func = partial(filter_func, visited_paths) - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -813,7 +858,10 @@ class DeltaTarTest(BaseTest): included_files = [ 'test/huge2' ] - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger, included_files=included_files) @@ -828,7 +876,7 @@ class DeltaTarTest(BaseTest): tar_filename = deltatar.volume_name_func('backup_dir', True, 0) tar_path = os.path.join("backup_dir", tar_filename) - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + deltatar = DeltaTar(mode=self.MODE, password=password, logger=self.consoleLogger) deltatar.restore_backup(target_path="source_dir", backup_tar_path=tar_path) @@ -846,7 +894,10 @@ class DeltaTarTest(BaseTest): included_files = [ 'test/huge2' ] - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -860,7 +911,7 @@ class DeltaTarTest(BaseTest): tar_filename = deltatar.volume_name_func('backup_dir', True, 0) tar_path = os.path.join("backup_dir", tar_filename) - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + deltatar = DeltaTar(mode=self.MODE, password=password, logger=self.consoleLogger, included_files=included_files) deltatar.restore_backup(target_path="source_dir", @@ -879,7 +930,10 @@ class DeltaTarTest(BaseTest): included_files = [ 'test/huge2' ] - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -893,7 +947,7 @@ class DeltaTarTest(BaseTest): tar_filename = deltatar.volume_name_func('backup_dir', True, 0) tar_path = os.path.join("backup_dir", tar_filename) - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + deltatar = DeltaTar(mode=self.MODE, password=password, logger=self.consoleLogger, included_files=included_files) deltatar.restore_backup(target_path="source_dir", @@ -910,7 +964,9 @@ class DeltaTarTest(BaseTest): Tests the collate iterators functionality with two exact directories, using an index iterator from a backup and the exact same source dir. ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -942,7 +998,9 @@ class DeltaTarTest(BaseTest): ''' self.hash["source_dir/zzzz"] = self.create_file("source_dir/zzzz", 100) - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -976,8 +1034,9 @@ class DeltaTarTest(BaseTest): Use the collate iterators functionality with two different directories. It must behave in an expected way. ''' - - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -1030,7 +1089,9 @@ class DeltaTarTest(BaseTest): ''' Creates an empty (no changes) backup diff ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -1073,7 +1134,9 @@ class DeltaTarTest(BaseTest): ''' Creates a diff backup when there are new files ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -1141,7 +1204,9 @@ class DeltaTarTest(BaseTest): raise SkipTest('this test only works for uncompressed ' 'or concat compressed modes') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -1182,7 +1247,9 @@ class DeltaTarTest(BaseTest): raise SkipTest('this test only works for uncompressed ' 'or concat compressed modes') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -1230,7 +1297,9 @@ class DeltaTarTest(BaseTest): raise SkipTest('this test only works for uncompressed ' 'or concat compressed modes') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) shutil.rmtree("source_dir") @@ -1301,7 +1370,9 @@ class DeltaTarTest(BaseTest): raise SkipTest('this test only works for uncompressed ' 'or concat compressed modes') - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) shutil.rmtree("source_dir") @@ -1406,7 +1477,9 @@ class DeltaTarTest(BaseTest): self.create_symlink("/foo/bar/baz", "source_dir/symlinks/xyzzy") self.create_symlink("burp/../buzz", "source_dir/symlinks/blup") self.create_symlink("../../../../biz", "source_dir/symlinks/bleep") - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -1441,7 +1514,9 @@ class DeltaTarTest(BaseTest): of them must be filtered out. ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -1484,7 +1559,9 @@ class DeltaTarTest(BaseTest): path that is abused to write outside the extraction prefix. ''' - deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD, + password, paramversion = self.ENCRYPTION or (None, None) + deltatar = DeltaTar(mode=self.MODE, password=password, + crypto_paramversion=paramversion, logger=self.consoleLogger) # create first backup @@ -1588,8 +1665,8 @@ class DeltaTarGzipAes128ConcatTest(DeltaTarTest): ''' Same as DeltaTar but with specific gzip aes128 concat stream mode ''' - MODE = '#gz.aes128' - PASSWORD = 'some magic key' + MODE = '#gz' + ENCRYPTION = ('some magic key', 1) MODE_COMPRESSES = True @@ -1597,7 +1674,6 @@ class DeltaTarAes128ConcatTest(DeltaTarTest): ''' Same as DeltaTar but with specific aes128 concat stream mode ''' - MODE = '#aes128' - PASSWORD = 'some magic key' + ENCRYPTION = ('some magic key', 1) -- 1.7.1