3 from twisted.web.server import UnsupportedMethod
6 from nevow.inevow import IRequest
8 from allmydata.web.common import get_arg, WebError
11 class MagicFolderWebApi(rend.Page):
13 I provide the web-based API for Magic Folder status etc.
16 def __init__(self, client):
17 super(MagicFolderWebApi, self).__init__(client)
20 def _render_json(self, req):
21 req.setHeader("content-type", "application/json")
24 for item in self.client._magic_folder.uploader.get_status():
27 status=item.status_history()[-1][0],
30 for (status, ts) in item.status_history():
31 d[status + '_at'] = ts
32 d['percent_done'] = item.progress.progress
35 for item in self.client._magic_folder.downloader.get_status():
38 status=item.status_history()[-1][0],
41 for (status, ts) in item.status_history():
42 d[status + '_at'] = ts
43 d['percent_done'] = item.progress.progress
46 return simplejson.dumps(data)
48 def renderHTTP(self, ctx):
50 t = get_arg(req, "t", None)
51 if req.method != 'POST':
52 raise UnsupportedMethod(('POST',))
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)
60 return rend.Page.renderHTTP(self, ctx)
64 return self._render_json(req)
66 raise WebError("'%s' invalid type for 't' arg" % (t,), 400)