backup: drop BackupHeader loading code
It is useless here since backup restore is moved to qubes-core-admin-client.
This commit is contained in:
parent
d4e9120903
commit
9dd0cfe6c5
@ -78,6 +78,7 @@ class BackupHeader(object):
|
|||||||
'''Structure describing backup-header file included as the first file in
|
'''Structure describing backup-header file included as the first file in
|
||||||
backup archive
|
backup archive
|
||||||
'''
|
'''
|
||||||
|
# pylint: disable=too-few-public-methods
|
||||||
header_keys = {
|
header_keys = {
|
||||||
'version': 'version',
|
'version': 'version',
|
||||||
'encrypted': 'encrypted',
|
'encrypted': 'encrypted',
|
||||||
@ -91,7 +92,6 @@ class BackupHeader(object):
|
|||||||
int_options = ['version']
|
int_options = ['version']
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
header_data=None,
|
|
||||||
version=None,
|
version=None,
|
||||||
encrypted=None,
|
encrypted=None,
|
||||||
compressed=None,
|
compressed=None,
|
||||||
@ -110,67 +110,6 @@ class BackupHeader(object):
|
|||||||
self.crypto_algorithm = crypto_algorithm
|
self.crypto_algorithm = crypto_algorithm
|
||||||
self.backup_id = backup_id
|
self.backup_id = backup_id
|
||||||
|
|
||||||
if header_data is not None:
|
|
||||||
self.load(header_data)
|
|
||||||
|
|
||||||
def load(self, untrusted_header_text):
|
|
||||||
"""Parse backup header file.
|
|
||||||
|
|
||||||
:param untrusted_header_text: header content
|
|
||||||
:type untrusted_header_text: basestring
|
|
||||||
|
|
||||||
.. warning::
|
|
||||||
This function may be exposed to not yet verified header,
|
|
||||||
so is security critical.
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
untrusted_header_text = untrusted_header_text.decode('ascii')
|
|
||||||
except UnicodeDecodeError:
|
|
||||||
raise qubes.exc.QubesException(
|
|
||||||
"Non-ASCII characters in backup header")
|
|
||||||
for untrusted_line in untrusted_header_text.splitlines():
|
|
||||||
if untrusted_line.count('=') != 1:
|
|
||||||
raise qubes.exc.QubesException("Invalid backup header")
|
|
||||||
key, value = untrusted_line.strip().split('=', 1)
|
|
||||||
if not _re_alphanum.match(key):
|
|
||||||
raise qubes.exc.QubesException("Invalid backup header (key)")
|
|
||||||
if key not in self.header_keys.keys():
|
|
||||||
# Ignoring unknown option
|
|
||||||
continue
|
|
||||||
if not _re_alphanum.match(value):
|
|
||||||
raise qubes.exc.QubesException("Invalid backup header (value)")
|
|
||||||
if getattr(self, self.header_keys[key]) is not None:
|
|
||||||
raise qubes.exc.QubesException(
|
|
||||||
"Duplicated header line: {}".format(key))
|
|
||||||
if key in self.bool_options:
|
|
||||||
value = value.lower() in ["1", "true", "yes"]
|
|
||||||
elif key in self.int_options:
|
|
||||||
value = int(value)
|
|
||||||
setattr(self, self.header_keys[key], value)
|
|
||||||
|
|
||||||
self.validate()
|
|
||||||
|
|
||||||
def validate(self):
|
|
||||||
if self.version == 1:
|
|
||||||
# header not really present
|
|
||||||
pass
|
|
||||||
elif self.version in [2, 3, 4]:
|
|
||||||
expected_attrs = ['version', 'encrypted', 'compressed',
|
|
||||||
'hmac_algorithm']
|
|
||||||
if self.encrypted:
|
|
||||||
expected_attrs += ['crypto_algorithm']
|
|
||||||
if self.version >= 3 and self.compressed:
|
|
||||||
expected_attrs += ['compression_filter']
|
|
||||||
if self.version >= 4:
|
|
||||||
expected_attrs += ['backup_id']
|
|
||||||
for key in expected_attrs:
|
|
||||||
if getattr(self, key) is None:
|
|
||||||
raise qubes.exc.QubesException(
|
|
||||||
"Backup header lack '{}' info".format(key))
|
|
||||||
else:
|
|
||||||
raise qubes.exc.QubesException(
|
|
||||||
"Unsupported backup version {}".format(self.version))
|
|
||||||
|
|
||||||
def save(self, filename):
|
def save(self, filename):
|
||||||
with open(filename, "w") as f_header:
|
with open(filename, "w") as f_header:
|
||||||
# make sure 'version' is the first key
|
# make sure 'version' is the first key
|
||||||
|
Loading…
Reference in New Issue
Block a user