ruby-openid 1.1.4 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. data/INSTALL +0 -9
  2. data/README +21 -22
  3. data/UPGRADE +117 -0
  4. data/admin/runtests.rb +36 -0
  5. data/examples/README +13 -21
  6. data/examples/active_record_openid_store/README +8 -3
  7. data/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb +4 -8
  8. data/examples/active_record_openid_store/XXX_upgrade_open_id_store.rb +26 -0
  9. data/examples/active_record_openid_store/lib/association.rb +2 -0
  10. data/examples/active_record_openid_store/lib/openid_ar_store.rb +22 -47
  11. data/examples/active_record_openid_store/test/store_test.rb +78 -48
  12. data/examples/discover +46 -0
  13. data/examples/{rails_server → rails_openid}/README +0 -0
  14. data/examples/{rails_server → rails_openid}/Rakefile +0 -0
  15. data/examples/{rails_server → rails_openid}/app/controllers/application.rb +0 -0
  16. data/examples/rails_openid/app/controllers/consumer_controller.rb +115 -0
  17. data/examples/{rails_server → rails_openid}/app/controllers/login_controller.rb +10 -2
  18. data/examples/rails_openid/app/controllers/server_controller.rb +265 -0
  19. data/examples/{rails_server → rails_openid}/app/helpers/application_helper.rb +0 -0
  20. data/examples/{rails_server → rails_openid}/app/helpers/login_helper.rb +0 -0
  21. data/examples/{rails_server → rails_openid}/app/helpers/server_helper.rb +0 -0
  22. data/examples/rails_openid/app/views/consumer/index.rhtml +81 -0
  23. data/examples/rails_openid/app/views/consumer/start.rhtml +8 -0
  24. data/examples/{rails_server → rails_openid}/app/views/layouts/server.rhtml +0 -0
  25. data/examples/{rails_server → rails_openid}/app/views/login/index.rhtml +1 -1
  26. data/examples/rails_openid/app/views/server/decide.rhtml +26 -0
  27. data/examples/{rails_server → rails_openid}/config/boot.rb +0 -0
  28. data/examples/{rails_server → rails_openid}/config/database.yml +0 -0
  29. data/examples/{rails_server → rails_openid}/config/environment.rb +0 -0
  30. data/examples/{rails_server → rails_openid}/config/environments/development.rb +0 -0
  31. data/examples/{rails_server → rails_openid}/config/environments/production.rb +0 -0
  32. data/examples/{rails_server → rails_openid}/config/environments/test.rb +0 -0
  33. data/examples/{rails_server → rails_openid}/config/routes.rb +2 -1
  34. data/examples/{rails_server → rails_openid}/doc/README_FOR_APP +0 -0
  35. data/examples/{rails_server → rails_openid}/public/404.html +0 -0
  36. data/examples/{rails_server → rails_openid}/public/500.html +0 -0
  37. data/examples/{rails_server → rails_openid}/public/dispatch.cgi +0 -0
  38. data/examples/{rails_server → rails_openid}/public/dispatch.fcgi +0 -0
  39. data/examples/{rails_server → rails_openid}/public/dispatch.rb +0 -0
  40. data/examples/{rails_server → rails_openid}/public/favicon.ico +0 -0
  41. data/examples/rails_openid/public/images/openid_login_bg.gif +0 -0
  42. data/examples/{rails_server → rails_openid}/public/javascripts/controls.js +0 -0
  43. data/examples/{rails_server → rails_openid}/public/javascripts/dragdrop.js +0 -0
  44. data/examples/{rails_server → rails_openid}/public/javascripts/effects.js +0 -0
  45. data/examples/{rails_server → rails_openid}/public/javascripts/prototype.js +0 -0
  46. data/examples/{rails_server → rails_openid}/public/robots.txt +0 -0
  47. data/examples/{rails_server → rails_openid}/script/about +0 -0
  48. data/examples/{rails_server → rails_openid}/script/breakpointer +0 -0
  49. data/examples/{rails_server → rails_openid}/script/console +0 -0
  50. data/examples/{rails_server → rails_openid}/script/destroy +0 -0
  51. data/examples/{rails_server → rails_openid}/script/generate +0 -0
  52. data/examples/{rails_server → rails_openid}/script/performance/benchmarker +0 -0
  53. data/examples/{rails_server → rails_openid}/script/performance/profiler +0 -0
  54. data/examples/{rails_server → rails_openid}/script/plugin +0 -0
  55. data/examples/{rails_server → rails_openid}/script/process/reaper +0 -0
  56. data/examples/{rails_server → rails_openid}/script/process/spawner +0 -0
  57. data/examples/{rails_server → rails_openid}/script/process/spinner +0 -0
  58. data/examples/{rails_server → rails_openid}/script/runner +0 -0
  59. data/examples/{rails_server → rails_openid}/script/server +0 -0
  60. data/examples/{rails_server → rails_openid}/test/functional/login_controller_test.rb +0 -0
  61. data/examples/{rails_server → rails_openid}/test/functional/server_controller_test.rb +0 -0
  62. data/examples/{rails_server → rails_openid}/test/test_helper.rb +0 -0
  63. data/lib/{hmac.rb → hmac/hmac.rb} +0 -0
  64. data/lib/{hmac-sha1.rb → hmac/sha1.rb} +1 -1
  65. data/lib/{hmac-sha2.rb → hmac/sha2.rb} +1 -1
  66. data/lib/openid/association.rb +213 -73
  67. data/lib/openid/consumer/associationmanager.rb +338 -0
  68. data/lib/openid/consumer/checkid_request.rb +175 -0
  69. data/lib/openid/consumer/discovery.rb +480 -0
  70. data/lib/openid/consumer/discovery_manager.rb +123 -0
  71. data/lib/openid/consumer/html_parse.rb +136 -0
  72. data/lib/openid/consumer/idres.rb +525 -0
  73. data/lib/openid/consumer/responses.rb +133 -0
  74. data/lib/openid/consumer.rb +280 -807
  75. data/lib/openid/cryptutil.rb +85 -0
  76. data/lib/openid/dh.rb +60 -23
  77. data/lib/openid/extension.rb +31 -0
  78. data/lib/openid/extensions/ax.rb +506 -0
  79. data/lib/openid/extensions/pape.rb +182 -0
  80. data/lib/openid/extensions/sreg.rb +275 -0
  81. data/lib/openid/extras.rb +11 -0
  82. data/lib/openid/fetchers.rb +132 -93
  83. data/lib/openid/kvform.rb +133 -0
  84. data/lib/openid/kvpost.rb +56 -0
  85. data/lib/openid/message.rb +534 -0
  86. data/lib/openid/protocolerror.rb +6 -0
  87. data/lib/openid/server.rb +1215 -666
  88. data/lib/openid/store/filesystem.rb +271 -0
  89. data/lib/openid/store/interface.rb +75 -0
  90. data/lib/openid/store/memory.rb +84 -0
  91. data/lib/openid/store/nonce.rb +68 -0
  92. data/lib/openid/trustroot.rb +314 -87
  93. data/lib/openid/urinorm.rb +37 -34
  94. data/lib/openid/util.rb +42 -220
  95. data/lib/openid/yadis/accept.rb +148 -0
  96. data/lib/openid/yadis/constants.rb +21 -0
  97. data/lib/openid/yadis/discovery.rb +153 -0
  98. data/lib/openid/yadis/filters.rb +205 -0
  99. data/lib/openid/{htmltokenizer.rb → yadis/htmltokenizer.rb} +1 -54
  100. data/lib/openid/yadis/parsehtml.rb +36 -0
  101. data/lib/openid/yadis/services.rb +42 -0
  102. data/lib/openid/yadis/xrds.rb +171 -0
  103. data/lib/openid/yadis/xri.rb +90 -0
  104. data/lib/openid/yadis/xrires.rb +106 -0
  105. data/lib/openid.rb +1 -4
  106. data/test/data/accept.txt +124 -0
  107. data/test/data/dh.txt +29 -0
  108. data/test/data/example-xrds.xml +14 -0
  109. data/test/data/linkparse.txt +587 -0
  110. data/test/data/n2b64 +650 -0
  111. data/test/data/test1-discover.txt +137 -0
  112. data/test/data/test1-parsehtml.txt +128 -0
  113. data/test/data/test_discover/openid.html +11 -0
  114. data/test/data/test_discover/openid2.html +11 -0
  115. data/test/data/test_discover/openid2_xrds.xml +12 -0
  116. data/test/data/test_discover/openid2_xrds_no_local_id.xml +11 -0
  117. data/test/data/test_discover/openid_1_and_2.html +11 -0
  118. data/test/data/test_discover/openid_1_and_2_xrds.xml +16 -0
  119. data/test/data/test_discover/openid_1_and_2_xrds_bad_delegate.xml +17 -0
  120. data/test/data/test_discover/openid_and_yadis.html +12 -0
  121. data/test/data/test_discover/openid_no_delegate.html +10 -0
  122. data/test/data/test_discover/yadis_0entries.xml +12 -0
  123. data/test/data/test_discover/yadis_2_bad_local_id.xml +15 -0
  124. data/test/data/test_discover/yadis_2entries_delegate.xml +22 -0
  125. data/test/data/test_discover/yadis_2entries_idp.xml +21 -0
  126. data/test/data/test_discover/yadis_another_delegate.xml +14 -0
  127. data/test/data/test_discover/yadis_idp.xml +12 -0
  128. data/test/data/test_discover/yadis_idp_delegate.xml +13 -0
  129. data/test/data/test_discover/yadis_no_delegate.xml +11 -0
  130. data/test/data/test_xrds/=j3h.2007.11.14.xrds +25 -0
  131. data/test/data/test_xrds/README +12 -0
  132. data/test/data/test_xrds/delegated-20060809-r1.xrds +34 -0
  133. data/test/data/test_xrds/delegated-20060809-r2.xrds +34 -0
  134. data/test/data/test_xrds/delegated-20060809.xrds +34 -0
  135. data/test/data/test_xrds/no-xrd.xml +7 -0
  136. data/test/data/test_xrds/not-xrds.xml +2 -0
  137. data/test/data/test_xrds/prefixsometimes.xrds +34 -0
  138. data/test/data/test_xrds/ref.xrds +109 -0
  139. data/test/data/test_xrds/sometimesprefix.xrds +34 -0
  140. data/test/data/test_xrds/spoof1.xrds +25 -0
  141. data/test/data/test_xrds/spoof2.xrds +25 -0
  142. data/test/data/test_xrds/spoof3.xrds +37 -0
  143. data/test/data/test_xrds/status222.xrds +9 -0
  144. data/test/data/test_xrds/valid-populated-xrds.xml +39 -0
  145. data/test/data/trustroot.txt +147 -0
  146. data/test/discoverdata.rb +131 -0
  147. data/test/test_accept.rb +170 -0
  148. data/test/test_association.rb +266 -0
  149. data/test/test_associationmanager.rb +899 -0
  150. data/test/test_ax.rb +587 -0
  151. data/test/test_checkid_request.rb +297 -0
  152. data/test/test_consumer.rb +257 -0
  153. data/test/test_cryptutil.rb +117 -0
  154. data/test/test_dh.rb +86 -0
  155. data/test/test_discover.rb +772 -0
  156. data/test/test_discovery_manager.rb +262 -0
  157. data/test/test_extras.rb +35 -0
  158. data/test/test_fetchers.rb +472 -0
  159. data/test/test_filters.rb +270 -0
  160. data/test/test_idres.rb +816 -0
  161. data/test/test_kvform.rb +165 -0
  162. data/test/test_kvpost.rb +65 -0
  163. data/test/test_linkparse.rb +101 -0
  164. data/test/test_message.rb +1058 -0
  165. data/test/test_nonce.rb +89 -0
  166. data/test/test_openid_yadis.rb +178 -0
  167. data/test/test_pape.rb +233 -0
  168. data/test/test_parsehtml.rb +80 -0
  169. data/test/test_responses.rb +63 -0
  170. data/test/test_server.rb +2270 -0
  171. data/test/test_sreg.rb +479 -0
  172. data/test/test_stores.rb +269 -0
  173. data/test/test_trustroot.rb +112 -0
  174. data/test/{urinorm.rb → test_urinorm.rb} +6 -3
  175. data/test/test_util.rb +144 -0
  176. data/test/test_xrds.rb +160 -0
  177. data/test/test_xri.rb +48 -0
  178. data/test/test_xrires.rb +63 -0
  179. data/test/test_yadis_discovery.rb +207 -0
  180. data/test/testutil.rb +116 -0
  181. data/test/util.rb +47 -50
  182. metadata +233 -143
  183. data/examples/consumer.rb +0 -290
  184. data/examples/rails_openid_login_generator/openid_login_generator-0.1.gem +0 -0
  185. data/examples/rails_server/app/controllers/server_controller.rb +0 -190
  186. data/examples/rails_server/app/views/server/decide.rhtml +0 -11
  187. data/examples/rails_server/public/images/rails.png +0 -0
  188. data/lib/hmac-md5.rb +0 -11
  189. data/lib/hmac-rmd160.rb +0 -11
  190. data/lib/openid/discovery.rb +0 -122
  191. data/lib/openid/filestore.rb +0 -315
  192. data/lib/openid/parse.rb +0 -23
  193. data/lib/openid/service.rb +0 -147
  194. data/lib/openid/stores.rb +0 -178
  195. data/test/assoc.rb +0 -38
  196. data/test/consumer.rb +0 -376
  197. data/test/data/brian.xrds +0 -16
  198. data/test/data/brianellin.mylid.xrds +0 -42
  199. data/test/dh.rb +0 -20
  200. data/test/extensions.rb +0 -30
  201. data/test/linkparse.rb +0 -305
  202. data/test/runtests.rb +0 -22
  203. data/test/server2.rb +0 -1053
  204. data/test/service.rb +0 -47
  205. data/test/storetestcase.rb +0 -172
  206. data/test/teststore.rb +0 -47
  207. data/test/trustroot.rb +0 -117
