+import logging
+from openid.consumer.consumer import Consumer
+from openid.extensions.sreg import SRegRequest, SRegResponse
+from openid.store.filestore import FileOpenIDStore
+from sqlalchemy.orm.exc import NoResultFound
+
+from pylons import config, request, response, session, tmpl_context as c
+from pylons.controllers.util import abort, redirect_to
+from routes import url_for, request_config
+
+from spline import model
+from spline.model import meta
+from spline.lib.base import BaseController, render
+
+log = logging.getLogger(__name__)
+
+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 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'])
+ sreg_req = SRegRequest(optional=['nickname', 'email', 'dob', 'gender',
+ 'country', 'language', 'timezone'])
+ auth_request.addExtension(sreg_req)
+
+ host = request.headers['host']
+ protocol = request_config().protocol
+ return_url = url_for(host=host, controller='accounts', action='login_finish')
+ new_url = auth_request.redirectURL(return_to=return_url,
+ realm=protocol + '://' + host)
+ redirect_to(new_url)
+
+ def login_finish(self):
+ """Step two of logging in; the OpenID provider redirects back here."""
+
+ cons = Consumer(session=session, store=self.openid_store)
+ host = request.headers['host']
+ return_url = url_for(host=host, controller='accounts', action='login_finish')
+ res = cons.complete(request.params, return_url)
+
+ if res.status != 'success':
+ return 'Error! %s' % res.message
+
+ try:
+ # Grab an existing user record, if one exists
+ q = meta.Session.query(model.User) \
+ .filter(model.User.openids.any(openid=res.identity_url))
+ user = q.one()
+ except NoResultFound:
+ # Try to pull a name out of the SReg response
+ sreg_res = SRegResponse.fromSuccessResponse(res)
+ try:
+ username = sreg_res['nickname']
+ except KeyError:
+ 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