Skip to content

Commit 6844654

Browse files
committed
Implement vault log API endpoint
1 parent 72c0866 commit 6844654

1 file changed

Lines changed: 39 additions & 4 deletions

File tree

syncrypt/api/resources.py

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
# tastypie-like asyncio-aware resources
2+
import asyncio
3+
import iso8601
4+
import itertools
25
import json
36
import logging
47
import os.path
5-
import itertools
68

7-
import asyncio
89
from aiohttp import web
9-
from .auth import require_auth_token
10-
from syncrypt.utils.format import format_size
10+
from tzlocal import get_localzone
11+
1112
from syncrypt.models import Identity
13+
from syncrypt.utils.format import format_size
14+
15+
from .auth import require_auth_token
16+
from ..models.bundle import VirtualBundle
17+
from ..pipes import Once
1218

1319
logger = logging.getLogger(__name__)
1420

@@ -120,6 +126,9 @@ def add_routes(self, router):
120126
router.add_route('GET',
121127
'/{version}/{name}/{{id}}/fingerprints/'.format(**opts),
122128
self.dispatch_fingerprints)
129+
router.add_route('GET',
130+
'/{version}/{name}/{{id}}/log/'.format(**opts),
131+
self.dispatch_log)
123132
router.add_route('POST',
124133
'/{version}/{name}/{{id}}/export/'.format(**opts),
125134
self.dispatch_export)
@@ -203,6 +212,32 @@ def dispatch_fingerprints(self, request):
203212
fingerprint_list = yield from vault.backend.list_vault_user_key_fingerprints()
204213
return JSONResponse(fingerprint_list)
205214

215+
@asyncio.coroutine
216+
def dispatch_log(self, request):
217+
vault_id = request.match_info['id']
218+
vault = self.find_vault_by_id(vault_id)
219+
local_tz = get_localzone()
220+
queue = yield from vault.backend.changes(None, None, verbose=True)
221+
log_items = []
222+
while True:
223+
item = yield from queue.get()
224+
if item is None:
225+
break
226+
store_hash, metadata, server_info = item
227+
bundle = VirtualBundle(None, vault, store_hash=store_hash)
228+
yield from bundle.write_encrypted_metadata(Once(metadata))
229+
rev_id = server_info['id'].decode(vault.config.encoding)
230+
created_at = server_info['created_at'].decode(vault.config.encoding)
231+
operation = server_info['operation'].decode(vault.config.encoding)
232+
user_email = server_info['email'].decode(vault.config.encoding)
233+
log_items.append({
234+
'operation': operation,
235+
'user_email': user_email,
236+
'created_at': created_at,
237+
'path': bundle.relpath
238+
})
239+
return JSONResponse({'items': log_items})
240+
206241
@asyncio.coroutine
207242
def dispatch_export(self, request):
208243
vault_id = request.match_info['id']

0 commit comments

Comments
 (0)