ruby-openid 2.0.4 → 2.1.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.
Potentially problematic release.
This version of ruby-openid might be problematic. Click here for more details.
- data/CHANGELOG +65 -28
- data/LICENSE +4 -1
- data/README +19 -12
- data/UPGRADE +5 -0
- data/examples/README +8 -22
- data/examples/active_record_openid_store/XXX_add_open_id_store_to_db.rb +6 -6
- data/examples/active_record_openid_store/lib/association.rb +2 -1
- data/examples/active_record_openid_store/lib/openid_ar_store.rb +3 -3
- data/examples/rails_openid/app/controllers/consumer_controller.rb +11 -5
- data/lib/openid.rb +4 -0
- data/lib/openid/association.rb +7 -7
- data/lib/openid/consumer/checkid_request.rb +11 -0
- data/lib/openid/consumer/discovery.rb +12 -3
- data/lib/openid/consumer/idres.rb +35 -43
- data/lib/openid/extension.rb +9 -1
- data/lib/openid/extensions/pape.rb +22 -25
- data/lib/openid/extensions/sreg.rb +1 -0
- data/lib/openid/fetchers.rb +25 -5
- data/lib/openid/kvform.rb +8 -5
- data/lib/openid/kvpost.rb +6 -5
- data/lib/openid/message.rb +53 -34
- data/lib/openid/server.rb +87 -52
- data/lib/openid/trustroot.rb +25 -17
- data/lib/openid/util.rb +19 -4
- data/lib/openid/yadis/discovery.rb +3 -3
- data/lib/openid/yadis/htmltokenizer.rb +8 -5
- data/lib/openid/yadis/parsehtml.rb +22 -14
- data/lib/openid/yadis/xrds.rb +6 -9
- data/test/data/linkparse.txt +1 -1
- data/test/data/test1-parsehtml.txt +24 -0
- data/test/data/trustroot.txt +8 -2
- data/test/test_association.rb +7 -7
- data/test/test_associationmanager.rb +1 -1
- data/test/test_extension.rb +46 -0
- data/test/test_idres.rb +81 -21
- data/test/test_kvform.rb +5 -5
- data/test/test_message.rb +61 -3
- data/test/test_pape.rb +36 -22
- data/test/test_server.rb +190 -12
- data/test/test_sreg.rb +0 -1
- data/test/test_trustroot.rb +1 -0
- data/test/test_yadis_discovery.rb +13 -0
- metadata +3 -19
- data/examples/rails_openid/app/views/consumer/start.rhtml +0 -8
- data/examples/rails_openid_login_generator/USAGE +0 -23
- data/examples/rails_openid_login_generator/gemspec +0 -13
- data/examples/rails_openid_login_generator/openid_login_generator.rb +0 -36
- data/examples/rails_openid_login_generator/templates/README +0 -116
- data/examples/rails_openid_login_generator/templates/controller.rb +0 -113
- data/examples/rails_openid_login_generator/templates/controller_test.rb +0 -0
- data/examples/rails_openid_login_generator/templates/helper.rb +0 -2
- data/examples/rails_openid_login_generator/templates/openid_login_system.rb +0 -87
- data/examples/rails_openid_login_generator/templates/user.rb +0 -14
- data/examples/rails_openid_login_generator/templates/user_test.rb +0 -0
- data/examples/rails_openid_login_generator/templates/users.yml +0 -0
- data/examples/rails_openid_login_generator/templates/view_login.rhtml +0 -15
- data/examples/rails_openid_login_generator/templates/view_logout.rhtml +0 -10
- data/examples/rails_openid_login_generator/templates/view_welcome.rhtml +0 -9
data/CHANGELOG
CHANGED
@@ -1,41 +1,78 @@
|
|
1
|
-
|
2
|
-
tagged 2.
|
1
|
+
Fri Jun 27 15:39:14 PDT 2008 Kevin Turner <kevin@janrain.com>
|
2
|
+
tagged 2.1.2
|
3
3
|
|
4
|
-
|
5
|
-
*
|
4
|
+
Fri Jun 27 15:38:05 PDT 2008 Kevin Turner <kevin@janrain.com>
|
5
|
+
* update version to 2.1.2
|
6
6
|
|
7
|
-
|
8
|
-
*
|
7
|
+
Fri Jun 27 15:01:35 PDT 2008 Kevin Turner <kevin@janrain.com>
|
8
|
+
* util: remove call to srand
|
9
|
+
|
10
|
+
From the Ruby FAQ:
|
11
|
+
|
12
|
+
9.2 How do random number seeds work?
|
13
|
+
|
14
|
+
It depends. In Ruby versions prior to 1.5.2, the random number generator had
|
15
|
+
(by default) a constant seed, and so would produce the same series of numbers
|
16
|
+
each time a program was run. If you needed less deterministic behaviors, you
|
17
|
+
called srand to set up a less predictable seed.
|
18
|
+
|
19
|
+
Newer Rubys (Rubies?) have a different behavior. If rand is called without a
|
20
|
+
prior call to srand, Ruby will generate its own random(ish) seed. Successive
|
21
|
+
runs of a program that does not use srand will generate different sequences of
|
22
|
+
random numbers. To get the old, predictable, behavior (perhaps for testing),
|
23
|
+
call srand with a constant seed.
|
24
|
+
|
25
|
+
Fri Jun 27 13:34:43 PDT 2008 Kevin Turner <kevin@janrain.com>
|
26
|
+
* LICENSE: htmltokenizer is (c) 2004 Ben Giddings
|
27
|
+
|
28
|
+
Fri Jun 27 13:32:09 PDT 2008 Kevin Turner <kevin@janrain.com>
|
29
|
+
* Yadis.html_yadis_location: catch HTMLTokenizerError
|
9
30
|
|
10
|
-
|
11
|
-
*
|
31
|
+
Fri Jun 27 13:24:13 PDT 2008 Kevin Turner <kevin@janrain.com>
|
32
|
+
* htmltokenizer: define HTMLTokenizerError to raise
|
12
33
|
|
13
|
-
|
14
|
-
*
|
34
|
+
Fri Jun 27 13:18:38 PDT 2008 Kevin Turner <kevin@janrain.com>
|
35
|
+
* htmltokenizer: Don't raise OpenIDError from htmltokenizer (it's not in the OpenID module namespace) #255
|
15
36
|
|
16
|
-
|
17
|
-
* OpenID::
|
37
|
+
Wed Jun 25 17:31:26 PDT 2008 Kevin Turner <kevin@janrain.com>
|
38
|
+
* OpenID::Server::CheckIDRequest.answer: document return type
|
18
39
|
|
19
|
-
|
20
|
-
*
|
21
|
-
revision 15006 and REXML revision 1301. The codebase with this
|
22
|
-
patch continues to work on Ruby 1.8.6.
|
40
|
+
Wed Jun 25 17:06:35 PDT 2008 Kevin Turner <kevin@janrain.com>
|
41
|
+
* TrustRoot.check_sanity: don't fail if the trust root is not parseable
|
23
42
|
|
24
|
-
|
25
|
-
*
|
43
|
+
Wed Jun 25 16:31:30 PDT 2008 Kevin Turner <kevin@janrain.com>
|
44
|
+
* Message.from_http_response: accept 206 code
|
45
|
+
|
46
|
+
Wed Jun 25 14:14:05 PDT 2008 Kevin Turner <kevin@janrain.com>
|
47
|
+
* move OpenID::VERSION definition in openid.rb, for #256
|
48
|
+
|
49
|
+
Wed Jun 25 13:55:18 PDT 2008 Kevin Turner <kevin@janrain.com>
|
50
|
+
* Add admin/gettlds.py to ease updating of TLD list in trust root validation
|
51
|
+
|
52
|
+
Wed Jun 25 13:50:22 PDT 2008 Kevin Turner <kevin@janrain.com>
|
53
|
+
* TrustRoot.TOP_LEVEL_DOMAINS: updated
|
54
|
+
|
55
|
+
Fri Jun 13 14:18:04 PDT 2008 Kevin Turner <kevin@janrain.com>
|
56
|
+
* xrds.rb: fix stray colon
|
57
|
+
|
58
|
+
Fri Jun 13 13:41:58 PDT 2008 Kevin Turner <kevin@janrain.com>
|
59
|
+
* Yadis::get_canonical_id: case-insensitive comparison
|
60
|
+
|
61
|
+
Porting a patch from =wil:
|
26
62
|
|
27
|
-
|
63
|
+
1. There should only be a single CanonicalID in each XRD (in the latest XRI
|
64
|
+
resolution spec), so I made it use the first CID found instead of the last.
|
28
65
|
|
29
|
-
|
66
|
+
2. Use case-insensitive comparison when comparing CanonicalIDs.
|
30
67
|
|
31
|
-
|
32
|
-
*
|
68
|
+
Wed Jun 11 15:24:12 PDT 2008 Kevin Turner <kevin@janrain.com>
|
69
|
+
* Accept response code 206 from fetcher results. Fixes #260
|
33
70
|
|
34
|
-
|
35
|
-
*
|
71
|
+
Wed Jun 11 11:27:25 PDT 2008 cygnus@janrain.com
|
72
|
+
* admin/fixperms: Fix stale entries
|
36
73
|
|
37
|
-
|
38
|
-
*
|
74
|
+
Wed Jun 11 11:08:11 PDT 2008 cygnus@janrain.com
|
75
|
+
* Add test cases for trust roots with non-ASCII characters in path or hostname
|
39
76
|
|
40
|
-
Fri
|
41
|
-
tagged 2.
|
77
|
+
Fri Jun 6 15:50:12 PDT 2008 cygnus@janrain.com
|
78
|
+
tagged 2.1.1
|
data/LICENSE
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
The code in lib/hmac/ is Copyright 2001 by Daiki Ueno, and distributed under
|
2
2
|
the terms of the Ruby license. See http://www.ruby-lang.org/en/LICENSE.txt
|
3
3
|
|
4
|
-
|
4
|
+
lib/openid/yadis/htmltokenizer.rb is Copyright 2004 by Ben Giddings and
|
5
|
+
distributed under the terms of the Ruby license.
|
6
|
+
|
7
|
+
The remainder of this package is Copyright 2006-2008 by JanRain, Inc. and
|
5
8
|
distributed under the terms of license below:
|
6
9
|
|
7
10
|
Apache License
|
data/README
CHANGED
@@ -31,20 +31,21 @@ Check the installation:
|
|
31
31
|
The library is known to work with Ruby 1.8.4 on Unix, Max OSX and
|
32
32
|
Win32. Examples have been tested with Rails 1.1 and 1.2, and 2.0.
|
33
33
|
|
34
|
-
==Getting Started
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
==Getting Started
|
35
|
+
The best way to start is to look at the rails_openid example.
|
36
|
+
You can run it with:
|
37
|
+
cd examples/rails_openid
|
38
|
+
script/server
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
If you are writing an OpenID Relying Party, a good place to start is:
|
41
|
+
examples/rails_openid/app/controllers/consumer_controller.rb
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
uses the Ruby on Rails framework. Start by reading about the
|
46
|
-
OpenID::Server interface documentation and looking at the example.
|
43
|
+
And if you are writing an OpenID provider:
|
44
|
+
examples/rails_openid/app/controllers/server_controller.rb
|
47
45
|
|
46
|
+
The library code is quite well documented, so don't be squeamish, and
|
47
|
+
look at the library itself if there's anything you don't understand in
|
48
|
+
the examples.
|
48
49
|
|
49
50
|
==Homepage
|
50
51
|
http://openidenabled.com/ruby-openid/
|
@@ -64,8 +65,14 @@ Please join this list to discuss, ask implementation questions, report
|
|
64
65
|
bugs, etc. Also check out the openid channel on the freenode IRC
|
65
66
|
network.
|
66
67
|
|
68
|
+
If you have a bugfix or feature you'd like to contribute, don't
|
69
|
+
hesitate to send it to us. For more detailed information on how to
|
70
|
+
contribute, see
|
71
|
+
|
72
|
+
http://openidenabled.com/contribute/
|
73
|
+
|
67
74
|
==Author
|
68
|
-
Copyright 2006-
|
75
|
+
Copyright 2006-2008, JanRain, Inc.
|
69
76
|
|
70
77
|
Contact openid@janrain.com or visit the OpenID channel on pibb.com:
|
71
78
|
|
data/UPGRADE
CHANGED
@@ -57,6 +57,11 @@ additional arguments to the return_to url, use
|
|
57
57
|
Generating the redirect is the same as before, but add any extensions
|
58
58
|
first.
|
59
59
|
|
60
|
+
If you need to set up an SSL certificate authority list for the fetcher,
|
61
|
+
use the 'ca_file' attr_accessor on the OpenID::StandardFetcher. This has
|
62
|
+
changed from 'ca_path' in the 1.x.x series library. That is, set
|
63
|
+
OpenID.fetcher.ca_file = '/path/to/ca.list'
|
64
|
+
before calling consumer.begin.
|
60
65
|
|
61
66
|
=== Requesting Simple Registration Data
|
62
67
|
|
data/examples/README
CHANGED
@@ -15,28 +15,14 @@ Rails installed, and then:
|
|
15
15
|
|
16
16
|
Open a web browser to http://localhost:3000/ and follow the instructions.
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
http://wiki.rubyonrails.com/rails/pages/LoginGenerator
|
27
|
-
|
28
|
-
===Running the generator
|
29
|
-
|
30
|
-
* Copy the contents of rails_openid_login_generator into
|
31
|
-
~/.rails/generators/openid_login
|
32
|
-
(or symlink: ln -s examples/rails_openid_login_generator
|
33
|
-
~/.rails/generators/openid_login)
|
34
|
-
* run script/generate openid_login openid
|
35
|
-
|
36
|
-
You will now have an openid_controller.rb in app/controllers. You'll
|
37
|
-
need to create your 'users' database table before running the
|
38
|
-
application. For schemas and more details about this generator, read
|
39
|
-
README_LOGIN in you rails root directory.
|
18
|
+
The relevant code to work from when writing your Rails OpenID Relying
|
19
|
+
Party is:
|
20
|
+
rails_openid/app/controllers/consumer_controller.rb
|
21
|
+
If you are working on an OpenID provider, check out
|
22
|
+
rails_openid/app/controllers/server_controller.rb
|
23
|
+
|
24
|
+
Since the library and examples are Apache-licensed, don't be shy about
|
25
|
+
copy-and-paste.
|
40
26
|
|
41
27
|
==Rails ActiveRecord OpenIDStore plugin
|
42
28
|
|
@@ -2,12 +2,12 @@
|
|
2
2
|
class AddOpenIdStoreToDb < ActiveRecord::Migration
|
3
3
|
def self.up
|
4
4
|
create_table "open_id_associations", :force => true do |t|
|
5
|
-
t.column "server_url", :binary
|
6
|
-
t.column "handle", :string
|
7
|
-
t.column "secret", :binary
|
8
|
-
t.column "issued", :integer
|
9
|
-
t.column "lifetime", :integer
|
10
|
-
t.column "assoc_type", :string
|
5
|
+
t.column "server_url", :binary, :null => false
|
6
|
+
t.column "handle", :string, :null => false
|
7
|
+
t.column "secret", :binary, :null => false
|
8
|
+
t.column "issued", :integer, :null => false
|
9
|
+
t.column "lifetime", :integer, :null => false
|
10
|
+
t.column "assoc_type", :string, :null => false
|
11
11
|
end
|
12
12
|
|
13
13
|
create_table "open_id_nonces", :force => true do |t|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'openid/association'
|
2
|
+
require 'time'
|
2
3
|
|
3
4
|
class Association < ActiveRecord::Base
|
4
5
|
set_table_name 'open_id_associations'
|
5
6
|
def from_record
|
6
|
-
OpenID::Association.new(handle, secret, issued, lifetime, assoc_type)
|
7
|
+
OpenID::Association.new(handle, secret, Time.at(issued), lifetime, assoc_type)
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
@@ -6,10 +6,10 @@ require 'openid/store/interface'
|
|
6
6
|
class ActiveRecordStore < OpenID::Store::Interface
|
7
7
|
def store_association(server_url, assoc)
|
8
8
|
remove_association(server_url, assoc.handle)
|
9
|
-
Association.create(:server_url => server_url,
|
9
|
+
Association.create!(:server_url => server_url,
|
10
10
|
:handle => assoc.handle,
|
11
11
|
:secret => assoc.secret,
|
12
|
-
:issued => assoc.issued,
|
12
|
+
:issued => assoc.issued.to_i,
|
13
13
|
:lifetime => assoc.lifetime,
|
14
14
|
:assoc_type => assoc.assoc_type)
|
15
15
|
end
|
@@ -40,7 +40,7 @@ class ActiveRecordStore < OpenID::Store::Interface
|
|
40
40
|
def use_nonce(server_url, timestamp, salt)
|
41
41
|
return false if Nonce.find_by_server_url_and_timestamp_and_salt(server_url, timestamp, salt)
|
42
42
|
return false if (timestamp - Time.now.to_i).abs > OpenID::Nonce.skew
|
43
|
-
Nonce.create(:server_url => server_url, :timestamp => timestamp, :salt => salt)
|
43
|
+
Nonce.create!(:server_url => server_url, :timestamp => timestamp, :salt => salt)
|
44
44
|
return true
|
45
45
|
end
|
46
46
|
|
@@ -14,9 +14,15 @@ class ConsumerController < ApplicationController
|
|
14
14
|
|
15
15
|
def start
|
16
16
|
begin
|
17
|
-
|
17
|
+
identifier = params[:openid_identifier]
|
18
|
+
if identifier.nil?
|
19
|
+
flash[:error] = "Enter an OpenID identifier"
|
20
|
+
redirect_to :action => 'index'
|
21
|
+
return
|
22
|
+
end
|
23
|
+
oidreq = consumer.begin(identifier)
|
18
24
|
rescue OpenID::OpenIDError => e
|
19
|
-
flash[:error] = "Discovery failed for #{
|
25
|
+
flash[:error] = "Discovery failed for #{identifier}: #{e}"
|
20
26
|
redirect_to :action => 'index'
|
21
27
|
return
|
22
28
|
end
|
@@ -45,7 +51,7 @@ class ConsumerController < ApplicationController
|
|
45
51
|
if oidreq.send_redirect?(realm, return_to, params[:immediate])
|
46
52
|
redirect_to oidreq.redirect_url(realm, return_to, params[:immediate])
|
47
53
|
else
|
48
|
-
|
54
|
+
render :text => oidreq.html_markup(realm, return_to, params[:immediate], {'id' => 'openid_form'})
|
49
55
|
end
|
50
56
|
end
|
51
57
|
|
@@ -86,8 +92,8 @@ class ConsumerController < ApplicationController
|
|
86
92
|
else
|
87
93
|
pape_message << ", but the server did not report one."
|
88
94
|
end
|
89
|
-
if pape_resp.
|
90
|
-
pape_message << "<br><b>Authentication
|
95
|
+
if pape_resp.auth_time
|
96
|
+
pape_message << "<br><b>Authentication time:</b> #{pape_resp.auth_time} seconds"
|
91
97
|
end
|
92
98
|
if pape_resp.nist_auth_level
|
93
99
|
pape_message << "<br><b>NIST Auth Level:</b> #{pape_resp.nist_auth_level}"
|
data/lib/openid.rb
CHANGED
data/lib/openid/association.rb
CHANGED
@@ -28,13 +28,13 @@ module OpenID
|
|
28
28
|
parsed = Util.kv_to_seq(serialized)
|
29
29
|
parsed_fields = parsed.map{|k, v| k.to_sym}
|
30
30
|
if parsed_fields != FIELD_ORDER
|
31
|
-
raise
|
31
|
+
raise ProtocolError, 'Unexpected fields in serialized association'\
|
32
32
|
" (Expected #{FIELD_ORDER.inspect}, got #{parsed_fields.inspect})"
|
33
33
|
end
|
34
34
|
version, handle, secret64, issued_s, lifetime_s, assoc_type =
|
35
35
|
parsed.map {|field, value| value}
|
36
36
|
if version != '2'
|
37
|
-
raise
|
37
|
+
raise ProtocolError, "Attempted to deserialize unsupported version "\
|
38
38
|
"(#{parsed[0][1].inspect})"
|
39
39
|
end
|
40
40
|
|
@@ -101,7 +101,7 @@ module OpenID
|
|
101
101
|
when 'HMAC-SHA256'
|
102
102
|
CryptUtil.hmac_sha256(@secret, kv)
|
103
103
|
else
|
104
|
-
raise
|
104
|
+
raise ProtocolError, "Association has unknown type: "\
|
105
105
|
"#{assoc_type.inspect}"
|
106
106
|
end
|
107
107
|
end
|
@@ -111,7 +111,7 @@ module OpenID
|
|
111
111
|
def make_pairs(message)
|
112
112
|
signed = message.get_arg(OPENID_NS, 'signed')
|
113
113
|
if signed.nil?
|
114
|
-
raise
|
114
|
+
raise ProtocolError, 'Missing signed list'
|
115
115
|
end
|
116
116
|
signed_fields = signed.split(',', -1)
|
117
117
|
data = message.to_post_args
|
@@ -122,7 +122,7 @@ module OpenID
|
|
122
122
|
def check_message_signature(message)
|
123
123
|
message_sig = message.get_arg(OPENID_NS, 'sig')
|
124
124
|
if message_sig.nil?
|
125
|
-
raise
|
125
|
+
raise ProtocolError, "#{message} has no sig."
|
126
126
|
end
|
127
127
|
calculated_sig = get_message_signature(message)
|
128
128
|
return calculated_sig == message_sig
|
@@ -190,13 +190,13 @@ module OpenID
|
|
190
190
|
when 'HMAC-SHA256'
|
191
191
|
['DH-SHA256', 'no-encryption']
|
192
192
|
else
|
193
|
-
raise
|
193
|
+
raise ProtocolError, "Unknown association type #{assoc_type.inspect}"
|
194
194
|
end
|
195
195
|
end
|
196
196
|
|
197
197
|
def self.check_session_type(assoc_type, session_type)
|
198
198
|
if !get_session_types(assoc_type).include?(session_type)
|
199
|
-
raise
|
199
|
+
raise ProtocolError, "Session type #{session_type.inspect} not "\
|
200
200
|
"valid for association type #{assoc_type.inspect}"
|
201
201
|
end
|
202
202
|
end
|
@@ -158,6 +158,17 @@ module OpenID
|
|
158
158
|
return message.to_form_markup(@endpoint.server_url, form_tag_attrs)
|
159
159
|
end
|
160
160
|
|
161
|
+
# Get a complete HTML document that autosubmits the request to the IDP
|
162
|
+
# with javascript. This method wraps form_markup - see that method's
|
163
|
+
# documentation for help with the parameters.
|
164
|
+
def html_markup(realm, return_to=nil, immediate=false,
|
165
|
+
form_tag_attrs=nil)
|
166
|
+
Util.auto_submit_html(form_markup(realm,
|
167
|
+
return_to,
|
168
|
+
immediate,
|
169
|
+
form_tag_attrs))
|
170
|
+
end
|
171
|
+
|
161
172
|
# Should this OpenID authentication request be sent as a HTTP
|
162
173
|
# redirect or as a POST (form submission)?
|
163
174
|
#
|
@@ -57,9 +57,18 @@ module OpenID
|
|
57
57
|
|
58
58
|
def display_identifier
|
59
59
|
return @display_identifier if @display_identifier
|
60
|
-
return @claimed_id if @claimed_id.nil? or not URI.parse(@claimed_id).fragment
|
61
60
|
|
62
|
-
|
61
|
+
return @claimed_id if @claimed_id.nil?
|
62
|
+
|
63
|
+
begin
|
64
|
+
parsed_identifier = URI.parse(@claimed_id)
|
65
|
+
rescue URI::InvalidURIError
|
66
|
+
raise ProtocolError, "Claimed identifier #{claimed_id} is not a valid URI"
|
67
|
+
end
|
68
|
+
|
69
|
+
return @claimed_id if not parsed_identifier.fragment
|
70
|
+
|
71
|
+
disp = parsed_identifier
|
63
72
|
disp.fragment = nil
|
64
73
|
|
65
74
|
return disp.to_s
|
@@ -434,7 +443,7 @@ module OpenID
|
|
434
443
|
|
435
444
|
def self.discover_no_yadis(uri)
|
436
445
|
http_resp = OpenID.fetch(uri)
|
437
|
-
if http_resp.code != "200"
|
446
|
+
if http_resp.code != "200" and http_resp.code != "206"
|
438
447
|
raise DiscoveryFailure.new(
|
439
448
|
"HTTP Response status from identity URL host is not \"200\". "\
|
440
449
|
"Got status #{http_resp.code.inspect}", http_resp)
|
@@ -2,6 +2,7 @@ require "openid/message"
|
|
2
2
|
require "openid/protocolerror"
|
3
3
|
require "openid/kvpost"
|
4
4
|
require "openid/consumer/discovery"
|
5
|
+
require "openid/urinorm"
|
5
6
|
|
6
7
|
module OpenID
|
7
8
|
class TypeURIMismatch < ProtocolError
|
@@ -138,7 +139,7 @@ module OpenID
|
|
138
139
|
|
139
140
|
def verify_return_to
|
140
141
|
begin
|
141
|
-
msg_return_to = URI.parse(fetch('return_to'))
|
142
|
+
msg_return_to = URI.parse(URINorm::urinorm(fetch('return_to')))
|
142
143
|
rescue URI::InvalidURIError
|
143
144
|
raise ProtocolError, ("return_to is not a valid URI")
|
144
145
|
end
|
@@ -188,7 +189,7 @@ module OpenID
|
|
188
189
|
|
189
190
|
def verify_return_to_base(msg_return_to)
|
190
191
|
begin
|
191
|
-
app_parsed = URI.parse(@current_url)
|
192
|
+
app_parsed = URI.parse(URINorm::urinorm(@current_url))
|
192
193
|
rescue URI::InvalidURIError
|
193
194
|
raise ProtocolError, "current_url is not a valid URI: #{@current_url}"
|
194
195
|
end
|
@@ -239,24 +240,17 @@ module OpenID
|
|
239
240
|
end
|
240
241
|
|
241
242
|
def create_check_auth_request
|
242
|
-
|
243
|
-
|
244
|
-
# Arguments that are always passed to the server and not
|
245
|
-
# included in the signature.
|
246
|
-
for k in ['assoc_handle', 'sig', 'signed', 'invalidate_handle']
|
247
|
-
val = fetch(k, nil)
|
248
|
-
if !val.nil?
|
249
|
-
check_args[k] = val
|
250
|
-
end
|
251
|
-
end
|
243
|
+
signed_list = @message.get_arg(OPENID_NS, 'signed', NO_DEFAULT).split(',')
|
252
244
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
245
|
+
# check that we got all the signed arguments
|
246
|
+
signed_list.each {|k|
|
247
|
+
@message.get_aliased_arg(k, NO_DEFAULT)
|
248
|
+
}
|
257
249
|
|
258
|
-
|
259
|
-
|
250
|
+
ca_message = @message.copy
|
251
|
+
ca_message.set_arg(OPENID_NS, 'mode', 'check_authentication')
|
252
|
+
|
253
|
+
return ca_message
|
260
254
|
end
|
261
255
|
|
262
256
|
# Process the response message from a check_authentication
|
@@ -352,7 +346,7 @@ module OpenID
|
|
352
346
|
|
353
347
|
if @endpoint.nil?
|
354
348
|
Util.log('No pre-discovered information supplied')
|
355
|
-
discover_and_verify(to_match)
|
349
|
+
discover_and_verify(to_match.claimed_id, [to_match])
|
356
350
|
else
|
357
351
|
begin
|
358
352
|
verify_discovery_single(@endpoint, to_match)
|
@@ -360,7 +354,7 @@ module OpenID
|
|
360
354
|
Util.log("Error attempting to use stored discovery "\
|
361
355
|
"information: #{why.message}")
|
362
356
|
Util.log("Attempting discovery to verify endpoint")
|
363
|
-
discover_and_verify(to_match)
|
357
|
+
discover_and_verify(to_match.claimed_id, [to_match])
|
364
358
|
end
|
365
359
|
end
|
366
360
|
|
@@ -376,7 +370,7 @@ module OpenID
|
|
376
370
|
|
377
371
|
if claimed_id.nil?
|
378
372
|
if @endpoint.nil?
|
379
|
-
raise
|
373
|
+
raise ProtocolError, ("When using OpenID 1, the claimed ID must "\
|
380
374
|
"be supplied, either by passing it through "\
|
381
375
|
"as a return_to parameter or by using a "\
|
382
376
|
"session, and supplied to the IdResHandler "\
|
@@ -414,55 +408,53 @@ module OpenID
|
|
414
408
|
# Either no endpoint was supplied or OpenID 1.x verification
|
415
409
|
# of the information that's in the message failed on that
|
416
410
|
# endpoint.
|
417
|
-
|
418
|
-
discover_and_verify(to_match)
|
419
|
-
rescue TypeURIMismatch
|
420
|
-
discover_and_verify(to_match_1_0)
|
421
|
-
end
|
411
|
+
discover_and_verify(to_match.claimed_id, [to_match, to_match_1_0])
|
422
412
|
end
|
423
413
|
|
424
414
|
# Given an endpoint object created from the information in an
|
425
415
|
# OpenID response, perform discovery and verify the discovery
|
426
416
|
# results, returning the matching endpoint that is the result of
|
427
417
|
# doing that discovery.
|
428
|
-
def discover_and_verify(
|
429
|
-
Util.log("Performing discovery on #{
|
430
|
-
_, services = OpenID.discover(
|
418
|
+
def discover_and_verify(claimed_id, to_match_endpoints)
|
419
|
+
Util.log("Performing discovery on #{claimed_id}")
|
420
|
+
_, services = OpenID.discover(claimed_id)
|
431
421
|
if services.length == 0
|
432
422
|
# XXX: this might want to be something other than
|
433
423
|
# ProtocolError. In Python, it's DiscoveryFailure
|
434
424
|
raise ProtocolError, ("No OpenID information found at "\
|
435
|
-
"#{
|
425
|
+
"#{claimed_id}")
|
436
426
|
end
|
437
|
-
verify_discovered_services(services,
|
427
|
+
verify_discovered_services(claimed_id, services, to_match_endpoints)
|
438
428
|
end
|
439
429
|
|
440
430
|
|
441
|
-
def verify_discovered_services(services,
|
431
|
+
def verify_discovered_services(claimed_id, services, to_match_endpoints)
|
442
432
|
# Search the services resulting from discovery to find one
|
443
433
|
# that matches the information from the assertion
|
444
434
|
failure_messages = []
|
445
435
|
for endpoint in services
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
436
|
+
for to_match_endpoint in to_match_endpoints
|
437
|
+
begin
|
438
|
+
verify_discovery_single(endpoint, to_match_endpoint)
|
439
|
+
rescue ProtocolError => why
|
440
|
+
failure_messages << why.message
|
441
|
+
else
|
442
|
+
# It matches, so discover verification has
|
443
|
+
# succeeded. Return this endpoint.
|
444
|
+
@endpoint = endpoint
|
445
|
+
return
|
446
|
+
end
|
455
447
|
end
|
456
448
|
end
|
457
449
|
|
458
|
-
Util.log("Discovery verification failure for #{
|
450
|
+
Util.log("Discovery verification failure for #{claimed_id}")
|
459
451
|
failure_messages.each do |failure_message|
|
460
452
|
Util.log(" * Endpoint mismatch: " + failure_message)
|
461
453
|
end
|
462
454
|
|
463
455
|
# XXX: is DiscoveryFailure in Python OpenID
|
464
456
|
raise ProtocolError, ("No matching endpoint found after "\
|
465
|
-
"discovering #{
|
457
|
+
"discovering #{claimed_id}")
|
466
458
|
end
|
467
459
|
|
468
460
|
def verify_discovery_single(endpoint, to_match)
|