@@ -111,201 +111,201 @@ def call(env)
111111
112112 private
113113
114- def sanitize_params! ( params )
115- [ 'openid.sig' , 'openid.response_nonce' ] . each do |param |
116- ( params [ param ] || '' ) . gsub! ( ' ' , '+' )
117- end
114+ def sanitize_params! ( params )
115+ [ 'openid.sig' , 'openid.response_nonce' ] . each do |param |
116+ ( params [ param ] || '' ) . gsub! ( ' ' , '+' )
118117 end
118+ end
119119
120- def begin_authentication ( env , qs )
121- req = Rack ::Request . new ( env )
122- params = self . class . parse_header ( qs )
123- session = env [ "rack.session" ]
120+ def begin_authentication ( env , qs )
121+ req = Rack ::Request . new ( env )
122+ params = self . class . parse_header ( qs )
123+ session = env [ "rack.session" ]
124124
125- unless session
126- raise RuntimeError , "Rack::OpenID requires a session"
127- end
125+ unless session
126+ raise RuntimeError , "Rack::OpenID requires a session"
127+ end
128128
129- consumer = ::OpenID ::Consumer . new ( session , @store )
130- identifier = params [ 'identifier' ] || params [ 'identity' ]
131-
132- begin
133- oidreq = consumer . begin ( identifier )
134- add_simple_registration_fields ( oidreq , params )
135- add_attribute_exchange_fields ( oidreq , params )
136- add_oauth_fields ( oidreq , params )
137- add_pape_fields ( oidreq , params )
138-
139- url = open_id_redirect_url ( req , oidreq , params )
140- return redirect_to ( url )
141- rescue ::OpenID ::OpenIDError , Timeout ::Error => e
142- env [ RESPONSE ] = MissingResponse . new
143- return @app . call ( env )
144- end
129+ consumer = ::OpenID ::Consumer . new ( session , @store )
130+ identifier = params [ 'identifier' ] || params [ 'identity' ]
131+
132+ begin
133+ oidreq = consumer . begin ( identifier )
134+ add_simple_registration_fields ( oidreq , params )
135+ add_attribute_exchange_fields ( oidreq , params )
136+ add_oauth_fields ( oidreq , params )
137+ add_pape_fields ( oidreq , params )
138+
139+ url = open_id_redirect_url ( req , oidreq , params )
140+ return redirect_to ( url )
141+ rescue ::OpenID ::OpenIDError , Timeout ::Error => e
142+ env [ RESPONSE ] = MissingResponse . new
143+ return @app . call ( env )
145144 end
145+ end
146146
147- def complete_authentication ( env )
148- req = Rack ::Request . new ( env )
149- session = env [ "rack.session" ]
147+ def complete_authentication ( env )
148+ req = Rack ::Request . new ( env )
149+ session = env [ "rack.session" ]
150150
151- unless session
152- raise RuntimeError , "Rack::OpenID requires a session"
153- end
151+ unless session
152+ raise RuntimeError , "Rack::OpenID requires a session"
153+ end
154154
155- oidresp = timeout_protection_from_identity_server {
156- consumer = ::OpenID ::Consumer . new ( session , @store )
157- consumer . complete ( flatten_params ( req . params ) , req . url )
158- }
155+ oidresp = timeout_protection_from_identity_server {
156+ consumer = ::OpenID ::Consumer . new ( session , @store )
157+ consumer . complete ( flatten_params ( req . params ) , req . url )
158+ }
159159
160- env [ RESPONSE ] = oidresp
160+ env [ RESPONSE ] = oidresp
161161
162- method = req . GET [ "_method" ]
163- override_request_method ( env , method )
162+ method = req . GET [ "_method" ]
163+ override_request_method ( env , method )
164164
165- sanitize_query_string ( env )
166- end
165+ sanitize_query_string ( env )
166+ end
167167
168- def flatten_params ( params )
169- Rack ::Utils . parse_query ( Rack ::Utils . build_nested_query ( params ) )
170- end
168+ def flatten_params ( params )
169+ Rack ::Utils . parse_query ( Rack ::Utils . build_nested_query ( params ) )
170+ end
171171
172- def override_request_method ( env , method )
173- return unless method
174- method = method . upcase
175- if HTTP_METHODS . include? ( method )
176- env [ "REQUEST_METHOD" ] = method
177- end
172+ def override_request_method ( env , method )
173+ return unless method
174+ method = method . upcase
175+ if HTTP_METHODS . include? ( method )
176+ env [ "REQUEST_METHOD" ] = method
178177 end
178+ end
179179
180- def sanitize_query_string ( env )
181- query_hash = env [ "rack.request.query_hash" ]
182- query_hash . delete ( "_method" )
183- query_hash . delete_if do |key , value |
184- key =~ /^openid\. /
185- end
186-
187- env [ "QUERY_STRING" ] = env [ "rack.request.query_string" ] =
188- Rack ::Utils . build_query ( env [ "rack.request.query_hash" ] )
189-
190- qs = env [ "QUERY_STRING" ]
191- request_uri = ( env [ "PATH_INFO" ] || "" ) . dup
192- request_uri << "?" + qs unless qs == ""
193- env [ "REQUEST_URI" ] = request_uri
180+ def sanitize_query_string ( env )
181+ query_hash = env [ "rack.request.query_hash" ]
182+ query_hash . delete ( "_method" )
183+ query_hash . delete_if do |key , value |
184+ key =~ /^openid\. /
194185 end
195186
196- def scheme_with_host_and_port ( req , host = nil )
197- url = req . scheme + "://"
198- url << ( host || req . host )
187+ env [ "QUERY_STRING" ] = env [ "rack.request.query_string" ] =
188+ Rack ::Utils . build_query ( env [ "rack.request.query_hash" ] )
199189
200- scheme , port = req . scheme , req . port
201- if scheme == "https" && port != 443 ||
202- scheme == "http" && port != 80
203- url << ":#{ port } "
204- end
190+ qs = env [ "QUERY_STRING" ]
191+ request_uri = ( env [ "PATH_INFO" ] || "" ) . dup
192+ request_uri << "?" + qs unless qs == ""
193+ env [ "REQUEST_URI" ] = request_uri
194+ end
195+
196+ def scheme_with_host_and_port ( req , host = nil )
197+ url = req . scheme + "://"
198+ url << ( host || req . host )
205199
206- url
200+ scheme , port = req . scheme , req . port
201+ if scheme == "https" && port != 443 ||
202+ scheme == "http" && port != 80
203+ url << ":#{ port } "
207204 end
208205
209- def realm ( req , domain = nil )
210- if domain
211- scheme_with_host_and_port ( req , domain )
212- else
213- scheme_with_host_and_port ( req )
214- end
206+ url
207+ end
215208
209+ def realm ( req , domain = nil )
210+ if domain
211+ scheme_with_host_and_port ( req , domain )
212+ else
213+ scheme_with_host_and_port ( req )
216214 end
217215
218- def request_url ( req )
219- url = scheme_with_host_and_port ( req )
220- url << req . script_name
221- url << req . path_info
222- url << "?#{ req . query_string } " if req . query_string . to_s . length > 0
223- url
224- end
216+ end
225217
226- def redirect_to ( url )
227- [ 303 , { "Content-Type" => "text/html" , "Location" => url } , [ ] ]
228- end
218+ def request_url ( req )
219+ url = scheme_with_host_and_port ( req )
220+ url << req . script_name
221+ url << req . path_info
222+ url << "?#{ req . query_string } " if req . query_string . to_s . length > 0
223+ url
224+ end
229225
230- def open_id_redirect_url ( req , oidreq , options )
231- trust_root = options [ "trust_root" ]
232- return_to = options [ "return_to" ]
233- method = options [ "method" ]
234- immediate = options [ "immediate" ] == "true"
226+ def redirect_to ( url )
227+ [ 303 , { "Content-Type" => "text/html" , "Location" => url } , [ ] ]
228+ end
235229
236- realm = realm ( req , options [ "realm_domain" ] )
237- request_url = request_url ( req )
230+ def open_id_redirect_url ( req , oidreq , options )
231+ trust_root = options [ "trust_root" ]
232+ return_to = options [ "return_to" ]
233+ method = options [ "method" ]
234+ immediate = options [ "immediate" ] == "true"
238235
239- if return_to
240- method ||= "get"
241- else
242- return_to = request_url
243- method ||= req . request_method
244- end
236+ realm = realm ( req , options [ "realm_domain" ] )
237+ request_url = request_url ( req )
245238
246- method = method . to_s . downcase
247- oidreq . return_to_args [ '_method' ] = method unless method == "get"
248- oidreq . redirect_url ( trust_root || realm , return_to || request_url , immediate )
239+ if return_to
240+ method ||= "get"
241+ else
242+ return_to = request_url
243+ method ||= req . request_method
249244 end
250245
251- def add_simple_registration_fields ( oidreq , fields )
252- sregreq = ::OpenID ::SReg ::Request . new
253-
254- required = Array ( fields [ 'required' ] ) . reject ( &URL_FIELD_SELECTOR )
255- sregreq . request_fields ( required , true ) if required . any?
246+ method = method . to_s . downcase
247+ oidreq . return_to_args [ '_method' ] = method unless method == "get"
248+ oidreq . redirect_url ( trust_root || realm , return_to || request_url , immediate )
249+ end
256250
257- optional = Array ( fields [ 'optional' ] ) . reject ( & URL_FIELD_SELECTOR )
258- sregreq . request_fields ( optional , false ) if optional . any?
251+ def add_simple_registration_fields ( oidreq , fields )
252+ sregreq = :: OpenID :: SReg :: Request . new
259253
260- policy_url = fields [ 'policy_url' ]
261- sregreq . policy_url = policy_url if policy_url
254+ required = Array ( fields [ 'required' ] ) . reject ( & URL_FIELD_SELECTOR )
255+ sregreq . request_fields ( required , true ) if required . any?
262256
263- oidreq . add_extension ( sregreq )
264- end
257+ optional = Array ( fields [ 'optional' ] ) . reject ( & URL_FIELD_SELECTOR )
258+ sregreq . request_fields ( optional , false ) if optional . any?
265259
266- def add_attribute_exchange_fields ( oidreq , fields )
267- axreq = :: OpenID :: AX :: FetchRequest . new
260+ policy_url = fields [ 'policy_url' ]
261+ sregreq . policy_url = policy_url if policy_url
268262
269- required = Array ( fields [ 'required' ] ) . select ( & URL_FIELD_SELECTOR )
270- optional = Array ( fields [ 'optional' ] ) . select ( & URL_FIELD_SELECTOR )
263+ oidreq . add_extension ( sregreq )
264+ end
271265
272- if required . any? || optional . any?
273- required . each do |field |
274- axreq . add ( ::OpenID ::AX ::AttrInfo . new ( field , nil , true ) )
275- end
266+ def add_attribute_exchange_fields ( oidreq , fields )
267+ axreq = ::OpenID ::AX ::FetchRequest . new
276268
277- optional . each do |field |
278- axreq . add ( ::OpenID ::AX ::AttrInfo . new ( field , nil , false ) )
279- end
269+ required = Array ( fields [ 'required' ] ) . select ( &URL_FIELD_SELECTOR )
270+ optional = Array ( fields [ 'optional' ] ) . select ( &URL_FIELD_SELECTOR )
280271
281- oidreq . add_extension ( axreq )
272+ if required . any? || optional . any?
273+ required . each do |field |
274+ axreq . add ( ::OpenID ::AX ::AttrInfo . new ( field , nil , true ) )
282275 end
283- end
284276
285- def add_oauth_fields ( oidreq , fields )
286- if ( consumer = fields [ 'oauth[consumer]' ] ) &&
287- ( scope = fields [ 'oauth[scope]' ] )
288- oauthreq = ::OpenID ::OAuth ::Request . new ( consumer , Array ( scope ) . join ( ' ' ) )
289- oidreq . add_extension ( oauthreq )
277+ optional . each do |field |
278+ axreq . add ( ::OpenID ::AX ::AttrInfo . new ( field , nil , false ) )
290279 end
280+
281+ oidreq . add_extension ( axreq )
291282 end
283+ end
292284
293- def add_pape_fields ( oidreq , fields )
294- preferred_auth_policies = fields [ 'pape[preferred_auth_policies]' ]
295- max_auth_age = fields [ 'pape[max_auth_age]' ]
296- if preferred_auth_policies || max_auth_age
297- preferred_auth_policies = preferred_auth_policies . split if preferred_auth_policies . is_a? ( String )
298- pape_request = ::OpenID ::PAPE ::Request . new ( preferred_auth_policies || [ ] , max_auth_age )
299- oidreq . add_extension ( pape_request )
300- end
285+ def add_oauth_fields ( oidreq , fields )
286+ if ( consumer = fields [ 'oauth[consumer]' ] ) &&
287+ ( scope = fields [ 'oauth[scope]' ] )
288+ oauthreq = ::OpenID ::OAuth ::Request . new ( consumer , Array ( scope ) . join ( ' ' ) )
289+ oidreq . add_extension ( oauthreq )
301290 end
291+ end
302292
303- def default_store
304- require 'openid/store/memory'
305- ::OpenID ::Store ::Memory . new
293+ def add_pape_fields ( oidreq , fields )
294+ preferred_auth_policies = fields [ 'pape[preferred_auth_policies]' ]
295+ max_auth_age = fields [ 'pape[max_auth_age]' ]
296+ if preferred_auth_policies || max_auth_age
297+ preferred_auth_policies = preferred_auth_policies . split if preferred_auth_policies . is_a? ( String )
298+ pape_request = ::OpenID ::PAPE ::Request . new ( preferred_auth_policies || [ ] , max_auth_age )
299+ oidreq . add_extension ( pape_request )
306300 end
301+ end
302+
303+ def default_store
304+ require 'openid/store/memory'
305+ ::OpenID ::Store ::Memory . new
306+ end
307307
308- def timeout_protection_from_identity_server
308+ def timeout_protection_from_identity_server
309309 yield
310310 rescue Timeout ::Error
311311 TimeoutResponse . new
0 commit comments