X-Git-Url: http://git.veekun.com/zzz-spline-users.git/blobdiff_plain/3a7f952ac7dde642522438b8508c176f89f73b71..ef84ec8cca82b01bdec296d7c02001b7b212ff5f:/spline/plugins/users/controllers/accounts.py diff --git a/spline/plugins/users/controllers/accounts.py b/spline/plugins/users/controllers/accounts.py index 09ca1ac..9add733 100644 --- a/spline/plugins/users/controllers/accounts.py +++ b/spline/plugins/users/controllers/accounts.py @@ -2,6 +2,7 @@ import logging from openid.consumer.consumer import Consumer from openid.extensions.sreg import SRegRequest, SRegResponse from openid.store.filestore import FileOpenIDStore +from openid.yadis.discover import DiscoveryFailure from sqlalchemy.orm.exc import NoResultFound from pylons import config, request, response, session, tmpl_context as c, url @@ -10,6 +11,7 @@ from routes import request_config from spline import model from spline.model import meta +from spline.lib import helpers as h from spline.lib.base import BaseController, render log = logging.getLogger(__name__) @@ -18,17 +20,36 @@ class AccountsController(BaseController): openid_store = FileOpenIDStore('/var/tmp') - def index(self): - # Return a rendered template - # return render('/template.mako') - # or, Return a response - return str(request.headers) + request.environ.get('scheme', '') + def _bail(self, reason): + # Used for bailing on a login attempt; reshows the login page + c.error = reason + c.attempted_openid = request.params.get('openid_identifier', '') + return render('/users/login.mako') + + + def login(self): + c.error = None + c.attempted_openid = None + return render('/users/login.mako') def login_begin(self): """Step one of logging in with OpenID; we redirect to the provider""" cons = Consumer(session=session, store=self.openid_store) - auth_request = cons.begin(request.params['openid']) + + try: + openid_url = request.params['openid_identifier'] + except KeyError: + return self._bail("Gotta enter an OpenID to log in.") + + try: + auth_request = cons.begin(openid_url) + except DiscoveryFailure: + return self._bail( + "Can't connect to '{0}'. You sure it's an OpenID?" + .format(openid_url) + ) + sreg_req = SRegRequest(optional=['nickname', 'email', 'dob', 'gender', 'country', 'language', 'timezone']) auth_request.addExtension(sreg_req) @@ -61,18 +82,36 @@ class AccountsController(BaseController): sreg_res = SRegResponse.fromSuccessResponse(res) try: username = sreg_res['nickname'] - except KeyError: + except (KeyError, TypeError): + # KeyError if sreg has no nickname; TypeError if sreg is None username = 'Anonymous' # Create db records user = model.User(name=username) meta.Session.add(user) + openid = model.OpenID(openid=res.identity_url) user.openids.append(openid) + meta.Session.commit() # Remember who's logged in, and we're good to go session['user_id'] = user.id session.save() - return "Hello, %s" % user.name + h.flash(u"""Hello, {0}!""".format(user.name), + icon='user') + + redirect_to('/', _code=303) + + def logout(self): + """Logs the user out.""" + + if 'user_id' in session: + del session['user_id'] + session.save() + + h.flash(u"""Logged out.""", + icon='user-silhouette') + + redirect_to('/', _code=303)