entp-ruby-openid 2.2

Sign up to get free protection for your applications and to get access to all the features.
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