summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Shyba <victor1984@riseup.net>2017-12-31 21:14:49 -0300
committerVictor Shyba <victor1984@riseup.net>2017-12-31 21:14:49 -0300
commit50a863e58c3075bf6206d060d41b35790fe5e955 (patch)
treea1fab7b6f5cfd538ef1a4285baf4ee826802444a
parent8a89f00a4a2b9e5622ce8581ebf633ae222311df (diff)
[bug] handle incomplete preamble as a retriable error
-rw-r--r--src/leap/soledad/client/_db/blobs/__init__.py6
-rw-r--r--tests/blobs/test_decrypter_buffer.py13
2 files changed, 18 insertions, 1 deletions
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)