entp-ruby-openid 2.2

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 (200) hide show
  1. data/CHANGELOG +215 -0
  2. data/INSTALL +47 -0
  3. data/LICENSE +210 -0
  4. data/NOTICE +2 -0
  5. data/README +85 -0
  6. data/UPGRADE +127 -0
  7. data/admin/runtests.rb +45 -0
  8. data/examples/README +32 -0
  9. data/examples/active_record_openid_store/README +58 -0
  10. data/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb +24 -0
  11. data/examples/active_record_openid_store/XXX_upgrade_open_id_store.rb +26 -0
  12. data/examples/active_record_openid_store/init.rb +8 -0
  13. data/examples/active_record_openid_store/lib/association.rb +10 -0
  14. data/examples/active_record_openid_store/lib/nonce.rb +3 -0
  15. data/examples/active_record_openid_store/lib/open_id_setting.rb +4 -0
  16. data/examples/active_record_openid_store/lib/openid_ar_store.rb +57 -0
  17. data/examples/active_record_openid_store/test/store_test.rb +212 -0
  18. data/examples/discover +49 -0
  19. data/examples/rails_openid/README +153 -0
  20. data/examples/rails_openid/Rakefile +10 -0
  21. data/examples/rails_openid/app/controllers/application.rb +4 -0
  22. data/examples/rails_openid/app/controllers/consumer_controller.rb +125 -0
  23. data/examples/rails_openid/app/controllers/login_controller.rb +45 -0
  24. data/examples/rails_openid/app/controllers/server_controller.rb +265 -0
  25. data/examples/rails_openid/app/helpers/application_helper.rb +3 -0
  26. data/examples/rails_openid/app/helpers/login_helper.rb +2 -0
  27. data/examples/rails_openid/app/helpers/server_helper.rb +9 -0
  28. data/examples/rails_openid/app/views/consumer/index.rhtml +81 -0
  29. data/examples/rails_openid/app/views/layouts/server.rhtml +68 -0
  30. data/examples/rails_openid/app/views/login/index.rhtml +56 -0
  31. data/examples/rails_openid/app/views/server/decide.rhtml +26 -0
  32. data/examples/rails_openid/config/boot.rb +19 -0
  33. data/examples/rails_openid/config/database.yml +74 -0
  34. data/examples/rails_openid/config/environment.rb +54 -0
  35. data/examples/rails_openid/config/environments/development.rb +19 -0
  36. data/examples/rails_openid/config/environments/production.rb +19 -0
  37. data/examples/rails_openid/config/environments/test.rb +19 -0
  38. data/examples/rails_openid/config/routes.rb +24 -0
  39. data/examples/rails_openid/doc/README_FOR_APP +2 -0
  40. data/examples/rails_openid/public/404.html +8 -0
  41. data/examples/rails_openid/public/500.html +8 -0
  42. data/examples/rails_openid/public/dispatch.cgi +12 -0
  43. data/examples/rails_openid/public/dispatch.fcgi +26 -0
  44. data/examples/rails_openid/public/dispatch.rb +12 -0
  45. data/examples/rails_openid/public/favicon.ico +0 -0
  46. data/examples/rails_openid/public/images/openid_login_bg.gif +0 -0
  47. data/examples/rails_openid/public/javascripts/controls.js +750 -0
  48. data/examples/rails_openid/public/javascripts/dragdrop.js +584 -0
  49. data/examples/rails_openid/public/javascripts/effects.js +854 -0
  50. data/examples/rails_openid/public/javascripts/prototype.js +1785 -0
  51. data/examples/rails_openid/public/robots.txt +1 -0
  52. data/examples/rails_openid/script/about +3 -0
  53. data/examples/rails_openid/script/breakpointer +3 -0
  54. data/examples/rails_openid/script/console +3 -0
  55. data/examples/rails_openid/script/destroy +3 -0
  56. data/examples/rails_openid/script/generate +3 -0
  57. data/examples/rails_openid/script/performance/benchmarker +3 -0
  58. data/examples/rails_openid/script/performance/profiler +3 -0
  59. data/examples/rails_openid/script/plugin +3 -0
  60. data/examples/rails_openid/script/process/reaper +3 -0
  61. data/examples/rails_openid/script/process/spawner +3 -0
  62. data/examples/rails_openid/script/process/spinner +3 -0
  63. data/examples/rails_openid/script/runner +3 -0
  64. data/examples/rails_openid/script/server +3 -0
  65. data/examples/rails_openid/test/functional/login_controller_test.rb +18 -0
  66. data/examples/rails_openid/test/functional/server_controller_test.rb +18 -0
  67. data/examples/rails_openid/test/test_helper.rb +28 -0
  68. data/lib/hmac/hmac.rb +112 -0
  69. data/lib/hmac/sha1.rb +11 -0
  70. data/lib/hmac/sha2.rb +25 -0
  71. data/lib/openid.rb +22 -0
  72. data/lib/openid/association.rb +249 -0
  73. data/lib/openid/consumer.rb +395 -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 +497 -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 +150 -0
  81. data/lib/openid/cryptutil.rb +115 -0
  82. data/lib/openid/dh.rb +89 -0
  83. data/lib/openid/extension.rb +39 -0
  84. data/lib/openid/extensions/ax.rb +539 -0
  85. data/lib/openid/extensions/oauth.rb +91 -0
  86. data/lib/openid/extensions/pape.rb +179 -0
  87. data/lib/openid/extensions/sreg.rb +277 -0
  88. data/lib/openid/extras.rb +11 -0
  89. data/lib/openid/fetchers.rb +258 -0
  90. data/lib/openid/kvform.rb +136 -0
  91. data/lib/openid/kvpost.rb +58 -0
  92. data/lib/openid/message.rb +553 -0
  93. data/lib/openid/protocolerror.rb +12 -0
  94. data/lib/openid/server.rb +1544 -0
  95. data/lib/openid/store.rb +10 -0
  96. data/lib/openid/store/filesystem.rb +272 -0
  97. data/lib/openid/store/interface.rb +75 -0
  98. data/lib/openid/store/memcache.rb +109 -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 +119 -0
  104. data/lib/openid/version.rb +3 -0
  105. data/lib/openid/yadis.rb +15 -0
  106. data/lib/openid/yadis/accept.rb +148 -0
  107. data/lib/openid/yadis/constants.rb +21 -0
  108. data/lib/openid/yadis/discovery.rb +153 -0
  109. data/lib/openid/yadis/filters.rb +205 -0
  110. data/lib/openid/yadis/htmltokenizer.rb +305 -0
  111. data/lib/openid/yadis/parsehtml.rb +45 -0
  112. data/lib/openid/yadis/services.rb +42 -0
  113. data/lib/openid/yadis/xrds.rb +155 -0
  114. data/lib/openid/yadis/xri.rb +90 -0
  115. data/lib/openid/yadis/xrires.rb +91 -0
  116. data/test/data/test_discover/openid_utf8.html +11 -0
  117. data/test/support/test_data_mixin.rb +127 -0
  118. data/test/support/test_util.rb +53 -0
  119. data/test/support/yadis_data.rb +131 -0
  120. data/test/support/yadis_data/accept.txt +124 -0
  121. data/test/support/yadis_data/dh.txt +29 -0
  122. data/test/support/yadis_data/example-xrds.xml +14 -0
  123. data/test/support/yadis_data/linkparse.txt +587 -0
  124. data/test/support/yadis_data/n2b64 +650 -0
  125. data/test/support/yadis_data/test1-discover.txt +137 -0
  126. data/test/support/yadis_data/test1-parsehtml.txt +152 -0
  127. data/test/support/yadis_data/test_discover/malformed_meta_tag.html +19 -0
  128. data/test/support/yadis_data/test_discover/openid.html +11 -0
  129. data/test/support/yadis_data/test_discover/openid2.html +11 -0
  130. data/test/support/yadis_data/test_discover/openid2_xrds.xml +12 -0
  131. data/test/support/yadis_data/test_discover/openid2_xrds_no_local_id.xml +11 -0
  132. data/test/support/yadis_data/test_discover/openid_1_and_2.html +11 -0
  133. data/test/support/yadis_data/test_discover/openid_1_and_2_xrds.xml +16 -0
  134. data/test/support/yadis_data/test_discover/openid_1_and_2_xrds_bad_delegate.xml +17 -0
  135. data/test/support/yadis_data/test_discover/openid_and_yadis.html +12 -0
  136. data/test/support/yadis_data/test_discover/openid_no_delegate.html +10 -0
  137. data/test/support/yadis_data/test_discover/openid_utf8.html +11 -0
  138. data/test/support/yadis_data/test_discover/yadis_0entries.xml +12 -0
  139. data/test/support/yadis_data/test_discover/yadis_2_bad_local_id.xml +15 -0
  140. data/test/support/yadis_data/test_discover/yadis_2entries_delegate.xml +22 -0
  141. data/test/support/yadis_data/test_discover/yadis_2entries_idp.xml +21 -0
  142. data/test/support/yadis_data/test_discover/yadis_another_delegate.xml +14 -0
  143. data/test/support/yadis_data/test_discover/yadis_idp.xml +12 -0
  144. data/test/support/yadis_data/test_discover/yadis_idp_delegate.xml +13 -0
  145. data/test/support/yadis_data/test_discover/yadis_no_delegate.xml +11 -0
  146. data/test/support/yadis_data/test_xrds/=j3h.2007.11.14.xrds +25 -0
  147. data/test/support/yadis_data/test_xrds/README +12 -0
  148. data/test/support/yadis_data/test_xrds/delegated-20060809-r1.xrds +34 -0
  149. data/test/support/yadis_data/test_xrds/delegated-20060809-r2.xrds +34 -0
  150. data/test/support/yadis_data/test_xrds/delegated-20060809.xrds +34 -0
  151. data/test/support/yadis_data/test_xrds/no-xrd.xml +7 -0
  152. data/test/support/yadis_data/test_xrds/not-xrds.xml +2 -0
  153. data/test/support/yadis_data/test_xrds/prefixsometimes.xrds +34 -0
  154. data/test/support/yadis_data/test_xrds/ref.xrds +109 -0
  155. data/test/support/yadis_data/test_xrds/sometimesprefix.xrds +34 -0
  156. data/test/support/yadis_data/test_xrds/spoof1.xrds +25 -0
  157. data/test/support/yadis_data/test_xrds/spoof2.xrds +25 -0
  158. data/test/support/yadis_data/test_xrds/spoof3.xrds +37 -0
  159. data/test/support/yadis_data/test_xrds/status222.xrds +9 -0
  160. data/test/support/yadis_data/test_xrds/subsegments.xrds +58 -0
  161. data/test/support/yadis_data/test_xrds/valid-populated-xrds.xml +39 -0
  162. data/test/support/yadis_data/trustroot.txt +153 -0
  163. data/test/support/yadis_data/urinorm.txt +79 -0
  164. data/test/test_accept.rb +170 -0
  165. data/test/test_association.rb +268 -0
  166. data/test/test_associationmanager.rb +918 -0
  167. data/test/test_ax.rb +690 -0
  168. data/test/test_checkid_request.rb +293 -0
  169. data/test/test_consumer.rb +260 -0
  170. data/test/test_cryptutil.rb +119 -0
  171. data/test/test_dh.rb +85 -0
  172. data/test/test_discover.rb +848 -0
  173. data/test/test_discovery_manager.rb +259 -0
  174. data/test/test_extension.rb +46 -0
  175. data/test/test_extras.rb +35 -0
  176. data/test/test_fetchers.rb +554 -0
  177. data/test/test_filters.rb +269 -0
  178. data/test/test_helper.rb +4 -0
  179. data/test/test_idres.rb +961 -0
  180. data/test/test_kvform.rb +164 -0
  181. data/test/test_kvpost.rb +64 -0
  182. data/test/test_linkparse.rb +100 -0
  183. data/test/test_message.rb +1115 -0
  184. data/test/test_nonce.rb +89 -0
  185. data/test/test_oauth.rb +176 -0
  186. data/test/test_openid_yadis.rb +177 -0
  187. data/test/test_pape.rb +248 -0
  188. data/test/test_parsehtml.rb +79 -0
  189. data/test/test_responses.rb +63 -0
  190. data/test/test_server.rb +2455 -0
  191. data/test/test_sreg.rb +479 -0
  192. data/test/test_stores.rb +292 -0
  193. data/test/test_trustroot.rb +111 -0
  194. data/test/test_urinorm.rb +34 -0
  195. data/test/test_util.rb +145 -0
  196. data/test/test_xrds.rb +167 -0
  197. data/test/test_xri.rb +48 -0
  198. data/test/test_xrires.rb +67 -0
  199. data/test/test_yadis_discovery.rb +218 -0
  200. metadata +268 -0
