diff --git a/VERSION b/VERSION index 4295d576..1241d66f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.4.6-stable+timestamp.2013.04.07.19.41.51 +Version 2.4.6-stable+timestamp.2013.04.07.19.44.10 diff --git a/gluon/contrib/login_methods/loginradius_account.py b/gluon/contrib/login_methods/loginradius_account.py new file mode 100644 index 00000000..061f9e5d --- /dev/null +++ b/gluon/contrib/login_methods/loginradius_account.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python +# coding: utf8 + +""" + LoginRadius Authentication for web2py + Developed by Nathan Freeze (Copyright © 2013) + Email + + This file contains code to allow using loginradius.com + authentication services with web2py +""" + +import os +from gluon import * +from gluon.storage import Storage +from gluon.contrib.simplejson import JSONDecodeError +from gluon.tools import fetch +import gluon.contrib.simplejson as json + + +class LoginRadiusAccount(object): + """ + from gluon.contrib.login_methods.loginradius_account import LoginRadiusAccount + auth.settings.actions_disabled=['register','change_password', + 'request_reset_password'] + auth.settings.login_form = LoginRadiusAccount(request, + api_key="...", + api_secret="...", + url = "http://localhost:8000/%s/default/user/login" % request.application) + """ + + def __init__(self, request, api_key="", api_secret="", + url=None, on_login_failure=None): + + self.request = request + self.api_key = api_key + self.api_secret = api_secret + self.url = url + self.auth_base_url = "https://hub.loginradius.com/UserProfile.ashx/" + self.profile = None + self.on_login_failure = on_login_failure + self.mappings = Storage() + + def defaultmapping(profile): + first_name = profile.get('FirstName') + last_name = profile.get('LastName') + email = profile.get('Email', [{}])[0].get('Value') + reg_id = profile.get('ID', '') + username = profile.get('ProfileName', email) + + return dict(registration_id=reg_id, username=username, email=email, + first_name=first_name, last_name=last_name) + + self.mappings.default = defaultmapping + + def get_user(self): + request = self.request + user = None + if request.vars.token: + try: + auth_url = self.auth_base_url + self.api_secret + "/" + request.vars.token + json_data = fetch(auth_url, headers={'User-Agent': "LoginRadius - Python - SDK"}) + self.profile = json.loads(json_data) + provider = self.profile['Provider'] + mapping = self.mappings.get(provider, self.mappings['default']) + user = mapping(self.profile) + except (JSONDecodeError, KeyError): + pass + if user is None and self.on_login_failure: + redirect(self.on_login_failure) + return user + + def login_form(self): + loginradius_url = "https://hub.loginradius.com/include/js/LoginRadius.js" + loginradius_lib = SCRIPT(_src=loginradius_url, _type='text/javascript') + container = DIV(_id="interfacecontainerdiv", _class='interfacecontainerdiv') + widget = SCRIPT("""var options={}; options.login=true; + LoginRadius_SocialLogin.util.ready(function () { + $ui = LoginRadius_SocialLogin.lr_login_settings; + $ui.interfacesize = "";$ui.apikey = "%s"; + $ui.callback=""; $ui.lrinterfacecontainer ="interfacecontainerdiv"; + LoginRadius_SocialLogin.init(options); });""" % self.api_key) + form = DIV(container, loginradius_lib, widget) + return form + + +def use_loginradius(auth, filename='private/loginradius.key', **kwargs): + path = os.path.join(current.request.folder, filename) + if os.path.exists(path): + request = current.request + domain, public_key, private_key = open(path, 'r').read().strip().split(':') + url = URL('default', 'user', args='login', scheme=True) + auth.settings.actions_disabled = \ + ['register', 'change_password', 'request_reset_password'] + auth.settings.login_form = LoginRadiusAccount( + request, api_key=public_key, api_secret=private_key, + url=url, **kwargs)