saml2 1.0.10 → 1.1.0

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -7
  3. data/lib/saml2.rb +2 -0
  4. data/lib/saml2/attribute.rb +2 -0
  5. data/lib/saml2/attribute_consuming_service.rb +1 -0
  6. data/lib/saml2/authn_request.rb +19 -47
  7. data/lib/saml2/base.rb +5 -2
  8. data/lib/saml2/bindings.rb +7 -0
  9. data/lib/saml2/bindings/http_redirect.rb +141 -0
  10. data/lib/saml2/contact.rb +14 -16
  11. data/lib/saml2/endpoint.rb +5 -6
  12. data/lib/saml2/entity.rb +23 -18
  13. data/lib/saml2/identity_provider.rb +4 -4
  14. data/lib/saml2/indexed_object.rb +7 -3
  15. data/lib/saml2/key.rb +19 -1
  16. data/lib/saml2/logout_request.rb +43 -0
  17. data/lib/saml2/logout_response.rb +23 -0
  18. data/lib/saml2/message.rb +109 -0
  19. data/lib/saml2/name_id.rb +16 -8
  20. data/lib/saml2/organization_and_contacts.rb +2 -2
  21. data/lib/saml2/request.rb +8 -0
  22. data/lib/saml2/response.rb +7 -23
  23. data/lib/saml2/role.rb +2 -3
  24. data/lib/saml2/service_provider.rb +24 -2
  25. data/lib/saml2/sso.rb +2 -2
  26. data/lib/saml2/status.rb +28 -0
  27. data/lib/saml2/status_response.rb +33 -0
  28. data/lib/saml2/version.rb +1 -1
  29. data/spec/fixtures/identity_provider.xml +1 -0
  30. data/spec/fixtures/response_signed.xml +1 -1
  31. data/spec/fixtures/response_with_attribute_signed.xml +1 -1
  32. data/spec/lib/attribute_consuming_service_spec.rb +37 -37
  33. data/spec/lib/attribute_spec.rb +17 -17
  34. data/spec/lib/authn_request_spec.rb +15 -71
  35. data/spec/lib/bindings/http_redirect_spec.rb +151 -0
  36. data/spec/lib/conditions_spec.rb +10 -10
  37. data/spec/lib/entity_spec.rb +12 -12
  38. data/spec/lib/identity_provider_spec.rb +4 -4
  39. data/spec/lib/indexed_object_spec.rb +38 -7
  40. data/spec/lib/logout_request_spec.rb +31 -0
  41. data/spec/lib/logout_response_spec.rb +31 -0
  42. data/spec/lib/message_spec.rb +21 -0
  43. data/spec/lib/response_spec.rb +8 -9
  44. data/spec/lib/service_provider_spec.rb +29 -8
  45. data/spec/spec_helper.rb +0 -1
  46. metadata +41 -11
@@ -3,13 +3,13 @@ require_relative '../spec_helper'
3
3
  module SAML2
4
4
  describe Conditions do
5
5
  it "empty should be valid" do
6
- Conditions.new.valid?.must_equal :valid
6
+ expect(Conditions.new.valid?).to eq :valid
7
7
  end
8
8
 
9
9
  it "should be valid with unknown condition" do
10
10
  conditions = Conditions.new
11
11
  conditions << Conditions::Condition.new
12
- conditions.valid?.must_equal :indeterminate
12
+ expect(conditions.valid?).to eq :indeterminate
13
13
  end
14
14
 
15
15
  it "should be valid with timestamps" do
@@ -17,7 +17,7 @@ module SAML2
17
17
  now = Time.now.utc
18
18
  conditions.not_before = now - 5
19
19
  conditions.not_on_or_after = now + 30
20
- conditions.valid?.must_equal :valid
20
+ expect(conditions.valid?).to eq :valid
21
21
  end
22
22
 
23
23
  it "should be invalid with out of range timestamps" do
@@ -25,7 +25,7 @@ module SAML2
25
25
  now = Time.now.utc
26
26
  conditions.not_before = now - 35
27
27
  conditions.not_on_or_after = now - 5
