1515
1616__author__ = 'Roland Hedberg'
1717
18- logger = logging .getLogger (__name__ )
18+ LOGGER = logging .getLogger (__name__ )
1919
2020
2121class Authorization (authorization .Authorization ):
@@ -105,7 +105,77 @@ def oidc_pre_construct(self, request_args=None, **kwargs):
105105
106106 return request_args , post_args
107107
108+ def get_request_object_signing_alg (self , ** kwargs ):
109+ alg = ''
110+ for arg in ["request_object_signing_alg" , "algorithm" ]:
111+ try : # Trumps everything
112+ alg = kwargs [arg ]
113+ except KeyError :
114+ pass
115+ else :
116+ break
117+
118+ if not alg :
119+ try :
120+ alg = self .service_context .behaviour [
121+ "request_object_signing_alg" ]
122+ except KeyError : # Use default
123+ alg = "RS256"
124+ return alg
125+
126+ def store_request_on_file (self , req , ** kwargs ):
127+ """
128+ Stores the request parameter in a file.
129+ :param req: The request
130+ :param kwargs: Extra keyword arguments
131+ :return: The URL the OP should use to access the file
132+ """
133+ try :
134+ _webname = self .service_context .registration_response ['request_uris' ][0 ]
135+ filename = self .service_context .filename_from_webname (_webname )
136+ except KeyError :
137+ filename , _webname = construct_request_uri (** kwargs )
138+
139+ fid = open (filename , mode = "w" )
140+ fid .write (req )
141+ fid .close ()
142+ return _webname
143+
144+ def construct_request_parameter (self , req , request_method , ** kwargs ):
145+ """Construct a request parameter"""
146+ alg = self .get_request_object_signing_alg (** kwargs )
147+ kwargs ["request_object_signing_alg" ] = alg
148+
149+ if "keys" not in kwargs and alg and alg != "none" :
150+ kwargs ["keys" ] = self .service_context .keyjar
151+
152+ _srv_cntx = self .service_context
153+ kwargs ['issuer' ] = _srv_cntx .client_id
154+ try :
155+ kwargs ['recv' ] = _srv_cntx .provider_info ['issuer' ]
156+ except KeyError :
157+ kwargs ['recv' ] = _srv_cntx .issuer
158+ del kwargs ['service' ]
159+
160+ _req = make_openid_request (req , ** kwargs )
161+
162+ # Should the request be encrypted
163+ _req = request_object_encryption (_req , self .service_context ,
164+ ** kwargs )
165+
166+ if request_method == "request" :
167+ req ["request" ] = _req
168+ else : # MUST be request_uri
169+ req ["request_uri" ] = self .store_request_on_file (_req , ** kwargs )
170+
108171 def oidc_post_construct (self , req , ** kwargs ):
172+ """
173+ Modify the request arguments.
174+
175+ :param req: The request
176+ :param kwargs: Extra keyword arguments
177+ :return: A possibly modified request.
178+ """
109179 if 'openid' in req ['scope' ]:
110180 _response_type = req ['response_type' ][0 ]
111181 if 'id_token' in _response_type or 'code' in _response_type :
@@ -122,61 +192,7 @@ def oidc_post_construct(self, req, **kwargs):
122192 else :
123193 del kwargs ['request_param' ]
124194
125- alg = ''
126- for arg in ["request_object_signing_alg" , "algorithm" ]:
127- try : # Trumps everything
128- alg = kwargs [arg ]
129- except KeyError :
130- pass
131- else :
132- break
133-
134- if not alg :
135- try :
136- alg = self .service_context .behaviour [
137- "request_object_signing_alg" ]
138- except KeyError : # Use default
139- alg = "RS256"
140-
141- kwargs ["request_object_signing_alg" ] = alg
142-
143- if "keys" not in kwargs and alg and alg != "none" :
144- # _kty = alg2keytype(alg)
145- # try:
146- # _kid = kwargs["sig_kid"]
147- # except KeyError:
148- # _kid = self.service_context.kid["sig"].get(_kty, None)
149-
150- kwargs ["keys" ] = self .service_context .keyjar
151-
152- _srv_cntx = self .service_context
153- kwargs ['issuer' ] = _srv_cntx .client_id
154- try :
155- kwargs ['recv' ] = _srv_cntx .provider_info ['issuer' ]
156- except KeyError :
157- kwargs ['recv' ] = _srv_cntx .issuer
158- del kwargs ['service' ]
159-
160- _req = make_openid_request (req , ** kwargs )
161-
162- # Should the request be encrypted
163- _req = request_object_encryption (_req , self .service_context ,
164- ** kwargs )
165-
166- if _request_method == "request" :
167- req ["request" ] = _req
168- else : # MUST be request_uri
169- try :
170- _webname = self .service_context .registration_response [
171- 'request_uris' ][0 ]
172- filename = self .service_context .filename_from_webname (
173- _webname )
174- except KeyError :
175- filename , _webname = construct_request_uri (** kwargs )
176- fid = open (filename , mode = "w" )
177- fid .write (_req )
178- fid .close ()
179- req ["request_uri" ] = _webname
195+ self .construct_request_parameter (req , _request_method , ** kwargs )
180196
181197 self .store_item (req , 'auth_request' , req ['state' ])
182198 return req
0 commit comments