devise_saml_authenticatable 1.3.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
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