devise_saml_authenticatable 1.3.1 → 1.6.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 (40) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +0 -2
  3. data/.travis.yml +37 -22
  4. data/Gemfile +2 -10
  5. data/README.md +127 -44
  6. data/app/controllers/devise/saml_sessions_controller.rb +38 -7
  7. data/devise_saml_authenticatable.gemspec +2 -1
  8. data/lib/devise_saml_authenticatable.rb +70 -0
  9. data/lib/devise_saml_authenticatable/default_attribute_map_resolver.rb +26 -0
  10. data/lib/devise_saml_authenticatable/default_idp_entity_id_reader.rb +10 -2
  11. data/lib/devise_saml_authenticatable/exception.rb +1 -1
  12. data/lib/devise_saml_authenticatable/model.rb +20 -32
  13. data/lib/devise_saml_authenticatable/routes.rb +17 -6
  14. data/lib/devise_saml_authenticatable/saml_mapped_attributes.rb +38 -0
  15. data/lib/devise_saml_authenticatable/saml_response.rb +16 -0
  16. data/lib/devise_saml_authenticatable/strategy.rb +10 -2
  17. data/lib/devise_saml_authenticatable/version.rb +1 -1
  18. data/spec/controllers/devise/saml_sessions_controller_spec.rb +118 -11
  19. data/spec/devise_saml_authenticatable/default_attribute_map_resolver_spec.rb +58 -0
  20. data/spec/devise_saml_authenticatable/default_idp_entity_id_reader_spec.rb +34 -4
  21. data/spec/devise_saml_authenticatable/model_spec.rb +199 -5
  22. data/spec/devise_saml_authenticatable/saml_mapped_attributes_spec.rb +50 -0
  23. data/spec/devise_saml_authenticatable/strategy_spec.rb +18 -0
  24. data/spec/features/saml_authentication_spec.rb +45 -21
  25. data/spec/rails_helper.rb +6 -2
  26. data/spec/routes/routes_spec.rb +102 -0
  27. data/spec/spec_helper.rb +7 -0
  28. data/spec/support/Gemfile.rails4 +24 -6
  29. data/spec/support/Gemfile.rails5 +25 -0
  30. data/spec/support/Gemfile.rails5.1 +25 -0
  31. data/spec/support/Gemfile.rails5.2 +25 -0
  32. data/spec/support/attribute-map.yml +12 -0
  33. data/spec/support/attribute_map_resolver.rb.erb +14 -0
  34. data/spec/support/idp_settings_adapter.rb.erb +5 -5
  35. data/spec/support/idp_template.rb +8 -1
  36. data/spec/support/rails_app.rb +110 -16
  37. data/spec/support/saml_idp_controller.rb.erb +22 -10
  38. data/spec/support/sp_template.rb +52 -21
  39. metadata +26 -10
  40. data/spec/support/Gemfile.ruby-saml-1.3 +0 -23
@@ -17,10 +17,10 @@ class SamlIdpController < SamlIdp::IdpController
17
17
 
18
18
  def idp_make_saml_response(_)
19
19
  attributes = {
20
- "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" => "A User",
20
+ name_attribute_key => "A User",
21
21
  }
22
22
  if include_subject_in_attributes
23
- attributes["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"] = "you@example.com"
23
+ attributes[email_address_attribute_key] = "you@example.com"
24
24
  end
25
25
  encode_SAMLResponse("you@example.com", attributes: attributes)
26
26
  end
@@ -29,14 +29,21 @@ class SamlIdpController < SamlIdp::IdpController
29
29
 
30
30
  def session_index
31
31
  Rails.cache.fetch('session_key') {
32
- UUID.generate
32
+ SecureRandom.uuid
33
33
  }
34
34
  end
35
35
 
36
+ def email_address_attribute_key
37
+ "<%= @email_address_attribute_key %>"
38
+ end
39
+
40
+ def name_attribute_key
41
+ "<%= @name_attribute_key %>"
42
+ end
36
43
 
