ruby-saml-idp 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8b16a7a227b6a3e2c072eea9c5057dcc7aaf749f
4
+ data.tar.gz: d759a2849e41456e496fbc5d7dfab40bb5bf626d
5
+ SHA512:
6
+ metadata.gz: 24c725eb2ef8fb77b942f41a495ee806341002089c0f70155bcb801a0960d1e4be7fc4a56684f00c887fa5ee66c9e79577a5220ef43b8f923d519ccafd14e573
7
+ data.tar.gz: ac5269128cc77bc6c336b7705366c4c8b40f98c276d07a79565da2744687d70c77d515f503d0f12ce68675b98853d689ff6c10ffe84645eef452cce866d8e1ef
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Ruby SAML Identity Provider (IdP)
2
- [![Build Status](https://secure.travis-ci.org/lawrencepit/ruby-saml-idp.png)](http://travis-ci.org/lawrencepit/ruby-saml-idp?branch=master) [![Dependency Status](https://gemnasium.com/lawrencepit/ruby-saml-idp.png)](https://gemnasium.com/lawrencepit/ruby-saml-idp)
2
+
3
+ [![Build Status](https://secure.travis-ci.org/lawrencepit/ruby-saml-idp.png)](http://travis-ci.org/lawrencepit/ruby-saml-idp?branch=master)
4
+ [![Code Climate](https://codeclimate.com/github/lawrencepit/ruby-saml-idp/badges/gpa.svg)](https://codeclimate.com/github/lawrencepit/ruby-saml-idp)
5
+ [![Gem Version](https://fury-badge.herokuapp.com/rb/ruby-saml-idp.png)](http://badge.fury.io/rb/ruby-saml-idp)
3
6
 
4
7
  The ruby SAML Identity Provider library is for implementing the server side of SAML authentication. It allows your application to act as an IdP (Identity Provider) using the [SAML v2.0](http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language) protocol. It provides a means for managing authentication requests and confirmation responses for SPs (Service Providers).
5
8
 
@@ -34,7 +37,7 @@ Create a controller that looks like this, customize to your own situation:
34
37
 
35
38
  ``` ruby
36
39
  class SamlIdpController < SamlIdp::IdpController
37
- before_filter :find_account
40
+ before_action :find_account
38
41
  # layout 'saml_idp'
39
42
 
40
43
  def idp_authenticate(email, password)
@@ -76,7 +79,7 @@ end
76
79
  Keys and Secrets
77
80
  ----------------
78
81
 
79
- To generate the SAML Response it uses a default X.509 certificate and secret key... which isn't so secret. You can find them in `SamlIdp::Default`. The X.509 certificate is valid until year 2032. Obviously you shouldn't use these if you intend to use this in production environments. In that case, within the controller set the properties `x509_certificate` and `secret_key` using a `prepend_before_filter` callback within the current request context or set them globally via the `SamlIdp.config.x509_certificate` and `SamlIdp.config.secret_key` properties.
82
+ To generate the SAML Response it uses a default X.509 certificate and secret key... which isn't so secret. You can find them in `SamlIdp::Default`. The X.509 certificate is valid until year 2032. Obviously you shouldn't use these if you intend to use this in production environments. In that case, within the controller set the properties `x509_certificate` and `secret_key` using a `prepend_before_action` callback within the current request context or set them globally via the `SamlIdp.config.x509_certificate` and `SamlIdp.config.secret_key` properties.
80
83
 
81
84
  The fingerprint to use, if you use the default X.509 certificate of this gem, is:
82
85
 
@@ -7,7 +7,11 @@ module SamlIdp
7
7
 
8
8
  protect_from_forgery
9
9
 
10
- before_filter :validate_saml_request
10
+ if Rails.version.to_i < 4
11
+ before_filter :validate_saml_request
12
+ else
13
+ before_action :validate_saml_request
14
+ end
11
15
 
12
16
  def new
13
17
  render :template => "saml_idp/idp/new"
@@ -1,10 +1,10 @@
1
1
  # encoding: utf-8
2
+
2
3
  module SamlIdp
3
4
  module Controller
4
5
  require 'openssl'
5
6
  require 'base64'
6
7
  require 'time'
7
- require 'uuid'
8
8
 
9
9
  attr_accessor :x509_certificate, :secret_key, :algorithm
10
10
  attr_accessor :saml_acs_url
@@ -46,7 +46,7 @@ module SamlIdp
46
46
  protected
47
47
 
48
48
  def validate_saml_request(saml_request = params[:SAMLRequest])
49
- decode_SAMLRequest(saml_request)
49
+ decode_SAMLRequest(saml_request) rescue false
50
50
  end
51
51
 
52
52
  def decode_SAMLRequest(saml_request)
@@ -60,11 +60,12 @@ module SamlIdp
60
60
 
61
61
  def encode_SAMLResponse(nameID, opts = {})
62
62
  now = Time.now.utc
63
- response_id, reference_id = UUID.generate, UUID.generate
63
+ response_id, reference_id = SecureRandom.uuid, SecureRandom.uuid
64
64
  audience_uri = opts[:audience_uri] || saml_acs_url[/^(.*?\/\/.*?\/)/, 1]
65
65
  issuer_uri = opts[:issuer_uri] || (defined?(request) && request.url) || "http://example.com"
66
+ attributes_statement = attributes(opts[:attributes_provider], nameID)
66
67
 
67
- assertion = %[<Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_#{reference_id}" IssueInstant="#{now.iso8601}" Version="2.0"><Issuer>#{issuer_uri}</Issuer><Subject><NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">#{nameID}</NameID><SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"><SubjectConfirmationData InResponseTo="#{@saml_request_id}" NotOnOrAfter="#{(now+3*60).iso8601}" Recipient="#{@saml_acs_url}"></SubjectConfirmationData></SubjectConfirmation></Subject><Conditions NotBefore="#{(now-5).iso8601}" NotOnOrAfter="#{(now+60*60).iso8601}"><AudienceRestriction><Audience>#{audience_uri}</Audience></AudienceRestriction></Conditions><AttributeStatement><Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"><AttributeValue>#{nameID}</AttributeValue></Attribute></AttributeStatement><AuthnStatement AuthnInstant="#{now.iso8601}" SessionIndex="_#{reference_id}"><AuthnContext><AuthnContextClassRef>urn:federation:authentication:windows</AuthnContextClassRef></AuthnContext></AuthnStatement></Assertion>]
68
+ assertion = %[<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_#{reference_id}" IssueInstant="#{now.iso8601}" Version="2.0"><saml:Issuer Format="urn:oasis:names:SAML:2.0:nameid-format:entity">#{issuer_uri}</saml:Issuer><saml:Subject><saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">#{nameID}</saml:NameID><saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"><saml:SubjectConfirmationData InResponseTo="#{@saml_request_id}" NotOnOrAfter="#{(now+3*60).iso8601}" Recipient="#{@saml_acs_url}"></saml:SubjectConfirmationData></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore="#{(now-5).iso8601}" NotOnOrAfter="#{(now+60*60).iso8601}"><saml:AudienceRestriction><saml:Audience>#{audience_uri}</saml:Audience></saml:AudienceRestriction></saml:Conditions>#{attributes_statement}<saml:AuthnStatement AuthnInstant="#{now.iso8601}" SessionIndex="_#{reference_id}"><saml:AuthnContext><saml:AuthnContextClassRef>urn:federation:authentication:windows</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement></saml:Assertion>]
68
69
 
69
70
  digest_value = Base64.encode64(algorithm.digest(assertion)).gsub(/\n/, '')
70
71
 
@@ -74,9 +75,9 @@ module SamlIdp
74
75
 
75
76
  signature = %[<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">#{signed_info}<ds:SignatureValue>#{signature_value}</ds:SignatureValue><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><ds:X509Data><ds:X509Certificate>#{self.x509_certificate}</ds:X509Certificate></ds:X509Data></KeyInfo></ds:Signature>]
76
77
 
77
- assertion_and_signature = assertion.sub(/Issuer\>\<Subject/, "Issuer>#{signature}<Subject")
78
+ assertion_and_signature = assertion.sub(/Issuer\>\<saml:Subject/, "Issuer>#{signature}<saml:Subject")
78
79
 
79
- xml = %[<samlp:Response ID="_#{response_id}" Version="2.0" IssueInstant="#{now.iso8601}" Destination="#{@saml_acs_url}" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified" InResponseTo="#{@saml_request_id}" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"><Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">#{issuer_uri}</Issuer><samlp:Status><samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></samlp:Status>#{assertion_and_signature}</samlp:Response>]
80
+ xml = %[<samlp:Response ID="_#{response_id}" Version="2.0" IssueInstant="#{now.iso8601}" Destination="#{@saml_acs_url}" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified" InResponseTo="#{@saml_request_id}" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"><saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">#{issuer_uri}</saml:Issuer><samlp:Status><samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></samlp:Status>#{assertion_and_signature}</samlp:Response>]
80
81
 
81
82
  Base64.encode64(xml)
82
83
  end
@@ -88,5 +89,8 @@ module SamlIdp
88
89
  Base64.encode64(key.sign(algorithm.new, data))
89
90
  end
90
91
 
92
+ def attributes(provider, nameID)
93
+ provider ? provider : %[<saml:AttributeStatement><saml:Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"><saml:AttributeValue>#{nameID}</saml:AttributeValue></saml:Attribute></saml:AttributeStatement>]
94
+ end
91
95
  end
92
- end
96
+ end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module SamlIdp
3
- VERSION = '0.3.2'
3
+ VERSION = '0.3.3'
4
4
  end
@@ -22,12 +22,11 @@ Gem::Specification.new do |s|
22
22
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
23
  s.require_paths = ["lib"]
24
24
  s.rdoc_options = ["--charset=UTF-8"]
25
- s.add_dependency('uuid')
26
25
  s.add_development_dependency "rake"
27
- # s.add_development_dependency "rcov"
28
- s.add_development_dependency "rspec"
29
- s.add_development_dependency "ruby-saml"
26
+ s.add_development_dependency("nokogiri", "~> 1.6.8")
27
+ s.add_development_dependency("rspec", "~> 3.0")
28
+ s.add_development_dependency("ruby-saml", "~> 0.8")
30
29
  s.add_development_dependency("rails", "~> 3.2")
31
- s.add_development_dependency("capybara")
30
+ s.add_development_dependency("capybara", "~> 2.4.1")
32
31
  end
33
32
 
@@ -9,8 +9,8 @@ feature 'IdpController' do
9
9
  fill_in 'Password', :with => "okidoki"
10
10
  click_button 'Sign in'
11
11
  click_button 'Submit' # simulating onload
12
- current_url.should == 'http://foo.example.com/saml/consume'
13
- page.should have_content "brad.copa@example.com"
12
+ expect(current_url).to eq('http://foo.example.com/saml/consume')
13
+ expect(page).to have_content("brad.copa@example.com")
14
14
  end
15
15
 
16
- end
16
+ end
@@ -1,8 +1,8 @@
1
1
  class SamlController < ApplicationController
2
2
 
3
3
  def consume
4
- response = Onelogin::Saml::Response.new(params[:SAMLResponse])
4
+ response = OneLogin::RubySaml::Response.new(params[:SAMLResponse])
5
5
  render :text => response.name_id
6
6
  end
7
7
 
8
- end
8
+ end
@@ -12,7 +12,7 @@ describe SamlIdp::Controller do
12
12
  requested_saml_acs_url = "https://example.com/saml/consume"
13
13
  params[:SAMLRequest] = make_saml_request(requested_saml_acs_url)
14
14
  validate_saml_request
15
- saml_acs_url.should == requested_saml_acs_url
15
+ expect(saml_acs_url).to eq(requested_saml_acs_url)
16
16
  end
17
17
 
18
18
  context "SAML Responses" do
@@ -23,38 +23,35 @@ describe SamlIdp::Controller do
23
23
 
24
24
  it "should create a SAML Response" do
25
25
  saml_response = encode_SAMLResponse("foo@example.com")
26
- response = Onelogin::Saml::Response.new(saml_response)
27
- response.name_id.should == "foo@example.com"
28
- response.issuer.should == "http://example.com"
26
+ response = OneLogin::RubySaml::Response.new(saml_response)
27
+ expect(response.name_id).to eq("foo@example.com")
28
+ expect(response.issuer).to eq("http://example.com")
29
29
  response.settings = saml_settings
30
- response.is_valid?.should be_true
30
+ expect(response.is_valid?).to be true
31
31
  end
32
32
 
33
- [:sha1, :sha256].each do |algorithm_name|
33
+ it "should handle custom attribute objects" do
34
+ provider = double(to_s: %[<saml:AttributeStatement><saml:Attribute Name="organization"><saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Organization name</saml:AttributeValue></saml:Attribute></saml:AttributeStatement>])
35
+
36
+ default_attributes = %[<saml:AttributeStatement><saml:Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"><saml:AttributeValue>foo@example.com</saml:AttributeValue></saml:Attribute></saml:AttributeStatement>]
37
+
38
+
39
+ saml_response = encode_SAMLResponse("foo@example.com", { attributes_provider: provider })
40
+ response = OneLogin::RubySaml::Response.new(saml_response)
41
+ expect(response.response).to include provider.to_s
42
+ expect(response.response).to_not include default_attributes
43
+ end
44
+
45
+ [:sha1, :sha256, :sha384, :sha512].each do |algorithm_name|
34
46
  it "should create a SAML Response using the #{algorithm_name} algorithm" do
35
47
  self.algorithm = algorithm_name
36
48
  saml_response = encode_SAMLResponse("foo@example.com")
37
- response = Onelogin::Saml::Response.new(saml_response)
38
- response.name_id.should == "foo@example.com"
39
- response.issuer.should == "http://example.com"
49
+ response = OneLogin::RubySaml::Response.new(saml_response)
50
+ expect(response.name_id).to eq("foo@example.com")
51
+ expect(response.issuer).to eq("http://example.com")
40
52
  response.settings = saml_settings
41
- response.is_valid?.should be_true
42
- end
43
- end
44
-
45
- [:sha384, :sha512].each do |algorithm_name|
46
- it "should create a SAML Response using the #{algorithm_name} algorithm" do
47
- pending "release of ruby-saml v0.5.4" do
48
- self.algorithm = algorithm_name
49
- saml_response = encode_SAMLResponse("foo@example.com")
50
- response = Onelogin::Saml::Response.new(saml_response)
51
- response.name_id.should == "foo@example.com"
52
- response.issuer.should == "http://example.com"
53
- response.settings = saml_settings
54
- response.is_valid?.should be_true
55
- end
53
+ expect(response.is_valid?).to be true
56
54
  end
57
55
  end
58
56
  end
59
-
60
- end
57
+ end
@@ -1,19 +1,19 @@
1
1
  module SamlRequestMacros
2
2
 
3
3
  def make_saml_request(requested_saml_acs_url = "https://foo.example.com/saml/consume")
4
- auth_request = Onelogin::Saml::Authrequest.new
5
- auth_url = auth_request.create(saml_settings(requested_saml_acs_url))
4
+ auth_request = OneLogin::RubySaml::Authrequest.new
5
+ auth_url = auth_request.create(saml_settings(saml_acs_url: requested_saml_acs_url))
6
6
  CGI.unescape(auth_url.split("=").last)
7
7
  end
8
8
 
9
- def saml_settings(saml_acs_url = "https://foo.example.com/saml/consume")
10
- settings = Onelogin::Saml::Settings.new
11
- settings.assertion_consumer_service_url = saml_acs_url
12
- settings.issuer = "http://example.com/issuer"
13
- settings.idp_sso_target_url = "http://idp.com/saml/idp"
9
+ def saml_settings(options = {})
10
+ settings = OneLogin::RubySaml::Settings.new
11
+ settings.assertion_consumer_service_url = options[:saml_acs_url] || "https://foo.example.com/saml/consume"
12
+ settings.issuer = options[:issuer] || "http://example.com/issuer"
13
+ settings.idp_sso_target_url = options[:idp_sso_target_url] || "http://idp.com/saml/idp"
14
14
  settings.idp_cert_fingerprint = SamlIdp::Default::FINGERPRINT
15
15
  settings.name_identifier_format = SamlIdp::Default::NAME_ID_FORMAT
16
16
  settings
17
17
  end
18
18
 
19
- end
19
+ end
metadata CHANGED
@@ -1,116 +1,108 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ruby-saml-idp
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 2
10
- version: 0.3.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.3
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Lawrence Pit
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2012-07-03 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: uuid
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
32
- type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
11
+ date: 2017-10-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
35
14
  name: rake
36
- prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- none: false
39
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
40
17
  - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
46
20
  type: :development
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: rspec
50
21
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
54
24
  - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.6.8
60
34
  type: :development
61
- version_requirements: *id003
62
- - !ruby/object:Gem::Dependency
63
- name: ruby-saml
64
35
  prerelease: false
65
- requirement: &id004 !ruby/object:Gem::Requirement
66
- none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.6.8
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
74
48
  type: :development
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
77
- name: rails
78
49
  prerelease: false
79
- requirement: &id005 !ruby/object:Gem::Requirement
80
- none: false
81
- requirements:
82
- - - ~>
83
- - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
86
- - 3
87
- - 2
88
- version: "3.2"
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ruby-saml
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.8'
89
62
  type: :development
90
- version_requirements: *id005
91
- - !ruby/object:Gem::Dependency
92
- name: capybara
93
63
  prerelease: false
94
- requirement: &id006 !ruby/object:Gem::Requirement
95
- none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- hash: 3
100
- segments:
101
- - 0
102
- version: "0"
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.8'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: capybara
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 2.4.1
103
90
  type: :development
104
- version_requirements: *id006
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 2.4.1
105
97
  description: SAML IdP (Identity Provider) library in ruby
106
98
  email: lawrence.pit@gmail.com
107
99
  executables: []
108
-
109
100
  extensions: []
110
-
111
101
  extra_rdoc_files: []
112
-
113
- files:
102
+ files:
103
+ - Gemfile
104
+ - MIT-LICENSE
105
+ - README.md
114
106
  - app/controllers/saml_idp/idp_controller.rb
115
107
  - app/views/saml_idp/idp/new.html.erb
116
108
  - app/views/saml_idp/idp/saml_post.html.erb
@@ -120,9 +112,6 @@ files:
120
112
  - lib/saml_idp/default.rb
121
113
  - lib/saml_idp/engine.rb
122
114
  - lib/saml_idp/version.rb
123
- - MIT-LICENSE
124
- - README.md
125
- - Gemfile
126
115
  - ruby-saml-idp.gemspec
127
116
  - spec/acceptance/acceptance_helper.rb
128
117
  - spec/acceptance/idp_controller_spec.rb
@@ -181,38 +170,29 @@ files:
181
170
  - spec/support/saml_request_macros.rb
182
171
  homepage: http://github.com/lawrencepit/ruby-saml-idp
183
172
  licenses: []
184
-
173
+ metadata: {}
185
174
  post_install_message:
186
- rdoc_options:
187
- - --charset=UTF-8
188
- require_paths:
175
+ rdoc_options:
176
+ - "--charset=UTF-8"
177
+ require_paths:
189
178
  - lib
190
- required_ruby_version: !ruby/object:Gem::Requirement
191
- none: false
192
- requirements:
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ requirements:
193
181
  - - ">="
194
- - !ruby/object:Gem::Version
195
- hash: 3
196
- segments:
197
- - 0
198
- version: "0"
199
- required_rubygems_version: !ruby/object:Gem::Requirement
200
- none: false
201
- requirements:
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ required_rubygems_version: !ruby/object:Gem::Requirement
185
+ requirements:
202
186
  - - ">="
203
- - !ruby/object:Gem::Version
204
- hash: 3
205
- segments:
206
- - 0
207
- version: "0"
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
208
189
  requirements: []
209
-
210
190
  rubyforge_project:
211
- rubygems_version: 1.8.24
191
+ rubygems_version: 2.6.8
212
192
  signing_key:
213
- specification_version: 3
193
+ specification_version: 4
214
194
  summary: SAML Indentity Provider in ruby
215
- test_files:
195
+ test_files:
216
196
  - spec/acceptance/acceptance_helper.rb
217
197
  - spec/acceptance/idp_controller_spec.rb
218
198
  - spec/rails_app/.gitignore