28
- conditions.valid?.must_equal :invalid
28
+ expect(conditions.valid?).to eq :invalid
29
29
  end
30
30
 
31
31
  it "should allow passing now" do
@@ -33,7 +33,7 @@ module SAML2
33
33
  now = Time.now.utc
34
34
  conditions.not_before = now - 35
35
35
  conditions.not_on_or_after = now - 5
36
- conditions.valid?(now: now - 10).must_equal :valid
36
+ expect(conditions.valid?(now: now - 10)).to eq :valid
37
37
  end
38
38
 
39
39
  it "should be invalid before indeterminate" do
@@ -41,29 +41,29 @@ module SAML2
41
41
  now = Time.now.utc
42
42
  conditions.not_before = now + 5
43
43
  conditions << Conditions::Condition.new
44
- conditions.valid?.must_equal :invalid
44
+ expect(conditions.valid?).to eq :invalid
45
45
  end
46
46
 
47
47
  it "should be invalid before indeterminate (actual conditions)" do
48
48
  conditions = Conditions.new
49
49
  conditions << Conditions::Condition.new
50
50
  conditions << Conditions::AudienceRestriction.new('audience')
51
- conditions.valid?.must_equal :invalid
51
+ expect(conditions.valid?).to eq :invalid
52
52
  end
53
53
 
54
54
  end
55
55
 
56
56
  describe Conditions::AudienceRestriction do
57
57
  it "should be invalid" do
58
- Conditions::AudienceRestriction.new('expected').valid?(audience: 'actual').must_equal :invalid
58
+ expect(Conditions::AudienceRestriction.new('expected').valid?(audience: 'actual')).to eq :invalid
59
59
  end
60
60
 
61
61
  it "should be valid" do
62
- Conditions::AudienceRestriction.new('expected').valid?(audience: 'expected').must_equal :valid
62
+ expect(Conditions::AudienceRestriction.new('expected').valid?(audience: 'expected')).to eq :valid
63
63
  end
64
64
 
65
65
  it "should be valid with an array" do
66
- Conditions::AudienceRestriction.new(['expected', 'actual']).valid?(audience: 'actual').must_equal :valid
66
+ expect(Conditions::AudienceRestriction.new(['expected', 'actual']).valid?(audience: 'actual')).to eq :valid
67
67
  end
68
68
  end
69
69
  end
@@ -4,45 +4,45 @@ module SAML2
4
4
  describe Entity do
5
5
  it "should parse and validate" do
6
6
  entity = Entity.parse(fixture('service_provider.xml'))
7
- entity.valid_schema?.must_equal true
7
+ expect(entity.valid_schema?).to eq true
8
8
  end
9
9
 
10
10
  it "should return nil when not valid schema" do
11
11
  entity = Entity.parse("<xml></xml>")
12
- assert_nil(entity)
12
+ expect(entity).to be_nil
13
13
  end
14
14
 
15
15
  it "should return nil on non-XML" do
16
16
  entity = Entity.parse("garbage")
17
- assert_nil(entity)
17
+ expect(entity).to be_nil
18
18
  end
19
19
 
20
20
  describe "valid schema" do
21
21
  let(:entity) { Entity.parse(fixture('service_provider.xml')) }
22
22
 
23
23
  it "should find the id" do
24
- entity.entity_id.must_equal "http://siteadmin.instructure.com/saml2"
24
+ expect(entity.entity_id).to eq "http://siteadmin.instructure.com/saml2"
25
25
  end
26
26
 
27
27
  it "should parse the organization" do
28
- entity.organization.display_name.must_equal 'Canvas'
29
- entity.organization.display_name('en').must_equal 'Canvas'
30
- assert_nil(entity.organization.display_name('es'))
31
- entity.organization.display_name(:all).must_equal en: 'Canvas'
28
+ expect(entity.organization.display_name).to eq 'Canvas'
29
+ expect(entity.organization.display_name('en')).to eq 'Canvas'
30
+ expect(entity.organization.display_name('es')).to be_nil
31
+ expect(entity.organization.display_name(:all)).to eq en: 'Canvas'
32
32
  end