data/examples/consumer.rb DELETED
@@ -1,290 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require "cgi"
3
- require "uri"
4
- require "pathname"
5
-
6
- require "webrick"
7
- include WEBrick
8
-
9
- # load the openid library, first trying rubygems
10
- begin
11
- require "openid"
12
- rescue LoadError
13
- require "rubygems"
14
- require_gem "ruby-openid"
15
- end
16
-
17
- ################ start config ##########################
18
- # use your desired store implementation here.
19
- store_dir = Pathname.new(Dir.tmpdir).join("openid-store")
20
- store = OpenID::FilesystemStore.new(store_dir)
21
-
22
- $host = "localhost"
23
- $port = 2000
24
- ################ end config ############################
25
-
26
- if $port.nil?
27
- $base_url = "http://#{$host}/"
28
- else
29
- $base_url = "http://#{$host}:#{$port}/"
30
- end
31
-
32
- # NOTE: Please note that a Hash is not a valid session storage type, it is just
33
- # used here to get something that works. In a production environment this
34
- # should be an object representing the CURRENT USER's session, NOT a global
35
- # hash. Every user visiting this running consumer.rb will write into this
36
- # same hash.
37
- $session = {}
38
-
39
- $trust_root = $base_url
40
- $consumer = OpenID::Consumer.new($session, store)
41
-
42
- server = HTTPServer.new(:Port=>$port)
43
- class SimpleServlet < HTTPServlet::AbstractServlet
44
-
45
- def do_GET(req, res)
46
- @req = req
47
- @res = res
48
-
49
- begin
50
- case req.path
51
- when "", "/", "/start"
52
- self.render
53
- when "/begin"
54
- self.do_begin
55
- when "/complete"
56
- self.do_complete
57
- when '/policy'
58
- self.do_policy
59
- else
60
- self.redirect(self.build_url("/"))
61
- end
62
- ensure
63
- @req = nil
64
- @res = nil
65
- end
66
- end
67
-
68
- def do_begin
69
- # First make sure the user entered something
70
- openid_url = @req.query.fetch("openid_url", "")
71
-
72
- if openid_url.empty?
73
- self.render("Enter an identity URL to verify",
74
- css_class="error", form_contents=openid_url)
75
- return HTTPStatus::Success
76
- end
77
-
78
- # Then ask the openid library to begin the authorization
79
- request = $consumer.begin(openid_url)
80
-
81
- # If the URL was unusable (either because of network conditions,
82
- # a server error, or that the response returned was not an OpenID
83
- # identity page), the library will return HTTP_FAILURE or PARSE_ERROR.
84
- # Let the user know that the URL is unusable.
85
- case request.status
86
- when OpenID::FAILURE
87
- self.render("Unable to find openid server for <q>#{openid_url}</q>",
88
- css_class="error", form_contents=openid_url)
89
- return HTTPStatus::Success
90
-
91
- when OpenID::SUCCESS
92
- # The URL was a valid identity URL. Now we just need to send a redirect
93
- # to the server using the redirect_url the library created for us.
94
-
95
- # check to see if we want to make an SREG request. Generally this will
96
- # not take the form of a checkbox, but will be part of your site policy.
97
- # For example, you may perform an sreg request if the user appears
98
- # to be new to the site. The checkbox is here for convenience of
99
- # testing.
100
- do_sreg = @req.query.fetch('sreg', nil)
101
-
102
- if do_sreg
103
- policy_url = self.build_url('/policy')
104
- request.add_extension_arg('sreg','policy_url', policy_url)
105
- request.add_extension_arg('sreg','required','email,nickname')
106
- request.add_extension_arg('sreg','optional','fullname,dob,gender,postcode,country')
107
- end
108
-
109
- if do_sreg
110
- extra = {'did_sreg' => 'true'}
111
- else
112
- extra = {}
113
- end
114
-
115
- return_to = self.build_url("/complete", extra)
116
-
117
- # build the redirect
118
- redirect_url = request.redirect_url($trust_root, return_to)
119
-
120
- # send redirect to the server
121
- self.redirect(redirect_url)
122
- else
123
- # Should never get here
124
- raise "Not Reached"
125
- end
126
- end
127
-
128
- # handle the redirect from the OpenID server
129
- def do_complete
130
- # Ask the library to check the response that the server sent
131
- # us. Status is a code indicating the response type. info is
132
- # either nil or a string containing more information about
133
- # the return type.
134
- response = $consumer.complete(@req.query)
135
-
136
- css_class = "error"
137
-
138
- did_sreg = @req.query.fetch('did_sreg', nil)
139
- sreg_checked = did_sreg ? 'checked="checked"' : ''
140
-
141
- if response.status == OpenID::FAILURE
142
- # In the case of failure, if info is non-nil, it is the
143
- # URL that we were verifying. We include it in the error
144
- # message to help the user figure out what happened.
145
- if response.identity_url
146
- message = "Verification of #{response.identity_url} failed"
147
- else
148
- message = 'Verification failed.'
149
- end
150
-
151
- # add on the failure message for a little debug info
152
- message += ' '+response.msg.to_s
153
-
154
- elsif response.status == OpenID::SUCCESS
155
- # Success means that the transaction completed without
156
- # error. If info is nil, it means that the user cancelled
157
- # the verification.
158
- css_class = "alert"
159
-
160
- message = "You have successfully verified #{response.identity_url} as your identity."
161
-
162
- # get the signed extension sreg arguments
163
- sreg = response.extension_response('sreg')
164
- if sreg.length > 0
165
- message += "<hr/> With simple registration fields:<br/>"
166
- sreg.keys.sort.each {|k| message += "<br/><b>#{k}</b>: #{sreg[k]}"}
167
- elsif did_sreg
168
- message += "<hr/> But the server does not support simple registration."
169
- end
170
-
171
- elsif response.status == OpenID::CANCEL
172
- message = "Verification cancelled."
173
-
174
- else
175
- message = "Unknown response status: #{response.status}"
176
-
177
- end
178
- self.render(message, css_class, response.identity_url, sreg_checked)
179
- end
180
-
181
- def do_policy
182
- @res.body = <<END
183
- <html>
184
- <head></head>
185
- <body>
186
- <h3>Ruby Consumer Simple Registration Policy</h3>
187
- <p>This consumer makes a simple registration request for the following fields:<br/><br/>
188
- <b>Required:</b> email, nickname<br/>
189
- <b>Optional:</b> fullname, dob, gender, postcode, country<br/><br/>
190
- Nothing is actually done with the data provided, it simply exists to illustrate the simple registration protocol.
191
- </p>
192
- </body>
193
- </html>
194
-
195
- END
196
- end
197
-
198
- # build a URL relative to the server base URL, with the given query
199
- # parameters added.
200
- def build_url(action, query=nil)
201
- url = URI.parse($base_url).merge(action).to_s
202
- url = OpenID::Util.append_args(url, query) unless query.nil?
203
- return url
204
- end
205
-
206
- def redirect(url)
207
- @res.set_redirect(HTTPStatus::TemporaryRedirect, url)
208
- end
209
-
210
- def render(message=nil, css_class="alert", form_contents="", checked="")
211
- @res.body = self.page_header
212
- unless message.nil?
213
- @res.body << "<div class=\"#{css_class}\">#{message}</div>"
214
- end
215
- @res.body << self.page_footer(form_contents, checked)
216
- end
217
-
218
- def page_header(title="Ruby OpenID WEBrick example")
219
- header = <<END_OF_STRING
220
- <html>
221
- <head><title>#{title}</title></head>
222
- <style type="text/css">
223
- * {
224
- font-family: verdana,sans-serif;
225
- }
226
- body {
227
- width: 50em;
228
- margin: 1em;
229
- }
230
- div {
231
- padding: .5em;
232
- }
233
- table {
234
- margin: none;
235
- padding: none;
236
- }
237
- .alert {
238
- border: 1px solid #e7dc2b;
239
- background: #fff888;
240
- }
241
- .error {
242
- border: 1px solid #ff0000;
243
- background: #ffaaaa;
244
- }
245
- #verify-form {
246
- border: 1px solid #777777;
247
- background: #dddddd;
248
- margin-top: 1em;
249
- padding-bottom: 0em;
250
- }
251
- </style>
252
- <body>
253
- <h1>#{title}</h1>
254
- <p>
255
- This example consumer uses the <a href="http://openidenabled.com/openid/libraries/ruby">Ruby OpenID</a> library
256
- on a WEBrick platform. The example just verifies that the URL that
257
- you enter is your identity URL.
258
- </p>
259
- END_OF_STRING
260
- end
261
-
262
-
263
- def page_footer(form_contents="", checked="")
264
- form_contents = "" if form_contents == "/"
265
- footer = <<END_OF_STRING
266
- <div id="verify-form">
267
- <form method="get" action="#{self.build_url("/begin")}">
268
- Identity&nbsp;URL:
269
- <input type="text" name="openid_url" value="#{form_contents}" />
270
- <input type="submit" value="Verify" />
271
- <input type="checkbox" id="sregbox" name="sreg" #{checked} />
272
- <label for="sregbox">with simple registration</label>
273
- <a href="http://www.openidenabled.com/openid/simple-registration-extension" target="_blank">?</a>
274
- </form>
275
- </div>
276
- </body>
277
- </html>
278
- END_OF_STRING
279
- end
280
-
281
-
282
-
283
- end
284
-
285
- # Bootstrap the example
286
- server.mount("/", SimpleServlet)
287
- trap("INT") {server.shutdown}
288
- print "\nVisit http://#{$host}:#{$port}/ in your browser.\n\n"
289
- server.start
290
-
@@ -1,190 +0,0 @@
1
- require 'pathname'
2
-
3
- # load the openid library, first trying rubygems
4
- begin
5
- require "rubygems"
6
- require_gem "ruby-openid", ">= 1.0"
7
- rescue LoadError
8
- require "openid"
9
- end
10
-
11
- class ServerController < ApplicationController
12
-
13
- include ServerHelper
14
- include OpenID::Server
15
- layout nil
16
-
17
- def index
18
- begin
19
- request = server.decode_request(@params)
20
- rescue ProtocolError => e
21
- # invalid openid request, so just display a page with an error message
22
- render_text e.to_s
23
- return
24
- end
25
-
26
- # no openid.mode was given
27
- unless request
28
- render_text "This is an OpenID server endpoint."
29
- return
30
- end
31
-
32
- if request.kind_of?(CheckIDRequest)
33
-
34
- if self.is_authorized(request.identity_url, request.trust_root)
35
- response = request.answer(true)
36
-
37
- # add the sreg response if requested
38
- self.add_sreg(request, response)
39
-
40
- elsif request.immediate
41
- server_url = url_for :action => 'index'
42
- response = request.answer(false, server_url)
43
-
44
- else
45
- @session[:last_request] = request
46
- @request = request
47
- flash[:notice] = "Do you trust this site with your identity?"
48
- render :template => 'server/decide', :layout => 'server'
49
- return
50
- end
51
-
52
- else
53
- response = server.handle_request(request)
54
- end
55
-
56
- self.render_response(response)
57
- end
58
-
59
- def user_page
60
- # Yadis content-negotiation: we want to return the xrds if asked for.
61
- accept = request.env['HTTP_ACCEPT']
62
-
63
- # This is not technically correct, and should eventually be updated
64
- # to do real Accept header parsing and logic. Though I expect it will work
65
- # 99% of the time.
66
- if accept and accept.include?('application/xrds+xml')
67
- render_xrds
68
- return
69
- end
70
-
71
- # content negotiation failed, so just render the user page
72
- xrds_url = url_for(:controller=>'user',:action=>@params[:username])+'/xrds'
73
- identity_page = <<EOS
74
- <html><head>
75
- <meta http-equiv="X-XRDS-Location" content="#{xrds_url}" />
76
- <link rel="openid.server" href="#{url_for :action => 'index'}" />
77
- </head><body><p>OpenID identity page for #{@params[:username]}</p>
78
- </body></html>
79
- EOS
80
-
81
- # Also add the Yadis location header, so that they don't have
82
- # to parse the html unless absolutely necessary.
83
- response.headers['X-XRDS-Location'] = xrds_url
84
- render_text identity_page
85
- end
86
-
87
- def xrds
88
- render_xrds
89
- end
90
-
91
- def decision
92
- request = @session[:last_request]
93
- @session[:last_request] = nil
94
-
95
- if @params[:yes].nil?
96
- redirect_to request.cancel_url
97
- return
98
- else
99
- session[:approvals] << request.trust_root
100
- response = request.answer(true)
101
- self.add_sreg(request, response)
102
- return self.render_response(response)
103
- end
104
- end
105
-
106
- protected
107
-
108
- def server
109
- if @server.nil?
110
- dir = Pathname.new(RAILS_ROOT).join('db').join('openid-store')
111
- store = OpenID::FilesystemStore.new(dir)
112
- @server = Server.new(store)
113
- end
114
- return @server
115
- end
116
-
117
- def approved(trust_root)
118
- return false if session[:approvals].nil?
119
- return session[:approvals].member?(trust_root)
120
- end
121
-
122
- def is_authorized(identity_url, trust_root)
123
- return (session[:username] and (identity_url == url_for_user) and self.approved(trust_root))
124
- end
125
-
126
- def render_xrds
127
- yadis = <<EOS
128
- <?xml version="1.0" encoding="UTF-8"?>
129
- <xrds:XRDS
130
- xmlns:xrds="xri://$xrds"
131
- xmlns:openid="http://openid.net/xmlns/1.0"
132
- xmlns="xri://$xrd*($v*2.0)">
133
- <XRD>
134
- <Service priority="1">
135
- <Type>http://openid.net/signon/1.0</Type>
136
- <Type>http://openid.net/sreg/1.0</Type>
137
- <URI>#{url_for(:controller => 'server')}</URI>
138
- </Service>
139
- </XRD>
140
- </xrds:XRDS>
141
- EOS
142
-
143
- response.headers['content-type'] = 'application/xrds+xml'
144
- render_text yadis
145
- end
146
-
147
- def add_sreg(request, response)
148
- # Your code should examine request.query
149
- # for openid.sreg.required, openid.sreg.optional, and
150
- # openid.sreg.policy_url, and generate add fields to your response
151
- # accordingly. For this example, we'll just see if there are any
152
- # sreg args and add some sreg data to the response. Take note,
153
- # that this does not actually respect the sreg query, it just sends
154
- # back some fake sreg data. Your implemetation should be better! :)
155
-
156
- required = request.query['openid.sreg.required']
157
- optional = request.query['openid.sreg.optional']
158
- policy_url = request.query['openid.sreg.policy_url']
159
-
160
- if required or optional or policy_url
161
- # this should be taken out of the user's profile,
162
- # but since we don't have one lets just make up some data.
163
- # Also, the user should be able to approve the transfer
164
- # and modify each field if she likes.
165
- sreg_fields = {
166
- 'email' => 'mayor@example.com',
167
- 'nickname' => 'Mayor McCheese'
168
- }
169
- response.add_fields('sreg', sreg_fields)
170
- end
171
-
172
- end
173
-
174
- def render_response(response)
175
- web_response = server.encode_response(response)
176
-
177
- case web_response.code
178
- when HTTP_OK
179
- render_text web_response.body, :status => 200
180
-
181
- when HTTP_REDIRECT
182
- redirect_to web_response.redirect_url
183
-
184
- else
185
- render_text web_response.body, :status => 400
186
- end
187
- end
188
-
189
-
190
- end
@@ -1,11 +0,0 @@
1
- <table>
2
- <tr><td>Identity:</td><td><%= @request.identity_url %></td></tr>
3
- <tr><td>Site:</td><td><%= @request.trust_root %></td></tr>
4
- </table>
5
-
6
- <form method="post" action="<%= url_for :controller => 'server', :action => 'decision' %>">
7
-
8
- <input type="submit" name="yes" value="yes" />
9
- <input type="submit" name="no" value="no" />
10
-
11
- </form>
data/lib/hmac-md5.rb DELETED
@@ -1,11 +0,0 @@
1
- require 'hmac'
2
- require 'digest/md5'
3
-
4
- module HMAC
5
- class MD5 < Base
6
- def initialize(key = nil)
7
- super(Digest::MD5, 64, 16, key)
8
- end
9
- public_class_method :new, :digest, :hexdigest
10
- end
11
- end
data/lib/hmac-rmd160.rb DELETED
@@ -1,11 +0,0 @@
1
- require 'hmac'
2
- require 'digest/rmd160'
3
-
4
- module HMAC
5
- class RMD160 < Base
6
- def initialize(key = nil)
7
- super(Digest::RMD160, 64, 20, key)
8
- end
9
- public_class_method :new, :digest, :hexdigest
10
- end
11
- end
@@ -1,122 +0,0 @@
1
- require "openid/util"
2
- require "openid/service"
3
- require "openid/parse"
4
-
5
- # try and use the yadis gem, falling back to system yadis
6
- begin
7
- require 'rubygems'
8
- require_gem 'ruby-yadis', ">=0.3.3"
9
- rescue LoadError
10
- require "yadis"
11
- end
12
-
13
- module OpenID
14
-
15
- OPENID_IDP_2_0_TYPE = 'http://openid.net/server/2.0'
16
- OPENID_2_0_TYPE = 'http://openid.net/signon/2.0'
17
- OPENID_1_2_TYPE = 'http://openid.net/signon/1.2'
18
- OPENID_1_1_TYPE = 'http://openid.net/signon/1.1'
19
- OPENID_1_0_TYPE = 'http://openid.net/signon/1.0'
20
- OPENID_TYPE_URIS = [OPENID_2_0_TYPE,OPENID_1_2_TYPE,
21
- OPENID_1_1_TYPE,OPENID_1_0_TYPE]
22
-
23
- # OpenID::Discovery encapsulates the logic for doing Yadis and OpenID 1.0
24
- # style server discovery. This class uses a session object to manage
25
- # a list of tried OpenID servers for implemeting server fallback. This is
26
- # useful the case when a user's primary server(s) is not available, and
27
- # will allow then to try again with one of their alternates.
28
- class OpenIDDiscovery < Discovery
29
-
30
- def initialize(session, url, fetcher, suffix=nil)
31
- super(session, url, suffix)
32
- @fetcher = fetcher
33
- end
34
-
35
- # Pass in a custom filter here if you like. Otherwise you'll get all
36
- # OpenID sso services. filter should produce objects or subclasses of
37
- # OpenIDServiceEndpoint.
38
- def discover(filter=nil)
39
- unless filter
40
- filter = lambda {|s| OpenIDServiceEndpoint.from_endpoint(s)}
41
- end
42
-
43
- begin
44
- # do yadis discover, filtering out OpenID services
45
- return super(filter)
46
- rescue YADISParseError, YADISHTTPError
47
-
48
- # Couldn't do Yadis discovery, fall back on OpenID 1.0 disco
49
- status, service = self.openid_discovery(@url)
50
- if status == SUCCESS
51
- return [service.consumer_id, [service]]
52
- end
53
- end
54
-
55
- return [nil, []]
56
- end
57
-
58
- # Perform OpenID 1.0 style link rel discovery. No string normalization
59
- # will be done on +url+. See Util.normalize_url for information on
60
- # textual URL transformations.
61
- def openid_discovery(url)
62
- ret = @fetcher.get(url)
63
- return [HTTP_FAILURE, nil] if ret.nil?
64
-
65
- consumer_id, data = ret
66
- server = nil
67
- delegate = nil
68
- parse_link_attrs(data) do |attrs|
69
- rel = attrs["rel"]
70
- if rel == "openid.server" and server.nil?
71
- href = attrs["href"]
72
- server = href unless href.nil?
73
- end
74
-
75
- if rel == "openid.delegate" and delegate.nil?
76
- href = attrs["href"]
77
- delegate = href unless href.nil?
78
- end
79
- end
80
-
81
- return [PARSE_ERROR, nil] if server.nil?
82
-
83
- server_id = delegate.nil? ? consumer_id : delegate
84
-
85
- consumer_id = OpenID::Util.normalize_url(consumer_id)
86
- server_id = OpenID::Util.normalize_url(server_id)
87
- server_url = OpenID::Util.normalize_url(server)
88
-
89
- service = OpenID::FakeOpenIDServiceEndpoint.new(consumer_id,
90
- server_id,
91
- server_url)
92
- return [SUCCESS, service]
93
- end
94
-
95
- end
96
-
97
- class XRIDiscovery < Discovery
98
- def initialize(session, iname, suffix=nil)
99
- super(session, iname, suffix)
100
- end
101
-
102
- def discover(filter=nil)
103
- begin
104
- services = XRI::ProxyResolver.new.query(@url, OPENID_TYPE_URIS)
105
- rescue XRI::XRIHTTPError, ArgumentError
106
- return [nil, []]
107
- end
108
- endpoints = []
109
- services.each {|s|
110
- se = OpenIDServiceEndpoint.from_endpoint(s)
111
- if se
112
- se.delegate_url = @url
113
- se.yadis_url = @url
114
- endpoints << se
115
- end
116
- }
117
- return [@url, endpoints]
118
- end
119
-
120
- end
121
-
122
- end