remainder = -1 # track size in encrypted entries
def __init__(self, name, mode, comptype, fileobj, bufsize,
- concat_stream=False, encryption=None, compresslevel=9):
+ concat_stream=False, encryption=None, enccounter=None,
+ compresslevel=9):
"""Construct a _Stream object.
"""
self._extfileobj = True
self.exception = zlib.error
self._init_read_gz()
elif mode == "w":
- if concat_stream is False and self.encryption is None:
+ if concat_stream is False:
+ if self.encryption is not None:
+ self._init_write_encrypt (name, enccounter)
self._init_write_gz ()
self.crc = zlib.crc32(b"") & 0xFFFFffff
else:
self.cmp = lzma.LZMACompressor()
- elif comptype != "tar":
+ elif comptype == "tar":
+ if concat_stream is False \
+ and mode == "w" \
+ and self.encryption is not None:
+ self._init_write_encrypt (name, enccounter)
+
+ else:
if self.encryption is not None:
raise InvalidEncryptionError("encryption not available for "
"compression %s" % comptype)
self.close()
- def _init_write_encrypt (self, entry=None, counter=None):
+ def _init_write_encrypt (self, entry=None, counter=None,
+ set_last_block_offset=False):
"""Save position for delayed write of header; fill the header location
with dummy bytes."""
if self.encryption is not None:
self.lasthdr = self.fileobj.tell()
self.__write_to_file(dummyhdr)
+ if set_last_block_offset is True:
+ self.last_block_offset = self.lasthdr
def _finalize_write_encrypt (self):
'''
self.concat_pos = 0
self.crc = self.zlib.crc32(b"") & 0xFFFFffff
- first = False
- if self.cmp is None:
- first = True
+ first = self.cmp is None
self.cmp = self.zlib.compressobj(self.compresslevel,
self.zlib.DEFLATED,
-self.zlib.MAX_WBITS,
0)
# if aes, we encrypt after compression
- if self.encryption is None and set_last_block_offset:
+ if set_last_block_offset is True:
self.last_block_offset = self.fileobj.tell()
self.__write(gz_header (self.name if first is True else None))
tarinfo = copy.copy(tarinfo)
- if self.concat_compression is True and \
- getattr (self.fileobj, "cmp", None) is not None:
- self.fileobj._finalize_write_gz ()
-
- if getattr (self.fileobj, "encryption", None) is not None:
- self.fileobj._finalize_write_encrypt ()
- self.fileobj._init_write_encrypt (tarinfo.name)
-
- if self.concat_compression:
- self.fileobj._init_write_gz (True)
+ if self.concat_compression is True:
+ if getattr (self.fileobj, "cmp", None) is not None:
+ self.fileobj._finalize_write_gz ()
+ encrypt = getattr (self.fileobj, "encryption", None) is not None
+ if encrypt is True:
+ self.fileobj._finalize_write_encrypt ()
+ self.fileobj._init_write_encrypt (tarinfo.name,
+ set_last_block_offset=True)
+ self.fileobj._init_write_gz (set_last_block_offset=not encrypt)
self.last_block_offset = self.fileobj.last_block_offset
else:
self.last_block_offset = self.fileobj.tell()
# the “new_volume_handler” is supposed to call .close() on the
# “fileobj” _Stream
self.new_volume_handler(self, self.base_name, self.volume_number)
- if self.concat_compression and \
- getattr (self.fileobj, "cmp", None) is not None:
- # e. g. compressed PAX header written
- self.fileobj._finalize_write_gz ()
self.volume_tarinfo = None
- if getattr (self.fileobj, "encryption", None) is not None:
- self.fileobj._init_write_encrypt (tarinfo.name)
if self.concat_compression is True:
+ # with non-concat modes, this is taken care by the _Stream
+ # ctor as invoked by the newvol handler
+ if getattr (self.fileobj, "cmp", None) is not None:
+ # e. g. compressed PAX header written
+ self.fileobj._finalize_write_gz ()
+ if getattr (self.fileobj, "encryption", None) is not None:
+ self.fileobj._init_write_encrypt (tarinfo.name)
self.fileobj._init_write_gz ()
# write new volume header