33
33
 
34
34
  it "validates metadata from ADFS containing lots of non-SAML schemas" do
35
- Entity.parse(fixture('FederationMetadata.xml')).valid_schema?.must_equal true
35
+ expect(Entity.parse(fixture('FederationMetadata.xml')).valid_schema?).to eq true
36
36
  end
37
37
  end
38
38
 
39
39
  describe Entity::Group do
40
40
  it "should parse and validate" do
41
41
  group = Entity.parse(fixture('entities.xml'))
42
- group.must_be_instance_of Entity::Group
43
- group.valid_schema?.must_equal true
42
+ expect(group).to be_instance_of(Entity::Group)
43
+ expect(group.valid_schema?).to eq true
44
44
 
45
- group.map(&:entity_id).must_equal ['urn:entity1', 'urn:entity2']
45
+ expect(group.map(&:entity_id)).to eq ['urn:entity1', 'urn:entity2']
46
46
  end
47
47
  end
48
48
  end
@@ -17,7 +17,7 @@ module SAML2
17
17
  idp.keys << Key.new('somedata', Key::Type::SIGNING)
18
18
 
19
19
  entity.roles << idp
20
- Schemas.metadata.validate(Nokogiri::XML(entity.to_s)).must_equal []
20
+ expect(Schemas.metadata.validate(Nokogiri::XML(entity.to_s))).to eq []
21
21
  end
22
22
 
23
23
  describe "valid metadata" do
@@ -25,12 +25,12 @@ module SAML2
25
25
  let(:idp) { entity.roles.first }
26
26
 
27
27
  it "should create the single_sign_on_services array" do
28
- idp.single_sign_on_services.length.must_equal 3
29
- idp.single_sign_on_services.first.location.must_equal 'https://sso.school.edu/idp/profile/Shibboleth/SSO'
28
+ expect(idp.single_sign_on_services.length).to eq 3
29
+ expect(idp.single_sign_on_services.first.location).to eq 'https://sso.school.edu/idp/profile/Shibboleth/SSO'
30
30
  end
31
31
 
32
32
  it "should find the signing certificate" do
33
- idp.keys.first.x509.must_match(/MIIE8TCCA9mgAwIBAgIJAITusxON60cKMA0GCSqGSIb3DQEBBQUAMIGrMQswCQYD/)
33
+ expect(idp.keys.first.x509).to match(/MIIE8TCCA9mgAwIBAgIJAITusxON60cKMA0GCSqGSIb3DQEBBQUAMIGrMQswCQYD/)
34
34
  end
35
35
  end
36
36
  end
@@ -1,22 +1,53 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
3
  module SAML2
4
+ describe IndexedObject do
5
+ describe "#default?" do
6
+ it "always returns a boolean" do
7
+ acs = Endpoint::Indexed.new('a', 0)
8
+ expect(acs.default?).to eq false
9
+ expect(acs.default_defined?).to eq false
10
+ end
11
+
12
+ it "#default_defined? works" do
13
+ acs = Endpoint::Indexed.new('a', 0, false)
14
+ expect(acs.default?).to eq false
15
+ expect(acs.default_defined?).to eq true
16
+ end
17
+ end
18
+
19
+ context "serialization" do
20
+ it "doesn't include isDefault when it's nil" do
21
+ acs = Endpoint::Indexed.new('a', 0)
22
+ builder = double()
23
+ expect(builder).to receive(:[]).and_return(builder).ordered
24
+ expect(builder).to receive(:"AssertionConsumerService").ordered
25
+ expect(builder).to receive(:parent).and_return(builder).ordered
26
+ expect(builder).to receive(:children).and_return(builder).ordered
27
+ expect(builder).to receive(:last).and_return(builder).ordered
28
+ expect(builder).to receive(:[]=).with("index", 0).ordered
29
+
30
+ acs.build(builder,"AssertionConsumerService")
31
+ end
32
+ end
33
+ end
34
+
4
35
  describe IndexedObject::Array do
5
36
  it "should sort by index" do
