OLD | NEW |
---|---|
(Empty) | |
1 # Copyright 2015 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 import json | |
6 import sys | |
7 import webapp2 | |
8 | |
9 from google.appengine.api import users | |
10 | |
11 import common | |
12 | |
13 class AdminCommand(object): | |
14 """Base class for administrative commands.""" | |
15 | |
16 def __init__(self, handler): | |
17 self._handler = handler | |
18 | |
19 @property | |
20 def request(self): | |
21 return self._handler.request | |
22 | |
23 @property | |
24 def response(self): | |
25 return self._handler.response | |
26 | |
27 | |
28 class AdminPage(AdminCommand): | |
29 """Display the admin page.""" | |
30 | |
31 def get(self): | |
32 self.response.write(open('templates/admin.html').read()) | |
33 | |
34 def post(self): | |
35 self.response.set_status(403) | |
36 return | |
37 | |
38 | |
39 def serialize(value): | |
ghost stip (do not use)
2015/04/14 00:36:42
I'm not entirely sure what these are used for. thi
Sergey Berezin (google)
2015/04/15 01:38:09
Function removed.
| |
40 if type(value) is str: | |
41 return value | |
42 if type(value) is list: | |
43 return '\n'.join(value) | |
44 if type(value) is dict: | |
45 return json.dumps(value) | |
46 return 'Unsupported type' | |
47 | |
48 | |
49 def deserialize(value, tp): | |
50 if tp is str: | |
51 return value | |
52 if tp is list: | |
53 return [l for l in value.splitlines() if l] | |
54 if tp is dict: | |
55 return json.loads(value) | |
56 raise ValueError('Unsuppored type') | |
57 | |
58 | |
59 class SetCredentials(AdminCommand): | |
60 """Save new credentials for the Monacq endpoint.""" | |
61 | |
62 # TODO(sergeyberezin): move this and (de)serialize funcs to common.py. | |
63 fields = { | |
64 'message': str, | |
65 'url': str, | |
66 'credentials': dict, | |
67 'scopes': list, | |
68 'headers': dict, | |
69 } | |
70 | |
71 def get(self): | |
72 params = {f: serialize(tp()) for f, tp in self.fields.iteritems()} | |
73 data = common.MonAcqData.get_by_id(common.CREDENTIALS_KEY) | |
74 if data: | |
75 params.update({ | |
76 f: serialize(self.fields[f](v)) for f, v in data.to_dict().items()}) | |
77 self.response.headers["Content-Type"] = 'text/html' | |
78 self.response.write(open('templates/set_credentials.html').read() % params) | |
ghost stip (do not use)
2015/04/14 00:36:41
you should use jinja
Sergey Berezin (google)
2015/04/15 01:38:09
Done.
| |
79 | |
80 def post(self): | |
81 params = {f: serialize(tp()) for f, tp in self.fields.iteritems()} | |
82 data = common.MonAcqData.get_or_insert(common.CREDENTIALS_KEY) | |
83 params.update({f: serialize(v) for f, v in data.to_dict().iteritems()}) | |
84 | |
85 updated_fields = [] | |
86 failed_fields = [] | |
87 for field, tp in self.fields.iteritems(): | |
88 if not self.request.get(field): | |
89 continue | |
90 try: | |
91 setattr(data, field, deserialize(self.request.get(field), tp)) | |
92 updated_fields.append(field) | |
93 except ValueError: | |
94 failed_fields.append(field) | |
95 params[field] = self.request.get(field) | |
96 | |
97 if failed_fields: | |
98 self.response.headers["Content-Type"] = 'text/html' | |
ghost stip (do not use)
2015/04/14 00:36:42
I think this is set by default?
Sergey Berezin (google)
2015/04/15 01:38:09
True. And now irrelevant (jinja!)
| |
99 params['message'] = 'Failed to update %s. Please try again.' % ( | |
100 ', '.join(failed_fields)) | |
101 self.response.out.write( | |
102 open('templates/set_credentials.html').read() % params) | |
103 return | |
104 if updated_fields: | |
105 data.put() | |
106 params['message'] = 'Updated %s.' % ', '.join(updated_fields) | |
107 self.response.headers["Content-Type"] = 'text/html' | |
108 self.response.out.write( | |
109 open('templates/set_credentials.html').read() % params) | |
ghost stip (do not use)
2015/04/14 00:36:42
again, jinja. from what I'm reading, you can repla
Sergey Berezin (google)
2015/04/15 01:38:09
Done. Thanks for the pointers!
| |
110 | |
111 | |
112 commands = { | |
113 '': AdminPage, | |
114 'set-credentials': SetCredentials, | |
115 } | |
116 | |
117 class AdminDispatch(webapp2.RequestHandler): | |
ghost stip (do not use)
2015/04/14 00:36:41
I think you can remove lines 112 - 128 if you just
Sergey Berezin (google)
2015/04/15 01:38:09
First, I'd really like to switch to auth groups he
| |
118 def get(self, command): | |
119 if not users.is_current_user_admin(): | |
120 self.redirect(users.create_login_url(self.request.url)) | |
121 return | |
122 commands[command](self).get() | |
123 | |
124 def post(self, command): | |
125 if not users.is_current_user_admin(): | |
126 self.response.set_status(403) | |
127 return | |
128 commands[command](self).post() | |
OLD | NEW |