@@ -0,0 +1,293 @@
1
+ require 'test_helper'
2
+ require 'support/test_util'
3
+ require "openid/consumer/checkid_request"
4
+ require "openid/message"
5
+
6
+ module OpenID
7
+ class Consumer
8
+ class CheckIDRequest
9
+ class DummyEndpoint
10
+ attr_accessor :preferred_namespace, :local_id, :server_url,
11
+ :is_op_identifier, :claimed_id
12
+
13
+ def initialize
14
+ @preferred_namespace = nil
15
+ @local_id = nil
16
+ @server_url = nil
17
+ @is_op_identifier = false
18
+ end
19
+
20
+ def get_local_id
21
+ @local_id
22
+ end
23
+
24
+ def compatibility_mode
25
+ @preferred_namespace == OPENID1_NS
26
+ end
27
+ end
28
+
29
+ module CheckIDTestMixin
30
+ include TestUtil
31
+
32
+ def setup
33
+ @endpoint = DummyEndpoint.new
34
+ @endpoint.local_id = 'http://server.unittest/joe'
35
+ @endpoint.claimed_id = 'http://joe.vanity.example/'
36
+ @endpoint.server_url = 'http://server.unittest/'
37
+ @endpoint.preferred_namespace = preferred_namespace
38
+ @realm = 'http://example/'
39
+ @return_to = 'http://example/return/'
40
+ @assoc = GoodAssoc.new
41
+ @checkid_req = CheckIDRequest.new(@assoc, @endpoint)
42
+ end
43
+
44
+ def assert_has_identifiers(msg, local_id, claimed_id)
45
+ assert_openid_value_equal(msg, 'identity', local_id)
46
+ assert_openid_value_equal(msg, 'claimed_id', claimed_id)
47
+ end
48
+
49
+ def assert_openid_key_exists(msg, key)
50
+ assert(msg.get_arg(OPENID_NS, key),
51
+ "#{key} not present in #{msg.get_args(OPENID_NS).inspect}")
52
+ end
53
+
54
+ def assert_openid_key_absent(msg, key)
55
+ assert(msg.get_arg(OPENID_NS, key).nil?)
56
+ end
57
+
58
+ def assert_openid_value_equal(msg, key, expected)
59
+ actual = msg.get_arg(OPENID_NS, key, NO_DEFAULT)
60
+ error_text = ("Expected #{expected.inspect} for openid.#{key} "\
61
+ "but got #{actual.inspect}: #{msg.inspect}")
62
+ assert_equal(expected, actual, error_text)
63
+ end
64
+
65
+ def assert_anonymous(msg)
66
+ ['claimed_id', 'identity'].each do |key|
67
+ assert_openid_key_absent(msg, key)
68
+ end
69
+ end
70
+
71
+ def assert_has_required_fields(msg)
72
+ internal_message = @checkid_req.instance_variable_get(:@message)
73
+ assert_equal(preferred_namespace,
74
+ internal_message.get_openid_namespace)
75
+
76
+ assert_equal(preferred_namespace, msg.get_openid_namespace)
77
+ assert_openid_value_equal(msg, 'mode', expected_mode)
78
+
79
+ # Implement these in subclasses because they depend on
80
+ # protocol differences!
81
+ assert_has_realm(msg)
82
+ assert_identifiers_present(msg)
83
+ end
84
+
85
+ # TESTS
86
+
87
+ def test_check_no_assoc_handle
88
+ @checkid_req.instance_variable_set('@assoc', nil)
89
+ msg = assert_log_matches("Generated checkid") {
90
+ @checkid_req.get_message(@realm, @return_to, immediate)
91
+ }
92
+ assert_openid_key_absent(msg, 'assoc_handle')
93
+ end
94
+
95
+ def test_check_with_assoc_handle
96
+ msg = assert_log_matches("Generated checkid") {
97
+ @checkid_req.get_message(@realm, @return_to, immediate)
98
+ }
99
+
100
+ assert_openid_value_equal(msg, 'assoc_handle', @assoc.handle)
101
+ end
102
+
103
+ def test_add_extension_arg
104
+ @checkid_req.add_extension_arg('bag:', 'color', 'brown')
105
+ @checkid_req.add_extension_arg('bag:', 'material', 'paper')
106
+ assert(@checkid_req.message.namespaces.member?('bag:'))
107
+ assert_equal(@checkid_req.message.get_args('bag:'),
108
+ {'color' => 'brown', 'material' => 'paper'})
109
+
110
+ msg = assert_log_matches("Generated checkid") {
111
+ @checkid_req.get_message(@realm, @return_to, immediate)
112
+ }
113
+
114
+ # XXX: this depends on the way that Message assigns
115
+ # namespaces. Really it doesn't care that it has alias "0",
116
+ # but that is tested anyway
117
+ post_args = msg.to_post_args()
118
+ assert_equal('brown', post_args['openid.ext0.color'])
119
+ assert_equal('paper', post_args['openid.ext0.material'])
120
+ end
121
+
122
+ def test_standard
123
+ msg = assert_log_matches('Generated checkid') {
124
+ @checkid_req.get_message(@realm, @return_to, immediate)
125
+ }
126
+ assert_has_identifiers(msg, @endpoint.local_id, @endpoint.claimed_id)
127
+ end
128
+
129
+ def test_send_redirect?
130
+ silence_logging {
131
+ url = @checkid_req.redirect_url(@realm, @return_to, immediate)
132
+ assert(url.length < OPENID1_URL_LIMIT)
133
+ assert(@checkid_req.send_redirect?(@realm, @return_to, immediate))
134
+
135
+ @return_to << '/foo' * 1000
136
+ url = @checkid_req.redirect_url(@realm, @return_to, immediate)
137
+ assert(url.length > OPENID1_URL_LIMIT)
138
+ actual = @checkid_req.send_redirect?(@realm, @return_to, immediate)
139
+ expected = preferred_namespace != OPENID2_NS
140
+ assert_equal(expected, actual)
141
+ }
142
+ end
143
+ end
144
+
145
+ class TestCheckIDRequestOpenID2 < Test::Unit::TestCase
146
+ include CheckIDTestMixin
147
+
148
+ def immediate
149
+ false
150
+ end
151
+
152
+ def expected_mode
153
+ 'checkid_setup'
154
+ end
155
+
156
+ def preferred_namespace
157
+ OPENID2_NS
158
+ end
159
+
160
+ # check presence of proper realm key and absence of the wrong
161
+ # one.
162
+ def assert_has_realm(msg)
163
+ assert_openid_value_equal(msg, 'realm', @realm)
164
+ assert_openid_key_absent(msg, 'trust_root')
165
+ end
166
+
167
+ def assert_identifiers_present(msg)
168
+ identity_present = msg.has_key?(OPENID_NS, 'identity')
169
+ claimed_present = msg.has_key?(OPENID_NS, 'claimed_id')
170
+
171
+ assert_equal(claimed_present, identity_present)
172
+ end
173
+
174
+ # OpenID Checkid_Requests should be able to set 'anonymous' to true.
175
+ def test_set_anonymous_works_for_openid2
176
+ assert(@checkid_req.message.is_openid2)
177
+ assert_nothing_raised {@checkid_req.anonymous = true}
178
+ assert_nothing_raised {@checkid_req.anonymous = false}
179
+ end
180
+
181
+ def test_user_anonymous_ignores_identfier
182
+ @checkid_req.anonymous = true
183
+ msg = assert_log_matches('Generated checkid') {
184
+ @checkid_req.get_message(@realm, @return_to, immediate)
185
+ }
186
+ assert_has_required_fields(msg)
187
+ assert_anonymous(msg)
188
+ end
189
+
190
+ def test_op_anonymous_ignores_identifier
191
+ @endpoint.is_op_identifier = true
192
+ @checkid_req.anonymous = true
193
+ msg = assert_log_matches('Generated checkid') {
194
+ @checkid_req.get_message(@realm, @return_to, immediate)
195
+ }
196
+ assert_has_required_fields(msg)
197
+ assert_anonymous(msg)
198
+ end
199
+
200
+ def test_op_identifier_sends_identifier_select
201
+ @endpoint.is_op_identifier = true
202
+ msg = assert_log_matches('Generated checkid') {
203
+ @checkid_req.get_message(@realm, @return_to, immediate)
204
+ }
205
+ assert_has_required_fields(msg)
206
+ assert_has_identifiers(msg, IDENTIFIER_SELECT, IDENTIFIER_SELECT)
207
+ end
208
+ end
209
+
210
+ class TestCheckIDRequestOpenID1 < Test::Unit::TestCase
211
+ include CheckIDTestMixin
212
+
213
+ def immediate
214
+ false
215
+ end
216
+
217
+ def preferred_namespace
218
+ OPENID1_NS
219
+ end
220
+
221
+ def expected_mode
222
+ 'checkid_setup'
223
+ end
224
+
225
+ # Make sure claimed_is is *absent* in request.
226
+ def assert_has_identifiers(msg, op_specific_id, claimed_id)
227
+ assert_openid_value_equal(msg, 'identity', op_specific_id)
228
+ assert_openid_key_absent(msg, 'claimed_id')
229
+ end
230
+
231
+ def assert_identifiers_present(msg)
232
+ assert_openid_key_absent(msg, 'claimed_id')
233
+ assert(msg.has_key?(OPENID_NS, 'identity'))
234
+ end
235
+
236
+ # check presence of proper realm key and absence of the wrong
237
+ # one.
238
+ def assert_has_realm(msg)
239
+ assert_openid_value_equal(msg, 'trust_root', @realm)
240
+ assert_openid_key_absent(msg, 'realm')
241
+ end
242
+
243
+ # TESTS
244
+
245
+ # OpenID 1 requests MUST NOT be able to set anonymous to true
246
+ def test_set_anonymous_fails_for_openid1
247
+ assert(@checkid_req.message.is_openid1)
248
+ assert_raises(ArgumentError) {
249
+ @checkid_req.anonymous = true
250
+ }
251
+ assert_nothing_raised{
252
+ @checkid_req.anonymous = false
253
+ }
254
+ end
255
+
256
+ # Identfier select SHOULD NOT be sent, but this pathway is in
257
+ # here in case some special discovery stuff is done to trigger
258
+ # it with OpenID 1. If it is triggered, it will send
259
+ # identifier_select just like OpenID 2.
260
+ def test_identifier_select
261
+ @endpoint.is_op_identifier = true
262
+ msg = assert_log_matches('Generated checkid') {
263
+ @checkid_req.get_message(@realm, @return_to, immediate)
264
+ }
265
+ assert_has_required_fields(msg)
266
+ assert_equal(IDENTIFIER_SELECT,
267
+ msg.get_arg(OPENID1_NS, 'identity'))
268
+ end
269
+
270
+ end
271
+
272
+ class TestCheckIDRequestOpenID1Immediate < TestCheckIDRequestOpenID1
273
+ def immediate
274
+ true
275
+ end
276
+
277
+ def expected_mode
278
+ 'checkid_immediate'
279
+ end
280
+ end
281
+
282
+ class TestCheckid_RequestOpenID2Immediate < TestCheckIDRequestOpenID2
283
+ def immediate
284
+ true
285
+ end
286
+
287
+ def expected_mode
288
+ 'checkid_immediate'
289
+ end
290
+ end
291
+ end
292
+ end
293
+ end
@@ -0,0 +1,260 @@
1
+ require 'test_helper'
2
+ require 'support/test_util'
3
+ require "openid/consumer"
4
+
5
+ module OpenID
6
+ class Consumer
7
+ module TestConsumer
8
+ class TestLastEndpoint < Test::Unit::TestCase
9
+ def test_set_get
10
+ session = {}
11
+ consumer = Consumer.new(session, nil)
12
+ consumer.send(:last_requested_endpoint=, :endpoint)
13
+ ep = consumer.send(:last_requested_endpoint)
14
+ assert_equal(:endpoint, ep)
15
+ ep = consumer.send(:last_requested_endpoint)
16
+ assert_equal(:endpoint, ep)
17
+ consumer.send(:cleanup_last_requested_endpoint)
18
+ ep = consumer.send(:last_requested_endpoint)
19
+ assert_equal(nil, ep)
20
+ end
21
+ end
22
+
23
+ class TestBegin < Test::Unit::TestCase
24
+ attr_accessor :user_input, :anonymous, :services,
25
+ :discovered_identifier, :checkid_request, :service
26
+
27
+ def setup
28
+ @discovered_identifier = 'http://discovered/'
29
+ @user_input = 'user.input'
30
+ @service = :service
31
+ @services = [@service]
32
+ @session = {}
33
+ @anonymous = false
34
+ @checkid_request = :checkid_request
35
+ end
36
+
37
+ def consumer
38
+ test = self
39
+ consumer = Consumer.new(@session, nil)
40
+ consumer.extend(InstanceDefExtension)
41
+ consumer.instance_def(:discover) do |identifier|
42
+ test.assert_equal(test.user_input, identifier)
43
+ [test.discovered_identifier, test.services]
44
+ end
45
+ consumer.instance_def(:begin_without_discovery) do
46
+ |service, sent_anonymous|
47
+ test.assert_equal(test.service, service)
48
+ test.assert_equal(test.anonymous, sent_anonymous)
49
+ test.checkid_request
50
+ end
51
+ consumer
52
+ end
53
+
54
+ def test_begin
55
+ checkid_request = consumer.begin(@user_input, @anonymous)
56
+ assert_equal(:checkid_request, checkid_request)
57
+ assert_equal(['OpenID::Consumer::DiscoveredServices::'\
58
+ 'OpenID::Consumer::'], @session.keys.sort!)
59
+ end
60
+
61
+ def test_begin_failure
62
+ @services = []
63
+ assert_raises(DiscoveryFailure) {
64
+ consumer.begin(@user_input, @anonymous)
65
+ }
66
+ end
67
+
68
+ def test_begin_fallback
69
+ @services = [:service1, :service2]
70
+ consumer = self.consumer
71
+ @service = :service1
72
+ consumer.begin(@user_input, @anonymous)
73
+ @service = :service2
74
+ consumer.begin(@user_input, @anonymous)
75
+ @service = :service1
76
+ consumer.begin(@user_input, @anonymous)
77
+ @service = :service2
78
+ consumer.begin(@user_input, @anonymous)
79
+ end
80
+ end
81
+
82
+ class TestBeginWithoutDiscovery < Test::Unit::TestCase
83
+ attr_reader :assoc
84
+ def setup
85
+ @session = {}
86
+ @assoc = :assoc
87
+ @service = OpenIDServiceEndpoint.new
88
+ @claimed_id = 'http://claimed.id/'
89
+ @service.claimed_id = @claimed_id
90
+ @anonymous = false
91
+ end
92
+
93
+ def consumer
94
+ test = self
95
+ assoc_manager = Object.new
96
+ assoc_manager.extend(InstanceDefExtension)
97
+ assoc_manager.instance_def(:get_association) do
98
+ test.assoc
99
+ end
100
+
101
+ consumer = Consumer.new(@session, nil)
102
+ consumer.extend(InstanceDefExtension)
103
+ consumer.instance_def(:association_manager) do |service|
104
+ assoc_manager
105
+ end
106
+ consumer
107
+ end
108
+
109
+ def call_begin_without_discovery
110
+ result = consumer.begin_without_discovery(@service, @anonymous)
111
+ assert(result.instance_of?(CheckIDRequest))
112
+ assert_equal(@anonymous, result.anonymous)
113
+ assert_equal(@service, consumer.send(:last_requested_endpoint))
114
+ assert_equal(result.instance_variable_get(:@assoc), @assoc)
115
+ return result
116
+ end
117
+
118
+ def cid_name
119
+ Consumer.openid1_return_to_claimed_id_name
120
+ end
121
+
122
+ def nonce_name
123
+ Consumer.openid1_return_to_nonce_name
124
+ end
125
+
126
+ def test_begin_without_openid1
127
+ result = call_begin_without_discovery
128
+
129
+ assert_equal(@claimed_id, result.return_to_args[cid_name])
130
+ assert_equal([cid_name, nonce_name].sort!,
131
+ result.return_to_args.keys.sort!)
132
+ end
133
+
134
+ def test_begin_without_openid1_anonymous
135
+ @anonymous = true
136
+ assert_raises(ArgumentError) {
137
+ call_begin_without_discovery
138
+ }
139
+ end
140
+
141
+ def test_begin_without_openid2
142
+ @service.type_uris = [OPENID_2_0_TYPE]
143
+ result = call_begin_without_discovery
144
+
145
+ assert(result.return_to_args.empty?)
146
+ end
147
+
148
+ def test_begin_without_openid2_anonymous
149
+ @anonymous = true
150
+ @service.type_uris = [OPENID_2_0_TYPE]
151
+ result = call_begin_without_discovery
152
+
153
+ assert(result.return_to_args.empty?)
154
+ end
155
+ end
156
+
157
+ class TestComplete < Test::Unit::TestCase
158
+ def setup
159
+ @session = {}
160
+ @consumer = Consumer.new(@session, nil)
161
+ end
162
+
163
+ def test_bad_mode
164
+ response = @consumer.complete({'openid.ns' => OPENID2_NS,
165
+ 'openid.mode' => 'bad'}, nil)
166
+ assert_equal(FAILURE, response.status)
167
+ end
168
+
169
+ def test_missing_mode
170
+ response = @consumer.complete({'openid.ns' => OPENID2_NS}, nil)
171
+ assert_equal(FAILURE, response.status)
172
+ end
173
+
174
+ def test_cancel
175
+ response = @consumer.complete({'openid.mode' => 'cancel'}, nil)
176
+ assert_equal(CANCEL, response.status)
177
+ end
178
+
179
+ def test_setup_needed_openid1
180
+ response = @consumer.complete({'openid.mode' => 'setup_needed'}, nil)
181
+ assert_equal(FAILURE, response.status)
182
+ end
183
+
184
+ def test_setup_needed_openid2
185
+ setup_url = 'http://setup.url/'
186
+ args = {'openid.ns' => OPENID2_NS, 'openid.mode' => 'setup_needed', 'openid.user_setup_url' => setup_url}
187
+ response = @consumer.complete(args, nil)
188
+ assert_equal(SETUP_NEEDED, response.status)
189
+ assert_equal(setup_url, response.setup_url)
190
+ end
191
+
192
+ def test_idres_setup_needed_openid1
193
+ setup_url = 'http://setup.url/'
194
+ args = {
195
+ 'openid.user_setup_url' => setup_url,
196
+ 'openid.mode' => 'id_res',
197
+ }
198
+ response = @consumer.complete(args, nil)
199
+ assert_equal(SETUP_NEEDED, response.status)
200
+ assert_equal(setup_url, response.setup_url)
201
+ end
202
+
203
+ def test_error
204
+ contact = 'me'
205
+ reference = 'thing thing'
206
+ args = {
207
+ 'openid.mode' => 'error',
208
+ 'openid.contact' => contact,
209
+ 'openid.reference' => reference,
210
+ }
211
+ response = @consumer.complete(args, nil)
212
+ assert_equal(FAILURE, response.status)
213
+ assert_equal(contact, response.contact)
214
+ assert_equal(reference, response.reference)
215
+
216
+ args['openid.ns'] = OPENID2_NS
217
+ response = @consumer.complete(args, nil)
218
+ assert_equal(FAILURE, response.status)
219
+ assert_equal(contact, response.contact)
220
+ assert_equal(reference, response.reference)
221
+ end
222
+
223
+ def test_idres_openid1
224
+ args = {
225
+ 'openid.mode' => 'id_res',
226
+ }
227
+
228
+ endpoint = OpenIDServiceEndpoint.new
229
+ endpoint.claimed_id = :test_claimed_id
230
+
231
+ idres = Object.new
232
+ idres.extend(InstanceDefExtension)
233
+ idres.instance_def(:endpoint){endpoint}
234
+ idres.instance_def(:signed_fields){:test_signed_fields}
235
+
236
+ test = self
237
+ @consumer.extend(InstanceDefExtension)
238
+ @consumer.instance_def(:handle_idres) {|message, return_to|
239
+ test.assert_equal(args, message.to_post_args)
240
+ test.assert_equal(:test_return_to, return_to)
241
+ idres
242
+ }
243
+
244
+ response = @consumer.complete(args, :test_return_to)
245
+ assert_equal(SUCCESS, response.status, response.message)
246
+ assert_equal(:test_claimed_id, response.identity_url)
247
+ assert_equal(endpoint, response.endpoint)
248
+
249
+ error_message = "In Soviet Russia, id_res handles you!"
250
+ @consumer.instance_def(:handle_idres) {|message, return_to|
251
+ raise ProtocolError, error_message
252
+ }
253
+ response = @consumer.complete(args, :test_return_to)
254
+ assert_equal(FAILURE, response.status)
255
+ assert_equal(error_message, response.message)
256
+ end
257
+ end
258
+ end
259
+ end
260
+ end