6
37
  acses = Endpoint::Indexed::Array.new(
7
38
  [Endpoint::Indexed.new('b', 1),
8
39
  Endpoint::Indexed.new('a', 0)])
9
- acses.map(&:location).must_equal ['a', 'b']
40
+ expect(acses.map(&:location)).to eq ['a', 'b']
10
41
  end
11
42
 
12
43
  it "should be accessible by index" do
13
44
  acses = Endpoint::Indexed::Array.new(
14
45
  [Endpoint::Indexed.new('b', 3),
15
46
  Endpoint::Indexed.new('a', 1)])
16
- acses.map(&:location).must_equal ['a', 'b']
17
- acses[1].location.must_equal 'a'
18
- acses[3].location.must_equal 'b'
19
- assert_nil(acses[0])
47
+ expect(acses.map(&:location)).to eq ['a', 'b']
48
+ expect(acses[1].location).to eq 'a'
49
+ expect(acses[3].location).to eq 'b'
50
+ expect(acses[0]).to be_nil
20
51
  end
21
52
 
22
53
  describe "#default" do
@@ -24,14 +55,14 @@ module SAML2
24
55
  acses = Endpoint::Indexed::Array.new(
25
56
  [Endpoint::Indexed.new('a', 0),
26
57
  Endpoint::Indexed.new('b', 1)])
27
- acses.default.location.must_equal 'a'
58
+ expect(acses.default.location).to eq 'a'
28
59
  end
29
60
 
30
61
  it "should default to a tagged default" do
31
62
  acses = Endpoint::Indexed::Array.new(
32
63
  [Endpoint::Indexed.new('a', 0),
33
64
  Endpoint::Indexed.new('b', 1, true)])
34
- acses.default.location.must_equal 'b'
65
+ expect(acses.default.location).to eq 'b'
35
66
  end
36
67
  end
37
68
  end
@@ -0,0 +1,31 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module SAML2
4
+ describe LogoutRequest do
5
+ let(:idp) { Entity.parse(fixture('identity_provider.xml')).roles.first }
6
+
7
+ let(:logout_request) {
8
+ LogoutRequest.initiate(idp,
9
+ NameID.new('issuer'),
10
+ NameID.new('jacob',
11
+ name_qualifier: "a",
12
+ sp_name_qualifier: "b"),
13
+ "abc")
14
+ }
15
+
16
+ it "should generate valid XML" do
17
+ xml = logout_request.to_s
18
+ expect(Schemas.protocol.validate(Nokogiri::XML(xml))).to eq []
19
+ end
20
+
21
+ it "parses" do
22
+ # yup, I'm lazy
23
+ new_request = LogoutRequest.parse(logout_request.to_s)
24
+ expect(new_request.issuer.id).to eq 'issuer'
25
+ expect(new_request.name_id.id).to eq 'jacob'
26
+ expect(new_request.name_id.name_qualifier).to eq 'a'
27
+ expect(new_request.name_id.sp_name_qualifier).to eq 'b'
28
+ expect(new_request.session_index).to eq ['abc']
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module SAML2
4
+ describe LogoutResponse do
5
+ let(:idp) { Entity.parse(fixture('identity_provider.xml')).roles.first }
6
+
7
+ let(:logout_request) {
8
+ LogoutRequest.initiate(idp,
9
+ NameID.new('issuer'),
10
+ NameID.new('jacob',
11
+ name_qualifier: "a",
12
+ sp_name_qualifier: "b"),
13
+ "abc")
14
+ }
15
+ let(:logout_response) {
16
+ LogoutResponse.respond_to(logout_request, idp, NameID.new('issuer2'))
17
+ }
18
+
19
+ it "should generate valid XML" do
20
+ xml = logout_response.to_s
21
+ expect(Schemas.protocol.validate(Nokogiri::XML(xml))).to eq []
22
+ end
23
+
24
+ it "parses" do
25
+ # yup, I'm lazy
26
+ new_response = LogoutResponse.parse(logout_response.to_s)
27
+ expect(new_response.issuer.id).to eq 'issuer2'
28
+ expect(new_response.status.code).to eq Status::SUCCESS
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module SAML2
4
+ describe Message do
5
+ describe '.parse' do
6
+ it 'complains about invalid XML' do
7
+ expect { Message.parse("garbage") }.to raise_error(CorruptMessage)
8
+ end
9
+
10
+ it 'complains about getting the wrong type if calling on a subclass, and you get a different type' do
11
+ expect { Response.parse(fixture('authnrequest.xml')) }.to raise_error(UnexpectedMessage)
12
+ end
13
+ end
14
+
15
+ describe '.from_xml' do
16
+ it "complains about unknown messages" do
17
+ expect { Message.parse("<Garbage></Garbage>") }.to raise_error(UnknownMessage)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -11,15 +11,14 @@ module SAML2
11
11
  end
