]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/web/magic_folder.py
Add simple auth-token to get JSON data
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / web / magic_folder.py
1 import simplejson
2
3 from twisted.web.server import UnsupportedMethod
4
5 from nevow import rend, url, tags as T
6 from nevow.inevow import IRequest
7
8 from allmydata.web.common import getxmlfile, get_arg, WebError
9
10
11 class MagicFolderWebApi(rend.Page):
12     """
13     I provide the web-based API for Magic Folder status etc.
14     """
15
16     def __init__(self, client):
17         super(MagicFolderWebApi, self).__init__(client)
18         self.client = client
19
20     def _render_json(self, req):
21         req.setHeader("content-type", "application/json")
22
23         data = []
24         for item in self.client._magic_folder.uploader.get_status():
25             d = dict(
26                 path=item.relpath_u,
27                 status=item.status_history()[-1][0],
28                 kind='upload',
29             )
30             for (status, ts) in item.status_history():
31                 d[status + '_at'] = ts
32             d['percent_done'] = item.progress.progress
33             data.append(d)
34
35         for item in self.client._magic_folder.downloader.get_status():
36             d = dict(
37                 path=item.relpath_u,
38                 status=item.status_history()[-1][0],
39                 kind='download',
40             )
41             for (status, ts) in item.status_history():
42                 d[status + '_at'] = ts
43             d['percent_done'] = item.progress.progress
44             data.append(d)
45
46         return simplejson.dumps(data)
47
48     def renderHTTP(self, ctx):
49         req = IRequest(ctx)
50         t = get_arg(req, "t", None)
51         if req.method != 'POST':
52             raise UnsupportedMethod(('POST',))
53
54         token = get_arg(req, "token", None)
55         # XXX need constant-time comparison?
56         if token is None or token != self.client.get_auth_token():
57             raise WebError("Missing or invalid token.", 400)
58
59         if t is None:
60             return rend.Page.renderHTTP(self, ctx)
61
62         t = t.strip()
63         if t == 'json':
64             return self._render_json(req)
65
66         raise WebError("'%s' invalid type for 't' arg" % (t,), 400)
67
68