diff -r 261778de26ff -r 620f9b141567 thirdparty/google_appengine/google/appengine/api/users.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/thirdparty/google_appengine/google/appengine/api/users.py Tue Aug 26 21:49:54 2008 +0000 @@ -0,0 +1,203 @@ +#!/usr/bin/env python +# +# Copyright 2007 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +"""Python datastore class User to be used as a datastore data type. + +Classes defined here: + User: object representing a user. + Error: base exception type + BadRequestError: UserService exception + UserNotFoundError: UserService exception + BackendError: UserService exception +""" + + + + + + +import os +from google.appengine.api import apiproxy_stub_map +from google.appengine.api import user_service_pb +from google.appengine.api import api_base_pb +from google.appengine.runtime import apiproxy_errors + + +class Error(Exception): + """Base User error type.""" + + +class UserNotFoundError(Error): + """Raised by User.__init__() when there's no email argument and no user is + logged in.""" + + +class RedirectTooLongError(Error): + """Raised by UserService calls if the generated redirect URL was too long. + """ + + +class User(object): + """A user. + + We provide here the email address, nickname, and auth domain for a user. + + A nickname is a human-readable string which uniquely identifies a Google + user, akin to a username. It will be an email address for some users, but + not all. + """ + + + def __init__(self, email=None, _auth_domain=None): + """Constructor. + + Args: + # email is optional. it defaults to the current user. + email: string + """ + if _auth_domain is None: + _auth_domain = os.environ.get('AUTH_DOMAIN') + else: + assert email is not None + + assert _auth_domain + + if email is None: + assert 'USER_EMAIL' in os.environ + email = os.environ['USER_EMAIL'] + + if not email: + raise UserNotFoundError + + self.__email = email + self.__auth_domain = _auth_domain + + def nickname(self): + """Return this user's nickname. + + The nickname will be a unique, human readable identifier for this user + with respect to this application. It will be an email address for some + users, but not all. + """ + if (self.__email and self.__auth_domain and + self.__email.endswith('@' + self.__auth_domain)): + suffix_len = len(self.__auth_domain) + 1 + return self.__email[:-suffix_len] + else: + return self.__email + + def email(self): + """Return this user's email address.""" + return self.__email + + def auth_domain(self): + """Return this user's auth domain.""" + return self.__auth_domain + + def __unicode__(self): + return unicode(self.nickname()) + + def __str__(self): + return str(self.nickname()) + + def __repr__(self): + return "users.User(email='%s')" % self.email() + + def __hash__(self): + return hash((self.__email, self.__auth_domain)) + + def __cmp__(self, other): + if not isinstance(other, User): + return NotImplemented + return cmp((self.__email, self.__auth_domain), + (other.__email, other.__auth_domain)) + + +def create_login_url(dest_url): + """Computes the login URL for this request and specified destination URL. + + Args: + dest_url: String that is the desired final destination URL for the user + once login is complete. If 'dest_url' does not have a host + specified, we will use the host from the current request. + + Returns: + string + """ + req = user_service_pb.StringProto() + resp = user_service_pb.StringProto() + req.set_value(dest_url) + try: + apiproxy_stub_map.MakeSyncCall('user', 'CreateLoginURL', req, resp) + except apiproxy_errors.ApplicationError, e: + if (e.application_error == + user_service_pb.UserServiceError.REDIRECT_URL_TOO_LONG): + raise RedirectTooLongError + else: + raise e + return resp.value() + +CreateLoginURL = create_login_url + + +def create_logout_url(dest_url): + """Computes the logout URL for this request and specified destination URL. + + Args: + dest_url: String that is the desired final destination URL for the user + once logout is complete. If 'dest_url' does not have a host + specified, we will use the host from the current request. + + Returns: + string + """ + req = user_service_pb.StringProto() + resp = user_service_pb.StringProto() + req.set_value(dest_url) + try: + apiproxy_stub_map.MakeSyncCall('user', 'CreateLogoutURL', req, resp) + except apiproxy_errors.ApplicationError, e: + if (e.application_error == + user_service_pb.UserServiceError.REDIRECT_URL_TOO_LONG): + raise RedirectTooLongError + else: + raise e + return resp.value() + +CreateLogoutURL = create_logout_url + + +def get_current_user(): + try: + return User() + except UserNotFoundError: + return None + +GetCurrentUser = get_current_user + + +def is_current_user_admin(): + """Return true if the user making this request is an admin for this + application, false otherwise. + + We specifically make this a separate function, and not a member function of + the User class, because admin status is not persisted in the datastore. It + only exists for the user making this request right now. + """ + return (os.environ.get('USER_IS_ADMIN', '0')) == "1" + +IsCurrentUserAdmin = is_current_user_admin