pelle-ruby-openid 2.1.8

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 (197) hide show
  1. data/CHANGELOG +215 -0
  2. data/CHANGES-2.1.0 +36 -0
  3. data/INSTALL +47 -0
  4. data/LICENSE +210 -0
  5. data/NOTICE +2 -0
  6. data/README +82 -0
  7. data/UPGRADE +127 -0
  8. data/VERSION +1 -0
  9. data/examples/README +32 -0
  10. data/examples/active_record_openid_store/README +58 -0
  11. data/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb +24 -0
  12. data/examples/active_record_openid_store/XXX_upgrade_open_id_store.rb +26 -0
  13. data/examples/active_record_openid_store/init.rb +8 -0
  14. data/examples/active_record_openid_store/lib/association.rb +10 -0
  15. data/examples/active_record_openid_store/lib/nonce.rb +3 -0
  16. data/examples/active_record_openid_store/lib/open_id_setting.rb +4 -0
  17. data/examples/active_record_openid_store/lib/openid_ar_store.rb +57 -0
  18. data/examples/active_record_openid_store/test/store_test.rb +212 -0
  19. data/examples/discover +49 -0
  20. data/examples/rails_openid/README +153 -0
  21. data/examples/rails_openid/Rakefile +10 -0
  22. data/examples/rails_openid/app/controllers/application.rb +4 -0
  23. data/examples/rails_openid/app/controllers/consumer_controller.rb +122 -0
  24. data/examples/rails_openid/app/controllers/login_controller.rb +45 -0
  25. data/examples/rails_openid/app/controllers/server_controller.rb +265 -0
  26. data/examples/rails_openid/app/helpers/application_helper.rb +3 -0
  27. data/examples/rails_openid/app/helpers/login_helper.rb +2 -0
  28. data/examples/rails_openid/app/helpers/server_helper.rb +9 -0
  29. data/examples/rails_openid/app/views/consumer/index.rhtml +81 -0
  30. data/examples/rails_openid/app/views/layouts/server.rhtml +68 -0
  31. data/examples/rails_openid/app/views/login/index.rhtml +56 -0
  32. data/examples/rails_openid/app/views/server/decide.rhtml +26 -0
  33. data/examples/rails_openid/config/boot.rb +19 -0
  34. data/examples/rails_openid/config/database.yml +74 -0
  35. data/examples/rails_openid/config/environment.rb +54 -0
  36. data/examples/rails_openid/config/environments/development.rb +19 -0
  37. data/examples/rails_openid/config/environments/production.rb +19 -0
  38. data/examples/rails_openid/config/environments/test.rb +19 -0
  39. data/examples/rails_openid/config/routes.rb +24 -0
  40. data/examples/rails_openid/doc/README_FOR_APP +2 -0
  41. data/examples/rails_openid/public/.htaccess +40 -0
  42. data/examples/rails_openid/public/404.html +8 -0
  43. data/examples/rails_openid/public/500.html +8 -0
  44. data/examples/rails_openid/public/dispatch.cgi +12 -0
  45. data/examples/rails_openid/public/dispatch.fcgi +26 -0
  46. data/examples/rails_openid/public/dispatch.rb +12 -0
  47. data/examples/rails_openid/public/favicon.ico +0 -0
  48. data/examples/rails_openid/public/images/openid_login_bg.gif +0 -0
  49. data/examples/rails_openid/public/javascripts/controls.js +750 -0
  50. data/examples/rails_openid/public/javascripts/dragdrop.js +584 -0
  51. data/examples/rails_openid/public/javascripts/effects.js +854 -0
  52. data/examples/rails_openid/public/javascripts/prototype.js +1785 -0
  53. data/examples/rails_openid/public/robots.txt +1 -0
  54. data/examples/rails_openid/script/about +3 -0
  55. data/examples/rails_openid/script/breakpointer +3 -0
  56. data/examples/rails_openid/script/console +3 -0
  57. data/examples/rails_openid/script/destroy +3 -0
  58. data/examples/rails_openid/script/generate +3 -0
  59. data/examples/rails_openid/script/performance/benchmarker +3 -0
  60. data/examples/rails_openid/script/performance/profiler +3 -0
  61. data/examples/rails_openid/script/plugin +3 -0
  62. data/examples/rails_openid/script/process/reaper +3 -0
  63. data/examples/rails_openid/script/process/spawner +3 -0
  64. data/examples/rails_openid/script/process/spinner +3 -0
  65. data/examples/rails_openid/script/runner +3 -0
  66. data/examples/rails_openid/script/server +3 -0
  67. data/examples/rails_openid/test/functional/login_controller_test.rb +18 -0
  68. data/examples/rails_openid/test/functional/server_controller_test.rb +18 -0
  69. data/examples/rails_openid/test/test_helper.rb +28 -0
  70. data/lib/hmac/hmac.rb +112 -0
  71. data/lib/hmac/sha1.rb +11 -0
  72. data/lib/hmac/sha2.rb +25 -0
  73. data/lib/openid/association.rb +249 -0
  74. data/lib/openid/consumer/associationmanager.rb +344 -0
  75. data/lib/openid/consumer/checkid_request.rb +186 -0
  76. data/lib/openid/consumer/discovery.rb +498 -0
  77. data/lib/openid/consumer/discovery_manager.rb +123 -0
  78. data/lib/openid/consumer/html_parse.rb +134 -0
  79. data/lib/openid/consumer/idres.rb +523 -0
  80. data/lib/openid/consumer/responses.rb +148 -0
  81. data/lib/openid/consumer.rb +395 -0
  82. data/lib/openid/cryptutil.rb +97 -0
  83. data/lib/openid/dh.rb +89 -0
  84. data/lib/openid/extension.rb +39 -0
  85. data/lib/openid/extensions/ax.rb +516 -0
  86. data/lib/openid/extensions/oauth.rb +91 -0
  87. data/lib/openid/extensions/pape.rb +179 -0
  88. data/lib/openid/extensions/sreg.rb +277 -0
  89. data/lib/openid/extras.rb +11 -0
  90. data/lib/openid/fetchers.rb +238 -0
  91. data/lib/openid/kvform.rb +136 -0
  92. data/lib/openid/kvpost.rb +58 -0
  93. data/lib/openid/message.rb +553 -0
  94. data/lib/openid/protocolerror.rb +8 -0
  95. data/lib/openid/server.rb +1544 -0
  96. data/lib/openid/store/filesystem.rb +271 -0
  97. data/lib/openid/store/interface.rb +75 -0
  98. data/lib/openid/store/memcache.rb +107 -0
  99. data/lib/openid/store/memory.rb +84 -0
  100. data/lib/openid/store/nonce.rb +68 -0
  101. data/lib/openid/trustroot.rb +349 -0
  102. data/lib/openid/urinorm.rb +75 -0
  103. data/lib/openid/util.rb +110 -0
  104. data/lib/openid/yadis/accept.rb +148 -0
  105. data/lib/openid/yadis/constants.rb +21 -0
  106. data/lib/openid/yadis/discovery.rb +153 -0
  107. data/lib/openid/yadis/filters.rb +205 -0
  108. data/lib/openid/yadis/htmltokenizer.rb +305 -0
  109. data/lib/openid/yadis/parsehtml.rb +45 -0
  110. data/lib/openid/yadis/services.rb +42 -0
  111. data/lib/openid/yadis/xrds.rb +155 -0
  112. data/lib/openid/yadis/xri.rb +90 -0
  113. data/lib/openid/yadis/xrires.rb +106 -0
  114. data/lib/openid.rb +20 -0
  115. data/setup.rb +1551 -0
  116. data/test/data/accept.txt +124 -0
  117. data/test/data/dh.txt +29 -0
  118. data/test/data/example-xrds.xml +14 -0
  119. data/test/data/linkparse.txt +587 -0
  120. data/test/data/n2b64 +650 -0
  121. data/test/data/test1-discover.txt +137 -0
  122. data/test/data/test1-parsehtml.txt +152 -0
  123. data/test/data/test_discover/malformed_meta_tag.html +19 -0
  124. data/test/data/test_discover/openid.html +11 -0
  125. data/test/data/test_discover/openid2.html +11 -0
  126. data/test/data/test_discover/openid2_xrds.xml +12 -0
  127. data/test/data/test_discover/openid2_xrds_no_local_id.xml +11 -0
  128. data/test/data/test_discover/openid_1_and_2.html +11 -0
  129. data/test/data/test_discover/openid_1_and_2_xrds.xml +16 -0
  130. data/test/data/test_discover/openid_1_and_2_xrds_bad_delegate.xml +17 -0
  131. data/test/data/test_discover/openid_and_yadis.html +12 -0
  132. data/test/data/test_discover/openid_no_delegate.html +10 -0
  133. data/test/data/test_discover/yadis_0entries.xml +12 -0
  134. data/test/data/test_discover/yadis_2_bad_local_id.xml +15 -0
  135. data/test/data/test_discover/yadis_2entries_delegate.xml +22 -0
  136. data/test/data/test_discover/yadis_2entries_idp.xml +21 -0
  137. data/test/data/test_discover/yadis_another_delegate.xml +14 -0
  138. data/test/data/test_discover/yadis_idp.xml +12 -0
  139. data/test/data/test_discover/yadis_idp_delegate.xml +13 -0
  140. data/test/data/test_discover/yadis_no_delegate.xml +11 -0
  141. data/test/data/test_xrds/=j3h.2007.11.14.xrds +25 -0
  142. data/test/data/test_xrds/README +12 -0
  143. data/test/data/test_xrds/delegated-20060809-r1.xrds +34 -0
  144. data/test/data/test_xrds/delegated-20060809-r2.xrds +34 -0
  145. data/test/data/test_xrds/delegated-20060809.xrds +34 -0
  146. data/test/data/test_xrds/no-xrd.xml +7 -0
  147. data/test/data/test_xrds/not-xrds.xml +2 -0
  148. data/test/data/test_xrds/prefixsometimes.xrds +34 -0
  149. data/test/data/test_xrds/ref.xrds +109 -0
  150. data/test/data/test_xrds/sometimesprefix.xrds +34 -0
  151. data/test/data/test_xrds/spoof1.xrds +25 -0
  152. data/test/data/test_xrds/spoof2.xrds +25 -0
  153. data/test/data/test_xrds/spoof3.xrds +37 -0
  154. data/test/data/test_xrds/status222.xrds +9 -0
  155. data/test/data/test_xrds/subsegments.xrds +58 -0
  156. data/test/data/test_xrds/valid-populated-xrds.xml +39 -0
  157. data/test/data/trustroot.txt +153 -0
  158. data/test/data/urinorm.txt +79 -0
  159. data/test/discoverdata.rb +131 -0
  160. data/test/test_accept.rb +170 -0
  161. data/test/test_association.rb +266 -0
  162. data/test/test_associationmanager.rb +917 -0
  163. data/test/test_ax.rb +648 -0
  164. data/test/test_checkid_request.rb +294 -0
  165. data/test/test_consumer.rb +257 -0
  166. data/test/test_cryptutil.rb +119 -0
  167. data/test/test_dh.rb +86 -0
  168. data/test/test_discover.rb +838 -0
  169. data/test/test_discovery_manager.rb +262 -0
  170. data/test/test_extension.rb +46 -0
  171. data/test/test_extras.rb +35 -0
  172. data/test/test_fetchers.rb +538 -0
  173. data/test/test_filters.rb +270 -0
  174. data/test/test_idres.rb +963 -0
  175. data/test/test_kvform.rb +165 -0
  176. data/test/test_kvpost.rb +65 -0
  177. data/test/test_linkparse.rb +101 -0
  178. data/test/test_message.rb +1116 -0
  179. data/test/test_nonce.rb +89 -0
  180. data/test/test_oauth.rb +175 -0
  181. data/test/test_openid_yadis.rb +178 -0
  182. data/test/test_pape.rb +247 -0
  183. data/test/test_parsehtml.rb +80 -0
  184. data/test/test_responses.rb +63 -0
  185. data/test/test_server.rb +2457 -0
  186. data/test/test_sreg.rb +479 -0
  187. data/test/test_stores.rb +298 -0
  188. data/test/test_trustroot.rb +113 -0
  189. data/test/test_urinorm.rb +35 -0
  190. data/test/test_util.rb +145 -0
  191. data/test/test_xrds.rb +169 -0
  192. data/test/test_xri.rb +48 -0
  193. data/test/test_xrires.rb +63 -0
  194. data/test/test_yadis_discovery.rb +220 -0
  195. data/test/testutil.rb +127 -0
  196. data/test/util.rb +53 -0
  197. metadata +316 -0
