Ignore:
Timestamp:
23/10/09 14:46:26 (11 years ago)
Author:
pjkersha
Message:
  • added an SQLAlchemy based AX interface for the OpenID Provider
  • Modified the openid_dbinterface egg to enable creation of a unique OpenID identifier based on a given database user table key
File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg_security_server/ndg/security/server/wsgi/openid/provider/__init__.py

    r5786 r5870  
    3030 
    3131from ndg.security.common.utils.classfactory import instantiateClass 
    32 from ndg.security.server.wsgi import NDGSecurityMiddlewareBase         
     32from ndg.security.server.wsgi import NDGSecurityMiddlewareBase   
     33 
     34 
     35class IdentityMapping(object): 
     36    """Utility class to map between user identifiers and OpenID URIs 
     37    The user identifier is the user unique component of an OpenID URI 
     38    """ 
     39    USER_IDENTIFIER_NAME = 'userIdentifier' 
     40     
     41    # Template substitution may or may not contain braces 
     42    USER_IDENTIFIER_RE = re.compile('\$\{?%s\}?' % USER_IDENTIFIER_NAME) 
     43     
     44    @classmethod 
     45    def userIdentifier2IdentityURI(cls, identityUriTmpl, userIdentifier): 
     46        """Convert an OpenID user identifier into an identity URI given a 
     47        template e.g. 
     48         
     49        https://${userIdentifier}.openid.ac.uk + pjk => https://pjk.openid.ac.uk 
     50        """ 
     51        mapping = {cls.USER_IDENTIFIER_NAME: userIdentifier} 
     52        tmpl = Template(identityUriTmpl) 
     53        return tmpl.substitute(mapping) 
     54         
     55    @classmethod 
     56    def identityUri2UserIdentifier(cls, identityUriTmpl, identityUri): 
     57        """Parse an OpenID user identifier from an identity URI given a 
     58        template e.g. 
     59         
     60        https://pjk.openid.ac.uk + https://${userIdentifier}.openid.ac.uk => pjk 
     61        """ 
     62        # Subtract start and end URI snippets from the template 
     63        try: 
     64            uriPrefix, uriSuffix = cls.USER_IDENTIFIER_RE.split(identityUriTmpl) 
     65        except ValueError: 
     66            raise OpenIDProviderConfigError('Error parsing identity URI %r ' 
     67                                            'using template %r' % 
     68                                            (identityUri, identityUriTmpl)) 
     69             
     70        if not identityUri.startswith(uriPrefix):  
     71            raise OpenIDProviderConfigError('Identity URI %r doesn\'t match ' 
     72                                            'the template prefix %r' % 
     73                                            (identityUri, uriPrefix)) 
     74             
     75        suffixIndex = identityUri.rfind(uriSuffix)     
     76        if suffixIndex == -1:  
     77            raise OpenIDProviderConfigError('Identity URI %r doesn\'t match ' 
     78                                            'the template suffix %r' % 
     79                                            (identityUri, uriSuffix)) 
     80         
     81        userIdentifier = identityUri[:suffixIndex].replace(uriPrefix, '', 1) 
     82        return userIdentifier 
     83  
     84# Place here to avoid circular import error with IdentityMapping class      
    3385from ndg.security.server.wsgi.openid.provider.authninterface import \ 
    3486    AbstractAuthNInterface, AuthNInterfaceError 
     
    748800                except Exception, e: 
    749801                    log.error("Unexpected %s type exception raised during " 
    750                               "authentication: %s" %  
    751                               e.__class__.__name__, 
     802                              "authentication: %s", type(e), 
    752803                              traceback.format_exc()) 
    753804                    msg = ("An internal error occurred.  " 
Note: See TracChangeset for help on using the changeset viewer.