use whitelist approach to make sure item._dict is clean

This commit is contained in:
Thomas Waldmann 2022-05-17 17:21:19 +02:00
parent d3dfa3be30
commit 8798b0340a
1 changed files with 13 additions and 4 deletions

View File

@ -345,6 +345,11 @@ class Archiver:
other_repository=None, other_manifest=None, other_key=None): other_repository=None, other_manifest=None, other_key=None):
"""archives transfer from other repository""" """archives transfer from other repository"""
ITEM_KEY_WHITELIST = {'path', 'source', 'rdev', 'chunks', 'chunks_healthy', 'hlid',
'mode', 'user', 'group', 'uid', 'gid', 'mtime', 'atime', 'ctime', 'birthtime', 'size',
'xattrs', 'bsdflags', 'acl_nfs4', 'acl_access', 'acl_default', 'acl_extended',
'part'}
def upgrade_item(item): def upgrade_item(item):
"""upgrade item as needed, get rid of legacy crap""" """upgrade item as needed, get rid of legacy crap"""
if hlm.borg1_hardlink_master(item): if hlm.borg1_hardlink_master(item):
@ -364,10 +369,14 @@ class Archiver:
if attr in item: if attr in item:
ns = getattr(item, attr) # decode (bigint or Timestamp) --> int ns ns = getattr(item, attr) # decode (bigint or Timestamp) --> int ns
setattr(item, attr, ns) # encode int ns --> msgpack.Timestamp only, no bigint any more setattr(item, attr, ns) # encode int ns --> msgpack.Timestamp only, no bigint any more
item._dict.pop('hardlink_master', None) # not used for hardlinks any more, replaced by hlid # make sure we only have desired stuff in the new item. specifically, make sure to get rid of:
item._dict.pop('acl', None) # remove remnants of bug in attic <= 0.13 # - 'acl' remnants of bug in attic <= 0.13
item.get_size(memorize=True) # if not already present: compute+remember size for items with chunks # - 'hardlink_master' (superseded by hlid)
return item new_item_dict = {key: value for key, value in item.as_dict().items() if key in ITEM_KEY_WHITELIST}
new_item = Item(internal_dict=new_item_dict)
new_item.get_size(memorize=True) # if not already present: compute+remember size for items with chunks
assert all(key in new_item for key in REQUIRED_ITEM_KEYS)
return new_item
def upgrade_compressed_chunk(chunk): def upgrade_compressed_chunk(chunk):
if ZLIB_legacy.detect(chunk): if ZLIB_legacy.detect(chunk):