Changeset 7474 for TI12-security


Ignore:
Timestamp:
10/09/10 16:46:22 (9 years ago)
Author:
pjkersha
Message:

Incomplete - task 13: OpenID Provider doesn't validate OpenID against username

  • Include fix from trunk enabling a return to URL to be specified as a query argument to the logout action. This is useful in cases where HTTP_REFERER is not set in environ.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/branches/ndg-security-1.5.x/ndg_security_server/ndg/security/server/wsgi/session.py

    r7119 r7474  
    1414log = logging.getLogger(__name__) 
    1515 
     16import urllib 
     17from paste.request import parse_querystring 
     18 
    1619from ndg.security.server.wsgi import (NDGSecurityMiddlewareBase, 
    1720                                      NDGSecurityMiddlewareError) 
     
    8386    SIGNOUT_PATH_PARAMNAME = 'signoutPath' 
    8487    SESSION_KEY_PARAMNAME = 'sessionKey' 
     88    DEFAULT_LOGOUT_RETURN2URI_PARAMNAME = 'defaultLogoutReturnToURI' 
    8589    propertyDefaults = { 
    8690        SIGNOUT_PATH_PARAMNAME: None, 
    87         SESSION_KEY_PARAMNAME: 'beaker.session.ndg.security' 
     91        SESSION_KEY_PARAMNAME: 'beaker.session.ndg.security', 
     92        DEFAULT_LOGOUT_RETURN2URI_PARAMNAME: '/' 
    8893    } 
    8994     
    9095    AUTH_TKT_SET_USER_ENVIRON_KEYNAME = 'paste.auth_tkt.set_user' 
     96     
     97    LOGOUT_RETURN2URI_ARGNAME = 'ndg.security.logout.r' 
     98    LOGOUT_REDIRECT_STATUS_CODE = 302 
    9199     
    92100    PARAM_PREFIX = 'sessionHandler.' 
     
    120128                raise SessionHandlerMiddlewareConfigError( 
    121129                                        '"signoutPath" parameter is not set') 
    122              
     130                 
     131        defaultLogoutReturnToURIParamName = prefix + \ 
     132                                        cls.DEFAULT_LOGOUT_RETURN2URI_PARAMNAME 
     133         
     134        self.__defaultLogoutReturnToURI = app_conf.get( 
     135                defaultLogoutReturnToURIParamName, 
     136                cls.propertyDefaults[cls.DEFAULT_LOGOUT_RETURN2URI_PARAMNAME]) 
     137                     
    123138        super(SessionHandlerMiddleware, self).__init__(app, 
    124139                                                       global_conf, 
     
    178193            session.pop(keyName, None) 
    179194        session.save() 
    180          
    181         referrer = environ.get('HTTP_REFERER') 
    182         if referrer is not None: 
    183             def _start_response(status, header, exc_info=None): 
    184                 """Alter the header to send a redirect to the logout 
    185                 referrer address""" 
    186                 filteredHeader = [(field, val) for field, val in header  
    187                                   if field.lower() != 'location']         
    188                 filteredHeader.extend([('Location', referrer)]) 
    189                 return start_response(self.getStatusMessage(302),  
    190                                       filteredHeader, 
    191                                       exc_info) 
    192                  
    193             return _start_response         
     195                
     196        if self.__class__.LOGOUT_RETURN2URI_ARGNAME in environ['QUERY_STRING']: 
     197            params = dict(parse_querystring(environ)) 
     198         
     199            # Store the return URI query argument in a beaker session 
     200            quotedReferrer = params.get( 
     201                                self.__class__.LOGOUT_RETURN2URI_ARGNAME, '') 
     202            referrer = urllib.unquote(quotedReferrer) 
     203             
     204            log.debug('Set redirect URI following logout based on %r URI query ' 
     205                      'string = %r',  
     206                      self.__class__.LOGOUT_RETURN2URI_ARGNAME, 
     207                      referrer) 
    194208        else: 
    195             log.error('No referrer set for redirect following logout') 
    196             return start_response 
     209            referrer = environ.get('HTTP_REFERER') 
     210            if referrer is None: 
     211                log.warning('No HTTP return to URI set for redirect following ' 
     212                            'logout, either via the return to query string %r ' 
     213                            'or the "HTTP_REFERER" environment variable: ' 
     214                            'redirecting based on the %r config file option = ' 
     215                            '%r',  
     216                            self.__class__.LOGOUT_RETURN2URI_ARGNAME, 
     217                            self.__class__.DEFAULT_LOGOUT_RETURN2URI_PARAMNAME, 
     218                            self.__defaultLogoutReturnToURI) 
     219                 
     220                referrer = self.__defaultLogoutReturnToURI 
     221            else: 
     222                log.debug('Set redirect URI following logout based on ' 
     223                          '"HTTP_REFERER" environment variable = %r', 
     224                          referrer) 
     225                 
     226        def _start_response(status, header, exc_info=None): 
     227            """Alter the header to send a redirect to the logout referrer  
     228            address""" 
     229             
     230            # Filter out any existing location field setting 
     231            filteredHeader = [(field, val) for field, val in header  
     232                              if field.lower() != 'location']   
     233             
     234            # Add redirect destination to new location field setting       
     235            filteredHeader.extend([('Location', referrer)]) 
     236             
     237            statusMsg = self.getStatusMessage( 
     238                                    self.__class__.LOGOUT_REDIRECT_STATUS_CODE) 
     239             
     240            return start_response(statusMsg, filteredHeader, exc_info) 
     241                 
     242        return _start_response 
    197243         
    198244    def _setSession(self, environ, session): 
Note: See TracChangeset for help on using the changeset viewer.