12
12
 
13
13
  let(:response) do
14
- response = Response.respond_to(request,
15
- NameID.new('issuer'),
16
- NameID.new('jacob', NameID::Format::PERSISTENT))
17
- response
14
+ Response.respond_to(request,
15
+ NameID.new('issuer'),
16
+ NameID.new('jacob', NameID::Format::PERSISTENT))
18
17
  end
19
18
 
20
19
  it "should generate valid XML" do
21
20
  xml = response.to_s
22
- Schemas.protocol.validate(Nokogiri::XML(xml)).must_equal []
21
+ expect(Schemas.protocol.validate(Nokogiri::XML(xml))).to eq []
23
22
  end
24
23
 
25
24
  def freeze_response
@@ -40,23 +39,23 @@ module SAML2
40
39
  it "should generate a valid signature" do
41
40
  freeze_response
42
41
  response.sign(fixture('certificate.pem'), fixture('privatekey.key'))
43
- Schemas.protocol.validate(response.to_xml).must_equal []
42
+ expect(Schemas.protocol.validate(response.to_xml)).to eq []
44
43
  # verifiable on the command line with:
45
44
  # xmlsec1 --verify --pubkey-cert-pem certificate.pem --privkey-pem privatekey.key --id-attr:ID urn:oasis:names:tc:SAML:2.0:assertion:Assertion response_signed.xml
46
- response.to_s.must_equal fixture('response_signed.xml')
45
+ expect(response.to_s).to eq fixture('response_signed.xml')
47
46
  end
48
47
 
49
48
  it "should generate a valid signature when attributes are present" do
50
49
  freeze_response
51
50
  response.assertions.first.statements << sp.attribute_consuming_services.default.create_statement('givenName' => 'cody')
52
51
  response.sign(fixture('certificate.pem'), fixture('privatekey.key'))
53
- response.to_s.must_equal fixture('response_with_attribute_signed.xml')
52
+ expect(response.to_s).to eq fixture('response_with_attribute_signed.xml')
54
53
  end
55
54
 
56
55
  it "should generate valid XML for IdP initiated response" do
57
56
  response = Response.initiate(sp, NameID.new('issuer'),
58
57
  NameID.new('jacob', NameID::Format::PERSISTENT))
59
- Schemas.protocol.validate(Nokogiri::XML(response.to_s)).must_equal []
58
+ expect(Schemas.protocol.validate(Nokogiri::XML(response.to_s))).to eq []
60
59
  end
61
60
  end
62
61
  end
@@ -2,28 +2,49 @@ require_relative '../spec_helper'
2
2
 
3
3
  module SAML2
4
4
  describe ServiceProvider do
