Changeset 6244


Ignore:
Timestamp:
24/12/09 12:09:19 (10 years ago)
Author:
pjkersha
Message:
 
File:
1 edited

Legend:

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

    r6243 r6244  
    201201        self._path = None 
    202202        self.mountPath = '/' 
     203         
     204        # See _createResponse method 
     205        self.oidResponse = None 
    203206 
    204207        opt = OpenIDProviderMiddleware.defOpt.copy() 
     
    665668                    } 
    666669                self.session.save() 
    667               
    668             try: 
    669                 oidResponse = self._identityApprovedPostProcessing(oidRequest, 
    670                                                                    identity) 
    671  
    672             except (OpenIDProviderMissingRequiredAXAttrs, 
    673                     OpenIDProviderMissingAXResponseHandler): 
    674                 log.error("%s type exception raised setting response " 
    675                           "following ID Approval: %s",  
    676                           e.__class__.__name__, 
    677                           traceback.format_exc()) 
     670             
     671            # Check for POST'ed user explicit setting of AX parameters 
     672            userAXSettings = [] 
     673            for fieldName in self.query: 
     674                if fieldName.startswith('ax.'): 
     675                    userAXSettings.append(self.query[fieldName]) 
     676             
     677            if userAXSettings: 
     678                # Get all the content namespaced as AX type 
     679                axArgs = self.oidResponse.fields.getArgs(ax.AXMessage.ns_uri) 
    678680                 
    679                 response = self._render.errorPage(environ, start_response, 
    680                         'The site where you wish to signin requires ' 
    681                         'additional information which this site isn\'t ' 
    682                         'configured to provide.  Please report this fault to ' 
    683                         'your site administrator.') 
    684                 return response 
     681                # Add to access object for convenient access based on type URI 
     682                axFetchResponse = ax.FetchResponse() 
     683                axFetchResponse.parseExtensionArgs(axArgs) 
     684                for i in axFetchResponse.data.keys(): 
     685                    if i not in userAXSettings: 
     686                        del axFetchResponse.data[i] 
    685687                     
    686             except Exception, e: 
    687                 log.error("%s type exception raised setting response " 
    688                           "following ID Approval: %s",  
    689                           e.__class__.__name__, 
    690                           traceback.format_exc()) 
    691                 return self._render.errorPage(environ, start_response, 
    692                         'An error occurred setting additional parameters ' 
    693                         'required by the site requesting your ID.  Please ' 
    694                         'report this fault to your site administrator.') 
    695             else: 
    696                 return self._displayResponse(oidResponse) 
     688            return self._displayResponse(self.oidResponse) 
    697689         
    698690        elif OpenIDProviderMiddleware.REJECT_RP_SUBMIT in self.query: 
     
    700692            # Party implementation to crash with 'openid.return_to' KeyError 
    701693            # in Authkit.authenticate.open_id.process 
    702             oidResponse = oidRequest.answer(False) 
    703             #return self._displayResponse(oidResponse) 
     694            self.oidResponse = oidRequest.answer(False) 
    704695            return self._render.mainPage(environ, start_response)             
    705696        else: 
     
    970961            OpenIDProviderMiddleware.IDENTITY_URI_SESSION_KEYNAME] 
    971962         
    972         oidResponse = self._identityApprovedPostProcessing(oidRequest, 
    973                                                         identifier=identityURI) 
     963        # Set the Response HERE to enable the inclusion of a user confirmation 
     964        # interface in the decide page so that the user can review the content 
     965        # of the response to be returned to the RP. 
     966        try: 
     967            self._createResponse(oidRequest, identifier=identityURI) 
     968                     
     969        except (OpenIDProviderMissingRequiredAXAttrs, 
     970                OpenIDProviderMissingAXResponseHandler): 
     971            response = self._render.errorPage(self.environ,  
     972                                              self.start_response, 
     973                'The site where you wish to signin requires ' 
     974                'additional information which this site isn\'t ' 
     975                'configured to provide.  Please report this fault to ' 
     976                'your site administrator.') 
     977            return response 
     978             
     979        except OpenIDProviderReloginRequired, e: 
     980            response = self._render.errorPage(self.environ,  
     981                                              self.start_response, 
     982                'An error occurred setting additional parameters required by ' 
     983                'the site requesting your ID.  Please try logging in again.') 
     984            return response 
     985             
     986        except Exception, e: 
     987            log.error("%s type exception raised setting response following ID " 
     988                      "Approval: %s", e.__class__.__name__,  
     989                      traceback.format_exc()) 
     990            response = self._render.errorPage(self.environ, 
     991                                              self.start_response, 
     992                'An error occurred setting additional parameters required by ' 
     993                'the site requesting your ID.  Please report this fault to ' 
     994                'your site administrator.') 
     995            return response 
    974996         
    975997        try: 
     
    977999                                           start_response,  
    9781000                                           oidRequest, 
    979                                            oidResponse) 
     1001                                           self.oidResponse) 
    9801002        except AuthNInterfaceError, e: 
    9811003            log.error("%s type exception raised calling decide page " 
     
    10431065        return approvedRoots.get(trust_root) is not None 
    10441066 
    1045     def _addSRegResponse(self, oidRequest, oidResponse): 
     1067    def _addSRegResponse(self, oidRequest): 
    10461068        '''Add Simple Registration attributes to response to Relying Party 
    10471069         
    10481070        @type oidRequest: openid.server.server.CheckIDRequest 
    1049         @param oidRequest: OpenID Check ID Request object 
    1050         @type oidResponse: openid.server.server.OpenIDResponse 
    1051         @param oidResponse: OpenID response object''' 
     1071        @param oidRequest: OpenID Check ID Request object''' 
    10521072         
    10531073        if self.sregResponseHandler is None: 
     
    10621082                            OpenIDProviderMiddleware.USERNAME_SESSION_KEYNAME)) 
    10631083        sreg_resp = sreg.SRegResponse.extractResponse(sreg_req, sreg_data) 
    1064         oidResponse.addExtension(sreg_resp) 
    1065  
    1066     def _addAXResponse(self, oidRequest, oidResponse): 
     1084        self.oidResponse.addExtension(sreg_resp) 
     1085 
     1086    def _addAXResponse(self, oidRequest): 
    10671087        '''Add attributes to response based on the OpenID Attribute Exchange  
    10681088        interface 
     
    10701090        @type oidRequest: openid.server.server.CheckIDRequest 
    10711091        @param oidRequest: OpenID Check ID Request object 
    1072         @type oidResponse: openid.server.server.OpenIDResponse 
    1073         @param oidResponse: OpenID response object''' 
     1092        ''' 
    10741093 
    10751094        ax_req = ax.FetchRequest.fromOpenIDRequest(oidRequest) 
     
    11171136         
    11181137        log.debug("Adding AX parameters to response: %s ...", ax_resp) 
    1119         oidResponse.addExtension(ax_resp) 
     1138        self.oidResponse.addExtension(ax_resp) 
    11201139        log.debug("Added AX parameters to response") 
    11211140         
    1122     def _identityApprovedPostProcessing(self, oidRequest, identifier=None): 
    1123         '''Action following approval of a Relying Party by the user.  Add 
     1141    def _createResponse(self, oidRequest, identifier=None): 
     1142        '''Create a response object from the input request and add 
    11241143        Simple Registration and/or Attribute Exchange parameters if handlers 
    11251144        were specified - See _addSRegResponse and _addAXResponse methods - and 
     
    11301149        @type identifier: basestring 
    11311150        @param identifier: OpenID selected by user - for ID Select mode only 
    1132         @rtype: openid.server.server.OpenIDResponse 
    1133         @return: OpenID response object''' 
    1134  
    1135         oidResponse = oidRequest.answer(True, identity=identifier) 
    1136         self._addSRegResponse(oidRequest, oidResponse) 
    1137         self._addAXResponse(oidRequest, oidResponse) 
    1138          
    1139         return oidResponse 
     1151        ''' 
     1152        self.oidResponse = oidRequest.answer(True, identity=identifier) 
     1153        self._addSRegResponse(oidRequest) 
     1154        self._addAXResponse(oidRequest) 
    11401155 
    11411156    def _handleCheckIDRequest(self, oidRequest): 
     
    11711186                # approved this Relying Party 
    11721187                try: 
    1173                     oidResponse = self._identityApprovedPostProcessing( 
    1174                                                                 oidRequest) 
     1188                    self._createResponse(oidRequest) 
     1189                     
    11751190                except (OpenIDProviderMissingRequiredAXAttrs, 
    11761191                        OpenIDProviderMissingAXResponseHandler): 
     
    12031218                    return response 
    12041219                 
    1205                 return self._displayResponse(oidResponse) 
     1220                return self._displayResponse(self.oidResponse) 
    12061221            else: 
    12071222                # This OpenID is being used for a login for the first time.   
Note: See TracChangeset for help on using the changeset viewer.