37
44
  def encode_SAMLResponse(nameID, opts = {})
38
45
  now = Time.now.utc
39
- response_id = UUID.generate
46
+ response_id = SecureRandom.uuid
40
47
  audience_uri = opts[:audience_uri] || "#{saml_acs_url[/^(.*?\/\/.*?\/)/, 1]}saml/metadata"
41
48
  issuer_uri = opts[:issuer_uri] || (defined?(request) && request.url) || "http://example.com"
42
49
 
@@ -50,7 +57,7 @@ class SamlIdpController < SamlIdp::IdpController
50
57
  attribute_statement = ""
51
58
  end
52
59
 
53
- assertion = %[<Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_#{session_index}" 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>#{attribute_statement}<AuthnStatement AuthnInstant="#{now.iso8601}" SessionIndex="_#{session_index}"><AuthnContext><AuthnContextClassRef>urn:federation:authentication:windows</AuthnContextClassRef></AuthnContext></AuthnStatement></Assertion>]
60
+ assertion = %[<Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_#{session_index}" IssueInstant="#{now.iso8601}" Version="2.0"><Issuer>#{issuer_uri}</Issuer><Subject><NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">#{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>#{attribute_statement}<AuthnStatement AuthnInstant="#{now.iso8601}" SessionIndex="_#{session_index}"><AuthnContext><AuthnContextClassRef>urn:federation:authentication:windows</AuthnContextClassRef></AuthnContext></AuthnStatement></Assertion>]
54
61
 
55
62
  digest_value = Base64.encode64(algorithm.digest(assertion)).gsub(/\n/, '')
56
63
 
@@ -72,8 +79,13 @@ class SamlIdpController < SamlIdp::IdpController
72
79
  end
73
80
 
74
81
  # == SLO functionality, see https://github.com/lawrencepit/ruby-saml-idp/pull/10
82
+ <% if Rails::VERSION::MAJOR < 5 %>
75
83
  skip_before_filter :validate_saml_request, :only => [:logout, :sp_sign_out]
76
84
  before_filter :validate_saml_slo_request, :only => [:logout]
85
+ <% else %>
86
+ skip_before_action :validate_saml_request, :only => [:logout, :sp_sign_out]
87
+ before_action :validate_saml_slo_request, :only => [:logout]
88
+ <% end %>
77
89
 
78
90
  public
79
91
 
@@ -110,7 +122,7 @@ class SamlIdpController < SamlIdp::IdpController
110
122
  def idp_make_saml_slo_response(person)
111
123
  attributes = {}
112
124
  if include_subject_in_attributes
113
- attributes["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"] = "you@example.com"
125
+ attributes[email_address_attribute_key] = "you@example.com"
114
126
  end
115
127
  encode_SAML_SLO_Response("you@example.com", attributes: attributes)
116
128
  end
@@ -139,11 +151,11 @@ class SamlIdpController < SamlIdp::IdpController
139
151
 
140
152
  def encode_SAML_SLO_Response(nameID, opts = {})
141
153
  now = Time.now.utc
142
- response_id = UUID.generate
154
+ response_id = SecureRandom.uuid
143
155
  audience_uri = opts[:audience_uri] || (@saml_slo_acs_url && @saml_slo_acs_url[/^(.*?\/\/.*?\/)/, 1])
144
156
  issuer_uri = opts[:issuer_uri] || (defined?(request) && request.url.split("?")[0]) || "http://example.com"
145
157
 
146
- assertion = %[<Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_#{session_index}" IssueInstant="#{now.iso8601}" Version="2.0"><Issuer2>#{issuer_uri}</Issuer2><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_slo_request_id}" NotOnOrAfter="#{(now+3*60).iso8601}" Recipient="#{@saml_slo_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="_#{session_index}"><AuthnContext><AuthnContextClassRef>urn:federation:authentication:windows</AuthnContextClassRef></AuthnContext></AuthnStatement></Assertion>]
158
+ assertion = %[<Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_#{session_index}" IssueInstant="#{now.iso8601}" Version="2.0"><Issuer2>#{issuer_uri}</Issuer2><Subject><NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">#{nameID}</NameID><SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"><SubjectConfirmationData InResponseTo="#{@saml_slo_request_id}" NotOnOrAfter="#{(now+3*60).iso8601}" Recipient="#{@saml_slo_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="#{email_address_attribute_key}"><AttributeValue>#{nameID}</AttributeValue></Attribute></AttributeStatement><AuthnStatement AuthnInstant="#{now.iso8601}" SessionIndex="_#{session_index}"><AuthnContext><AuthnContextClassRef>urn:federation:authentication:windows</AuthnContextClassRef></AuthnContext></AuthnStatement></Assertion>]
147
159
 
148
160
  digest_value = Base64.encode64(algorithm.digest(assertion)).gsub(/\n/, '')
149
161
 
@@ -175,7 +187,7 @@ class SamlIdpController < SamlIdp::IdpController
175
187
 
176
188
  def encode_SAML_SLO_Request(nameID, opts = {})
177
189
  now = Time.now.utc
178
- response_id = UUID.generate
190
+ response_id = SecureRandom.uuid
179
191
  issuer_uri = opts[:issuer_uri] || (defined?(request) && request.url.split("?")[0]) || "http://example.com"
180
192
  xml = %[<samlp:LogoutRequest
181
193
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
@@ -184,7 +196,7 @@ class SamlIdpController < SamlIdp::IdpController
184
196
  Destination="#{destination(@saml_slo_acs_url)}"
185
197
  IssueInstant="#{now.iso8601}">
186
198
  <saml:Issuer >#{issuer_uri}</saml:Issuer>
187
- <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">#{nameID}</saml:NameID>
199
+ <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">#{nameID}</saml:NameID>
188
200
  <samlp:SessionIndex>_#{session_index}</samlp:SessionIndex>
189
201
  </samlp:LogoutRequest>]
190
202
 
@@ -2,13 +2,18 @@
2
2
 
3
3
  require "onelogin/ruby-saml/version"
4
4
 
5
+ attribute_map_resolver = ENV.fetch("ATTRIBUTE_MAP_RESOLVER", "nil")
5
6
  saml_session_index_key = ENV.fetch('SAML_SESSION_INDEX_KEY', ":session_index")
6
7
  use_subject_to_authenticate = ENV.fetch('USE_SUBJECT_TO_AUTHENTICATE')
7
8
  idp_settings_adapter = ENV.fetch('IDP_SETTINGS_ADAPTER', "nil")
8
9
  idp_entity_id_reader = ENV.fetch('IDP_ENTITY_ID_READER', "DeviseSamlAuthenticatable::DefaultIdpEntityIdReader")
9
10
  saml_failed_callback = ENV.fetch('SAML_FAILED_CALLBACK', "nil")
10
11
 
11
- gem 'devise_saml_authenticatable', path: '../../..'
12
+ if Rails::VERSION::MAJOR < 5 || (Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR < 2)
13
+ gsub_file 'config/secrets.yml', /secret_key_base:.*$/, 'secret_key_base: "8b5889df1fcf03f76c7d66da02d8776bcc85b06bed7d9c592f076d9c8a5455ee6d4beae45986c3c030b40208db5e612f2a6ef8283036a352e3fae83c5eda36be"'
14
+ end
15
+
16
+ gem 'devise_saml_authenticatable', path: File.expand_path("../../..", __FILE__)
12
17
  gem 'ruby-saml', OneLogin::RubySaml::VERSION
13
18
  gem 'thin'
14
19
 
@@ -17,17 +22,27 @@ insert_into_file('Gemfile', after: /\z/) {
17
22
  # Lock down versions of gems for older versions of Ruby
18
23
  if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.1")
19
24
  gem 'devise', '~> 3.5'
25
+ gem 'nokogiri', '~> 1.6.8'
26
+ elsif Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
27
+ gem 'responders', '~> 2.4'
20
28
  end
21
29
  GEMFILE
22
30
  }
31
+ if Rails::VERSION::MAJOR < 6
32
+ # sqlite3 is hard-coded in Rails < 6 to v1.3.x
33
+ gsub_file 'Gemfile', /^gem 'sqlite3'.*$/, "gem 'sqlite3', '~> 1.3.6'"
34
+ end
23
35
 
36
+ template File.expand_path('../attribute_map_resolver.rb.erb', __FILE__), 'app/lib/attribute_map_resolver.rb'
24
37
  template File.expand_path('../idp_settings_adapter.rb.erb', __FILE__), 'app/lib/idp_settings_adapter.rb'
25
38
 
26
- create_file 'config/attribute-map.yml', <<-ATTRIBUTES
39
+ if attribute_map_resolver == "nil"
40
+ create_file 'config/attribute-map.yml', <<-ATTRIBUTES
27
41
  ---
28
42
  "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress": email
29
43
  "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": name
30
- ATTRIBUTES
44
+ ATTRIBUTES
45
+ end
31
46
 
32
47
  create_file('app/lib/our_saml_failed_callback_handler.rb', <<-CALLBACKHANDLER)
33
48
 
@@ -56,28 +71,17 @@ end
56
71
  READER
57
72
 
58
73
  after_bundle do
59
- generate :controller, 'home', 'index'
60
- insert_into_file('app/controllers/home_controller.rb', after: "class HomeController < ApplicationController\n") {
61
- <<-AUTHENTICATE
62
- before_action :authenticate_user!
63
- AUTHENTICATE
64
- }
65
- insert_into_file('app/views/home/index.html.erb', after: /\z/) {
66
- <<-HOME
67
- <%= current_user.email %> <%= current_user.name %>
68
- <%= form_tag destroy_user_session_path, method: :delete do %>
69
- <%= submit_tag "Log out" %>
70
- <% end %>
71
- HOME
72
- }
73
- route "root to: 'home#index'"
74
-
75
74
  # Configure for our SAML IdP
76
75
  generate 'devise:install'
77
76
  gsub_file 'config/initializers/devise.rb', /^end$/, <<-CONFIG
77
+ config.secret_key = 'adc7cd73792f5d20055a0ac749ce8cdddb2e0f0d3ea7fe7855eec3d0f81833b9a4ac31d12e05f232d40ae86ca492826a6fc5a65228c6e16752815316e2d5b38d'
78
+
78
79
  config.saml_default_user_key = :email
79
80
  config.saml_session_index_key = #{saml_session_index_key}
80
81
 
82
+ if #{attribute_map_resolver}
83
+ config.saml_attribute_map_resolver = #{attribute_map_resolver}
84
+ end
81
85
  config.saml_use_subject = #{use_subject_to_authenticate}
82
86
  config.saml_create_user = true
83
87
  config.saml_update_user = true
@@ -91,11 +95,33 @@ after_bundle do
91
95
  settings.idp_slo_target_url = "http://localhost:8009/saml/logout"
92
96
  settings.idp_sso_target_url = "http://localhost:8009/saml/auth"
93
97
  settings.idp_cert_fingerprint = "9E:65:2E:03:06:8D:80:F2:86:C7:6C:77:A1:D9:14:97:0A:4D:F4:4D"
98
+ settings.name_identifier_format = "urn:oasis:names:tc:SAML:2.0:nameid-format:transient"
94
99
  end
95
100
  end
96
101
  CONFIG
97
102
 
98
- generate :devise, "user", "email:string", "name:string", "session_index:string"
103
+ generate :controller, 'home', 'index'
104
+ insert_into_file('app/controllers/home_controller.rb', after: "class HomeController < ApplicationController\n") {
105
+ <<-AUTHENTICATE
106
+ before_action :authenticate_user!
107
+ AUTHENTICATE
108
+ }
109
+ insert_into_file('app/views/home/index.html.erb', after: /\z/) {
110
+ <<-HOME
111
+ <%= current_user.email %> <%= current_user.name %>
112
+ <%= form_tag destroy_user_session_path(entity_id: "http://localhost:8020/saml/metadata"), method: :delete do %>
113
+ <%= submit_tag "Log out" %>
114
+ <% end %>
115
+ HOME
116
+ }
117
+ route "root to: 'home#index'"
118
+
119
+ if Rails::VERSION::MAJOR < 6
120
+ generate :devise, "user", "email:string", "name:string", "session_index:string"
121
+ else
122
+ # devise seems to add `email` by default in Rails 6
123
+ generate :devise, "user", "name:string", "session_index:string"
124
+ end
99
125
  gsub_file 'app/models/user.rb', /database_authenticatable.*\n.*/, 'saml_authenticatable'
100
126
  route "resources :users, only: [:create]"
101
127
  create_file('app/controllers/users_controller.rb', <<-USERS)
@@ -103,13 +129,18 @@ class UsersController < ApplicationController
103
129
  skip_before_action :verify_authenticity_token
104
130
  def create
105
131
  User.create!(email: params[:email])
106
- render nothing: true, status: 201
132
+ head 201
107
133
  end
108
134
  end
109
135
  USERS
110
136
 
111
137
  rake "db:create"
112
138
  rake "db:migrate"
139
+ rake "db:create", env: "production"
140
+ rake "db:migrate", env: "production"
141
+
142
+ # Remove any specs so that future RSpec runs don't try to also run these
143
+ run 'rm -rf spec'
113
144
  end
114
145
 
115
146
  create_file 'public/stylesheets/application.css', ''
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_saml_authenticatable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josef Sauter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-30 00:00:00.000000000 Z
11
+ date: 2020-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: devise
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '1.7'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: '1.7'
41
41
  description: SAML Authentication for devise
42
42
  email:
43
43
  - Josef.Sauter@gmail.com
@@ -55,25 +55,35 @@ files:
55
55
  - app/controllers/devise/saml_sessions_controller.rb
56
56
  - devise_saml_authenticatable.gemspec
57
57
  - lib/devise_saml_authenticatable.rb
58
+ - lib/devise_saml_authenticatable/default_attribute_map_resolver.rb
58
59
  - lib/devise_saml_authenticatable/default_idp_entity_id_reader.rb
59
60
  - lib/devise_saml_authenticatable/exception.rb
60
61
  - lib/devise_saml_authenticatable/logger.rb
61
62
  - lib/devise_saml_authenticatable/model.rb
62
63
  - lib/devise_saml_authenticatable/routes.rb
63
64
  - lib/devise_saml_authenticatable/saml_config.rb
65
+ - lib/devise_saml_authenticatable/saml_mapped_attributes.rb
66
+ - lib/devise_saml_authenticatable/saml_response.rb
64
67
  - lib/devise_saml_authenticatable/strategy.rb
65
68
  - lib/devise_saml_authenticatable/version.rb
66
69
  - rails/init.rb
67
70
  - spec/controllers/devise/saml_sessions_controller_spec.rb
71
+ - spec/devise_saml_authenticatable/default_attribute_map_resolver_spec.rb
68
72
  - spec/devise_saml_authenticatable/default_idp_entity_id_reader_spec.rb
69
73
  - spec/devise_saml_authenticatable/model_spec.rb
70
74
  - spec/devise_saml_authenticatable/saml_config_spec.rb
75
+ - spec/devise_saml_authenticatable/saml_mapped_attributes_spec.rb
71
76
  - spec/devise_saml_authenticatable/strategy_spec.rb
72
77
  - spec/features/saml_authentication_spec.rb
73
78
  - spec/rails_helper.rb
79
+ - spec/routes/routes_spec.rb
74
80
  - spec/spec_helper.rb
75
81
  - spec/support/Gemfile.rails4
76
- - spec/support/Gemfile.ruby-saml-1.3
82
+ - spec/support/Gemfile.rails5
83
+ - spec/support/Gemfile.rails5.1
84
+ - spec/support/Gemfile.rails5.2
85
+ - spec/support/attribute-map.yml
86
+ - spec/support/attribute_map_resolver.rb.erb
77
87
  - spec/support/idp_settings_adapter.rb.erb
78
88
  - spec/support/idp_template.rb
79
89
  - spec/support/rails_app.rb
@@ -82,7 +92,8 @@ files:
82
92
  - spec/support/saml_idp_controller.rb.erb
83
93
  - spec/support/sp_template.rb
84
94
  homepage: ''
85
- licenses: []
95
+ licenses:
96
+ - MIT
86
97
  metadata: {}
87
98
  post_install_message:
88
99
  rdoc_options: []
@@ -99,22 +110,28 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
110
  - !ruby/object:Gem::Version
100
111
  version: '0'
101
112
  requirements: []
102
- rubyforge_project:
103
- rubygems_version: 2.4.6
113
+ rubygems_version: 3.0.6
104
114
  signing_key:
105
115
  specification_version: 4
106
116
  summary: SAML Authentication for devise
107
117
  test_files:
108
118
  - spec/controllers/devise/saml_sessions_controller_spec.rb
119
+ - spec/devise_saml_authenticatable/default_attribute_map_resolver_spec.rb
109
120
  - spec/devise_saml_authenticatable/default_idp_entity_id_reader_spec.rb
110
121
  - spec/devise_saml_authenticatable/model_spec.rb
111
122
  - spec/devise_saml_authenticatable/saml_config_spec.rb
123
+ - spec/devise_saml_authenticatable/saml_mapped_attributes_spec.rb
112
124
  - spec/devise_saml_authenticatable/strategy_spec.rb
113
125
  - spec/features/saml_authentication_spec.rb
114
126
  - spec/rails_helper.rb
127
+ - spec/routes/routes_spec.rb
115
128
  - spec/spec_helper.rb
116
129
  - spec/support/Gemfile.rails4
117
- - spec/support/Gemfile.ruby-saml-1.3
130
+ - spec/support/Gemfile.rails5
131
+ - spec/support/Gemfile.rails5.1
132
+ - spec/support/Gemfile.rails5.2
133
+ - spec/support/attribute-map.yml
134
+ - spec/support/attribute_map_resolver.rb.erb
118
135
  - spec/support/idp_settings_adapter.rb.erb
119
136
  - spec/support/idp_template.rb
120
137
  - spec/support/rails_app.rb
@@ -122,4 +139,3 @@ test_files:
122
139
  - spec/support/saml_idp-saml_slo_post.html.erb
123
140
  - spec/support/saml_idp_controller.rb.erb
124
141
  - spec/support/sp_template.rb
125
- has_rdoc:
@@ -1,23 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in devise_saml_authenticatable.gemspec
4
- gemspec path: '../..'
5
-
6
- group :test do
7
- gem 'rake'
8
- gem 'rspec', '~> 3.0'
9
- gem 'rails', '~> 5.0'
10
- gem 'rspec-rails'
11
- gem 'ruby-saml', '~> 1.3.0'
12
- gem 'sqlite3'
13
- gem 'capybara'
14
- gem 'poltergeist'
15
-
16
- # Lock down versions of gems for older versions of Ruby
17
- if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.0")
18
- gem 'mime-types', '~> 2.99'
19
- end
20
- if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.1")
21
- gem 'devise', '~> 3.5'
22
- end
23
- end