ruby-yadis 0.2 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/openid.rb +4 -0
- data/lib/yadis/fetcher.rb +10 -14
- data/lib/yadis/yadis.rb +32 -15
- data/test/test_yadis.rb +4 -1
- metadata +2 -2
data/examples/openid.rb
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'yadis'
|
4
4
|
|
5
|
+
# Want to verify server certificates for https?
|
6
|
+
# Visit http://curl.haxx.se/docs/caextract.html and uncomment:
|
7
|
+
# YADIS.ca_path = '/path/to/cacert.pem'
|
8
|
+
|
5
9
|
yadis = YADIS.discover('http://brian.myopenid.com/')
|
6
10
|
if yadis.nil? or yadis.openid_servers.length == 0
|
7
11
|
p 'No XRDS found'
|
data/lib/yadis/fetcher.rb
CHANGED
@@ -1,20 +1,14 @@
|
|
1
1
|
require "uri"
|
2
|
-
|
3
|
-
begin
|
4
|
-
require "net/https"
|
5
|
-
rescue LoadError # no openssl
|
6
|
-
require "net/http"
|
7
|
-
HAS_OPENSSL = false
|
8
|
-
STDERR.puts("No openssl found, won't be able to fetch https URIs.")
|
9
|
-
else
|
10
|
-
HAS_OPENSSL = true
|
11
|
-
end
|
2
|
+
require "net/https"
|
12
3
|
|
13
4
|
class NetHTTPFetcher
|
14
5
|
|
6
|
+
attr_accessor :ca_path
|
7
|
+
|
15
8
|
def initialize(read_timeout=20, open_timeout=20)
|
16
9
|
@read_timeout = read_timeout
|
17
10
|
@open_timeout = open_timeout
|
11
|
+
@ca_path = nil
|
18
12
|
end
|
19
13
|
|
20
14
|
def get(url, params = nil)
|
@@ -36,11 +30,13 @@ class NetHTTPFetcher
|
|
36
30
|
http.open_timeout = @open_timeout
|
37
31
|
|
38
32
|
if uri.scheme == 'https'
|
39
|
-
|
40
|
-
|
41
|
-
http.
|
33
|
+
http.use_ssl = true
|
34
|
+
if @ca_path
|
35
|
+
http.ca_file = @ca_path
|
36
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
42
37
|
else
|
43
|
-
|
38
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
39
|
+
STDERR.puts("Warning: fetching over https without verifying server certificate")
|
44
40
|
end
|
45
41
|
end
|
46
42
|
|
data/lib/yadis/yadis.rb
CHANGED
@@ -6,29 +6,50 @@ class YADISParseError < StandardError; end
|
|
6
6
|
class YADISHTTPError < StandardError; end
|
7
7
|
|
8
8
|
class YADIS
|
9
|
-
|
10
|
-
|
9
|
+
|
10
|
+
@@ca_path = nil
|
11
|
+
attr_accessor :uri, :xrds_uri, :xrds
|
11
12
|
|
12
13
|
# Discover services for a given URI. Please note that no normalization
|
13
14
|
# will be done to the passed in URI, it should be valid before calling
|
14
15
|
# discover.
|
15
16
|
#
|
16
|
-
# Returns nil if no XRDS was found, or a YADIS object on success.
|
17
|
+
# Returns nil if no XRDS was found, or a YADIS object on success. This
|
18
|
+
# method is essentially the same as YADIS.new, but does not raise any
|
19
|
+
# exceptions.
|
17
20
|
def YADIS.discover(uri)
|
21
|
+
return nil unless uri
|
18
22
|
begin
|
19
|
-
return YADIS.
|
23
|
+
return YADIS.new(uri)
|
20
24
|
rescue
|
21
25
|
return nil
|
22
26
|
end
|
23
27
|
end
|
24
28
|
|
25
|
-
#
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
+
# Set the path to a certificate authority pem file, for verifying
|
30
|
+
# server certificates of HTTPS pages. If you are interested in verifying
|
31
|
+
# certs like the mozilla web browser, have a look at the files here:
|
32
|
+
#
|
33
|
+
# http://curl.haxx.se/docs/caextract.html
|
34
|
+
def YADIS.ca_path=(ca_path)
|
35
|
+
ca_path = ca_path.to_s
|
36
|
+
if File.exists?(ca_path)
|
37
|
+
@@ca_path = ca_path
|
38
|
+
else
|
39
|
+
raise ArgumentError, "#{ca_path} is not a valid file path"
|
40
|
+
end
|
41
|
+
end
|
29
42
|
|
43
|
+
# Discover services for a URI using the Yadis protocol. +uri+ should
|
44
|
+
# be a valid URI represented as a string. This method may raise
|
45
|
+
# YADISParseError in the case of an invalid or unparsable XRDS file,
|
46
|
+
# or YADISHTTPError is the URI cannot be fetched.
|
47
|
+
def initialize(uri)
|
48
|
+
http = NetHTTPFetcher.new
|
49
|
+
http.ca_path = @@ca_path if @@ca_path
|
50
|
+
|
30
51
|
headers = {'Accept' => 'application/xrds+xml'}
|
31
|
-
response =
|
52
|
+
response = http.get(uri, headers)
|
32
53
|
raise YADISHTTPError, "Could not fetch #{uri}" if response.nil?
|
33
54
|
|
34
55
|
uri, resp_payload = response
|
@@ -39,7 +60,7 @@ class YADIS
|
|
39
60
|
|
40
61
|
if header
|
41
62
|
xrds_uri = header
|
42
|
-
response =
|
63
|
+
response = http.get(xrds_uri)
|
43
64
|
raise YADISHTTPError, "Could not fetch XRDS #{xrds_uri}" if response.nil?
|
44
65
|
resp_payload = response[1]
|
45
66
|
end
|
@@ -47,17 +68,13 @@ class YADIS
|
|
47
68
|
unless resp_payload['content-type'] == 'application/xrds+xml'
|
48
69
|
loc = html_yadis_location(resp_payload.body)
|
49
70
|
unless loc.nil?
|
50
|
-
xrds_uri, resp_payload =
|
71
|
+
xrds_uri, resp_payload = http.get(loc)
|
51
72
|
end
|
52
73
|
end
|
53
74
|
|
54
75
|
xrds = XRDS.parse(resp_payload.body)
|
55
76
|
raise YADISParseError, "Bad XRDS" if xrds.nil?
|
56
77
|
|
57
|
-
return new(uri, xrds_uri, xrds)
|
58
|
-
end
|
59
|
-
|
60
|
-
def initialize(uri, xrds_uri, xrds)
|
61
78
|
@uri = uri
|
62
79
|
@xrds_uri = xrds_uri
|
63
80
|
@xrds = xrds
|
data/test/test_yadis.rb
CHANGED
@@ -12,7 +12,10 @@ class YADISTestCase < Test::Unit::TestCase
|
|
12
12
|
|
13
13
|
uri = 'http://brian.myopenid.com/'
|
14
14
|
xrds_uri = 'http://brian.myopenid.com/xrds'
|
15
|
-
y = YADIS.new(uri
|
15
|
+
y = YADIS.new(uri)
|
16
|
+
y.uri = uri
|
17
|
+
y.xrds_uri = xrds_uri
|
18
|
+
y.xrds_uri = xrds
|
16
19
|
|
17
20
|
servers = y.openid_servers
|
18
21
|
assert_equal(servers.length, 1)
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-yadis
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version:
|
7
|
-
date: 2006-03-
|
6
|
+
version: 0.2.1
|
7
|
+
date: 2006-03-22 00:00:00 -08:00
|
8
8
|
summary: A library for performing Yadis service discovery
|
9
9
|
require_paths:
|
10
10
|
- lib
|