Changeset 5041


Ignore:
Timestamp:
26/02/09 12:27:31 (11 years ago)
Author:
pjkersha
Message:

Fix to accommodate AuthKit? OpenID URL handling. - Strip out return to query arg from HTTP_REFERER so that AuthKit? doesn't mistake it for a non-OpenID query.

File:
1 edited

Legend:

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

    r5037 r5041  
    1616import httplib # to get official status code messages 
    1717import urllib # decode quoted URI in query arg 
    18 from urlparse import urlparse 
     18from urlparse import urlsplit, urlunsplit 
    1919 
    2020from paste.request import parse_querystring, parse_formvars 
     
    2323 
    2424from ndg.security.server.wsgi import NDGSecurityMiddlewareBase 
     25from ndg.security.server.wsgi.authn import AuthNRedirectMiddleware 
    2526from ndg.security.common.utils.classfactory import instantiateClass 
    2627 
     
    105106                                                "AuthOpenIDHandler in the " 
    106107                                                "WSGI stack") 
    107              
     108         
     109        # Check for return to argument in query key value pairs 
     110        self._return2URIKey = AuthNRedirectMiddleware.return2URIArgName + '=' 
     111     
    108112        super(OpenIDRelyingPartyMiddleware, self).__init__(authKitApp,  
    109113                                                           global_conf,  
     
    131135            params = dict(parse_formvars(environ)) 
    132136         
    133         referer = urllib.unquote(params.get('ndg.security.r', '')) 
    134         refererPathInfo = urlparse(referer)[2] 
    135         if referer and \ 
    136            not refererPathInfo.endswith(self._authKitVerifyPath) and \ 
    137            not refererPathInfo.endswith(self._authKitProcessPath): 
     137        quotedReferrer=params.get(AuthNRedirectMiddleware.return2URIArgName,'') 
     138        referrer = urllib.unquote(quotedReferrer) 
     139        referrerPathInfo = urlsplit(referrer)[2] 
     140        if referrer and \ 
     141           not referrerPathInfo.endswith(self._authKitVerifyPath) and \ 
     142           not referrerPathInfo.endswith(self._authKitProcessPath): 
    138143            # Set-up for authkit.authenticate.open_id.AuthOpenIDHandler.process 
    139             session['referer'] = referer 
     144            session['referer'] = referrer 
    140145            session.save() 
    141                  
     146             
     147        if self._return2URIKey in environ.get('HTTP_REFERER', ''): 
     148            # Remove return to arg to avoid interfering with AuthKit OpenID 
     149            # processing 
     150            splitURI = urlsplit(environ['HTTP_REFERER']) 
     151            query = splitURI[3] 
     152             
     153            filteredQuery = '&'.join([arg for arg in query.split('&') 
     154                                if not arg.startswith(self._return2URIKey)]) 
     155             
     156            environ['HTTP_REFERER'] = urlunsplit(splitURI[:3] + \ 
     157                                                 (filteredQuery,) + \ 
     158                                                 splitURI[4:]) 
     159 
    142160        if self.signoutPath is not None and self.pathInfo == self.signoutPath: 
    143161            # TODO: Redirect to referrer ... 
    144             referer = session.get( 
     162            referrer = session.get( 
    145163                        'ndg.security.server.wsgi.openid.relyingparty.referer') 
    146             if referer is not None: 
     164            if referrer is not None: 
    147165                def setRedirectResponse(status, header, exc_info=None): 
    148                     header.extend([('Location', referer)]) 
    149                     return start_response('302 %s' % httplib.responses[302],  
     166                    header.extend([('Location', referrer)]) 
     167                    return start_response(self.getStatusMessage(302),  
    150168                                          header, 
    151169                                          exc_info) 
     
    153171                return self._app(environ, setRedirectResponse) 
    154172            else: 
    155                 log.debug('No referer set for redirect following logout') 
     173                log.debug('No referrer set for redirect following logout') 
    156174                 
    157175        # Set a return to address following logout.   
Note: See TracChangeset for help on using the changeset viewer.