1818#
1919
2020require 'pathname'
21-
22- require "openid"
23- require 'openid/store/filesystem'
21+ require 'openid'
22+ require ( Chef ::Config [ :openid_cstore_couchdb ] ? 'openid-store-couchdb' : 'openid/store/filesystem' )
2423
2524class ChefServerSlice ::OpenidConsumer < ChefServerSlice ::Application
2625
@@ -29,14 +28,19 @@ class ChefServerSlice::OpenidConsumer < ChefServerSlice::Application
2928 def index
3029 render
3130 end
32-
31+
3332 def start
34- check_valid_openid_provider ( params [ :openid_identifier ] )
33+ oid = params [ :openid_identifier ]
34+ providers = Chef ::Config [ :openid_providers ]
35+ raise ( Unauthorized , "Sorry, #{ openid } is not an authorized OpenID." ) unless is_authorized_openid_identifier? ( oid , providers )
36+ raise ( Unauthorized , "Sorry, #{ openid } is not an allowed OpenID Provider." ) unless is_valid_openid_provider? ( oid , providers )
37+
3538 begin
36- oidreq = consumer . begin ( params [ :openid_identifier ] )
39+ oidreq = consumer . begin ( oid )
3740 rescue OpenID ::OpenIDError => e
3841 raise BadRequest , "Discovery failed for #{ params [ :openid_identifier ] } : #{ e } "
3942 end
43+
4044 return_to = absolute_slice_url ( :openid_consumer_complete )
4145 realm = absolute_slice_url ( :openid_consumer )
4246
@@ -49,36 +53,17 @@ def start
4953 end
5054
5155 def login
52- check_authorized_openid_identifier ( params [ :openid_identifier ] )
53- check_valid_openid_provider ( params [ :openid_identifier ] )
54- begin
55- oidreq = consumer . begin ( params [ :openid_identifier ] )
56- rescue OpenID ::OpenIDError => e
57- raise BadRequest , "Discovery failed for #{ params [ :openid_identifier ] } : #{ e } "
58- end
59- return_to = absolute_slice_url ( :openid_consumer_complete )
60- realm = absolute_slice_url ( :openid_consumer )
61-
62- if oidreq . send_redirect? ( realm , return_to , params [ :immediate ] )
63- return redirect ( oidreq . redirect_url ( realm , return_to , params [ :immediate ] ) )
64- else
65- @form_text = oidreq . form_markup ( realm , return_to , params [ :immediate ] , { 'id' => 'openid_form' } )
66- render
67- end
56+ start
6857 end
69-
58+
7059 def complete
7160 # FIXME - url_for some action is not necessarily the current URL.
7261 current_url = absolute_slice_url ( :openid_consumer_complete )
7362 parameters = params . reject { |k , v | k == "controller" || k == "action" }
7463 oidresp = consumer . complete ( parameters , current_url )
7564 case oidresp . status
7665 when OpenID ::Consumer ::FAILURE
77- if oidresp . display_identifier
78- raise BadRequest , "Verification of #{ oidresp . display_identifier } failed: #{ oidresp . message } "
79- else
80- raise BadRequest , "Verification failed: #{ oidresp . message } "
81- end
66+ raise BadRequest , "Verification failed: #{ oidresp . message } " + ( oidresp . display_identifier ? " for identifier '#{ oidresp . display_identifier } '" : "" )
8267 when OpenID ::Consumer ::SUCCESS
8368 session [ :openid ] = oidresp . identity_url
8469 if oidresp . display_identifier =~ /openid\/ server\/ node\/ (.+)$/
@@ -102,56 +87,31 @@ def complete
10287 end
10388
10489 def logout
105- session [ :openid ] = nil if session . has_key? ( :openid )
106- session [ :level ] = nil if session . has_key? ( :level )
107- session [ :node_name ] = nil if session . has_key? ( :node_name )
90+ [ :openid , :level , :node_name ] . each { |n | session . delete ( n ) }
10891 redirect slice_url ( :top )
10992 end
11093
11194 private
112-
95+ #
96+ #
97+
11398 # Returns true if the openid is at a valid provider, based on whether :openid_providers is
11499 # defined. Raises an exception if it is not an allowed provider.
115- def check_valid_openid_provider ( openid )
116- if Chef ::Config [ :openid_providers ]
117- fp = Chef ::Config [ :openid_providers ] . detect do |p |
118- case openid
119- when /^https?:\/ \/ #{ p } / , /^#{ p } /
120- true
121- else
122- false
123- end
124- end
125- unless fp
126- raise Unauthorized , "Sorry, #{ openid } is not an allowed OpenID Provider."
127- end
128- end
129- true
130- end
100+ def is_valid_openid_provider? ( openid , providers )
101+ ( providers && providers . detect { |p | openid =~ /^https?:\/ \/ #{ p } / or openid =~ /^#{ p } / } ) || true
102+ end
131103
132- def check_authorized_openid_identifier ( openid )
133- if Chef ::Config [ :authorized_openid_identifiers ]
134- fp = Chef ::Config [ :authorized_openid_identifiers ] . detect do |p |
135- case openid
136- when p
137- true
138- else
139- false
140- end
141- end
142- unless fp
143- raise Unauthorized , "Sorry, #{ openid } is not an authorized OpenID."
144- end
145- end
146- true
104+ def is_authorized_openid_identifier? ( openid , providers )
105+ ( providers && providers . detect { |p | openid ==p } ) || true
147106 end
148107
149108 def consumer
150- if @consumer . nil?
151- dir = Chef ::Config [ :openid_cstore_path ]
152- store = OpenID ::Store ::Filesystem . new ( dir )
153- @consumer = OpenID :: Consumer . new ( session , store )
154- end
155- return @consumer
109+ @consumer ||= OpenID :: Consumer . new ( session ,
110+ if Chef ::Config [ :openid_cstore_couchdb ]
111+ OpenID ::Store ::CouchDB . new ( Chef :: Config [ :couchdb_url ] )
112+ else
113+ OpenID :: Store :: Filesystem . new ( Chef :: Config [ :openid_cstore_path ] )
114+ end )
156115 end
116+
157117end
0 commit comments