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/test/test_sreg.rb ADDED
@@ -0,0 +1,479 @@
1
+ require 'openid/extensions/sreg'
2
+ require 'openid/message'
3
+ require 'openid/server'
4
+
5
+ module OpenID
6
+ module SReg
7
+ module SRegTest
8
+ SOME_DATA = {
9
+ 'nickname'=>'linusaur',
10
+ 'postcode'=>'12345',
11
+ 'country'=>'US',
12
+ 'gender'=>'M',
13
+ 'fullname'=>'Leonhard Euler',
14
+ 'email'=>'president@whitehouse.gov',
15
+ 'dob'=>'0000-00-00',
16
+ 'language'=>'en-us',
17
+ }
18
+
19
+ class SRegTest < Test::Unit::TestCase
20
+
21
+ def test_is11
22
+ assert_equal(NS_URI, NS_URI_1_1)
23
+ end
24
+
25
+ def test_check_field_name
26
+ DATA_FIELDS.keys.each{|field_name|
27
+ OpenID::check_sreg_field_name(field_name)
28
+ }
29
+ assert_raises(ArgumentError) { OpenID::check_sreg_field_name('invalid') }
30
+ assert_raises(ArgumentError) { OpenID::check_sreg_field_name(nil) }
31
+ end
32
+
33
+ def test_unsupported
34
+ endpoint = FakeEndpoint.new([])
35
+ assert(!OpenID::supports_sreg?(endpoint))
36
+ assert_equal([NS_URI_1_1,NS_URI_1_0], endpoint.checked_uris)
37
+ end
38
+
39
+ def test_supported_1_1
40
+ endpoint = FakeEndpoint.new([NS_URI_1_1])
41
+ assert(OpenID::supports_sreg?(endpoint))
42
+ assert_equal([NS_URI_1_1], endpoint.checked_uris)
43
+ end
44
+
45
+ def test_supported_1_0
46
+ endpoint = FakeEndpoint.new([NS_URI_1_0])
47
+ assert(OpenID::supports_sreg?(endpoint))
48
+ assert_equal([NS_URI_1_1,NS_URI_1_0], endpoint.checked_uris)
49
+ end
50
+
51
+ end
52
+
53
+ class FakeEndpoint < Object
54
+ attr_accessor :checked_uris
55
+ def initialize(supported)
56
+ @supported = supported
57
+ @checked_uris = []
58
+ end
59
+
60
+ def uses_extension(namespace_uri)
61
+ @checked_uris << namespace_uri
62
+ return @supported.member?(namespace_uri)
63
+ end
64
+ end
65
+
66
+ class FakeMessage < Object
67
+ attr_accessor :namespaces
68
+ attr_accessor :openid1
69
+ def initialize
70
+ @openid1 = false
71
+ @namespaces = NamespaceMap.new
72
+ end
73
+
74
+ def is_openid1
75
+ return @openid1
76
+ end
77
+
78
+ end
79
+
80
+ class GetNSTest < Test::Unit::TestCase
81
+ def setup
82
+ @msg = FakeMessage.new
83
+ end
84
+
85
+ def test_openid2_empty
86
+ ns_uri = OpenID::get_sreg_ns(@msg)
87
+ assert_equal('sreg', @msg.namespaces.get_alias(ns_uri))
88
+ assert_equal(NS_URI, ns_uri)
89
+ end
90
+
91
+ def test_openid1_empty
92
+ @msg.openid1 = true
93
+ ns_uri = OpenID::get_sreg_ns(@msg)
94
+ assert_equal('sreg', @msg.namespaces.get_alias(ns_uri))
95
+ assert_equal(NS_URI, ns_uri)
96
+ end
97
+
98
+ def test_openid1defined_1_0
99
+ @msg.openid1 = true
100
+ @msg.namespaces.add(NS_URI_1_0)
101
+ ns_uri = OpenID::get_sreg_ns(@msg)
102
+ assert_equal(NS_URI_1_0, ns_uri)
103
+ end
104
+
105
+ def test_openid1_defined_1_0_override_alias
106
+ [true, false].each{|openid_version|
107
+ [NS_URI_1_0, NS_URI_1_1].each{|sreg_version|
108
+ ['sreg', 'bogus'].each{|name|
109
+ setup
110
+ @msg.openid1 = openid_version
111
+ @msg.namespaces.add_alias(sreg_version, name)
112
+ ns_uri = OpenID::get_sreg_ns(@msg)
113
+ assert_equal(name, @msg.namespaces.get_alias(ns_uri))
114
+ assert_equal(sreg_version, ns_uri)
115
+ }
116
+ }
117
+ }
118
+ end
119
+
120
+ def test_openid1_defined_badly
121
+ @msg.openid1 = true
122
+ @msg.namespaces.add_alias('http://invalid/', 'sreg')
123
+ assert_raises(NamespaceError) { OpenID::get_sreg_ns(@msg) }
124
+ end
125
+
126
+ def test_openid2_defined_badly
127
+ @msg.namespaces.add_alias('http://invalid/', 'sreg')
128
+ assert_raises(NamespaceError) { OpenID::get_sreg_ns(@msg) }
129
+ end
130
+
131
+ def test_openid2_defined_1_0
132
+ @msg.namespaces.add(NS_URI_1_0)
133
+ ns_uri = OpenID::get_sreg_ns(@msg)
134
+ assert_equal(NS_URI_1_0, ns_uri)
135
+ end
136
+
137
+ def test_openid1_sreg_ns_from_args
138
+ args = {
139
+ 'sreg.optional'=> 'nickname',
140
+ 'sreg.required'=> 'dob',
141
+ }
142
+
143
+ m = Message.from_openid_args(args)
144
+
145
+ assert_equal('nickname', m.get_arg(NS_URI_1_1, 'optional'))
146
+ assert_equal('dob', m.get_arg(NS_URI_1_1, 'required'))
147
+ end
148
+
149
+ end
150
+
151
+ class SRegRequestTest < Test::Unit::TestCase
152
+ def test_construct_empty
153
+ req = Request.new
154
+ assert_equal([], req.optional)
155
+ assert_equal([], req.required)
156
+ assert_equal(nil, req.policy_url)
157
+ assert_equal(NS_URI, req.ns_uri)
158
+ end
159
+
160
+ def test_construct_fields
161
+ req = Request.new(['nickname'],['gender'],'http://policy', 'http://sreg.ns_uri')
162
+ assert_equal(['gender'], req.optional)
163
+ assert_equal(['nickname'], req.required)
164
+ assert_equal('http://policy', req.policy_url)
165
+ assert_equal('http://sreg.ns_uri', req.ns_uri)
166
+ end
167
+
168
+ def test_construct_bad_fields
169
+ assert_raises(ArgumentError) {Request.new(['elvis'])}
170
+ end
171
+
172
+ def test_from_openid_request_message_copied
173
+ message = Message.from_openid_args({"sreg.required" => "nickname"})
174
+ openid_req = Server::OpenIDRequest.new
175
+ openid_req.message = message
176
+ sreg_req = Request.from_openid_request(openid_req)
177
+ # check that the message is copied by looking at sreg namespace
178
+ assert_equal(NS_URI_1_1, message.namespaces.get_namespace_uri('sreg'))
179
+ assert_equal(NS_URI, sreg_req.ns_uri)
180
+ assert_equal(['nickname'], sreg_req.required)
181
+ end
182
+
183
+ def test_from_openid_request_ns_1_0
184
+ message = Message.from_openid_args({'ns.sreg' => NS_URI_1_0,
185
+ "sreg.required" => "nickname"})
186
+ openid_req = Server::OpenIDRequest.new
187
+ openid_req.message = message
188
+ sreg_req = Request.from_openid_request(openid_req)
189
+ assert_equal(NS_URI_1_0, sreg_req.ns_uri)
190
+ assert_equal(['nickname'], sreg_req.required)
191
+ end
192
+
193
+ def test_from_openid_request_no_sreg
194
+ message = Message.new
195
+ openid_req = Server::OpenIDRequest.new
196
+ openid_req.message = message
197
+ sreg_req = Request.from_openid_request(openid_req)
198
+ assert(sreg_req.nil?)
199
+ end
200
+
201
+ def test_parse_extension_args_empty
202
+ req = Request.new
203
+ req.parse_extension_args({})
204
+ end
205
+
206
+ def test_parse_extension_args_extra_ignored
207
+ req = Request.new
208
+ req.parse_extension_args({'extra' => 'stuff'})
209
+ end
210
+
211
+ def test_parse_extension_args_non_strict
212
+ req = Request.new
213
+ req.parse_extension_args({'required' => 'stuff'})
214
+ assert_equal([], req.required)
215
+ end
216
+
217
+ def test_parse_extension_args_strict
218
+ req = Request.new
219
+ assert_raises(ArgumentError) {
220
+ req.parse_extension_args({'required' => 'stuff'}, true)
221
+ }
222
+ end
223
+
224
+ def test_parse_extension_args_policy
225
+ req = Request.new
226
+ req.parse_extension_args({'policy_url' => 'http://policy'}, true)
227
+ assert_equal('http://policy', req.policy_url)
228
+ end
229
+
230
+ def test_parse_extension_args_required_empty
231
+ req = Request.new
232
+ req.parse_extension_args({'required' => ''}, true)
233
+ assert_equal([], req.required)
234
+ end
235
+
236
+ def test_parse_extension_args_optional_empty
237
+ req = Request.new
238
+ req.parse_extension_args({'optional' => ''},true)
239
+ assert_equal([], req.optional)
240
+ end
241
+
242
+ def test_parse_extension_args_optional_single
243
+ req = Request.new
244
+ req.parse_extension_args({'optional' => 'nickname'},true)
245
+ assert_equal(['nickname'], req.optional)
246
+ end
247
+
248
+ def test_parse_extension_args_optional_list
249
+ req = Request.new
250
+ req.parse_extension_args({'optional' => 'nickname,email'},true)
251
+ assert_equal(['nickname','email'], req.optional)
252
+ end
253
+
254
+ def test_parse_extension_args_optional_list_bad_nonstrict
255
+ req = Request.new
256
+ req.parse_extension_args({'optional' => 'nickname,email,beer'})
257
+ assert_equal(['nickname','email'], req.optional)
258
+ end
259
+
260
+ def test_parse_extension_args_optional_list_bad_strict
261
+ req = Request.new
262
+ assert_raises(ArgumentError) {
263
+ req.parse_extension_args({'optional' => 'nickname,email,beer'}, true)
264
+ }
265
+ end
266
+
267
+ def test_parse_extension_args_both_nonstrict
268
+ req = Request.new
269
+ req.parse_extension_args({'optional' => 'nickname', 'required' => 'nickname'})
270
+ assert_equal(['nickname'], req.required)
271
+ assert_equal([], req.optional)
272
+ end
273
+
274
+ def test_parse_extension_args_both_strict
275
+ req = Request.new
276
+ assert_raises(ArgumentError) {
277
+ req.parse_extension_args({'optional' => 'nickname', 'required' => 'nickname'},true)
278
+ }
279
+ end
280
+
281
+ def test_parse_extension_args_both_list
282
+ req = Request.new
283
+ req.parse_extension_args({'optional' => 'nickname,email', 'required' => 'country,postcode'},true)
284
+ assert_equal(['nickname','email'], req.optional)
285
+ assert_equal(['country','postcode'], req.required)
286
+ end
287
+
288
+ def test_all_requested_fields
289
+ req = Request.new
290
+ assert_equal([], req.all_requested_fields)
291
+ req.request_field('nickname')
292
+ assert_equal(['nickname'], req.all_requested_fields)
293
+ req.request_field('gender', true)
294
+ requested = req.all_requested_fields.sort
295
+ assert_equal(['gender', 'nickname'], requested)
296
+ end
297
+
298
+ def test_were_fields_requested
299
+ req = Request.new
300
+ assert(!req.were_fields_requested?)
301
+ req.request_field('nickname')
302
+ assert(req.were_fields_requested?)
303
+ end
304
+
305
+ def test_member
306
+ req = Request.new
307
+ DATA_FIELDS.keys.each {|f|
308
+ assert(!req.member?(f))
309
+ }
310
+ assert(!req.member?('something else'))
311
+ req.request_field('nickname')
312
+ DATA_FIELDS.keys.each {|f|
313
+ assert_equal(f == 'nickname',req.member?(f))
314
+ }
315
+ end
316
+
317
+ def test_request_field_bogus
318
+ req = Request.new
319
+ fields = DATA_FIELDS.keys
320
+ fields.each {|f| req.request_field(f) }
321
+ assert_equal(fields, req.optional)
322
+ assert_equal([], req.required)
323
+
324
+ # By default, adding the same fields over again has no effect
325
+ fields.each {|f| req.request_field(f) }
326
+ assert_equal(fields, req.optional)
327
+ assert_equal([], req.required)
328
+
329
+ # Requesting a field as required overrides requesting it as optional
330
+ expected = fields[1..-1]
331
+ overridden = fields[0]
332
+ req.request_field(overridden, true)
333
+ assert_equal(expected, req.optional)
334
+ assert_equal([overridden], req.required)
335
+
336
+ fields.each {|f| req.request_field(f, true) }
337
+ assert_equal(fields, req.required)
338
+ assert_equal([], req.optional)
339
+ end
340
+
341
+ def test_request_fields_type
342
+ req = Request.new
343
+ assert_raises(ArgumentError) { req.request_fields('nickname') }
344
+ end
345
+
346
+ def test_request_fields
347
+ req = Request.new
348
+ fields = DATA_FIELDS.keys
349
+
350
+ req.request_fields(fields)
351
+ assert_equal(fields, req.optional)
352
+ assert_equal([], req.required)
353
+
354
+ # By default, adding the same fields over again has no effect
355
+ req.request_fields(fields)
356
+ assert_equal(fields, req.optional)
357
+ assert_equal([], req.required)
358
+
359
+ # required overrides optional
360
+ expected = fields[1..-1]
361
+ overridden = fields[0]
362
+ req.request_fields([overridden], true)
363
+ assert_equal(expected, req.optional)
364
+ assert_equal([overridden], req.required)
365
+
366
+ req.request_fields(fields, true)
367
+ assert_equal(fields, req.required)
368
+ assert_equal([], req.optional)
369
+
370
+ # optional does not override required
371
+ req.request_fields(fields)
372
+ assert_equal(fields, req.required)
373
+ assert_equal([], req.optional)
374
+ end
375
+
376
+ def test_get_extension_args
377
+ req = Request.new
378
+ assert_equal({}, req.get_extension_args)
379
+
380
+ req.request_field('nickname')
381
+ assert_equal({'optional' => 'nickname'}, req.get_extension_args)
382
+
383
+ req.request_field('email')
384
+ assert_equal({'optional' => 'nickname,email'}, req.get_extension_args)
385
+
386
+ req.request_field('gender', true)
387
+ assert_equal({'optional' => 'nickname,email',
388
+ 'required' => 'gender'}, req.get_extension_args)
389
+
390
+ req.request_field('dob', true)
391
+ assert_equal({'optional' => 'nickname,email',
392
+ 'required' => 'gender,dob'}, req.get_extension_args)
393
+
394
+ req.policy_url = 'http://policy'
395
+ assert_equal({'optional' => 'nickname,email',
396
+ 'required' => 'gender,dob',
397
+ 'policy_url' => 'http://policy'},
398
+ req.get_extension_args)
399
+
400
+ end
401
+ end
402
+
403
+ class DummySuccessResponse
404
+ attr_accessor :message
405
+ def initialize(message, signed_stuff)
406
+ @message = message
407
+ @signed_stuff = signed_stuff
408
+ end
409
+ def get_signed_ns(ns_uri)
410
+ return @signed_stuff
411
+ end
412
+ end
413
+
414
+
415
+ class SRegResponseTest < Test::Unit::TestCase
416
+ def test_construct
417
+ resp = Response.new(SOME_DATA)
418
+ assert_equal(SOME_DATA, resp.get_extension_args)
419
+ assert_equal(NS_URI, resp.ns_uri)
420
+ resp2 = Response.new({}, "http://foo")
421
+ assert_equal({}, resp2.get_extension_args)
422
+ assert_equal('http://foo', resp2.ns_uri)
423
+ end
424
+
425
+ def test_from_success_response_signed
426
+ message = Message.from_openid_args({
427
+ 'sreg.nickname'=>'The Mad Stork',
428
+ })
429
+ success_resp = DummySuccessResponse.new(message, {})
430
+ sreg_resp = Response.from_success_response(success_resp)
431
+ assert_equal({}, sreg_resp.get_extension_args)
432
+ end
433
+
434
+ def test_from_success_response_unsigned
435
+ message = Message.from_openid_args({
436
+ 'ns.sreg' => NS_URI,
437
+ 'sreg.nickname' => 'The Mad Stork',
438
+ })
439
+ success_resp = DummySuccessResponse.new(message, {})
440
+ sreg_resp = Response.from_success_response(success_resp, false)
441
+ assert_equal({'nickname' => 'The Mad Stork'},
442
+ sreg_resp.get_extension_args)
443
+ end
444
+ end
445
+
446
+ class SendFieldsTest < Test::Unit::TestCase
447
+ # class SendFieldsTest < Object
448
+ def test_send_fields
449
+ # create a request message with simple reg fields
450
+ sreg_req = Request.new(['nickname', 'email'], ['fullname'])
451
+ req_msg = Message.new
452
+ req_msg.update_args(NS_URI, sreg_req.get_extension_args)
453
+ req = Server::OpenIDRequest.new
454
+ req.message = req_msg
455
+ req.namespace = req_msg.get_openid_namespace
456
+
457
+ # -> checkid_* request
458
+
459
+ # create a response
460
+ resp_msg = Message.new
461
+ resp = Server::OpenIDResponse.new(req)
462
+ resp.fields = resp_msg
463
+ sreg_resp = Response.extract_response(sreg_req, SOME_DATA)
464
+ resp.add_extension(sreg_resp)
465
+
466
+ # <- id_res response
467
+
468
+ # extract sent fields
469
+ sreg_data_resp = resp_msg.get_args(NS_URI)
470
+ assert_equal({'nickname' => 'linusaur',
471
+ 'email'=>'president@whitehouse.gov',
472
+ 'fullname'=>'Leonhard Euler',
473
+ }, sreg_data_resp)
474
+ end
475
+ end
476
+ end
477
+ end
478
+ end
479
+