Chromium Code Reviews| 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 |