5
+ it "should serialize valid xml" do
6
+ entity = Entity.new
7
+ entity.entity_id = 'http://sso.canvaslms.com/SAML2'
8
+ entity.organization = Organization.new('Canvas', 'Canvas by Instructure', 'https://www.canvaslms.com/')
9
+ contact = Contact.new(Contact::Type::TECHNICAL)
10
+ contact.company = 'Instructure'
11
+ contact.email_addresses << 'mailto:ops@instructure.com'
12
+ entity.contacts << contact
13
+
14
+ sp = ServiceProvider.new
15
+ sp.single_logout_services << Endpoint.new('https://sso.canvaslms.com/SAML2/Logout',
16
+ Endpoint::Bindings::HTTP_REDIRECT)
17
+ sp.assertion_consumer_services << Endpoint::Indexed.new('https://sso.canvaslms.com/SAML2/Login1', 0)
18
+ sp.assertion_consumer_services << Endpoint::Indexed.new('https://sso.canvaslms.com/SAML2/Login2', 1)
19
+ sp.keys << Key.new('somedata', Key::Type::ENCRYPTION, [Key::EncryptionMethod.new])
20
+ sp.keys << Key.new('somedata', Key::Type::SIGNING)
21
+
22
+ entity.roles << sp
23
+ expect(Schemas.metadata.validate(Nokogiri::XML(entity.to_s))).to eq []
24
+ end
25
+
5
26
  describe "valid metadata" do
6
27
  let(:entity) { Entity.parse(fixture('service_provider.xml')) }
7
28
  let(:sp) { entity.roles.first }
8
29
 
9
30
  it "should create the assertion_consumer_services array" do
10
- sp.assertion_consumer_services.length.must_equal 4
11
- sp.assertion_consumer_services.map(&:index).must_equal [0, 1, 2, 3]
12
- sp.assertion_consumer_services.first.location.must_equal 'https://siteadmin.instructure.com/saml_consume'
31
+ expect(sp.assertion_consumer_services.length).to eq 4
32
+ expect(sp.assertion_consumer_services.map(&:index)).to eq [0, 1, 2, 3]
33
+ expect(sp.assertion_consumer_services.first.location).to eq 'https://siteadmin.instructure.com/saml_consume'
13
34
  end
14
35
 
15
36
  it "should find the signing certificate" do
16
- sp.signing_keys.first.x509.must_match(/MIIE8TCCA9mgAwIBAgIJAITusxON60cKMA0GCSqGSIb3DQEBBQUAMIGrMQswCQYD/)
37
+ expect(sp.signing_keys.first.x509).to match(/MIIE8TCCA9mgAwIBAgIJAITusxON60cKMA0GCSqGSIb3DQEBBQUAMIGrMQswCQYD/)
17
38
  end
18
39
 
19
40
  it "should load the organization" do
20
- entity.organization.display_name.must_equal 'Canvas'
41
+ expect(entity.organization.display_name).to eq 'Canvas'
21
42
  end
22
43
 
23
44
  it "should load contacts" do
24
- entity.contacts.length.must_equal 1
25
- entity.contacts.first.type.must_equal Contact::Type::TECHNICAL
26
- entity.contacts.first.surname.must_equal 'Administrator'
45
+ expect(entity.contacts.length).to eq 1
46
+ expect(entity.contacts.first.type).to eq Contact::Type::TECHNICAL
47
+ expect(entity.contacts.first.surname).to eq 'Administrator'
27
48
  end
28
49
  end
29
50
  end
@@ -1,4 +1,3 @@
1
- require 'minitest/autorun'
2
1
  require 'saml2'
3
2
 
4
3
  def fixture(name)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saml2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.10
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Cutrer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-27 00:00:00.000000000 Z
11
+ date: 2017-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -70,34 +70,48 @@ dependencies:
70
70
  - - "<"
71
71
  - !ruby/object:Gem::Version
72
72
  version: '5.1'
73
+ - !ruby/object:Gem::Dependency
74
+ name: byebug
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '9.0'
80
+ type: :development
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '9.0'
73
87
  - !ruby/object:Gem::Dependency
74
88
  name: rake
75
89
  requirement: !ruby/object:Gem::Requirement
76
90
  requirements:
77
- - - ">="
91
+ - - "~>"
78
92
  - !ruby/object:Gem::Version
79
- version: '0'
93
+ version: '12.0'
80
94
  type: :development
81
95
  prerelease: false
82
96
  version_requirements: !ruby/object:Gem::Requirement
83
97
  requirements:
84
- - - ">="
98
+ - - "~>"
85
99
  - !ruby/object:Gem::Version
