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,167 @@
1
+ require "test_helper"
2
+ require 'openid/yadis/xrds'
3
+
4
+
5
+ module OpenID
6
+ module Yadis
7
+
8
+ module XRDSTestMixin
9
+ include TestDataMixin
10
+
11
+ XRD_FILE = 'valid-populated-xrds.xml'
12
+ NOXRDS_FILE = 'not-xrds.xml'
13
+ NOXRD_FILE = 'no-xrd.xml'
14
+
15
+ XRDS_DATA_DIR = TEST_DATA_DIR.join('test_xrds')
16
+
17
+ def read_data_file(filename)
18
+ super(filename, false, XRDS_DATA_DIR)
19
+ end
20
+ end
21
+
22
+ class ParseXRDSTestCase < Test::Unit::TestCase
23
+ include XRDSTestMixin
24
+
25
+ # Check that parsing succeeds at all.
26
+ def test_parse
27
+ result = Yadis.parseXRDS(read_data_file(XRD_FILE))
28
+ assert_not_nil result
29
+ end
30
+
31
+ def test_parse_no_xrds_xml
32
+ xmldoc = read_data_file(NOXRDS_FILE)
33
+ assert_raise(Yadis::XRDSError) {
34
+ Yadis.parseXRDS(xmldoc)
35
+ }
36
+ end
37
+
38
+ def test_parse_no_xrds_empty
39
+ assert_raise(Yadis::XRDSError) {
40
+ Yadis.parseXRDS('')
41
+ }
42
+ end
43
+
44
+ def test_is_xrds
45
+ isnt = REXML::Document.new(read_data_file(NOXRDS_FILE))
46
+ should_be = Yadis.parseXRDS(read_data_file(XRD_FILE))
47
+ assert_equal false, Yadis::is_xrds?(isnt)
48
+ assert Yadis::is_xrds?(should_be)
49
+ end
50
+ end
51
+
52
+ class GetYadisXRDTestCase < Test::Unit::TestCase
53
+ include XRDSTestMixin
54
+
55
+ # XXX: Test to make sure this really gets the _right_ XRD.
56
+ def test_get_xrd
57
+ doc = Yadis.parseXRDS(read_data_file(XRD_FILE))
58
+ result = Yadis::get_yadis_xrd(doc)
59
+ assert_not_nil result
60
+ assert_equal 'XRD', result.name
61
+ assert_equal Yadis::XRD_NS_2_0, result.namespace
62
+ end
63
+
64
+ def test_no_xrd
65
+ xmldoc = read_data_file(NOXRD_FILE)
66
+ doc = Yadis.parseXRDS(xmldoc)
67
+ assert_raise(Yadis::XRDSError) {
68
+ Yadis.get_yadis_xrd(doc)
69
+ }
70
+ end
71
+ end
72
+
73
+ class EachServiceTestCase < Test::Unit::TestCase
74
+ include XRDSTestMixin
75
+
76
+ def test_get_xrd
77
+ doc = Yadis.parseXRDS(read_data_file(XRD_FILE))
78
+ count = 0
79
+ result = Yadis::each_service(doc) { |e|
80
+ assert_equal 'Service', e.name
81
+ count += 1
82
+ }
83
+ assert_not_nil result
84
+ assert_equal 5, count
85
+ end
86
+
87
+ def test_no_xrd
88
+ xmldoc = read_data_file(NOXRD_FILE)
89
+ doc = Yadis.parseXRDS(xmldoc)
90
+ assert_raise(Yadis::XRDSError) {
91
+ Yadis.each_service(doc)
92
+ }
93
+ end
94
+
95
+ def test_equal_j3h
96
+ doc = Yadis.parseXRDS(read_data_file('=j3h.2007.11.14.xrds'))
97
+ count = 0
98
+ result = Yadis::each_service(doc) { |e|
99
+ assert_equal 'Service', e.name
100
+ count += 1
101
+ }
102
+ assert_not_nil result
103
+ assert_equal 2, count
104
+ end
105
+ end
106
+
107
+ # XXX: test prioSort!
108
+
109
+ class ExpandServiceTestCase < Test::Unit::TestCase
110
+ @@service_xml = <<END
111
+ <Service>
112
+ <Type>urn://foo</Type>
113
+ <Type>urn://bar</Type>
114
+ <URI priority='2'>http://2.invalid/</URI>
115
+ <URI>http://0.invalid/</URI>
116
+ <URI priority='1'>http://1.invalid/</URI>
117
+ </Service>
118
+ END
119
+
120
+ # XXX - not sorted!
121
+ def test_expand_service
122
+ service_element = REXML::Document.new(@@service_xml).root
123
+ result = Yadis::expand_service(service_element)
124
+ assert_equal 3, result.length
125
+ types, uri, result_element = result[0]
126
+ assert_same service_element, result_element
127
+ assert_equal 'http://0.invalid/', uri
128
+ assert_equal ['urn://foo', 'urn://bar'], types
129
+ types, uri, result_element = result[1]
130
+ assert_equal 'http://1.invalid/', uri
131
+ types, uri, result_element = result[2]
132
+ assert_equal 'http://2.invalid/', uri
133
+ end
134
+ end
135
+
136
+ class PrioSortTestCase < Test::Unit::TestCase
137
+ def new_uri(priority)
138
+ e = REXML::Element.new("URI")
139
+ e.add_attribute("priority", priority.to_s) unless e.nil?
140
+ return e
141
+ end
142
+
143
+ def test_sorting
144
+ l = [
145
+ e7 = new_uri(7),
146
+ e1 = new_uri(1),
147
+ e0 = new_uri(nil),
148
+ e2 = new_uri(2),
149
+ ]
150
+ sorted = Yadis::prio_sort(l)
151
+ assert_same e0, sorted[0]
152
+ assert_same e1, sorted[1]
153
+ assert_same e2, sorted[2]
154
+ assert_same e7, sorted[3]
155
+ end
156
+ end
157
+
158
+ class GetCanonicalIDTestCase < Test::Unit::TestCase
159
+ include XRDSTestMixin
160
+
161
+ def test_multisegment_xri
162
+ xmldoc = Yadis.parseXRDS(read_data_file('subsegments.xrds'))
163
+ result = Yadis.get_canonical_id('xri://=nishitani*masaki', xmldoc)
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,48 @@
1
+ require "test_helper"
2
+ require 'openid/yadis/xri'
3
+
4
+ module OpenID
5
+
6
+ module Yadis
7
+
8
+ class XriDiscoveryTestCase < Test::Unit::TestCase
9
+
10
+ def test_isXRI?
11
+ assert_equal(:xri, XRI.identifier_scheme('=john.smith'))
12
+ assert_equal(:xri, XRI.identifier_scheme('@smiths/john'))
13
+ assert_equal(:xri, XRI.identifier_scheme('xri://=john'))
14
+ assert_equal(:xri, XRI.identifier_scheme('@ootao*test1'))
15
+ assert_equal(:uri, XRI.identifier_scheme('smoker.myopenid.com'))
16
+ assert_equal(:uri, XRI.identifier_scheme('http://smoker.myopenid.com'))
17
+ assert_equal(:uri, XRI.identifier_scheme('https://smoker.myopenid.com'))
18
+ end
19
+ end
20
+
21
+ class XriEscapingTestCase < Test::Unit::TestCase
22
+ def test_escaping_percents
23
+ assert_equal('@example/abc%252Fd/ef',
24
+ XRI.escape_for_iri('@example/abc%2Fd/ef'))
25
+ end
26
+
27
+ def test_escaping_xref
28
+ # no escapes
29
+ assert_equal('@example/foo/(@bar)',
30
+ XRI.escape_for_iri('@example/foo/(@bar)'))
31
+ # escape slashes
32
+ assert_equal('@example/foo/(@bar%2Fbaz)',
33
+ XRI.escape_for_iri('@example/foo/(@bar/baz)'))
34
+ # escape query ? and fragment #
35
+ assert_equal('@example/foo/(@baz%3Fp=q%23r)?i=j#k',
36
+ XRI.escape_for_iri('@example/foo/(@baz?p=q#r)?i=j#k'))
37
+ end
38
+ end
39
+
40
+ class XriTransformationTestCase < Test::Unit::TestCase
41
+ def test_to_iri_normal
42
+ assert_equal('xri://@example', XRI.to_iri_normal('@example'))
43
+ end
44
+ # iri_to_url:
45
+ # various ucschar to hex
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,67 @@
1
+ require "test_helper"
2
+ require 'openid/yadis/xrires'
3
+
4
+ module OpenID
5
+ module Yadis
6
+
7
+ class XRDSFetcher
8
+ def initialize(results)
9
+ @results = results
10
+ end
11
+
12
+ def fetch(url, body=nil, headers=nil, redirect_limit=nil)
13
+ if !@results.empty?
14
+ return @results.shift
15
+ end
16
+
17
+ nil
18
+ end
19
+ end
20
+
21
+ class ProxyQueryTestCase < Test::Unit::TestCase
22
+ def setup
23
+ @proxy_url = 'http://xri.example.com/'
24
+ @proxy = XRI::ProxyResolver.new(@proxy_url)
25
+ @servicetype = 'xri://+i-service*(+forwarding)*($v*1.0)'
26
+ @servicetype_enc = 'xri%3A%2F%2F%2Bi-service%2A%28%2Bforwarding%29%2A%28%24v%2A1.0%29'
27
+ end
28
+
29
+ def unesc(s)
30
+ CGI::unescape(s)
31
+ end
32
+
33
+ def test_proxy_url
34
+ st = @servicetype
35
+ ste = @servicetype_enc
36
+ args_esc = "_xrd_r=application%2Fxrds%2Bxml&_xrd_t=" + ste
37
+ pqu = @proxy.method('query_url')
38
+ h = @proxy_url
39
+
40
+ assert_equal(unesc(h + '=foo?' + args_esc), unesc(pqu.call('=foo', st)))
41
+ assert_equal(unesc(h + '=foo/bar?baz&' + args_esc),
42
+ unesc(pqu.call('=foo/bar?baz', st)))
43
+ assert_equal(unesc(h + '=foo/bar?baz=quux&' + args_esc),
44
+ unesc(pqu.call('=foo/bar?baz=quux', st)))
45
+ assert_equal(unesc(h + '=foo/bar?mi=fa&so=la&' + args_esc),
46
+ unesc(pqu.call('=foo/bar?mi=fa&so=la', st)))
47
+
48
+ # With no service endpoint selection.
49
+ args_esc = "_xrd_r=application%2Fxrds%2Bxml"
50
+ assert_equal(unesc(h + '=foo?' + args_esc), unesc(pqu.call('=foo', nil)))
51
+ end
52
+
53
+ def test_proxy_url_qmarks
54
+ st = @servicetype
55
+ ste = @servicetype_enc
56
+ args_esc = "_xrd_r=application%2Fxrds%2Bxml&_xrd_t=" + ste
57
+ pqu = @proxy.method('query_url')
58
+ h = @proxy_url
59
+
60
+ assert_equal(unesc(h + '=foo/bar?' + args_esc),
61
+ unesc(pqu.call('=foo/bar??', st)))
62
+ assert_equal(unesc(h + '=foo/bar?' + args_esc),
63
+ unesc(pqu.call('=foo/bar???', st)))
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,218 @@
1
+ require "test_helper"
2
+ require 'uri'
3
+
4
+ require 'openid/yadis/discovery'
5
+ require 'openid/fetchers'
6
+ require 'openid/util'
7
+ require 'support/yadis_data'
8
+
9
+ module OpenID
10
+
11
+ module YadisDiscovery
12
+ include FetcherMixin
13
+ include YadisData
14
+
15
+ STATUS_HEADER_RE = /Status: (\d+) .*?$/m
16
+
17
+ four04_pat = "\nContent-Type: text/plain\n\nNo such file %s"
18
+
19
+ def self.mkResponse(data)
20
+ status_mo = data.scan(STATUS_HEADER_RE)
21
+ headers_str, body = data.split("\n\n", 2)
22
+ headers = {}
23
+ headers_str.split("\n", -1).each { |line|
24
+ k, v = line.split(':', 2)
25
+ k = k.strip().downcase
26
+ v = v.strip()
27
+ headers[k] = v
28
+ }
29
+ status = status_mo[0][0].to_i
30
+ return HTTPResponse._from_raw_data(status, body,
31
+ headers)
32
+ end
33
+
34
+ class TestFetcher
35
+ include YadisData
36
+
37
+ def initialize(base_url)
38
+ @base_url = base_url
39
+ end
40
+
41
+ def fetch(url, headers, body, redirect_limit=nil)
42
+ current_url = url
43
+ while true
44
+ parsed = URI::parse(current_url)
45
+ # parsed[2][1:]
46
+ path = parsed.path[1..-1]
47
+ begin
48
+ data = generateSample(path, @base_url)
49
+ rescue ArgumentError
50
+ return HTTPResponse._from_raw_data(404, '', {},
51
+ current_url)
52
+ end
53
+
54
+ response = YadisDiscovery.mkResponse(data)
55
+ if ["301", "302", "303", "307"].member?(response.code)
56
+ current_url = response['location']
57
+ else
58
+ response.final_url = current_url
59
+ return response
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ class MockFetcher
66
+ def initialize
67
+ @count = 0
68
+ end
69
+
70
+ def fetch(uri, headers=nil, body=nil, redirect_limit=nil)
71
+ @count += 1
72
+ if @count == 1
73
+ headers = {
74
+ 'X-XRDS-Location'.downcase => 'http://unittest/404',
75
+ }
76
+ return HTTPResponse._from_raw_data(200, '', headers, uri)
77
+ else
78
+ return HTTPResponse._from_raw_data(404, '', {}, uri)
79
+ end
80
+ end
81
+ end
82
+
83
+ class TestSecondGet < Test::Unit::TestCase
84
+ include FetcherMixin
85
+
86
+ def test_404
87
+ uri = "http://something.unittest/"
88
+ assert_raise(DiscoveryFailure) {
89
+ with_fetcher(MockFetcher.new) { Yadis.discover(uri) }
90
+ }
91
+ end
92
+ end
93
+
94
+ class DiscoveryTestCase
95
+ include YadisData
96
+ include FetcherMixin
97
+
98
+ def initialize(testcase, input_name, id_name, result_name, success)
99
+ @base_url = 'http://invalid.unittest/'
100
+ @testcase = testcase
101
+ @input_name = input_name
102
+ @id_name = id_name
103
+ @result_name = result_name
104
+ @success = success
105
+ end
106
+
107
+ def setup
108
+ @input_url, @expected = generateResult(@base_url,
109
+ @input_name,
110
+ @id_name,
111
+ @result_name,
112
+ @success)
113
+ end
114
+
115
+ def do_discovery
116
+ with_fetcher(TestFetcher.new(@base_url)) do
117
+ Yadis.discover(@input_url)
118
+ end
119
+ end
120
+
121
+ def runCustomTest
122
+ setup
123
+
124
+ if @expected.respond_to?("ancestors") and @expected.ancestors.member?(DiscoveryFailure)
125
+ @testcase.assert_raise(DiscoveryFailure) {
126
+ do_discovery
127
+ }
128
+ else
129
+ result = do_discovery
130
+ @testcase.assert_equal(@input_url, result.request_uri)
131
+
132
+ msg = sprintf("Identity URL mismatch: actual = %s, expected = %s",
133
+ result.normalized_uri, @expected.normalized_uri)
134
+ @testcase.assert_equal(@expected.normalized_uri, result.normalized_uri, msg)
135
+
136
+ msg = sprintf("Content mismatch: actual = %s, expected = %s",
137
+ result.response_text, @expected.response_text)
138
+ @testcase.assert_equal(@expected.response_text, result.response_text, msg)
139
+
140
+ expected_keys = @expected.instance_variables
141
+ expected_keys.sort!
142
+
143
+ actual_keys = result.instance_variables
144
+ actual_keys.sort!
145
+
146
+ @testcase.assert_equal(actual_keys, expected_keys)
147
+
148
+ @expected.instance_variables.each { |k|
149
+ exp_v = @expected.instance_variable_get(k)
150
+ act_v = result.instance_variable_get(k)
151
+ @testcase.assert_equal(act_v, exp_v, [k, exp_v, act_v])
152
+ }
153
+ end
154
+ end
155
+ end
156
+
157
+ class NoContentTypeFetcher
158
+ def fetch(url, body=nil, headers=nil, redirect_limit=nil)
159
+ return OpenID::HTTPResponse._from_raw_data(200, "", {}, nil)
160
+ end
161
+ end
162
+
163
+ class BlankContentTypeFetcher
164
+ def fetch(url, body=nil, headers=nil, redirect_limit=nil)
165
+ return OpenID::HTTPResponse._from_raw_data(200, "", {"Content-Type" => ""}, nil)
166
+ end
167
+ end
168
+
169
+ class TestYadisDiscovery < Test::Unit::TestCase
170
+ include FetcherMixin
171
+
172
+ def test_yadis_discovery
173
+ YadisData::TESTLIST.each { |success, input_name, id_name, result_name|
174
+ test = DiscoveryTestCase.new(self, input_name, id_name, result_name, success)
175
+ test.runCustomTest
176
+ }
177
+ end
178
+
179
+ def test_is_xrds_yadis_location
180
+ result = Yadis::DiscoveryResult.new('http://request.uri/')
181
+ result.normalized_uri = "http://normalized/"
182
+ result.xrds_uri = "http://normalized/xrds"
183
+
184
+ assert(result.is_xrds)
185
+ end
186
+
187
+ def test_is_xrds_content_type
188
+ result = Yadis::DiscoveryResult.new('http://request.uri/')
189
+ result.normalized_uri = result.xrds_uri = "http://normalized/"
190
+ result.content_type = Yadis::YADIS_CONTENT_TYPE
191
+
192
+ assert(result.is_xrds)
193
+ end
194
+
195
+ def test_is_xrds_neither
196
+ result = Yadis::DiscoveryResult.new('http://request.uri/')
197
+ result.normalized_uri = result.xrds_uri = "http://normalized/"
198
+ result.content_type = "another/content-type"
199
+
200
+ assert(!result.is_xrds)
201
+ end
202
+
203
+ def test_no_content_type
204
+ with_fetcher(NoContentTypeFetcher.new) do
205
+ result = Yadis.discover("http://bogus")
206
+ assert_equal(nil, result.content_type)
207
+ end
208
+ end
209
+
210
+ def test_blank_content_type
211
+ with_fetcher(BlankContentTypeFetcher.new) do
212
+ result = Yadis.discover("http://bogus")
213
+ assert_equal("", result.content_type)
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end