diff options
Diffstat (limited to 'ipsilon/providers/openid/extensions/ax.py')
-rwxr-xr-x | ipsilon/providers/openid/extensions/ax.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/ipsilon/providers/openid/extensions/ax.py b/ipsilon/providers/openid/extensions/ax.py new file mode 100755 index 0000000..7daa52a --- /dev/null +++ b/ipsilon/providers/openid/extensions/ax.py @@ -0,0 +1,64 @@ +#!/usr/bin/python +# +# Copyright (C) 2014 Ipsilon project Contributors, for licensee see COPYING + +from __future__ import absolute_import + +from ipsilon.providers.openid.extensions.common import OpenidExtensionBase +from openid.extensions import ax + + +AP_MAP = { + 'http://schema.openid.net/namePerson': 'fullname', + 'http://schema.openid.net/contact/email': 'email', + 'http://axschema.org/namePerson': 'fullname', + 'http://axschema.org/namePerson/first': 'firstname', + 'http://axschema.org/namePerson/last': 'lastname', + 'http://axschema.org/namePerson/friendly': 'nickname', + 'http://axschema.org/contact/email': 'email', + 'http://openid.net/schema/namePerson/first': 'firstname', + 'http://openid.net/schema/namePerson/last': 'lastname', + 'http://openid.net/schema/namePerson/friendly': 'nickname', + 'http://openid.net/schema/gender': 'gender', + 'http://openid.net/schema/language/pref': 'language', + 'http://fedoauth.org/openid/schema/GPG/keyid': 'gpg_keyid', + 'http://fedoauth.org/openid/schema/SSH/key': 'ssh_key', +} + + +class OpenidExtension(OpenidExtensionBase): + + def __init__(self): + super(OpenidExtension, self).__init__('Attribute Exchange') + self.type_uris = [ + ax.AXMessage.ns_uri, + ] + + def _resp(self, request, userdata): + req = ax.FetchRequest.fromOpenIDRequest(request) + if req is None: + return {} + resp = ax.FetchResponse(req) + for name in req.requested_attributes: + try: + self.debug(name) + if name in AP_MAP: + resp.addValue(name, userdata[AP_MAP[name]]) + else: + resp.addValue(name, userdata[name]) + except Exception: # pylint: disable=broad-except + pass + return resp + + def _display(self, request, userdata): + resp = self._resp(request, userdata) + data = dict() + for name, value in resp.data.items(): + key = name + if name in AP_MAP: + key = AP_MAP[name] + data[key] = ', '.join(value if value else []) + return data + + def _response(self, request, userdata): + return self._resp(request, userdata) |