86
- version: '0'
100
+ version: '12.0'
87
101
  - !ruby/object:Gem::Dependency
88
- name: minitest
102
+ name: rspec
89
103
  requirement: !ruby/object:Gem::Requirement
90
104
  requirements:
91
- - - ">="
105
+ - - "~>"
92
106
  - !ruby/object:Gem::Version
93
- version: '0'
107
+ version: '3.5'
94
108
  type: :development
95
109
  prerelease: false
96
110
  version_requirements: !ruby/object:Gem::Requirement
97
111
  requirements:
98
- - - ">="
112
+ - - "~>"
99
113
  - !ruby/object:Gem::Version
100
- version: '0'
114
+ version: '3.5'
101
115
  description: |2
102
116
  The saml2 library is yet another SAML library for Ruby, with
103
117
  an emphasis on _not_ re-implementing XML, especially XML Security,
@@ -122,6 +136,8 @@ files:
122
136
  - lib/saml2/authn_request.rb
123
137
  - lib/saml2/authn_statement.rb
124
138
  - lib/saml2/base.rb
139
+ - lib/saml2/bindings.rb
140
+ - lib/saml2/bindings/http_redirect.rb
125
141
  - lib/saml2/conditions.rb
126
142
  - lib/saml2/contact.rb
127
143
  - lib/saml2/endpoint.rb
@@ -130,15 +146,21 @@ files:
130
146
  - lib/saml2/identity_provider.rb
131
147
  - lib/saml2/indexed_object.rb
132
148
  - lib/saml2/key.rb
149
+ - lib/saml2/logout_request.rb
150
+ - lib/saml2/logout_response.rb
151
+ - lib/saml2/message.rb
133
152
  - lib/saml2/name_id.rb
134
153
  - lib/saml2/namespaces.rb
135
154
  - lib/saml2/organization.rb
136
155
  - lib/saml2/organization_and_contacts.rb
156
+ - lib/saml2/request.rb
137
157
  - lib/saml2/response.rb
138
158
  - lib/saml2/role.rb
139
159
  - lib/saml2/schemas.rb
140
160
  - lib/saml2/service_provider.rb
141
161
  - lib/saml2/sso.rb
162
+ - lib/saml2/status.rb
163
+ - lib/saml2/status_response.rb
142
164
  - lib/saml2/subject.rb
143
165
  - lib/saml2/version.rb
144
166
  - schemas/MetadataExchange.xsd
@@ -166,10 +188,14 @@ files:
166
188
  - spec/lib/attribute_consuming_service_spec.rb
167
189
  - spec/lib/attribute_spec.rb
168
190
  - spec/lib/authn_request_spec.rb
191
+ - spec/lib/bindings/http_redirect_spec.rb
169
192
  - spec/lib/conditions_spec.rb
170
193
  - spec/lib/entity_spec.rb
171
194
  - spec/lib/identity_provider_spec.rb
172
195
  - spec/lib/indexed_object_spec.rb
196
+ - spec/lib/logout_request_spec.rb
197
+ - spec/lib/logout_response_spec.rb
198
+ - spec/lib/message_spec.rb
173
199
  - spec/lib/response_spec.rb
174
200
  - spec/lib/service_provider_spec.rb
175
201
  - spec/spec_helper.rb
@@ -210,10 +236,14 @@ test_files:
210
236
  - spec/lib/attribute_consuming_service_spec.rb
211
237
  - spec/lib/attribute_spec.rb
212
238
  - spec/lib/authn_request_spec.rb
239
+ - spec/lib/bindings/http_redirect_spec.rb
213
240
  - spec/lib/conditions_spec.rb
214
241
  - spec/lib/entity_spec.rb
215
242
  - spec/lib/identity_provider_spec.rb
216
243
  - spec/lib/indexed_object_spec.rb
244
+ - spec/lib/logout_request_spec.rb
245
+ - spec/lib/logout_response_spec.rb
246
+ - spec/lib/message_spec.rb
217
247
  - spec/lib/response_spec.rb
218
248
  - spec/lib/service_provider_spec.rb
219
249
  - spec/spec_helper.rb