ruby-saml 0.9 → 0.9.1

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-saml might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a74680083b8b3cd4e4145de5e3358addac4fce7
4
- data.tar.gz: 7fc603140154d73be347544795a7616ba1fb246e
3
+ metadata.gz: 472b9871eb65dc7e7290cd0eeefbe32299062339
4
+ data.tar.gz: 6275d19b96066aa9f17502b4e521b2c3d30626a3
5
5
  SHA512:
6
- metadata.gz: 3fbdd9922622ff8c2e62ab0956d319db1bc13311da52c969ff5307d53d2d2ed5eb6c2a6900452a3976478b552b7085af6b9338db2bcea4958be0dd809f412f34
7
- data.tar.gz: 071f1f8f248e724b60b9870d5c1a4c7c3b9f2630cb289f762b11911392aa0d9d471c1f1fbf5c2e0cfe4e1d5eaf8c29a82eeee7a52845f1bcc77c10e2d75941d4
6
+ metadata.gz: b2f4796bb5f8ee71f40fdf18f28552038c0c9b6ac85f626452a2614a898f60775fdf482eab044f8643c178da126ea3d640eb3b72427c86e59b935418649ae5b8
7
+ data.tar.gz: 96050fa0bfb1451640fe4e1fa799b60fffee4f33622832e9f2a3c0bee20b085c8f99d087b1541d60277de4c4a88c01890206dca8b16c29f4d2dbbe5106b4666f
@@ -2,5 +2,6 @@ language: ruby
2
2
  rvm:
3
3
  - 1.8.7
4
4
  - 1.9.3
5
- - 2.1.1
5
+ - 2.0.0
6
+ - 2.1.5
6
7
  - ree
data/Gemfile CHANGED
@@ -4,24 +4,3 @@
4
4
  source 'http://rubygems.org'
5
5
 
6
6
  gemspec
