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.
- checksums.yaml +7 -0
- data/README.md +6 -3
- data/app/controllers/saml_idp/idp_controller.rb +5 -1
- data/lib/saml_idp/controller.rb +11 -7
- data/lib/saml_idp/version.rb +1 -1
- data/ruby-saml-idp.gemspec +4 -5
- data/spec/acceptance/idp_controller_spec.rb +3 -3
- data/spec/rails_app/app/controllers/saml_controller.rb +2 -2
- data/spec/saml_idp/controller_spec.rb +23 -26
- data/spec/support/saml_request_macros.rb +8 -8
- metadata +97 -117
checksums.yaml
ADDED
@@ -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
|
-
|
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
|
-
|
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 `
|
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
|
-
|
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"
|
data/lib/saml_idp/controller.rb
CHANGED
@@ -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 =
|
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
|
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
|
data/lib/saml_idp/version.rb
CHANGED
data/ruby-saml-idp.gemspec
CHANGED
@@ -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
|
-
|
28
|
-
s.add_development_dependency
|
29
|
-
s.add_development_dependency
|
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.
|
13
|
-
page.
|
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
|
@@ -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.
|
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 =
|
27
|
-
response.name_id.
|
28
|
-
response.issuer.
|
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
|
30
|
+
expect(response.is_valid?).to be true
|
31
31
|
end
|
32
32
|
|
33
|
-
|
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 =
|
38
|
-
response.name_id.
|
39
|
-
response.issuer.
|
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
|
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 =
|
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(
|
10
|
-
settings =
|
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
|
-
|
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
|
-
|
19
|
-
|
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
|
-
|
37
|
-
|
38
|
-
none: false
|
39
|
-
requirements:
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
40
17
|
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
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
|
-
|
52
|
-
|
53
|
-
requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
54
24
|
- - ">="
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
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
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
192
|
-
requirements:
|
179
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
180
|
+
requirements:
|
193
181
|
- - ">="
|
194
|
-
- !ruby/object:Gem::Version
|
195
|
-
|
196
|
-
|
197
|
-
|
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
|
-
|
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:
|
191
|
+
rubygems_version: 2.6.8
|
212
192
|
signing_key:
|
213
|
-
specification_version:
|
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
|