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