data/test/test_ax.rb ADDED
@@ -0,0 +1,648 @@
1
+ require 'openid/extensions/ax'
2
+ require 'openid/message'
3
+ require 'openid/consumer/responses'
4
+ require 'openid/consumer/discovery'
5
+ require 'openid/consumer/checkid_request'
6
+
7
+ module OpenID
8
+ module AX
9
+ class BogusAXMessage < AXMessage
10
+ @mode = 'bogus'
11
+
12
+ def get_extension_args
13
+ new_args
14
+ end
15
+
16
+ def do_check_mode(args)
17
+ check_mode(args)
18
+ end
19
+
20
+ def do_check_mode_new_args
21
+ check_mode(new_args)
22
+ end
23
+ end
24
+
25
+ class AXMessageTest < Test::Unit::TestCase
26
+ def setup
27
+ @bax = BogusAXMessage.new
28
+ end
29
+
30
+ def test_check_mode
31
+ assert_raises(Error) { @bax.do_check_mode({'mode' => 'fetch_request'})}
32
+ @bax.do_check_mode({'mode' => @bax.mode})
33
+ end
34
+
35
+ def test_check_mode_new_args
36
+ @bax.do_check_mode_new_args
37
+ end
38
+ end
39
+
40
+ class AttrInfoTest < Test::Unit::TestCase
41
+ def test_construct
42
+ assert_raises(ArgumentError) { AttrInfo.new }
43
+ type_uri = 'uri geller'
44
+ ainfo = AttrInfo.new(type_uri)
45
+
46
+ assert_equal(type_uri, ainfo.type_uri)
47
+ assert_equal(1, ainfo.count)
48
+ assert_equal(false, ainfo.required)
49
+ assert_equal(nil, ainfo.ns_alias)
50
+ end
51
+ end
52
+
53
+ class ToTypeURIsTest < Test::Unit::TestCase
54
+ def setup
55
+ @aliases = NamespaceMap.new
56
+ end
57
+
58
+ def test_empty
59
+ [nil, ''].each{|empty|
60
+ uris = AX.to_type_uris(@aliases, empty)
61
+ assert_equal([], uris)
62
+ }
63
+ end
64
+
65
+ def test_undefined
66
+ assert_raises(IndexError) {
67
+ AX.to_type_uris(@aliases, 'http://janrain.com/')
68
+ }
69
+ end
70
+
71
+ def test_one
72
+ uri = 'http://janrain.com/'
73
+ name = 'openid_hackers'
74
+ @aliases.add_alias(uri, name)
75
+ uris = AX::to_type_uris(@aliases, name)
76
+ assert_equal([uri], uris)
77
+ end
78
+
79
+ def test_two
80
+ uri1 = 'http://janrain.com/'
81
+ name1 = 'openid_hackers'
82
+ @aliases.add_alias(uri1, name1)
83
+
84
+ uri2 = 'http://jyte.com/'
85
+ name2 = 'openid_hack'
86
+ @aliases.add_alias(uri2, name2)
87
+
88
+ uris = AX.to_type_uris(@aliases, [name1, name2].join(','))
89
+ assert_equal([uri1, uri2], uris)
90
+ end
91
+ end
92
+
93
+ class ParseAXValuesTest < Test::Unit::TestCase
94
+ def ax_values(ax_args, expected_args)
95
+ msg = KeyValueMessage.new
96
+ msg.parse_extension_args(ax_args)
97
+ assert_equal(expected_args, msg.data)
98
+ end
99
+
100
+ def ax_error(ax_args, error)
101
+ msg = KeyValueMessage.new
102
+ assert_raises(error) {
103
+ msg.parse_extension_args(ax_args)
104
+ }
105
+ end
106
+
107
+ def test_empty_is_valid
108
+ ax_values({}, {})
109
+ end
110
+
111
+ def test_missing_value_for_alias_explodes
112
+ ax_error({'type.foo'=>'urn:foo'}, IndexError)
113
+ end
114
+
115
+ def test_count_present_but_not_value
116
+ ax_error({'type.foo'=>'urn:foo', 'count.foo' => '1'}, IndexError)
117
+ end
118
+
119
+ def test_invalid_count_value
120
+ msg = FetchRequest.new
121
+ assert_raises(Error) {
122
+ msg.parse_extension_args({'type.foo'=>'urn:foo',
123
+ 'count.foo' => 'bogus'})
124
+ }
125
+ end
126
+
127
+ def test_request_unlimited_values
128
+ msg = FetchRequest.new
129
+ args = {'mode' => 'fetch_request',
130
+ 'required' => 'foo',
131
+ 'type.foo' => 'urn:foo',
132
+ 'count.foo' => UNLIMITED_VALUES
133
+ }
134
+ msg.parse_extension_args(args)
135
+ foo = msg.attributes[0]
136
+ assert_equal(UNLIMITED_VALUES, foo.count)
137
+ assert(foo.wants_unlimited_values?)
138
+ end
139
+
140
+ def test_long_alias
141
+ # spec says we must support at least 32 character-long aliases
142
+ name = 'x' * MINIMUM_SUPPORTED_ALIAS_LENGTH
143
+
144
+ msg = KeyValueMessage.new
145
+ args = {
146
+ "type.#{name}" => 'urn:foo',
147
+ "count.#{name}" => '1',
148
+ "value.#{name}.1" => 'first',
149
+ }
150
+ msg.parse_extension_args(args)
151
+ assert_equal(['first'],msg['urn:foo'])
152
+ end
153
+
154
+ def test_invalid_alias
155
+ types = [
156
+ KeyValueMessage,
157
+ FetchRequest
158
+ ]
159
+ inputs = [
160
+ {'type.a.b'=>'urn:foo',
161
+ 'count.a.b'=>'1'},
162
+ {'type.a,b'=>'urn:foo',
163
+ 'count.a,b'=>'1'},
164
+ ]
165
+ types.each{|t|
166
+ inputs.each{|input|
167
+ msg = t.new
168
+ assert_raises(Error) {msg.parse_extension_args(input)}
169
+ }
170
+ }
171
+ end
172
+
173
+ def test_count_present_and_is_zero
174
+ ax_values(
175
+ {'type.foo'=>'urn:foo',
176
+ 'count.foo'=>'0',
177
+ },
178
+ {'urn:foo'=>[]}
179
+ )
180
+ end
181
+
182
+ def test_singleton_empty
183
+ ax_values(
184
+ {'type.foo'=>'urn:foo',
185
+ 'value.foo'=>'',
186
+ },
187
+ {'urn:foo'=>[]}
188
+ )
189
+ end
190
+
191
+ def test_double_alias
192
+ ax_error(
193
+ {'type.foo'=>'urn:foo',
194
+ 'value.foo'=>'',
195
+ 'type.bar'=>'urn:foo',
196
+ 'value.bar'=>'',
197
+ },
198
+ IndexError
199
+ )
200
+ end
201
+
202
+ def test_double_singleton
203
+ ax_values(
204
+ {'type.foo'=>'urn:foo',
205
+ 'value.foo'=>'',
206
+ 'type.bar'=>'urn:bar',
207
+ 'value.bar'=>'',
208
+ },
209
+ {'urn:foo'=>[],'urn:bar'=>[]}
210
+ )
211
+ end
212
+
213
+ def singleton_value
214
+ ax_values(
215
+ {'type.foo'=>'urn:foo',
216
+ 'value.foo'=>'something',
217
+ },
218
+ {'urn:foo'=>['something']}
219
+ )
220
+ end
221
+ end
222
+
223
+ class FetchRequestTest < Test::Unit::TestCase
224
+ def setup
225
+ @msg = FetchRequest.new
226
+ @type_a = 'http://janrain.example.com/a'
227
+ @name_a = 'a'
228
+ end
229
+
230
+ def test_mode
231
+ assert_equal('fetch_request', @msg.mode)
232
+ end
233
+
234
+ def test_construct
235
+ assert_equal({}, @msg.requested_attributes)
236
+ assert_equal(nil, @msg.update_url)
237
+
238
+ msg = FetchRequest.new('hailstorm')
239
+ assert_equal({}, msg.requested_attributes)
240
+ assert_equal('hailstorm', msg.update_url)
241
+ end
242
+
243
+ def test_add
244
+ uri = 'mud://puddle'
245
+
246
+ assert(! @msg.member?(uri))
247
+ a = AttrInfo.new(uri)
248
+ @msg.add(a)
249
+ assert(@msg.member?(uri))
250
+ end
251
+
252
+ def test_add_twice
253
+ uri = 'its://raining'
254
+ a = AttrInfo.new(uri)
255
+ @msg.add(a)
256
+ assert_raises(IndexError) {@msg.add(a)}
257
+ end
258
+
259
+ def do_extension_args(expected_args)
260
+ expected_args['mode'] = @msg.mode
261
+ assert_equal(expected_args, @msg.get_extension_args)
262
+ end
263
+
264
+ def test_get_extension_args_empty
265
+ do_extension_args({})
266
+ end
267
+
268
+ def test_get_extension_args_no_alias
269
+ a = AttrInfo.new('foo://bar')
270
+ @msg.add(a)
271
+ ax_args = @msg.get_extension_args
272
+ ax_args.each{|k,v|
273
+ if v == a.type_uri and k.index('type.') == 0
274
+ @name = k[5..-1]
275
+ break
276
+ end
277
+ }
278
+ do_extension_args({'type.'+@name => a.type_uri,
279
+ 'if_available' => @name})
280
+ end
281
+
282
+ def test_get_extension_args_alias_if_available
283
+ a = AttrInfo.new('type://of.transportation',
284
+ 'transport')
285
+ @msg.add(a)
286
+ do_extension_args({'type.'+a.ns_alias => a.type_uri,
287
+ 'if_available' => a.ns_alias})
288
+ end
289
+
290
+ def test_get_extension_args_alias_req
291
+ a = AttrInfo.new('type://of.transportation',
292
+ 'transport',
293
+ true)
294
+ @msg.add(a)
295
+ do_extension_args({'type.'+a.ns_alias => a.type_uri,
296
+ 'required' => a.ns_alias})
297
+ end
298
+
299
+ def test_get_required_attrs_empty
300
+ assert_equal([], @msg.get_required_attrs)
301
+ end
302
+
303
+ def test_parse_extension_args_extra_type
304
+ args = {
305
+ 'mode' => 'fetch_request',
306
+ 'type.' + @name_a => @type_a
307
+ }
308
+ assert_raises(Error) {@msg.parse_extension_args(args)}
309
+ end
310
+
311
+ def test_parse_extension_args
312
+ args = {
313
+ 'mode' => 'fetch_request',
314
+ 'type.' + @name_a => @type_a,
315
+ 'if_available' => @name_a
316
+ }
317
+ @msg.parse_extension_args(args)
318
+ assert(@msg.member?(@type_a) )
319
+ assert_equal([@type_a], @msg.requested_types)
320
+ ai = @msg.requested_attributes[@type_a]
321
+ assert(ai.is_a?(AttrInfo))
322
+ assert(!ai.required)
323
+ assert_equal(@type_a, ai.type_uri)
324
+ assert_equal(@name_a, ai.ns_alias)
325
+ assert_equal([ai], @msg.attributes)
326
+ end
327
+
328
+ def test_extension_args_idempotent
329
+ args = {
330
+ 'mode' => 'fetch_request',
331
+ 'type.' + @name_a => @type_a,
332
+ 'if_available' => @name_a
333
+ }
334
+ @msg.parse_extension_args(args)
335
+ assert_equal(args, @msg.get_extension_args)
336
+ assert(!@msg.requested_attributes[@type_a].required)
337
+ end
338
+
339
+ def test_extension_args_idempotent_count_required
340
+ args = {
341
+ 'mode' => 'fetch_request',
342
+ 'type.' + @name_a => @type_a,
343
+ 'count.' + @name_a => '2',
344
+ 'required' => @name_a
345
+ }
346
+ @msg.parse_extension_args(args)
347
+ assert_equal(args, @msg.get_extension_args)
348
+ assert(@msg.requested_attributes[@type_a].required)
349
+ end
350
+
351
+ def test_extension_args_count1
352
+ args = {
353
+ 'mode' => 'fetch_request',
354
+ 'type.' + @name_a => @type_a,
355
+ 'count.' + @name_a => '1',
356
+ 'if_available' => @name_a
357
+ }
358
+ norm_args = {
359
+ 'mode' => 'fetch_request',
360
+ 'type.' + @name_a => @type_a,
361
+ 'if_available' => @name_a
362
+ }
363
+ @msg.parse_extension_args(args)
364
+ assert_equal(norm_args, @msg.get_extension_args)
365
+ end
366
+
367
+ def test_from_openid_request_no_ax
368
+ message = Message.new
369
+ openid_req = Server::OpenIDRequest.new
370
+ openid_req.message = message
371
+ ax_req = FetchRequest.from_openid_request(openid_req)
372
+ assert(ax_req.nil?)
373
+ end
374
+
375
+ def test_openid_update_url_verification_error
376
+ openid_req_msg = Message.from_openid_args({
377
+ 'mode' => 'checkid_setup',
378
+ 'ns' => OPENID2_NS,
379
+ 'realm' => 'http://example.com/realm',
380
+ 'ns.ax' => AXMessage::NS_URI,
381
+ 'ax.update_url' => 'http://different.site/path',
382
+ 'ax.mode' => 'fetch_request',
383
+ })
384
+ openid_req = Server::OpenIDRequest.new
385
+ openid_req.message = openid_req_msg
386
+ assert_raises(Error) {
387
+ FetchRequest.from_openid_request(openid_req)
388
+ }
389
+ end
390
+
391
+ def test_openid_no_realm
392
+ openid_req_msg = Message.from_openid_args({
393
+ 'mode' => 'checkid_setup',
394
+ 'ns' => OPENID2_NS,
395
+ 'ns.ax' => AXMessage::NS_URI,
396
+ 'ax.update_url' => 'http://different.site/path',
397
+ 'ax.mode' => 'fetch_request',
398
+ })
399
+ openid_req = Server::OpenIDRequest.new
400
+ openid_req.message = openid_req_msg
401
+ assert_raises(Error) {
402
+ FetchRequest.from_openid_request(openid_req)
403
+ }
404
+ end
405
+
406
+ def test_openid_update_url_verification_success
407
+ openid_req_msg = Message.from_openid_args({
408
+ 'mode' => 'checkid_setup',
409
+ 'ns' => OPENID2_NS,
410
+ 'realm' => 'http://example.com/realm',
411
+ 'ns.ax' => AXMessage::NS_URI,
412
+ 'ax.update_url' => 'http://example.com/realm/update_path',
413
+ 'ax.mode' => 'fetch_request',
414
+ })
415
+ openid_req = Server::OpenIDRequest.new
416
+ openid_req.message = openid_req_msg
417
+ fr = FetchRequest.from_openid_request(openid_req)
418
+ assert(fr.is_a?(FetchRequest))
419
+ end
420
+
421
+ def test_openid_update_url_verification_success_return_to
422
+ openid_req_msg = Message.from_openid_args({
423
+ 'mode' => 'checkid_setup',
424
+ 'ns' => OPENID2_NS,
425
+ 'return_to' => 'http://example.com/realm',
426
+ 'ns.ax' => AXMessage::NS_URI,
427
+ 'ax.update_url' => 'http://example.com/realm/update_path',
428
+ 'ax.mode' => 'fetch_request',
429
+ })
430
+ openid_req = Server::OpenIDRequest.new
431
+ openid_req.message = openid_req_msg
432
+ fr = FetchRequest.from_openid_request(openid_req)
433
+ assert(fr.is_a?(FetchRequest))
434
+ end
435
+
436
+ def test_add_extension
437
+ openid_req_msg = Message.from_openid_args({
438
+ 'mode' => 'checkid_setup',
439
+ 'ns' => OPENID2_NS,
440
+ 'return_to' => 'http://example.com/realm',
441
+ })
442
+
443
+ e = OpenID::OpenIDServiceEndpoint.new
444
+ openid_req = Consumer::CheckIDRequest.new(nil, e)
445
+ openid_req.message = openid_req_msg
446
+
447
+ fr = FetchRequest.new
448
+ fr.add(AttrInfo.new("urn:bogus"))
449
+
450
+ openid_req.add_extension(fr)
451
+
452
+ expected = {
453
+ 'mode' => 'fetch_request',
454
+ 'if_available' => 'ext0',
455
+ 'type.ext0' => 'urn:bogus',
456
+ }
457
+
458
+ expected.each { |k,v|
459
+ assert(openid_req.message.get_arg(AXMessage::NS_URI, k) == v)
460
+ }
461
+ end
462
+ end
463
+
464
+ class FetchResponseTest < Test::Unit::TestCase
465
+ def setup
466
+ @msg = FetchResponse.new
467
+ @value_a = 'commodity'
468
+ @type_a = 'http://blood.transfusion/'
469
+ @name_a = 'george'
470
+ @request_update_url = 'http://some.url.that.is.awesome/'
471
+ end
472
+
473
+ def test_construct
474
+ assert_equal(nil, @msg.update_url)
475
+ assert_equal({}, @msg.data)
476
+ end
477
+
478
+ def test_get_extension_args_empty
479
+ eargs = {
480
+ 'mode' => 'fetch_response'
481
+ }
482
+ assert_equal(eargs, @msg.get_extension_args)
483
+ end
484
+
485
+ def test_get_extension_args_empty_request
486
+ eargs = {
487
+ 'mode' => 'fetch_response'
488
+ }
489
+ req = FetchRequest.new
490
+ assert_equal(eargs, @msg.get_extension_args(req))
491
+ end
492
+
493
+ def test_get_extension_args_empty_request_some
494
+ uri = 'http://not.found/'
495
+ name = 'ext0'
496
+ eargs = {
497
+ 'mode' => 'fetch_response',
498
+ 'type.' + name => uri,
499
+ 'count.' + name => '0'
500
+ }
501
+ req = FetchRequest.new
502
+ req.add(AttrInfo.new(uri))
503
+ assert_equal(eargs, @msg.get_extension_args(req))
504
+ end
505
+
506
+ def test_update_url_in_response
507
+ uri = 'http://not.found/'
508
+ name = 'ext0'
509
+ eargs = {
510
+ 'mode' => 'fetch_response',
511
+ 'update_url' => @request_update_url,
512
+ 'type.' + name => uri,
513
+ 'count.' + name => '0'
514
+ }
515
+ req = FetchRequest.new(@request_update_url)
516
+ req.add(AttrInfo.new(uri))
517
+ assert_equal(eargs, @msg.get_extension_args(req))
518
+ end
519
+
520
+ def test_get_extension_args_some_request
521
+ eargs = {
522
+ 'mode' => 'fetch_response',
523
+ 'type.' + @name_a => @type_a,
524
+ 'value.' + @name_a + '.1' => @value_a,
525
+ 'count.' + @name_a => '1'
526
+ }
527
+ req = FetchRequest.new
528
+ req.add(AttrInfo.new(@type_a, @name_a))
529
+ @msg.add_value(@type_a, @value_a)
530
+ assert_equal(eargs, @msg.get_extension_args(req))
531
+ end
532
+
533
+ def test_get_extension_args_some_not_request
534
+ req = FetchRequest.new
535
+ @msg.add_value(@type_a, @value_a)
536
+ assert_raises(IndexError) {@msg.get_extension_args(req)}
537
+ end
538
+
539
+ def test_get_single_success
540
+ req = FetchRequest.new
541
+ @msg.add_value(@type_a, @value_a)
542
+ assert_equal(@value_a, @msg.get_single(@type_a))
543
+ end
544
+
545
+ def test_get_single_none
546
+ assert_equal(nil, @msg.get_single(@type_a))
547
+ end
548
+
549
+ def test_get_single_extra
550
+ @msg.set_values(@type_a, ['x', 'y'])
551
+ assert_raises(Error) { @msg.get_single(@type_a) }
552
+ end
553
+
554
+ def test_from_success_response
555
+ uri = 'http://under.the.sea/'
556
+ name = 'ext0'
557
+ value = 'snarfblat'
558
+
559
+ m = OpenID::Message.from_openid_args({
560
+ 'mode' => 'id_res',
561
+ 'ns' => OPENID2_NS,
562
+ 'ns.ax' => AXMessage::NS_URI,
563
+ 'ax.update_url' => 'http://example.com/realm/update_path',
564
+ 'ax.mode' => 'fetch_response',
565
+ 'ax.type.' + name => uri,
566
+ 'ax.count.' + name => '1',
567
+ 'ax.value.' + name + '.1' => value,
568
+ })
569
+
570
+ e = OpenID::OpenIDServiceEndpoint.new()
571
+ resp = OpenID::Consumer::SuccessResponse.new(e, m, [])
572
+
573
+ ax_resp = FetchResponse.from_success_response(resp, false)
574
+
575
+ values = ax_resp[uri]
576
+ assert_equal(values, [value])
577
+ end
578
+
579
+ def test_from_success_response_empty
580
+ e = OpenID::OpenIDServiceEndpoint.new()
581
+ m = OpenID::Message.from_openid_args({'mode' => 'id_res'})
582
+ resp = OpenID::Consumer::SuccessResponse.new(e, m, [])
583
+ ax_resp = FetchResponse.from_success_response(resp)
584
+ assert(ax_resp.nil?)
585
+ end
586
+ end
587
+
588
+ class StoreRequestTest < Test::Unit::TestCase
589
+ def setup
590
+ @msg = StoreRequest.new
591
+ @type_a = 'http://oranges.are.for/'
592
+ @name_a = 'juggling'
593
+ end
594
+
595
+ def test_construct
596
+ assert_equal({}, @msg.data)
597
+ end
598
+
599
+ def test_get_extension_args_empty
600
+ eargs = {
601
+ 'mode' => 'store_request'
602
+ }
603
+ assert_equal(eargs, @msg.get_extension_args)
604
+ end
605
+
606
+ def test_get_extension_args_nonempty
607
+ @msg.set_values(@type_a, ['foo','bar'])
608
+ aliases = NamespaceMap.new
609
+ aliases.add_alias(@type_a, @name_a)
610
+ eargs = {
611
+ 'mode' => 'store_request',
612
+ 'type.' + @name_a => @type_a,
613
+ 'value.' + @name_a + '.1' => 'foo',
614
+ 'value.' + @name_a + '.2' => 'bar',
615
+ 'count.' + @name_a => '2'
616
+ }
617
+ assert_equal(eargs, @msg.get_extension_args(aliases))
618
+ end
619
+ end
620
+
621
+ class StoreResponseTest < Test::Unit::TestCase
622
+ def test_success
623
+ msg = StoreResponse.new
624
+ assert(msg.succeeded?)
625
+ assert(!msg.error_message)
626
+ assert_equal({'mode' => 'store_response_success'},
627
+ msg.get_extension_args)
628
+ end
629
+
630
+ def test_fail_nomsg
631
+ msg = StoreResponse.new(false)
632
+ assert(! msg.succeeded? )
633
+ assert(! msg.error_message )
634
+ assert_equal({'mode' => 'store_response_failure'},
635
+ msg.get_extension_args)
636
+ end
637
+
638
+ def test_fail_msg
639
+ reason = "because I said so"
640
+ msg = StoreResponse.new(false, reason)
641
+ assert(! msg.succeeded? )
642
+ assert_equal(reason, msg.error_message)
643
+ assert_equal({'mode' => 'store_response_failure', 'error' => reason},
644
+ msg.get_extension_args)
645
+ end
646
+ end
647
+ end
648
+ end