From caafff74b3d9f438f564f3bc7e8e3e0d18ad6fde Mon Sep 17 00:00:00 2001 From: Massimo Date: Tue, 15 Apr 2014 10:16:02 -0500 Subject: [PATCH] reverted rpx_account for backward compatibility and added janrain_account for the new engage.js api --- VERSION | 2 +- applications/admin/views/appadmin.html | 2 +- applications/examples/views/appadmin.html | 2 +- applications/welcome/models/db.py | 2 +- applications/welcome/views/appadmin.html | 2 +- .../contrib/login_methods/janrain_account.py | 138 ++++++++++++++++++ gluon/contrib/login_methods/rpx_account.py | 47 +++--- 7 files changed, 164 insertions(+), 31 deletions(-) create mode 100644 gluon/contrib/login_methods/janrain_account.py diff --git a/VERSION b/VERSION index a071bd53..11d80a26 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.9.5-trunk+timestamp.2014.04.07.12.15.01 +Version 2.9.5-trunk+timestamp.2014.04.15.10.14.45 diff --git a/applications/admin/views/appadmin.html b/applications/admin/views/appadmin.html index 054efd49..d8bea300 100644 --- a/applications/admin/views/appadmin.html +++ b/applications/admin/views/appadmin.html @@ -65,7 +65,7 @@ {{if start>0:}}{{=A(T('previous %s rows') % step,_href=URL('select',args=request.args[0],vars=dict(start=start-step)),_class="btn")}}{{pass}} {{if stop +
{{linkto = lambda f, t, r: URL('update', args=[request.args[0], r, f]) if f else "#"}} {{upload=URL('download',args=request.args[0])}} {{=SQLTABLE(rows,linkto,upload,orderby=True,_class='sortable')}} diff --git a/applications/examples/views/appadmin.html b/applications/examples/views/appadmin.html index 054efd49..d8bea300 100644 --- a/applications/examples/views/appadmin.html +++ b/applications/examples/views/appadmin.html @@ -65,7 +65,7 @@ {{if start>0:}}{{=A(T('previous %s rows') % step,_href=URL('select',args=request.args[0],vars=dict(start=start-step)),_class="btn")}}{{pass}} {{if stop +
{{linkto = lambda f, t, r: URL('update', args=[request.args[0], r, f]) if f else "#"}} {{upload=URL('download',args=request.args[0])}} {{=SQLTABLE(rows,linkto,upload,orderby=True,_class='sortable')}} diff --git a/applications/welcome/models/db.py b/applications/welcome/models/db.py index 813ce551..67ece569 100644 --- a/applications/welcome/models/db.py +++ b/applications/welcome/models/db.py @@ -60,7 +60,7 @@ auth.settings.reset_password_requires_verification = True ## if you need to use OpenID, Facebook, MySpace, Twitter, Linkedin, etc. ## register with janrain.com, write your domain:api_key in private/janrain.key -from gluon.contrib.login_methods.rpx_account import use_janrain +from gluon.contrib.login_methods.janrain_account import use_janrain use_janrain(auth, filename='private/janrain.key') ######################################################################### diff --git a/applications/welcome/views/appadmin.html b/applications/welcome/views/appadmin.html index 054efd49..d8bea300 100644 --- a/applications/welcome/views/appadmin.html +++ b/applications/welcome/views/appadmin.html @@ -65,7 +65,7 @@ {{if start>0:}}{{=A(T('previous %s rows') % step,_href=URL('select',args=request.args[0],vars=dict(start=start-step)),_class="btn")}}{{pass}} {{if stop +
{{linkto = lambda f, t, r: URL('update', args=[request.args[0], r, f]) if f else "#"}} {{upload=URL('download',args=request.args[0])}} {{=SQLTABLE(rows,linkto,upload,orderby=True,_class='sortable')}} diff --git a/gluon/contrib/login_methods/janrain_account.py b/gluon/contrib/login_methods/janrain_account.py new file mode 100644 index 00000000..a69ba9e5 --- /dev/null +++ b/gluon/contrib/login_methods/janrain_account.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python +# coding: utf8 + +""" + RPX Authentication for web2py + Developed by Nathan Freeze (Copyright © 2009) + Email + Modified by Massimo Di Pierro + + This file contains code to allow using RPXNow.com (now Jainrain.com) + services with web2py +""" + +import os +import re +import urllib +from gluon import * +from gluon.tools import fetch +from gluon.storage import Storage +import gluon.contrib.simplejson as json + + +class RPXAccount(object): + + """ + from gluon.contrib.login_methods.rpx_account import RPXAccount + auth.settings.actions_disabled=['register','change_password', + 'request_reset_password'] + auth.settings.login_form = RPXAccount(request, + api_key="...", + domain="...", + url = "http://localhost:8000/%s/default/user/login" % request.application) + """ + + def __init__(self, + request, + api_key="", + domain="", + url="", + embed=True, + auth_url="https://rpxnow.com/api/v2/auth_info", + language="en", + prompt='rpx', + on_login_failure=None, + ): + + self.request = request + self.api_key = api_key + self.embed = embed + self.auth_url = auth_url + self.domain = domain + self.token_url = url + self.language = language + self.profile = None + self.prompt = prompt + self.on_login_failure = on_login_failure + self.mappings = Storage() + + dn = {'givenName': '', 'familyName': ''} + self.mappings.Facebook = lambda profile, dn=dn:\ + dict(registration_id=profile.get("identifier", ""), + username=profile.get("preferredUsername", ""), + email=profile.get("email", ""), + first_name=profile.get("name", dn).get("givenName", ""), + last_name=profile.get("name", dn).get("familyName", "")) + self.mappings.Google = lambda profile, dn=dn:\ + dict(registration_id=profile.get("identifier", ""), + username=profile.get("preferredUsername", ""), + email=profile.get("email", ""), + first_name=profile.get("name", dn).get("givenName", ""), + last_name=profile.get("name", dn).get("familyName", "")) + self.mappings.default = lambda profile:\ + dict(registration_id=profile.get("identifier", ""), + username=profile.get("preferredUsername", ""), + email=profile.get("email", ""), + first_name=profile.get("preferredUsername", ""), + last_name='') + + def get_user(self): + request = self.request + if request.vars.token: + user = Storage() + data = urllib.urlencode( + dict(apiKey=self.api_key, token=request.vars.token)) + auth_info_json = fetch(self.auth_url + '?' + data) + auth_info = json.loads(auth_info_json) + + if auth_info['stat'] == 'ok': + self.profile = auth_info['profile'] + provider = re.sub('[^\w\-]', '', self.profile['providerName']) + user = self.mappings.get( + provider, self.mappings.default)(self.profile) + return user + elif self.on_login_failure: + redirect(self.on_login_failure) + return None + + def login_form(self): + request = self.request + args = request.args + rpxform = """ + +
""" % (self.token_url, self.domain, self.domain) + return XML(rpxform) + +def use_janrain(auth, filename='private/janrain.key', **kwargs): + path = os.path.join(current.request.folder, filename) + if os.path.exists(path): + request = current.request + domain, key = open(path, 'r').read().strip().split(':') + host = current.request.env.http_host + url = URL('default', 'user', args='login', scheme=True) + auth.settings.actions_disabled = \ + ['register', 'change_password', 'request_reset_password'] + auth.settings.login_form = RPXAccount( + request, api_key=key, domain=domain, url=url, **kwargs) diff --git a/gluon/contrib/login_methods/rpx_account.py b/gluon/contrib/login_methods/rpx_account.py index d8c47eb6..a22c1a50 100644 --- a/gluon/contrib/login_methods/rpx_account.py +++ b/gluon/contrib/login_methods/rpx_account.py @@ -98,32 +98,27 @@ class RPXAccount(object): def login_form(self): request = self.request args = request.args - rpxform = """ - -
""" % (self.token_url, self.domain, self.domain) - return XML(rpxform) + if self.embed: + JANRAIN_URL = \ + "https://%s.rpxnow.com/openid/embed?token_url=%s&language_preference=%s" + rpxform = IFRAME( + _src=JANRAIN_URL % ( + self.domain, self.token_url, self.language), + _scrolling="no", + _frameborder="no", + _style="width:400px;height:240px;") + else: + JANRAIN_URL = \ + "https://%s.rpxnow.com/openid/v2/signin?token_url=%s" + rpxform = DIV(SCRIPT(_src="https://rpxnow.com/openid/v2/widget", + _type="text/javascript"), + SCRIPT("RPXNOW.overlay = true;", + "RPXNOW.language_preference = '%s';" % self.language, + "RPXNOW.realm = '%s';" % self.domain, + "RPXNOW.token_url = '%s';" % self.token_url, + "RPXNOW.show();", + _type="text/javascript")) + return rpxform def use_janrain(auth, filename='private/janrain.key', **kwargs):