7
-
8
- group :test do
9
- if RUBY_VERSION < '1.9'
10
- gem 'nokogiri', '~> 1.5.0'
11
- gem 'ruby-debug', '~> 0.10.4'
12
- elsif RUBY_VERSION < '2.0'
13
- gem 'debugger-linecache', '~> 1.2.0'
14
- gem 'debugger', '~> 1.6.4'
15
- elsif RUBY_VERSION < '2.1'
16
- gem 'byebug', '~> 2.1.1'
17
- else
18
- gem 'pry-byebug'
19
- end
20
-
21
- gem 'mocha', '~> 0.14', :require => false
22
- gem 'rake', '~> 10'
23
- gem 'shoulda', '~> 2.11'
24
- gem 'systemu', '~> 2'
25
- gem 'test-unit', '~> 3'
26
- gem 'timecop', '<= 0.6.0'
27
- end
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ruby SAML [![Build Status](https://secure.travis-ci.org/onelogin/ruby-saml.png)](http://travis-ci.org/onelogin/ruby-saml)
2
2
 
3
- ## Updating from 0.8.x to 0.9
3
+ ## Updating from 0.8.x to 0.9.x
4
4
  Version `0.9` adds many new features and improvements. It is a recommended update for all Ruby SAML users. For more details, please review [the changelog](changelog.md)
5
5
 
6
6
  ## Updating from 0.7.x to 0.8.x
@@ -14,6 +14,12 @@ SAML authorization is a two step process and you are expected to implement suppo
14
14
 
15
15
  We created a demo project for Rails4 that uses the latest version of this library: [ruby-saml-example](https://github.com/onelogin/ruby-saml-example)
16
16
 
17
+ ### Supported versions of Ruby
18
+ * 1.8.7
19
+ * 1.9.x
20
+ * 2.1.x
21
+ * 2.2 (not yet officially supported)
22
+
17
23
  ## Adding Features, Pull Requests
18
24
  * Fork the repository
19
25
  * Make your feature addition or bug fix
@@ -29,7 +35,7 @@ Using `Gemfile`
29
35
 
30
36
  ```ruby
31
37
  # latest stable
32
- gem 'ruby-saml', '~> 0.9'
38
+ gem 'ruby-saml', '~> 0.9.1'
33
39
 
34
40
  # or track master for bleeding-edge
35
41
  gem 'ruby-saml', :github => 'onelogin/ruby-saml'
@@ -1,4 +1,8 @@
1
1
  # RubySaml Changelog
2
+ ### 0.9.1 (Feb 10, 2015)
3
+ * [#194](https://github.com/onelogin/ruby-saml/pull/194) Relax nokogiri gem requirements
4
+ * [#191](https://github.com/onelogin/ruby-saml/pull/191) Use Minitest instead of Test::Unit
5
+
2
6
  ### 0.9 (Jan 26, 2015)
3
7
  * [#169](https://github.com/onelogin/ruby-saml/pull/169) WantAssertionSigned should be either true or false
4
8
  * [#167](https://github.com/onelogin/ruby-saml/pull/167) (doc update) make unit of clock drift obvious
@@ -1,5 +1,5 @@
1
1
  module OneLogin
2
2
  module RubySaml
3
- VERSION = '0.9'
3
+ VERSION = '0.9.1'
4
4
  end
5
5
  end
@@ -21,9 +21,37 @@ Gem::Specification.new do |s|
21
21
  s.rdoc_options = ["--charset=UTF-8"]
22
22
  s.require_paths = ["lib"]
23
23
  s.rubygems_version = %q{1.3.7}
24
+ s.required_ruby_version = '>= 1.8.7'
24
25
  s.summary = %q{SAML Ruby Tookit}
25
26
  s.test_files = `git ls-files test/*`.split("\n")
26
27
 
27
- s.add_runtime_dependency("uuid", ["~> 2.3"])
28
- s.add_runtime_dependency("nokogiri", [">= 1.5.0"])
28
+ s.add_runtime_dependency('uuid', '~> 2.3')
29
+ if RUBY_VERSION < '1.9'
30
+ # 1.8.7
31
+ s.add_runtime_dependency('nokogiri', '~> 1.5.10')
32
+ else
33
+ s.add_runtime_dependency('nokogiri', '~> 1.6.0')
34
+ end
35
+
36
+ s.add_development_dependency('minitest', '~> 5.5')
37
+ s.add_development_dependency('mocha', '~> 0.14')
38
+ s.add_development_dependency('rake', '~> 10')
39
+ s.add_development_dependency('shoulda', '~> 2.11')
40
+ s.add_development_dependency('systemu', '~> 2')
41
+ s.add_development_dependency('timecop', '<= 0.6.0')
42
+
43
+ if RUBY_VERSION < '1.9'
44
+ # 1.8.7
45
+ s.add_development_dependency('ruby-debug', '~> 0.10.4')
46
+ elsif RUBY_VERSION < '2.0'
47
+ # 1.9.x
48
+ s.add_development_dependency('debugger-linecache', '~> 1.2.0')
49
+ s.add_development_dependency('debugger', '~> 1.6.4')
50
+ elsif RUBY_VERSION < '2.1'
51
+ # 2.0.x
52
+ s.add_development_dependency('byebug', '~> 2.1.1')
53
+ else
54
+ # 2.1.x, 2.2.x
55
+ s.add_development_dependency('pry-byebug')
56
+ end
29
57
  end
@@ -2,14 +2,14 @@ require File.expand_path(File.join(File.dirname(__FILE__), "test_helper"))
2
2
  require 'net/http'
3
3
  require 'net/https'
4
4
 
5
- class IdpMetadataParserTest < Test::Unit::TestCase
5
+ class IdpMetadataParserTest < Minitest::Test
6
6
 
7
7
  class MockResponse
8
8
  attr_accessor :body
9
9
  end
10
10
 
11
- context "parsing an IdP descriptor file" do
12
- should "extract settings details from xml" do
11
+ describe "parsing an IdP descriptor file" do
12
+ it "extract settings details from xml" do
13
13
  idp_metadata_parser = OneLogin::RubySaml::IdpMetadataParser.new
14
14
 
15
15
  settings = idp_metadata_parser.parse(idp_metadata)
@@ -20,8 +20,8 @@ class IdpMetadataParserTest < Test::Unit::TestCase
20
20
  end
21
21
  end
22
22
 
23
- context "download and parse IdP descriptor file" do
24
- setup do
23
+ describe "download and parse IdP descriptor file" do
24
+ before do
25
25
  mock_response = MockResponse.new
26
26
  mock_response.body = idp_metadata
27
27
  @url = "https://example.com"
@@ -33,7 +33,7 @@ class IdpMetadataParserTest < Test::Unit::TestCase
33
33
  end
34
34
 
35
35
 
36
- should "extract settings from remote xml" do
36
+ it "extract settings from remote xml" do
37
37
  idp_metadata_parser = OneLogin::RubySaml::IdpMetadataParser.new
38
38
  settings = idp_metadata_parser.parse_remote(@url)
39
39
 
@@ -43,7 +43,7 @@ class IdpMetadataParserTest < Test::Unit::TestCase
43
43
  assert_equal OpenSSL::SSL::VERIFY_PEER, @http.verify_mode
44
44
  end
45
45
 
46
- should "accept self signed certificate if insturcted" do
46
+ it "accept self signed certificate if insturcted" do
47
47
  idp_metadata_parser = OneLogin::RubySaml::IdpMetadataParser.new
48
48
  settings = idp_metadata_parser.parse_remote(@url, false)
49
49
 
@@ -1,11 +1,11 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), "test_helper"))
2
2
 
3
- class RequestTest < Test::Unit::TestCase
3
+ class RequestTest < Minitest::Test
4
4
 
5
- context "Logoutrequest" do
6
- settings = OneLogin::RubySaml::Settings.new
5
+ describe "Logoutrequest" do
6
+ let(:settings) { OneLogin::RubySaml::Settings.new }
7
7
 
8
- should "create the deflated SAMLRequest URL parameter" do
8
+ it "create the deflated SAMLRequest URL parameter" do
9
9
  settings.idp_slo_target_url = "http://unauth.com/logout"
10
10
  settings.name_identifier_value = "f00f00"
11
11
 
@@ -17,8 +17,8 @@ class RequestTest < Test::Unit::TestCase
17
17
  assert_match /^<samlp:LogoutRequest/, inflated
18
18
  end
19
19
 
20
- should "support additional params" do
21
-
20
+ it "support additional params" do
21
+ settings.idp_slo_target_url = "http://example.com"
22
22
  unauth_url = OneLogin::RubySaml::Logoutrequest.new.create(settings, { :hello => nil })
23
23
  assert unauth_url =~ /&hello=$/
24
24
 
@@ -26,7 +26,7 @@ class RequestTest < Test::Unit::TestCase
26
26
  assert unauth_url =~ /&foo=bar$/
27
27
  end
28
28
 
29
- should "set sessionindex" do
29
+ it "set sessionindex" do
30
30
  settings.idp_slo_target_url = "http://example.com"
31
31
  sessionidx = UUID.new.generate
32
32
  settings.sessionindex = sessionidx
@@ -38,7 +38,7 @@ class RequestTest < Test::Unit::TestCase
38
38
  assert_match %r(#{sessionidx}</samlp:SessionIndex>), inflated
39
39
  end
40
40
 
41
- should "set name_identifier_value" do
41
+ it "set name_identifier_value" do
42
42
  settings = OneLogin::RubySaml::Settings.new
43
43
  settings.idp_slo_target_url = "http://example.com"
44
44
  settings.name_identifier_format = "transient"
@@ -52,8 +52,8 @@ class RequestTest < Test::Unit::TestCase
52
52
  assert_match %r(#{name_identifier_value}</saml:NameID>), inflated
53
53
  end
54
54
 
55
- context "when the target url doesn't contain a query string" do
56
- should "create the SAMLRequest parameter correctly" do
55
+ describe "when the target url doesn't contain a query string" do
56
+ it "create the SAMLRequest parameter correctly" do
57
57
  settings = OneLogin::RubySaml::Settings.new
58
58
  settings.idp_slo_target_url = "http://example.com"
59
59
  settings.name_identifier_value = "f00f00"
@@ -63,8 +63,8 @@ class RequestTest < Test::Unit::TestCase
63
63
  end
64
64
  end
65
65
 
66
- context "when the target url contains a query string" do
67
- should "create the SAMLRequest parameter correctly" do
66
+ describe "when the target url contains a query string" do
67
+ it "create the SAMLRequest parameter correctly" do
68
68
  settings = OneLogin::RubySaml::Settings.new
69
69
  settings.idp_slo_target_url = "http://example.com?field=value"
70
70
  settings.name_identifier_value = "f00f00"
@@ -74,8 +74,8 @@ class RequestTest < Test::Unit::TestCase
74
74
  end
75
75
  end
76
76
 
77
- context "consumation of logout may need to track the transaction" do
78
- should "have access to the request uuid" do
77
+ describe "consumation of logout may need to track the transaction" do
78
+ it "have access to the request uuid" do
79
79
  settings = OneLogin::RubySaml::Settings.new
80
80
  settings.idp_slo_target_url = "http://example.com?field=value"
81
81
  settings.name_identifier_value = "f00f00"
@@ -88,8 +88,8 @@ class RequestTest < Test::Unit::TestCase
88
88
  end
89
89
  end
90
90
 
91
- context "when the settings indicate to sign (embebed) the logout request" do
92
- should "created a signed logout request" do
91
+ describe "when the settings indicate to sign (embebed) the logout request" do
92
+ it "created a signed logout request" do
93
93
  settings = OneLogin::RubySaml::Settings.new
94
94
  settings.idp_slo_target_url = "http://example.com?field=value"
95
95
  settings.name_identifier_value = "f00f00"
@@ -106,7 +106,7 @@ class RequestTest < Test::Unit::TestCase
106
106
  assert_match %r[<ds:SignatureValue>([a-zA-Z0-9/+=]+)</ds:SignatureValue>], inflated
107
107
  end
108
108
 
109
- should "create a signed logout request with 256 digest and signature methods" do
109
+ it "create a signed logout request with 256 digest and signature methods" do
110
110
  settings = OneLogin::RubySaml::Settings.new
111
111
  settings.compress_request = false
112
112
  settings.idp_slo_target_url = "http://example.com?field=value"
@@ -128,8 +128,8 @@ class RequestTest < Test::Unit::TestCase
128
128
  end
129
129
  end
130
130
 
131
- context "when the settings indicate to sign the logout request" do
132
- should "create a signature parameter" do
131
+ describe "when the settings indicate to sign the logout request" do
132
+ it "create a signature parameter" do
133
133
  settings = OneLogin::RubySaml::Settings.new
134
134
  settings.compress_request = false
135
135
  settings.idp_slo_target_url = "http://example.com?field=value"
@@ -153,16 +153,4 @@ class RequestTest < Test::Unit::TestCase
153
153
  end
154
154
 
155
155
  end
156
-
157
- def decode_saml_request_payload(unauth_url)
158
- payload = CGI.unescape(unauth_url.split("SAMLRequest=").last)
159
- decoded = Base64.decode64(payload)
160
-
161
- zstream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
162
- inflated = zstream.inflate(decoded)
163
- zstream.finish
164
- zstream.close
165
- inflated
166
- end
167
-
168
156
  end
@@ -1,26 +1,27 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), "test_helper"))
2
2
  require 'rexml/document'
3
3
  require 'responses/logoutresponse_fixtures'
4
- class RubySamlTest < Test::Unit::TestCase
5
4
 
6
- context "Logoutresponse" do
7
- context "#new" do
8
- should "raise an exception when response is initialized with nil" do
5
+ class RubySamlTest < Minitest::Test
6
+
7
+ describe "Logoutresponse" do
8
+ describe "#new" do
9
+ it "raise an exception when response is initialized with nil" do
9
10
  assert_raises(ArgumentError) { OneLogin::RubySaml::Logoutresponse.new(nil) }
10
11
  end
11
- should "default to empty settings" do
12
+ it "default to empty settings" do
12
13
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new( valid_response)
13
14
  assert_nil logoutresponse.settings
14
15
  end
15
- should "accept constructor-injected settings" do
16
+ it "accept constructor-injected settings" do
16
17
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(valid_response, settings)
17
- assert_not_nil logoutresponse.settings
18
+ refute_nil logoutresponse.settings
18
19
  end
19
- should "accept constructor-injected options" do
20
+ it "accept constructor-injected options" do
20
21
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(valid_response, nil, { :foo => :bar} )
21
22
  assert !logoutresponse.options.empty?
22
23
  end
23
- should "support base64 encoded responses" do
24
+ it "support base64 encoded responses" do
24
25
  expected_response = valid_response
25
26
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(Base64.encode64(expected_response), settings)
26
27
 
@@ -28,8 +29,8 @@ class RubySamlTest < Test::Unit::TestCase
28
29
  end
29
30
  end
30
31
 
31
- context "#validate" do
32
- should "validate the response" do
32
+ describe "#validate" do
33
+ it "validate the response" do
33
34
  in_relation_to_request_id = random_id
34
35
 
35
36
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(valid_response({:uuid => in_relation_to_request_id}), settings)
@@ -42,7 +43,7 @@ class RubySamlTest < Test::Unit::TestCase
42
43
  assert logoutresponse.success?
43
44
  end
44
45
 
45
- should "invalidate responses with wrong id when given option :matches_uuid" do
46
+ it "invalidate responses with wrong id when given option :matches_uuid" do
46
47
 
47
48
  expected_request_id = "_some_other_expected_uuid"
48
49
  opts = { :matches_request_id => expected_request_id}
@@ -50,10 +51,10 @@ class RubySamlTest < Test::Unit::TestCase
50
51
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(valid_response, settings, opts)
51
52
 
52
53
  assert !logoutresponse.validate
53
- assert_not_equal expected_request_id, logoutresponse.in_response_to
54
+ refute_equal expected_request_id, logoutresponse.in_response_to
54
55
  end
55
56
 
56
- should "invalidate responses with wrong request status" do
57
+ it "invalidate responses with wrong request status" do
57
58
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(unsuccessful_response, settings)
58
59
 
59
60
  assert !logoutresponse.validate
@@ -61,8 +62,8 @@ class RubySamlTest < Test::Unit::TestCase
61
62
  end
62
63
  end
63
64
 
64
- context "#validate!" do
65
- should "validates good responses" do
65
+ describe "#validate!" do
66
+ it "validates good responses" do
66
67
  in_relation_to_request_id = random_id
67
68
 
68
69
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(valid_response({:uuid => in_relation_to_request_id}), settings)
@@ -70,7 +71,7 @@ class RubySamlTest < Test::Unit::TestCase
70
71
  logoutresponse.validate!
71
72
  end
72
73
 
73
- should "raises validation error when matching for wrong request id" do
74
+ it "raises validation error when matching for wrong request id" do
74
75
 
75
76
  expected_request_id = "_some_other_expected_id"
76
77
  opts = { :matches_request_id => expected_request_id}
@@ -80,37 +81,30 @@ class RubySamlTest < Test::Unit::TestCase
80
81
  assert_raises(OneLogin::RubySaml::ValidationError) { logoutresponse.validate! }
81
82
  end
82
83
 
83
- should "raise validation error for wrong request status" do
84
+ it "raise validation error for wrong request status" do
84
85
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(unsuccessful_response, settings)
85
86
 
86
87
  assert_raises(OneLogin::RubySaml::ValidationError) { logoutresponse.validate! }
87
88
  end
88
89
 
89
- should "raise validation error when in bad state" do
90
+ it "raise validation error when in bad state" do
90
91
  # no settings
91
92
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(unsuccessful_response)
92
93
  assert_raises(OneLogin::RubySaml::ValidationError) { logoutresponse.validate! }
93
94
  end
94
95
 
95
- should "raise validation error when in lack of issuer setting" do
96
+ it "raise validation error when in lack of issuer setting" do
96
97
  bad_settings = settings
97
98
  bad_settings.issuer = nil
98
99
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(unsuccessful_response, bad_settings)
99
100
  assert_raises(OneLogin::RubySaml::ValidationError) { logoutresponse.validate! }
100
101
  end
101
102
 
102
- should "raise error for invalid xml" do
103
+ it "raise error for invalid xml" do
103
104
  logoutresponse = OneLogin::RubySaml::Logoutresponse.new(invalid_xml_response, settings)
104
105
 
105
106
  assert_raises(OneLogin::RubySaml::ValidationError) { logoutresponse.validate! }
106
107
  end
107
108
  end
108
-
109
109
  end
110
-
111
- # logoutresponse fixtures
112
- def random_id
113
- "_#{UUID.new.generate}"
114
- end
115
-
116
110
  end
@@ -1,87 +1,88 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), "test_helper"))
2
2
 
3
- class MetadataTest < Test::Unit::TestCase
4
-
5
- def setup
6
- @settings = OneLogin::RubySaml::Settings.new
7
- @settings.issuer = "https://example.com"
8
- @settings.name_identifier_format = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
9
- @settings.assertion_consumer_service_url = "https://foo.example/saml/consume"
10
- @settings.security[:authn_requests_signed] = false
11
- end
12
-
13
- should "generate Service Provider Metadata with X509Certificate" do
14
- @settings.security[:authn_requests_signed] = true
15
- @settings.certificate = ruby_saml_cert_text
3
+ class MetadataTest < Minitest::Test
4
+
5
+ describe 'Metadata' do
6
+ def setup
7
+ @settings = OneLogin::RubySaml::Settings.new
8
+ @settings.issuer = "https://example.com"
9
+ @settings.name_identifier_format = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
10
+ @settings.assertion_consumer_service_url = "https://foo.example/saml/consume"
11
+ @settings.security[:authn_requests_signed] = false
12
+ end
16
13
 
17
- xml_text = OneLogin::RubySaml::Metadata.new.generate(@settings)
14
+ it "generates Service Provider Metadata with X509Certificate" do
15
+ @settings.security[:authn_requests_signed] = true
16
+ @settings.certificate = ruby_saml_cert_text
18
17
 
19
- # assert xml_text can be parsed into an xml doc
20
- xml_doc = REXML::Document.new(xml_text)
18
+ xml_text = OneLogin::RubySaml::Metadata.new.generate(@settings)
21
19
 
22
- spsso_descriptor = REXML::XPath.first(xml_doc, "//md:SPSSODescriptor")
23
- assert_equal "true", spsso_descriptor.attribute("AuthnRequestsSigned").value
20
+ # assert xml_text can be parsed into an xml doc
21
+ xml_doc = REXML::Document.new(xml_text)
24
22
 
25
- cert_node = REXML::XPath.first(xml_doc, "//md:KeyDescriptor/ds:KeyInfo/ds:X509Data/ds:X509Certificate", {
26
- "md" => "urn:oasis:names:tc:SAML:2.0:metadata",
27
- "ds" => "http://www.w3.org/2000/09/xmldsig#"
28
- })
29
- cert_text = cert_node.text
30
- cert = OpenSSL::X509::Certificate.new(Base64.decode64(cert_text))
31
- assert_equal ruby_saml_cert.to_der, cert.to_der
32
- end
23
+ spsso_descriptor = REXML::XPath.first(xml_doc, "//md:SPSSODescriptor")
24
+ assert_equal "true", spsso_descriptor.attribute("AuthnRequestsSigned").value
33
25
 
34
- should "should generate Service Provider Metadata" do
35
- settings = OneLogin::RubySaml::Settings.new
36
- settings.issuer = "https://example.com"
37
- settings.name_identifier_format = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
38
- settings.assertion_consumer_service_url = "https://foo.example/saml/consume"
39
- settings.security[:authn_requests_signed] = false
26
+ cert_node = REXML::XPath.first(xml_doc, "//md:KeyDescriptor/ds:KeyInfo/ds:X509Data/ds:X509Certificate", {
27
+ "md" => "urn:oasis:names:tc:SAML:2.0:metadata",
28
+ "ds" => "http://www.w3.org/2000/09/xmldsig#"
29
+ })
30
+ cert_text = cert_node.text
31
+ cert = OpenSSL::X509::Certificate.new(Base64.decode64(cert_text))
32
+ assert_equal ruby_saml_cert.to_der, cert.to_der
33
+ end
40
34
 
41
- xml_text = OneLogin::RubySaml::Metadata.new.generate(settings)
35
+ it "generates Service Provider Metadata" do
36
+ settings = OneLogin::RubySaml::Settings.new
37
+ settings.issuer = "https://example.com"
38
+ settings.name_identifier_format = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
39
+ settings.assertion_consumer_service_url = "https://foo.example/saml/consume"
40
+ settings.security[:authn_requests_signed] = false
42
41
 
43
- # assert correct xml declaration
44
- start = "<?xml version='1.0' encoding='UTF-8'?>\n<md:EntityDescriptor"
45
- assert xml_text[0..start.length-1] == start
42
+ xml_text = OneLogin::RubySaml::Metadata.new.generate(settings)
46
43
 
47
- # assert xml_text can be parsed into an xml doc
48
- xml_doc = REXML::Document.new(xml_text)
44
+ # assert correct xml declaration
45
+ start = "<?xml version='1.0' encoding='UTF-8'?>\n<md:EntityDescriptor"
46
+ assert xml_text[0..start.length-1] == start
49
47
 
50
- assert_equal "https://example.com", REXML::XPath.first(xml_doc, "//md:EntityDescriptor").attribute("entityID").value
48
+ # assert xml_text can be parsed into an xml doc
49
+ xml_doc = REXML::Document.new(xml_text)
51
50
 
52
- spsso_descriptor = REXML::XPath.first(xml_doc, "//md:SPSSODescriptor")
53
- assert_equal "urn:oasis:names:tc:SAML:2.0:protocol", spsso_descriptor.attribute("protocolSupportEnumeration").value
54
- assert_equal "false", spsso_descriptor.attribute("AuthnRequestsSigned").value
55
- assert_equal "false", spsso_descriptor.attribute("WantAssertionsSigned").value
51
+ assert_equal "https://example.com", REXML::XPath.first(xml_doc, "//md:EntityDescriptor").attribute("entityID").value
56
52
 
57
- assert_equal "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", REXML::XPath.first(xml_doc, "//md:NameIDFormat").text.strip
53
+ spsso_descriptor = REXML::XPath.first(xml_doc, "//md:SPSSODescriptor")
54
+ assert_equal "urn:oasis:names:tc:SAML:2.0:protocol", spsso_descriptor.attribute("protocolSupportEnumeration").value
55
+ assert_equal "false", spsso_descriptor.attribute("AuthnRequestsSigned").value
56
+ assert_equal "false", spsso_descriptor.attribute("WantAssertionsSigned").value
58
57
 
59
- acs = REXML::XPath.first(xml_doc, "//md:AssertionConsumerService")
60
- assert_equal "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", acs.attribute("Binding").value
61
- assert_equal "https://foo.example/saml/consume", acs.attribute("Location").value
62
- end
58
+ assert_equal "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", REXML::XPath.first(xml_doc, "//md:NameIDFormat").text.strip
63
59
 
64
- should "generate attribute service if configured" do
65
- settings = OneLogin::RubySaml::Settings.new
66
- settings.issuer = "https://example.com"
67
- settings.name_identifier_format = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
68
- settings.assertion_consumer_service_url = "https://foo.example/saml/consume"
69
- settings.attribute_consuming_service.configure do
70
- service_name "Test Service"
71
- add_attribute(:name => "Name", :name_format => "Name Format", :friendly_name => "Friendly Name", :attribute_value => "Attribute Value")
60
+ acs = REXML::XPath.first(xml_doc, "//md:AssertionConsumerService")
61
+ assert_equal "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", acs.attribute("Binding").value
62
+ assert_equal "https://foo.example/saml/consume", acs.attribute("Location").value
72
63
  end
73
64
 
74
- xml_text = OneLogin::RubySaml::Metadata.new.generate(settings)
75
- xml_doc = REXML::Document.new(xml_text)
76
- acs = REXML::XPath.first(xml_doc, "//md:AttributeConsumingService")
77
- assert_equal "true", acs.attribute("isDefault").value
78
- assert_equal "1", acs.attribute("index").value
79
- assert_equal REXML::XPath.first(xml_doc, "//md:ServiceName").text.strip, "Test Service"
80
- req_attr = REXML::XPath.first(xml_doc, "//md:RequestedAttribute")
81
- assert_equal "Name", req_attr.attribute("Name").value
82
- assert_equal "Name Format", req_attr.attribute("NameFormat").value
83
- assert_equal "Friendly Name", req_attr.attribute("FriendlyName").value
84
- assert_equal "Attribute Value", REXML::XPath.first(xml_doc, "//md:AttributeValue").text.strip
65
+ it "generates attribute service if configured" do
66
+ settings = OneLogin::RubySaml::Settings.new
67
+ settings.issuer = "https://example.com"
68
+ settings.name_identifier_format = "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
69
+ settings.assertion_consumer_service_url = "https://foo.example/saml/consume"
70
+ settings.attribute_consuming_service.configure do
71
+ service_name "Test Service"
72
+ add_attribute(:name => "Name", :name_format => "Name Format", :friendly_name => "Friendly Name", :attribute_value => "Attribute Value")
73
+ end
74
+
75
+ xml_text = OneLogin::RubySaml::Metadata.new.generate(settings)
76
+ xml_doc = REXML::Document.new(xml_text)
77
+ acs = REXML::XPath.first(xml_doc, "//md:AttributeConsumingService")
78
+ assert_equal "true", acs.attribute("isDefault").value
79
+ assert_equal "1", acs.attribute("index").value
80
+ assert_equal REXML::XPath.first(xml_doc, "//md:ServiceName").text.strip, "Test Service"
81
+ req_attr = REXML::XPath.first(xml_doc, "//md:RequestedAttribute")
82
+ assert_equal "Name", req_attr.attribute("Name").value
83
+ assert_equal "Name Format", req_attr.attribute("NameFormat").value
84
+ assert_equal "Friendly Name", req_attr.attribute("FriendlyName").value
85
+ assert_equal "Attribute Value", REXML::XPath.first(xml_doc, "//md:AttributeValue").text.strip
86
+ end
85
87
  end
86
-
87
88
  end