diff options
-rw-r--r-- | src/leap/soledad/client/_db/blobs/__init__.py | 7 | ||||
-rw-r--r-- | src/leap/soledad/server/_blobs.py | 19 | ||||
-rw-r--r-- | tests/server/test_blobs_server.py | 4 |
3 files changed, 25 insertions, 5 deletions
diff --git a/src/leap/soledad/client/_db/blobs/__init__.py b/src/leap/soledad/client/_db/blobs/__init__.py index 45fae024..a5b7d6e3 100644 --- a/src/leap/soledad/client/_db/blobs/__init__.py +++ b/src/leap/soledad/client/_db/blobs/__init__.py @@ -159,7 +159,7 @@ class BlobManager(BlobsSynchronizer): return self.remote_list(namespace=namespace, only_count=True) @defer.inlineCallbacks - def remote_list(self, namespace='', order_by=None, + def remote_list(self, namespace='', order_by=None, deleted=False, filter_flag=False, only_count=False): """ List blobs from server, with filtering and ordering capabilities. @@ -172,6 +172,9 @@ class BlobManager(BlobsSynchronizer): date or +date - Ascending order (older first) -date - Descending order (newer first) :type order_by: str + :param deleted: + Optional paramter to return only deleted blobs. + :type only_count: bool :param filter_flag: Optional parameter to filter listing to results containing the specified tag. @@ -188,6 +191,8 @@ class BlobManager(BlobsSynchronizer): params = {'namespace': namespace} if namespace else {} if order_by: params['order_by'] = order_by + if deleted: + params['deleted'] = deleted if filter_flag: params['filter_flag'] = filter_flag if only_count: diff --git a/src/leap/soledad/server/_blobs.py b/src/leap/soledad/server/_blobs.py index 55ef0d86..f44afd94 100644 --- a/src/leap/soledad/server/_blobs.py +++ b/src/leap/soledad/server/_blobs.py @@ -70,6 +70,9 @@ class FilesystemBlobsBackend(object): os.makedirs(blobs_path) self.path = blobs_path + def __touch(self, path): + open(path, 'a') + def read_blob(self, user, blob_id, request, namespace=''): logger.info('reading blob: %s - %s@%s' % (user, blob_id, namespace)) path = self._get_path(user, blob_id, namespace) @@ -138,6 +141,7 @@ class FilesystemBlobsBackend(object): os.unlink(blob_path + '.flags') except Exception: pass + self.__touch(blob_path + '.deleted') def get_blob_size(user, blob_id, namespace=''): raise NotImplementedError @@ -150,13 +154,18 @@ class FilesystemBlobsBackend(object): return json.dumps({"count": count}) def list_blobs(self, user, request, namespace='', order_by=None, - filter_flag=False): + deleted=False, filter_flag=False): namespace = namespace or 'default' blob_ids = [] base_path = self._get_path(user, namespace=namespace) + + def match(name): + if deleted: + return name.endswith('.deleted') + return VALID_STRINGS.match(name) for root, dirs, filenames in os.walk(base_path): blob_ids += [os.path.join(root, name) for name in filenames - if not name.endswith('.flags')] + if match(name)] if order_by in ['date', '+date']: blob_ids.sort(key=lambda x: os.path.getmtime(x)) elif order_by == '-date': @@ -165,7 +174,8 @@ class FilesystemBlobsBackend(object): raise Exception("Unsupported order_by parameter: %s" % order_by) if filter_flag: blob_ids = list(self._filter_flag(blob_ids, filter_flag)) - blob_ids = [os.path.basename(path) for path in blob_ids] + blob_ids = [os.path.basename(path).replace('.deleted', '') + for path in blob_ids] return json.dumps(blob_ids) def _filter_flag(self, blob_paths, flag): @@ -267,8 +277,9 @@ class BlobsResource(resource.Resource): elif not blob_id: order = request.args.get('order_by', [None])[0] filter_flag = request.args.get('filter_flag', [False])[0] + deleted = request.args.get('deleted', [False])[0] return self._handler.list_blobs(user, request, namespace, - order_by=order, + order_by=order, deleted=deleted, filter_flag=filter_flag) only_flags = request.args.get('only_flags', [False])[0] if only_flags: diff --git a/tests/server/test_blobs_server.py b/tests/server/test_blobs_server.py index 1d66d0ef..ba4a03d7 100644 --- a/tests/server/test_blobs_server.py +++ b/tests/server/test_blobs_server.py @@ -353,7 +353,9 @@ class BlobServerTestCase(unittest.TestCase): yield manager._encrypt_and_upload('blob_id2', BytesIO("2")) yield manager._delete_from_remote('blob_id1') blobs_list = yield manager.remote_list() + deleted_blobs_list = yield manager.remote_list(deleted=True) self.assertEquals(set(['blob_id2']), set(blobs_list)) + self.assertEquals(set(['blob_id1']), set(deleted_blobs_list)) @defer.inlineCallbacks @pytest.mark.usefixtures("method_tmpdir") @@ -367,7 +369,9 @@ class BlobServerTestCase(unittest.TestCase): namespace=namespace) yield manager._delete_from_remote('blob_id1', namespace=namespace) blobs_list = yield manager.remote_list(namespace=namespace) + deleted_blobs_list = yield manager.remote_list(namespace, deleted=True) self.assertEquals(set(['blob_id2']), set(blobs_list)) + self.assertEquals(set(['blob_id1']), set(deleted_blobs_list)) @defer.inlineCallbacks @pytest.mark.usefixtures("method_tmpdir") |