in oss2/resumable.py [0:0]
def __load_record(self):
record = self._get_record()
logger.debug("Load record return {0}".format(record))
if record and not self.__is_record_sane(record):
logger.warn("The content of record is invalid, delete the record")
self._del_record()
record = None
if record and self.__file_changed(record):
logger.warn("File: {0} has been changed, delete the record".format(self.filename))
self._del_record()
record = None
if record and not self.__upload_exists(record['upload_id']):
logger.warn('Multipart upload: {0} does not exist, delete the record'.format(record['upload_id']))
self._del_record()
record = None
if not record:
params = _populate_valid_params(self.__params, [Bucket.SEQUENTIAL])
part_size = determine_part_size(self.size, self.__part_size)
logger.debug("Upload File size: {0}, User-specify part_size: {1}, Calculated part_size: {2}".format(
self.size, self.__part_size, part_size))
if self.__encryption:
upload_context = models.MultipartUploadCryptoContext(self.size, part_size)
upload_id = self.bucket.init_multipart_upload(self.key, self.__headers, params,
upload_context).upload_id
if self.__record_upload_context:
material = upload_context.content_crypto_material
material_record = {'wrap_alg': material.wrap_alg, 'cek_alg': material.cek_alg,
'encrypted_key': b64encode_as_string(material.encrypted_key),
'encrypted_iv': b64encode_as_string(material.encrypted_iv),
'mat_desc': material.mat_desc}
else:
upload_id = self.bucket.init_multipart_upload(self.key, self.__headers, params).upload_id
record = {'op_type': self.__op, 'upload_id': upload_id, 'file_path': self._abspath, 'size': self.size,
'mtime': self.__mtime, 'bucket': self.bucket.bucket_name, 'key': self.key, 'part_size': part_size}
if self.__record_upload_context:
record['content_crypto_material'] = material_record
logger.debug('Add new record, bucket: {0}, key: {1}, upload_id: {2}, part_size: {3}'.format(
self.bucket.bucket_name, self.key, upload_id, part_size))
self._put_record(record)
self.__record = record
self.__part_size = self.__record['part_size']
self.__upload_id = self.__record['upload_id']
if self.__record_upload_context:
if 'content_crypto_material' in self.__record:
material_record = self.__record['content_crypto_material']
wrap_alg = material_record['wrap_alg']
cek_alg = material_record['cek_alg']
if cek_alg != self.bucket.crypto_provider.cipher.alg or wrap_alg != self.bucket.crypto_provider.wrap_alg:
err_msg = 'Envelope or data encryption/decryption algorithm is inconsistent'
raise exceptions.InconsistentError(err_msg, self)
content_crypto_material = models.ContentCryptoMaterial(self.bucket.crypto_provider.cipher,
material_record['wrap_alg'],
b64decode_from_string(
material_record['encrypted_key']),
b64decode_from_string(
material_record['encrypted_iv']),
material_record['mat_desc'])
self.__upload_context = models.MultipartUploadCryptoContext(self.size, self.__part_size,
content_crypto_material)
else:
err_msg = 'If record_upload_context flag is true, content_crypto_material must in the the record'
raise exceptions.InconsistentError(err_msg, self)
else:
if 'content_crypto_material' in self.__record:
err_msg = 'content_crypto_material must in the the record, but record_upload_context flat is false'
raise exceptions.InvalidEncryptionRequest(err_msg, self)
self.__finished_parts = self.__get_finished_parts()
self.__finished_size = sum(p.size for p in self.__finished_parts)