| Index: appengine_apps/chromium_status/appengine_module/chromium_status/base_page.py
|
| diff --git a/appengine_apps/chromium_status/appengine_module/chromium_status/base_page.py b/appengine_apps/chromium_status/appengine_module/chromium_status/base_page.py
|
| deleted file mode 100644
|
| index b63f7174f4aac47f96a7b0c654f62222b5d01636..0000000000000000000000000000000000000000
|
| --- a/appengine_apps/chromium_status/appengine_module/chromium_status/base_page.py
|
| +++ /dev/null
|
| @@ -1,195 +0,0 @@
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""Utility base class."""
|
| -
|
| -import datetime
|
| -import hashlib
|
| -import logging
|
| -import os
|
| -import re
|
| -
|
| -from google.appengine.api import memcache
|
| -from google.appengine.api import oauth
|
| -from google.appengine.api import users
|
| -from google.appengine.ext import db
|
| -from google.appengine.ext import webapp
|
| -from google.appengine.ext.webapp import template
|
| -
|
| -from appengine_module.chromium_status import utils
|
| -
|
| -
|
| -class Passwords(db.Model):
|
| - """Super users. Useful for automated scripts."""
|
| - password_sha1 = db.StringProperty(required=True, multiline=False)
|
| -
|
| -
|
| -class GlobalConfig(db.Model):
|
| - """Instance-specific config like application name."""
|
| - app_name = db.StringProperty(required=True)
|
| - # Flag indicating that anonymous viewing is possible.
|
| - public_access = db.BooleanProperty()
|
| - # Flag indicating that this is a ChromiumOS status page
|
| - is_chromiumos = db.BooleanProperty(default=False)
|
| -
|
| -
|
| -class BasePage(webapp.RequestHandler):
|
| - """Utility functions needed to validate user and display a template."""
|
| - # Initialized in bootstrap(), which is called serially at process startup.
|
| - APP_NAME = ''
|
| - _VALID_PUBLIC_EMAIL = re.compile(r"^.*@(chromium\.org|google\.com)$")
|
| - _VALID_PRIVATE_EMAIL = re.compile(r"^.*@(google\.com)$")
|
| - PUBLIC_ACCESS = False
|
| - IS_CHROMIUMOS = False
|
| -
|
| - def __init__(self, *args, **kwargs): # pragma: no cover
|
| - super(BasePage, self).__init__(*args, **kwargs)
|
| - self._initialized = False
|
| - # Read and write access mean to the datastore.
|
| - # Bot access is specifically required (in addition to write access) for
|
| - # some queries that are allowed to specify a username synthetically.
|
| - self._read_access = False
|
| - self._write_access = False
|
| - self._bot_login = False
|
| - self._user = None
|
| -
|
| - def _late_init(self): # pragma: no cover
|
| - """Initializes access control fields once the object is setup."""
|
| -
|
| - def look_for_password():
|
| - """Looks for password parameter. Not awesome."""
|
| - password = self.request.get('password')
|
| - if password:
|
| - sha1_pass = hashlib.sha1(password).hexdigest()
|
| - if Passwords.gql('WHERE password_sha1 = :1', sha1_pass).get():
|
| - # The password is valid, this is a super admin.
|
| - self._write_access = True
|
| - self._read_access = True
|
| - self._bot_login = True
|
| - else:
|
| - if utils.is_dev_env() and password == 'foobar':
|
| - # Dev server is unsecure.
|
| - self._read_access = True
|
| - self._write_access = True
|
| - self._bot_login = True
|
| - else:
|
| - logging.error('Password is invalid')
|
| -
|
| - self._user = users.get_current_user()
|
| - if utils.is_dev_env():
|
| - look_for_password()
|
| - # Maybe the tests reloaded our public settings ...
|
| - self.PUBLIC_ACCESS = GlobalConfig.all().get().public_access
|
| - elif not self._user:
|
| - try:
|
| - self._user = oauth.get_current_user()
|
| - except oauth.OAuthRequestError:
|
| - if self.request.scheme == 'https':
|
| - look_for_password()
|
| -
|
| - if not self._write_access and self._user:
|
| - if self.PUBLIC_ACCESS:
|
| - valid_email = self._VALID_PUBLIC_EMAIL
|
| - else:
|
| - valid_email = self._VALID_PRIVATE_EMAIL
|
| - self._write_access = bool(
|
| - users.is_current_user_admin() or
|
| - valid_email.match(self._user.email()))
|
| - if self.PUBLIC_ACCESS:
|
| - self._read_access = True
|
| - else:
|
| - self._read_access = self._write_access
|
| -
|
| - self._initialized = True
|
| - logging.info('ReadAccess: %r, WriteAccess: %r, BotLogin: %r, User: %s' % (
|
| - self._read_access, self._write_access, self._bot_login, self._user))
|
| -
|
| - @property
|
| - def write_access(self): # pragma: no cover
|
| - if not self._initialized:
|
| - self._late_init()
|
| - return self._write_access
|
| -
|
| - @property
|
| - def read_access(self): # pragma: no cover
|
| - if not self._initialized:
|
| - self._late_init()
|
| - return self._read_access
|
| -
|
| - @property
|
| - def user(self): # pragma: no cover
|
| - if not self._initialized:
|
| - self._late_init()
|
| - return self._user
|
| -
|
| - @property
|
| - def bot_login(self): # pragma: no cover
|
| - if not self._initialized:
|
| - self._late_init()
|
| - return self._bot_login
|
| -
|
| - def InitializeTemplate(self, title): # pragma: no cover
|
| - """Initializes the template values with information needed by all pages."""
|
| - if self.user:
|
| - user_email = self.user.email()
|
| - else:
|
| - user_email = ''
|
| - template_values = {
|
| - 'app_name': self.APP_NAME,
|
| - 'username': user_email,
|
| - 'title': title,
|
| - 'current_UTC_time': datetime.datetime.now(),
|
| - 'write_access': self.write_access,
|
| - 'user': self.user,
|
| - }
|
| - return template_values
|
| -
|
| - def DisplayTemplate(self, name, template_values,
|
| - use_cache=False): # pragma: no cover
|
| - """Replies to a http request with a template.
|
| -
|
| - Optionally cache it for 1 second. Only to be used for user-invariant
|
| - pages!
|
| - """
|
| - self.response.headers['Cache-Control'] = 'no-cache, private, max-age=0'
|
| - buff = None
|
| - if use_cache:
|
| - buff = memcache.get(name)
|
| - if not buff:
|
| - path = 'templates/%s' % name
|
| - buff = template.render(path, template_values)
|
| - if use_cache:
|
| - memcache.add(name, buff, 1)
|
| - self.response.out.write(buff)
|
| -
|
| -
|
| -def bootstrap(): # pragma: no cover
|
| - app_name = os.environ['APPLICATION_ID']
|
| - if app_name.endswith('-status'):
|
| - app_name = app_name[:-7]
|
| - config = GlobalConfig.all().get()
|
| - if config is None:
|
| - # Insert a dummy GlobalConfig so it can be edited through the admin
|
| - # console
|
| - config = GlobalConfig(app_name=app_name)
|
| - config.public_access = False
|
| - config.put()
|
| - else:
|
| - needs_update = False
|
| - if not config.app_name:
|
| - config.app_name = app_name
|
| - needs_update = True
|
| - if config.public_access is None:
|
| - # Upgrade to public_access for existing waterfalls.
|
| - config.public_access = True
|
| - needs_update = True
|
| - if needs_update:
|
| - config.put()
|
| - BasePage.APP_NAME = config.app_name
|
| - BasePage.PUBLIC_ACCESS = config.public_access
|
| - BasePage.IS_CHROMIUMOS = config.is_chromiumos
|
| -
|
| - if db.GqlQuery('SELECT __key__ FROM Passwords').get() is None:
|
| - # Insert a dummy Passwords so it can be edited through the admin console
|
| - Passwords(password_sha1='invalidhash').put()
|
|
|