From 50a863e58c3075bf6206d060d41b35790fe5e955 Mon Sep 17 00:00:00 2001 From: Victor Shyba Date: Sun, 31 Dec 2017 21:14:49 -0300 Subject: [bug] handle incomplete preamble as a retriable error --- src/leap/soledad/client/_db/blobs/__init__.py | 6 +++++- tests/blobs/test_decrypter_buffer.py | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/leap/soledad/client/_db/blobs/__init__.py b/src/leap/soledad/client/_db/blobs/__init__.py index d4eddb8f..cacfe638 100644 --- a/src/leap/soledad/client/_db/blobs/__init__.py +++ b/src/leap/soledad/client/_db/blobs/__init__.py @@ -104,8 +104,12 @@ class DecrypterBuffer(object): if self.decrypter: real_size = self.decrypter.decrypted_content_size return self.decrypter.endStream(), real_size - else: + elif hasattr(self, 'raw_data'): + # Externally encrypted blob, see Incoming API specification return self.raw_data, self.raw_data.tell() + else: + msg = "Incomplete Blob: %s" % self.doc_info.doc_id + raise RetriableTransferError(msg) class StreamDecrypterBuffer(object): diff --git a/tests/blobs/test_decrypter_buffer.py b/tests/blobs/test_decrypter_buffer.py index 83fbaad3..f6e03946 100644 --- a/tests/blobs/test_decrypter_buffer.py +++ b/tests/blobs/test_decrypter_buffer.py @@ -27,6 +27,7 @@ from twisted.internet import defer from leap.soledad.client._db.blobs import DecrypterBuffer from leap.soledad.client._db.blobs import BlobManager from leap.soledad.client._db.blobs import FIXED_REV +from leap.soledad.client._db.blobs.errors import RetriableTransferError from leap.soledad.client import _crypto @@ -70,3 +71,15 @@ class DecrypterBufferCase(unittest.TestCase): fd = BytesIO('up and up') manager._client.put = _check_result yield manager._encrypt_and_upload(self.doc_info.doc_id, fd) + + @defer.inlineCallbacks + def test_incomplete_decryption(self): + # SCENARIO: Transport failed and close was called with incomplete data + # CASE 1: Incomplete preamble + encrypted = (yield self.blob.encrypt()).getvalue() + encrypted = encrypted[:20] # only 20 bytes of preamble arrived + tag = encrypted[-16:] + buf = DecrypterBuffer(self.doc_info.doc_id, self.secret, tag) + buf.write(encrypted) + self.assertRaises(RetriableTransferError, + buf.close) -- cgit v1.2.3