Chromium Code Reviews| Index: appengine/chromium_cq_status/shared/utils.py |
| diff --git a/appengine/chromium_cq_status/shared/utils.py b/appengine/chromium_cq_status/shared/utils.py |
| index 7312725d4f3dd54789d0a6b8fd58ca80630b23af..48fac3c4a1fea2e9f2c6c09017c2d7f566c17268 100644 |
| --- a/appengine/chromium_cq_status/shared/utils.py |
| +++ b/appengine/chromium_cq_status/shared/utils.py |
| @@ -4,14 +4,17 @@ |
| import calendar |
| from datetime import datetime |
| +import functools |
| import hashlib |
| import json |
| import logging |
| +import os |
| from google.appengine.api import memcache |
| from google.appengine.api import users |
| +from google.appengine.api import app_identity |
| -from shared.config import VALID_EMAIL_RE |
| +from shared.config import HOST_ACLS |
| compressed_separators = (',', ':') |
| minutes_per_day = 24 * 60 |
| @@ -24,6 +27,7 @@ def cronjob(cronjob_handler): |
| return checked_cronjob_handler |
| def cross_origin_json(handler): |
| + @functools.wraps(handler) |
| def headered_json_handler(self, *args): |
| self.response.headers.add_header("Access-Control-Allow-Origin", "*") |
| result = handler(self, *args) |
| @@ -35,11 +39,43 @@ def cross_origin_json(handler): |
| def filter_dict(d, keys): |
| return {key: d[key] for key in d if key in keys} |
| -def is_valid_user(): |
| + |
| +def get_host_permissions(kind): |
| + """Returns compiled regex of allowed user email or True if everyone is |
| + allowed.""" |
| + assert kind in ('read', 'write') |
| + if os.environ.get('SERVER_SOFTWARE', '').startswith('Development'): |
| + host = 'Development' |
| + else: |
| + host = app_identity.get_default_version_hostname() |
| + return HOST_ACLS[host][kind] |
| + |
| +def has_permission(kind): |
| if users.is_current_user_admin(): |
| + logging.info('user is admin') |
| + return True |
| + email_pattern = get_host_permissions(kind) |
| + if email_pattern is True: # Everyone. |
|
Sergiy Byelozyorov
2016/07/01 17:13:06
I'd use 'everyone' rather than True. Then it's als
tandrii(chromium)
2016/07/01 18:56:55
good idea.
|
| return True |
| user = users.get_current_user() |
| - return user and VALID_EMAIL_RE.match(user.email()) |
| + return user and bool(email_pattern.match(user.email())) |
| + |
| + |
| +def read_access(handler): |
| + """Decorator ensuring current user has read access to this host.""" |
| + @functools.wraps(handler) |
| + def ensure(self, *args, **kwargs): |
| + if not has_permission('read'): |
| + self.redirect(users.create_login_url(self.request.url)) |
| + return |
| + return handler(self, *args, **kwargs) |
| + return ensure |
| + |
| + |
| +def get_friendly_hostname(): |
| + host = app_identity.get_default_version_hostname() |
| + return host.split('-')[0].capitalize() |
|
Sergiy Byelozyorov
2016/07/01 17:13:06
Not so friendly to developers trying to understand
tandrii(chromium)
2016/07/01 18:56:55
added comment.
|
| + |
| def memcachize(cache_check): |
| def decorator(f): |