devise_saml_authenticatable 1.7.0 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +11 -35
- data/.gitignore +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +12 -2
- data/README.md +4 -5
- data/app/controllers/devise/saml_sessions_controller.rb +17 -26
- data/lib/devise_saml_authenticatable/logger.rb +2 -2
- data/lib/devise_saml_authenticatable/strategy.rb +9 -1
- data/lib/devise_saml_authenticatable/version.rb +1 -1
- data/spec/controllers/devise/saml_sessions_controller_spec.rb +109 -139
- data/spec/features/saml_authentication_spec.rb +17 -4
- data/spec/support/Gemfile.rails5.2 +1 -12
- data/spec/support/Gemfile.rails6 +5 -1
- data/spec/support/Gemfile.rails6.1 +24 -0
- data/spec/support/idp_template.rb +5 -13
- data/spec/support/rails_app.rb +1 -1
- data/spec/support/saml_idp_controller.rb.erb +1 -6
- data/spec/support/sp_template.rb +5 -14
- metadata +6 -9
- data/spec/support/Gemfile.rails4 +0 -41
- data/spec/support/Gemfile.rails5 +0 -25
- data/spec/support/Gemfile.rails5.1 +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2b6dd7d4f718cf0df20aff218f90f1eac720279e4ff5afe6aedef20f84a14fd
|
4
|
+
data.tar.gz: 5efc5fa9d89ee10eb6328261b6b870ce580dbe7cd48cedbe8dd609786c5c9f84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70c0b6c4e5f6ec2b7f4a421c898c493cb34aef837c119e126d1b557640f685c1c35ad7cddaf94de3598601fe691563fa2984297010b4ac96f539609c8fa55f95
|
7
|
+
data.tar.gz: ca3d854ab1bd6b84d3a7d2225feb926f9fbc2d6df5c546c975d5773e8bdd8254d5ce544dd08f6c32a0db29e15f9f4aa3bbc38bee1dbdf491d9e92826b00c760b
|
data/.github/workflows/ci.yml
CHANGED
@@ -12,57 +12,33 @@ jobs:
|
|
12
12
|
fail-fast: false
|
13
13
|
matrix:
|
14
14
|
ruby:
|
15
|
+
- "3.1"
|
16
|
+
- "3.0"
|
15
17
|
- "2.7"
|
16
18
|
- "2.6"
|
17
|
-
- "2.5"
|
18
|
-
- "2.4"
|
19
|
-
- "2.3"
|
20
19
|
gemfile:
|
21
20
|
- Gemfile
|
21
|
+
- spec/support/Gemfile.rails6.1
|
22
22
|
- spec/support/Gemfile.rails6
|
23
23
|
- spec/support/Gemfile.rails5.2
|
24
|
-
- spec/support/Gemfile.rails5.1
|
25
|
-
- spec/support/Gemfile.rails5
|
26
24
|
bundler:
|
27
25
|
- "2"
|
28
26
|
exclude:
|
29
|
-
- ruby: "2.
|
27
|
+
- ruby: "2.6"
|
30
28
|
gemfile: Gemfile
|
31
29
|
bundler: "2"
|
32
|
-
- ruby: "
|
30
|
+
- ruby: "3.0"
|
31
|
+
gemfile: spec/support/Gemfile.rails5.2
|
32
|
+
bundler: "2"
|
33
|
+
- ruby: "3.0"
|
33
34
|
gemfile: spec/support/Gemfile.rails6
|
34
35
|
bundler: "2"
|
35
|
-
- ruby: "
|
36
|
-
gemfile: Gemfile
|
36
|
+
- ruby: "3.1"
|
37
|
+
gemfile: spec/support/Gemfile.rails5.2
|
37
38
|
bundler: "2"
|
38
|
-
- ruby: "
|
39
|
+
- ruby: "3.1"
|
39
40
|
gemfile: spec/support/Gemfile.rails6
|
40
41
|
bundler: "2"
|
41
|
-
include:
|
42
|
-
- ruby: "2.5"
|
43
|
-
gemfile: spec/support/Gemfile.rails4
|
44
|
-
bundler: "1"
|
45
|
-
- ruby: "2.4"
|
46
|
-
gemfile: spec/support/Gemfile.rails4
|
47
|
-
bundler: "1"
|
48
|
-
- ruby: "2.3"
|
49
|
-
gemfile: spec/support/Gemfile.rails4
|
50
|
-
bundler: "1"
|
51
|
-
- ruby: "2.2"
|
52
|
-
gemfile: spec/support/Gemfile.rails5.1
|
53
|
-
bundler: "1"
|
54
|
-
- ruby: "2.2"
|
55
|
-
gemfile: spec/support/Gemfile.rails5
|
56
|
-
bundler: "1"
|
57
|
-
- ruby: "2.2"
|
58
|
-
gemfile: spec/support/Gemfile.rails4
|
59
|
-
bundler: "1"
|
60
|
-
- ruby: "2.1"
|
61
|
-
gemfile: spec/support/Gemfile.rails4
|
62
|
-
bundler: "1"
|
63
|
-
- ruby: "2.0"
|
64
|
-
gemfile: spec/support/Gemfile.rails4
|
65
|
-
bundler: "1"
|
66
42
|
runs-on: ubuntu-latest
|
67
43
|
env:
|
68
44
|
BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.gemfile }}
|
data/.gitignore
CHANGED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.1.0
|
data/Gemfile
CHANGED
@@ -6,9 +6,19 @@ gemspec
|
|
6
6
|
group :test do
|
7
7
|
gem 'rake'
|
8
8
|
gem 'rspec', '~> 3.0'
|
9
|
-
gem 'rails', '~>
|
9
|
+
gem 'rails', '~> 7.0.0'
|
10
10
|
gem 'rspec-rails'
|
11
11
|
gem 'sqlite3', '~> 1.4.0'
|
12
12
|
gem 'capybara'
|
13
|
-
gem '
|
13
|
+
gem 'selenium-webdriver'
|
14
|
+
|
15
|
+
if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new("3.0")
|
16
|
+
gem 'webrick'
|
17
|
+
end
|
18
|
+
|
19
|
+
if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new("3.1")
|
20
|
+
gem 'net-smtp', require: false
|
21
|
+
gem 'net-imap', require: false
|
22
|
+
gem 'net-pop', require: false
|
23
|
+
end
|
14
24
|
end
|
data/README.md
CHANGED
@@ -85,8 +85,8 @@ In `config/initializers/devise.rb`:
|
|
85
85
|
# for the user's session to facilitate an IDP initiated logout request.
|
86
86
|
config.saml_session_index_key = :session_index
|
87
87
|
|
88
|
-
# You can set this value to use Subject or SAML
|
89
|
-
# If you don't set it then email will be extracted from SAML
|
88
|
+
# You can set this value to use Subject or SAML assertion as info to which email will be compared.
|
89
|
+
# If you don't set it then email will be extracted from SAML assertion attributes.
|
90
90
|
config.saml_use_subject = true
|
91
91
|
|
92
92
|
# You can support multiple IdPs by setting this value to the name of a class that implements a ::settings method
|
@@ -97,9 +97,9 @@ In `config/initializers/devise.rb`:
|
|
97
97
|
# by setting this to the name of a custom reader class, or use the default.
|
98
98
|
# config.idp_entity_id_reader = "DeviseSamlAuthenticatable::DefaultIdpEntityIdReader"
|
99
99
|
|
100
|
-
# You can set a
|
100
|
+
# You can set the name of a class that takes the response for a failed SAML request and the strategy,
|
101
101
|
# and implements a #handle method. This method can then redirect the user, return error messages, etc.
|
102
|
-
# config.saml_failed_callback =
|
102
|
+
# config.saml_failed_callback = "MySamlFailedCallbacksHandler"
|
103
103
|
|
104
104
|
# You can customize the named routes generated in case of named route collisions with
|
105
105
|
# other Devise modules or libraries. Set the saml_route_helper_prefix to a string that will
|
@@ -117,7 +117,6 @@ In `config/initializers/devise.rb`:
|
|
117
117
|
|
118
118
|
# Configure with your SAML settings (see ruby-saml's README for more information: https://github.com/onelogin/ruby-saml).
|
119
119
|
config.saml_configure do |settings|
|
120
|
-
# assertion_consumer_service_url is required starting with ruby-saml 1.4.3: https://github.com/onelogin/ruby-saml#updating-from-142-to-143
|
121
120
|
settings.assertion_consumer_service_url = "http://localhost:3000/users/saml/auth"
|
122
121
|
settings.assertion_consumer_service_binding = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
|
123
122
|
settings.name_identifier_format = "urn:oasis:names:tc:SAML:2.0:nameid-format:transient"
|
@@ -1,31 +1,24 @@
|
|
1
|
-
require
|
1
|
+
require 'ruby-saml'
|
2
2
|
|
3
3
|
class Devise::SamlSessionsController < Devise::SessionsController
|
4
4
|
include DeviseSamlAuthenticatable::SamlConfig
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
prepend_before_filter :verify_signed_out_user, :store_info_for_sp_initiated_logout, only: :destroy
|
9
|
-
else
|
10
|
-
skip_before_action :verify_authenticity_token, raise: false
|
11
|
-
prepend_before_action :verify_signed_out_user, :store_info_for_sp_initiated_logout, only: :destroy
|
12
|
-
end
|
5
|
+
|
6
|
+
skip_before_action :verify_authenticity_token, raise: false
|
7
|
+
prepend_before_action :verify_signed_out_user, :store_info_for_sp_initiated_logout, only: :destroy
|
13
8
|
|
14
9
|
def new
|
15
10
|
idp_entity_id = get_idp_entity_id(params)
|
16
11
|
request = OneLogin::RubySaml::Authrequest.new
|
17
12
|
auth_params = { RelayState: relay_state } if relay_state
|
18
13
|
action = request.create(saml_config(idp_entity_id), auth_params || {})
|
19
|
-
if request.respond_to?(:request_id)
|
20
|
-
|
21
|
-
end
|
22
|
-
redirect_to action
|
14
|
+
session[:saml_transaction_id] = request.request_id if request.respond_to?(:request_id)
|
15
|
+
redirect_to action, allow_other_host: true
|
23
16
|
end
|
24
17
|
|
25
18
|
def metadata
|
26
19
|
idp_entity_id = params[:idp_entity_id]
|
27
20
|
meta = OneLogin::RubySaml::Metadata.new
|
28
|
-
render :
|
21
|
+
render xml: meta.generate(saml_config(idp_entity_id))
|
29
22
|
end
|
30
23
|
|
31
24
|
def idp_sign_out
|
@@ -34,7 +27,7 @@ class Devise::SamlSessionsController < Devise::SessionsController
|
|
34
27
|
logout_request = OneLogin::RubySaml::SloLogoutrequest.new(params[:SAMLRequest], settings: saml_config)
|
35
28
|
resource_class.reset_session_key_for(logout_request.name_id)
|
36
29
|
|
37
|
-
redirect_to generate_idp_logout_response(saml_config, logout_request.id)
|
30
|
+
redirect_to generate_idp_logout_response(saml_config, logout_request.id), allow_other_host: true
|
38
31
|
elsif params[:SAMLResponse]
|
39
32
|
# Currently Devise handles the session invalidation when the request is made.
|
40
33
|
# To support a true SP initiated logout response, the request ID would have to be tracked and session invalidated
|
@@ -52,18 +45,19 @@ class Devise::SamlSessionsController < Devise::SessionsController
|
|
52
45
|
protected
|
53
46
|
|
54
47
|
def relay_state
|
55
|
-
@relay_state ||= if Devise.saml_relay_state.present?
|
56
|
-
Devise.saml_relay_state.call(request)
|
57
|
-
end
|
48
|
+
@relay_state ||= (Devise.saml_relay_state.call(request) if Devise.saml_relay_state.present?)
|
58
49
|
end
|
59
50
|
|
60
51
|
# For non transient name ID, save info to identify user for logout purpose
|
61
52
|
# before that user's session got destroyed. These info are used in the
|
62
53
|
# `after_sign_out_path_for` method below.
|
63
54
|
def store_info_for_sp_initiated_logout
|
64
|
-
return if Devise.saml_config.name_identifier_format ==
|
55
|
+
return if Devise.saml_config.name_identifier_format == 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient'
|
56
|
+
|
65
57
|
@name_identifier_value_for_sp_initiated_logout = Devise.saml_name_identifier_retriever.call(current_user)
|
66
|
-
|
58
|
+
if Devise.saml_session_index_key
|
59
|
+
@sessionindex_for_sp_initiated_logout = current_user.public_send(Devise.saml_session_index_key)
|
60
|
+
end
|
67
61
|
end
|
68
62
|
|
69
63
|
# Override devise to send user to IdP logout for SLO
|
@@ -89,17 +83,14 @@ class Devise::SamlSessionsController < Devise::SessionsController
|
|
89
83
|
if all_signed_out?
|
90
84
|
set_flash_message! :notice, :already_signed_out
|
91
85
|
|
92
|
-
redirect_to Devise.saml_sign_out_success_url.presence ||
|
93
|
-
Devise::SessionsController.new.after_sign_out_path_for(resource_name)
|
86
|
+
redirect_to (Devise.saml_sign_out_success_url.presence ||
|
87
|
+
Devise::SessionsController.new.after_sign_out_path_for(resource_name)), allow_other_host: true
|
94
88
|
end
|
95
89
|
end
|
96
90
|
|
97
91
|
def generate_idp_logout_response(saml_config, logout_request_id)
|
98
|
-
|
99
92
|
params = {}
|
100
|
-
if relay_state
|
101
|
-
params[:RelayState] = relay_state
|
102
|
-
end
|
93
|
+
params[:RelayState] = relay_state if relay_state
|
103
94
|
|
104
95
|
OneLogin::RubySaml::SloLogoutresponse.new.create(saml_config, logout_request_id, nil, params)
|
105
96
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module DeviseSamlAuthenticatable
|
2
2
|
|
3
3
|
class Logger
|
4
|
-
def self.send(message, logger = Rails.logger)
|
4
|
+
def self.send(message, log_level = ::Logger::INFO, logger = Rails.logger)
|
5
5
|
if ::Devise.saml_logger
|
6
|
-
logger.add
|
6
|
+
logger.add log_level, " \e[36msaml:\e[0m #{message}"
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
@@ -52,7 +52,15 @@ module Devise
|
|
52
52
|
def failed_auth(msg)
|
53
53
|
DeviseSamlAuthenticatable::Logger.send(msg)
|
54
54
|
fail!(:invalid)
|
55
|
-
|
55
|
+
failed_callback.new.handle(@response, self) if Devise.saml_failed_callback
|
56
|
+
end
|
57
|
+
|
58
|
+
def failed_callback
|
59
|
+
if Devise.saml_failed_callback.respond_to?(:new)
|
60
|
+
Devise.saml_failed_callback
|
61
|
+
else
|
62
|
+
Devise.saml_failed_callback.constantize
|
63
|
+
end
|
56
64
|
end
|
57
65
|
|
58
66
|
def response_options
|
@@ -10,13 +10,12 @@ class DeviseController < ApplicationController
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def resource_name
|
13
|
-
|
13
|
+
'users'
|
14
14
|
end
|
15
15
|
|
16
|
-
def require_no_authentication
|
17
|
-
end
|
16
|
+
def require_no_authentication; end
|
18
17
|
|
19
|
-
def set_flash_message!(key, kind,
|
18
|
+
def set_flash_message!(key, kind, _options = {})
|
20
19
|
flash[key] = I18n.t("devise.sessions.#{kind}")
|
21
20
|
end
|
22
21
|
end
|
@@ -24,7 +23,7 @@ end
|
|
24
23
|
class Devise::SessionsController < DeviseController
|
25
24
|
def destroy
|
26
25
|
sign_out
|
27
|
-
redirect_to after_sign_out_path_for(:user)
|
26
|
+
redirect_to after_sign_out_path_for(:user), allow_other_host: true
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
@@ -33,65 +32,49 @@ require_relative '../../../app/controllers/devise/saml_sessions_controller'
|
|
33
32
|
describe Devise::SamlSessionsController, type: :controller do
|
34
33
|
include RubySamlSupport
|
35
34
|
|
36
|
-
let(:idp_providers_adapter) { spy(
|
35
|
+
let(:idp_providers_adapter) { spy('Stub IDPSettings Adaptor') }
|
37
36
|
|
38
37
|
before do
|
39
|
-
@request.env[
|
38
|
+
@request.env['devise.mapping'] = Devise.mappings[:user]
|
40
39
|
settings = {
|
41
|
-
assertion_consumer_service_url:
|
42
|
-
assertion_consumer_service_binding:
|
43
|
-
name_identifier_format:
|
44
|
-
issuer:
|
45
|
-
idp_entity_id:
|
46
|
-
authn_context:
|
47
|
-
idp_cert:
|
40
|
+
assertion_consumer_service_url: 'acs_url',
|
41
|
+
assertion_consumer_service_binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
|
42
|
+
name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
|
43
|
+
issuer: 'sp_issuer',
|
44
|
+
idp_entity_id: 'http://www.example.com',
|
45
|
+
authn_context: '',
|
46
|
+
idp_cert: 'idp_cert'
|
48
47
|
}
|
49
48
|
with_ruby_saml_1_12_or_greater(proc {
|
50
49
|
settings.merge!(
|
51
|
-
idp_slo_service_url:
|
52
|
-
idp_sso_service_url:
|
50
|
+
idp_slo_service_url: 'http://idp_slo_url',
|
51
|
+
idp_sso_service_url: 'http://idp_sso_url'
|
53
52
|
)
|
54
53
|
}, else_do: proc {
|
55
54
|
settings.merge!(
|
56
|
-
idp_slo_target_url:
|
57
|
-
idp_sso_target_url:
|
55
|
+
idp_slo_target_url: 'http://idp_slo_url',
|
56
|
+
idp_sso_target_url: 'http://idp_sso_url'
|
58
57
|
)
|
59
58
|
})
|
60
59
|
allow(idp_providers_adapter).to receive(:settings).and_return(settings)
|
61
60
|
end
|
62
61
|
|
63
|
-
before do
|
64
|
-
if Rails::VERSION::MAJOR < 5 && Gem::Version.new(RUBY_VERSION) > Gem::Version.new("2.6")
|
65
|
-
# we still want to support Rails 4
|
66
|
-
# patch tests using snippet from https://github.com/rails/rails/issues/34790#issuecomment-483607370
|
67
|
-
class ActionController::TestResponse < ActionDispatch::TestResponse
|
68
|
-
def recycle!
|
69
|
-
@mon_mutex_owner_object_id = nil
|
70
|
-
@mon_mutex = nil
|
71
|
-
initialize
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
62
|
describe '#new' do
|
78
|
-
let(:saml_response)
|
63
|
+
let(:saml_response) do
|
64
|
+
File.read(File.join(File.dirname(__FILE__), '../../support', 'response_encrypted_nameid.xml.base64'))
|
65
|
+
end
|
79
66
|
|
80
|
-
subject(:do_get)
|
81
|
-
|
82
|
-
|
83
|
-
else
|
84
|
-
get :new, "SAMLResponse" => saml_response
|
85
|
-
end
|
86
|
-
}
|
67
|
+
subject(:do_get) do
|
68
|
+
get :new, params: { 'SAMLResponse' => saml_response }
|
69
|
+
end
|
87
70
|
|
88
|
-
context
|
89
|
-
it
|
71
|
+
context 'when using the default saml config' do
|
72
|
+
it 'redirects to the IdP SSO target url' do
|
90
73
|
do_get
|
91
|
-
expect(response).to redirect_to(%r
|
74
|
+
expect(response).to redirect_to(%r{\Ahttp://localhost:8009/saml/auth\?SAMLRequest=})
|
92
75
|
end
|
93
76
|
|
94
|
-
it
|
77
|
+
it 'stores saml_transaction_id in the session' do
|
95
78
|
do_get
|
96
79
|
if OneLogin::RubySaml::Authrequest.public_instance_methods.include?(:request_id)
|
97
80
|
expect(session[:saml_transaction_id]).to be_present
|
@@ -99,53 +82,49 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
99
82
|
end
|
100
83
|
end
|
101
84
|
|
102
|
-
context
|
85
|
+
context 'with a specified idp' do
|
103
86
|
before do
|
104
87
|
Devise.idp_settings_adapter = idp_providers_adapter
|
105
88
|
end
|
106
89
|
|
107
|
-
it
|
90
|
+
it 'redirects to the associated IdP SSO target url' do
|
108
91
|
do_get
|
109
|
-
expect(response).to redirect_to(%r
|
92
|
+
expect(response).to redirect_to(%r{\Ahttp://idp_sso_url\?SAMLRequest=})
|
110
93
|
end
|
111
94
|
|
112
|
-
it
|
95
|
+
it 'stores saml_transaction_id in the session' do
|
113
96
|
do_get
|
114
97
|
if OneLogin::RubySaml::Authrequest.public_instance_methods.include?(:request_id)
|
115
98
|
expect(session[:saml_transaction_id]).to be_present
|
116
99
|
end
|
117
100
|
end
|
118
101
|
|
119
|
-
it
|
102
|
+
it 'uses the DefaultIdpEntityIdReader' do
|
120
103
|
expect(DeviseSamlAuthenticatable::DefaultIdpEntityIdReader).to receive(:entity_id)
|
121
104
|
do_get
|
122
105
|
expect(idp_providers_adapter).to have_received(:settings).with(nil)
|
123
106
|
end
|
124
107
|
|
125
|
-
context
|
126
|
-
let(:relay_state) { ->(
|
108
|
+
context 'with a relay_state lambda defined' do
|
109
|
+
let(:relay_state) { ->(_request) { '123' } }
|
127
110
|
|
128
|
-
it
|
111
|
+
it 'includes the RelayState param in the request to the IdP' do
|
129
112
|
expect(Devise).to receive(:saml_relay_state).at_least(:once).and_return(relay_state)
|
130
113
|
do_get
|
131
|
-
expect(response).to redirect_to(%r
|
114
|
+
expect(response).to redirect_to(%r{\Ahttp://idp_sso_url\?SAMLRequest=.*&RelayState=123})
|
132
115
|
end
|
133
116
|
end
|
134
117
|
|
135
|
-
context
|
118
|
+
context 'with a specified idp entity id reader' do
|
136
119
|
class OurIdpEntityIdReader
|
137
120
|
def self.entity_id(params)
|
138
121
|
params[:entity_id]
|
139
122
|
end
|
140
123
|
end
|
141
124
|
|
142
|
-
subject(:do_get)
|
143
|
-
|
144
|
-
|
145
|
-
else
|
146
|
-
get :new, entity_id: "http://www.example.com"
|
147
|
-
end
|
148
|
-
}
|
125
|
+
subject(:do_get) do
|
126
|
+
get :new, params: { entity_id: 'http://www.example.com' }
|
127
|
+
end
|
149
128
|
|
150
129
|
before do
|
151
130
|
@default_reader = Devise.idp_entity_id_reader
|
@@ -156,10 +135,10 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
156
135
|
Devise.idp_entity_id_reader = @default_reader
|
157
136
|
end
|
158
137
|
|
159
|
-
it
|
138
|
+
it 'redirects to the associated IdP SSO target url' do
|
160
139
|
do_get
|
161
|
-
expect(idp_providers_adapter).to have_received(:settings).with(
|
162
|
-
expect(response).to redirect_to(%r
|
140
|
+
expect(idp_providers_adapter).to have_received(:settings).with('http://www.example.com')
|
141
|
+
expect(response).to redirect_to(%r{\Ahttp://idp_sso_url\?SAMLRequest=})
|
163
142
|
end
|
164
143
|
end
|
165
144
|
end
|
@@ -168,7 +147,7 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
168
147
|
describe '#metadata' do
|
169
148
|
let(:saml_config) { Devise.saml_config.dup }
|
170
149
|
|
171
|
-
context
|
150
|
+
context 'with the default configuration' do
|
172
151
|
it 'generates metadata' do
|
173
152
|
get :metadata
|
174
153
|
|
@@ -179,20 +158,20 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
179
158
|
end
|
180
159
|
end
|
181
160
|
|
182
|
-
context
|
183
|
-
let(:saml_config) { controller.saml_config(
|
161
|
+
context 'with a specified IDP' do
|
162
|
+
let(:saml_config) { controller.saml_config('anything') }
|
184
163
|
|
185
164
|
before do
|
186
165
|
Devise.idp_settings_adapter = idp_providers_adapter
|
187
166
|
Devise.saml_configure do |settings|
|
188
|
-
settings.assertion_consumer_service_url =
|
189
|
-
settings.assertion_consumer_service_binding =
|
190
|
-
settings.name_identifier_format =
|
191
|
-
settings.issuer =
|
167
|
+
settings.assertion_consumer_service_url = 'http://localhost:3000/users/saml/auth'
|
168
|
+
settings.assertion_consumer_service_binding = 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST'
|
169
|
+
settings.name_identifier_format = 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient'
|
170
|
+
settings.issuer = 'http://localhost:3000'
|
192
171
|
end
|
193
172
|
end
|
194
173
|
|
195
|
-
it
|
174
|
+
it 'generates the same service metadata' do
|
196
175
|
get :metadata
|
197
176
|
|
198
177
|
# Remove ID that can vary across requests
|
@@ -206,7 +185,7 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
206
185
|
describe '#destroy' do
|
207
186
|
subject { delete :destroy }
|
208
187
|
|
209
|
-
context
|
188
|
+
context 'when user is signed out' do
|
210
189
|
before do
|
211
190
|
class Devise::SessionsController < DeviseController
|
212
191
|
def all_signed_out?
|
@@ -215,45 +194,45 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
215
194
|
end
|
216
195
|
end
|
217
196
|
|
218
|
-
shared_examples
|
197
|
+
shared_examples 'not create SP initiated logout request' do
|
219
198
|
it do
|
220
199
|
expect(OneLogin::RubySaml::Logoutrequest).not_to receive(:new)
|
221
200
|
subject
|
222
201
|
end
|
223
202
|
end
|
224
203
|
|
225
|
-
context
|
204
|
+
context 'when Devise.saml_sign_out_success_url is set' do
|
226
205
|
before do
|
227
|
-
allow(Devise).to receive(:saml_sign_out_success_url).and_return(
|
206
|
+
allow(Devise).to receive(:saml_sign_out_success_url).and_return('http://localhost:8009/logged_out')
|
228
207
|
end
|
229
208
|
|
230
|
-
it
|
231
|
-
is_expected.to redirect_to
|
232
|
-
expect(flash[:notice]).to eq I18n.t(
|
209
|
+
it 'redirect to saml_sign_out_success_url' do
|
210
|
+
is_expected.to redirect_to 'http://localhost:8009/logged_out'
|
211
|
+
expect(flash[:notice]).to eq I18n.t('devise.sessions.already_signed_out')
|
233
212
|
end
|
234
213
|
|
235
|
-
it_behaves_like
|
214
|
+
it_behaves_like 'not create SP initiated logout request'
|
236
215
|
end
|
237
216
|
|
238
|
-
context
|
217
|
+
context 'when Devise.saml_sign_out_success_url is not set' do
|
239
218
|
before do
|
240
219
|
class Devise::SessionsController < DeviseController
|
241
220
|
def after_sign_out_path_for(_)
|
242
|
-
|
221
|
+
'http://localhost:8009/logged_out'
|
243
222
|
end
|
244
223
|
end
|
245
224
|
end
|
246
225
|
|
247
226
|
it "redirect to devise's after sign out path" do
|
248
|
-
is_expected.to redirect_to
|
249
|
-
expect(flash[:notice]).to eq I18n.t(
|
227
|
+
is_expected.to redirect_to 'http://localhost:8009/logged_out'
|
228
|
+
expect(flash[:notice]).to eq I18n.t('devise.sessions.already_signed_out')
|
250
229
|
end
|
251
230
|
|
252
|
-
it_behaves_like
|
231
|
+
it_behaves_like 'not create SP initiated logout request'
|
253
232
|
end
|
254
233
|
end
|
255
234
|
|
256
|
-
context
|
235
|
+
context 'when user is not signed out' do
|
257
236
|
before do
|
258
237
|
class Devise::SessionsController < DeviseController
|
259
238
|
def all_signed_out?
|
@@ -263,60 +242,56 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
263
242
|
allow(controller).to receive(:sign_out)
|
264
243
|
end
|
265
244
|
|
266
|
-
context
|
267
|
-
it
|
245
|
+
context 'when using the default saml config' do
|
246
|
+
it 'signs out and redirects to the IdP' do
|
268
247
|
delete :destroy
|
269
248
|
expect(controller).to have_received(:sign_out)
|
270
|
-
expect(response).to redirect_to(%r
|
249
|
+
expect(response).to redirect_to(%r{\Ahttp://localhost:8009/saml/logout\?SAMLRequest=})
|
271
250
|
end
|
272
251
|
end
|
273
252
|
|
274
|
-
context
|
253
|
+
context 'when configured to use a non-transient name identifier' do
|
275
254
|
before do
|
276
|
-
allow(Devise.saml_config).to receive(:name_identifier_format).and_return(
|
255
|
+
allow(Devise.saml_config).to receive(:name_identifier_format).and_return('urn:oasis:names:tc:SAML:2.0:nameid-format:persistent')
|
277
256
|
end
|
278
257
|
|
279
|
-
it
|
280
|
-
controller.current_user = Struct.new(:email, :session_index).new(
|
258
|
+
it 'includes a LogoutRequest with the name identifier and session index', :aggregate_failures do
|
259
|
+
controller.current_user = Struct.new(:email, :session_index).new('user@example.com', 'sessionindex')
|
281
260
|
|
282
261
|
actual_settings = nil
|
283
262
|
expect_any_instance_of(OneLogin::RubySaml::Logoutrequest).to receive(:create) do |_, settings|
|
284
263
|
actual_settings = settings
|
285
|
-
|
264
|
+
'http://localhost:8009/saml/logout'
|
286
265
|
end
|
287
266
|
|
288
267
|
delete :destroy
|
289
|
-
expect(actual_settings.name_identifier_value).to eq(
|
290
|
-
expect(actual_settings.sessionindex).to eq(
|
268
|
+
expect(actual_settings.name_identifier_value).to eq('user@example.com')
|
269
|
+
expect(actual_settings.sessionindex).to eq('sessionindex')
|
291
270
|
end
|
292
271
|
end
|
293
272
|
|
294
|
-
context
|
273
|
+
context 'with a specified idp' do
|
295
274
|
before do
|
296
275
|
Devise.idp_settings_adapter = idp_providers_adapter
|
297
276
|
end
|
298
277
|
|
299
|
-
it
|
278
|
+
it 'redirects to the associated IdP SSO target url' do
|
300
279
|
expect(DeviseSamlAuthenticatable::DefaultIdpEntityIdReader).to receive(:entity_id)
|
301
280
|
delete :destroy
|
302
281
|
expect(controller).to have_received(:sign_out)
|
303
|
-
expect(response).to redirect_to(%r
|
282
|
+
expect(response).to redirect_to(%r{\Ahttp://idp_slo_url\?SAMLRequest=})
|
304
283
|
end
|
305
284
|
|
306
|
-
context
|
285
|
+
context 'with a specified idp entity id reader' do
|
307
286
|
class OurIdpEntityIdReader
|
308
287
|
def self.entity_id(params)
|
309
288
|
params[:entity_id]
|
310
289
|
end
|
311
290
|
end
|
312
291
|
|
313
|
-
subject(:do_delete)
|
314
|
-
|
315
|
-
|
316
|
-
else
|
317
|
-
delete :destroy, entity_id: "http://www.example.com"
|
318
|
-
end
|
319
|
-
}
|
292
|
+
subject(:do_delete) do
|
293
|
+
delete :destroy, params: { entity_id: 'http://www.example.com' }
|
294
|
+
end
|
320
295
|
|
321
296
|
before do
|
322
297
|
@default_reader = Devise.idp_entity_id_reader
|
@@ -327,11 +302,11 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
327
302
|
Devise.idp_entity_id_reader = @default_reader
|
328
303
|
end
|
329
304
|
|
330
|
-
it
|
305
|
+
it 'redirects to the associated IdP SLO target url' do
|
331
306
|
do_delete
|
332
307
|
expect(controller).to have_received(:sign_out)
|
333
|
-
expect(idp_providers_adapter).to have_received(:settings).with(
|
334
|
-
expect(response).to redirect_to(%r
|
308
|
+
expect(idp_providers_adapter).to have_received(:settings).with('http://www.example.com')
|
309
|
+
expect(response).to redirect_to(%r{\Ahttp://idp_slo_url\?SAMLRequest=})
|
335
310
|
end
|
336
311
|
end
|
337
312
|
end
|
@@ -352,14 +327,10 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
352
327
|
expect(response.status).to eq 500
|
353
328
|
end
|
354
329
|
|
355
|
-
context
|
356
|
-
subject(:do_post)
|
357
|
-
|
358
|
-
|
359
|
-
else
|
360
|
-
post :idp_sign_out, SAMLResponse: "stubbed_response"
|
361
|
-
end
|
362
|
-
}
|
330
|
+
context 'when receiving a logout response from the IdP after redirecting an SP logout request' do
|
331
|
+
subject(:do_post) do
|
332
|
+
post :idp_sign_out, params: { SAMLResponse: 'stubbed_response' }
|
333
|
+
end
|
363
334
|
|
364
335
|
it 'accepts a LogoutResponse and redirects sign_in' do
|
365
336
|
do_post
|
@@ -381,20 +352,18 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
381
352
|
end
|
382
353
|
end
|
383
354
|
|
384
|
-
context
|
385
|
-
subject(:do_post)
|
386
|
-
|
387
|
-
|
388
|
-
else
|
389
|
-
post :idp_sign_out, SAMLRequest: "stubbed_logout_request"
|
390
|
-
end
|
391
|
-
}
|
355
|
+
context 'when receiving an IdP logout request' do
|
356
|
+
subject(:do_post) do
|
357
|
+
post :idp_sign_out, params: { SAMLRequest: 'stubbed_logout_request' }
|
358
|
+
end
|
392
359
|
|
393
|
-
let(:saml_request)
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
360
|
+
let(:saml_request) do
|
361
|
+
double(:slo_logoutrequest, {
|
362
|
+
id: 42,
|
363
|
+
name_id: name_id,
|
364
|
+
issuer: 'http://www.example.com'
|
365
|
+
})
|
366
|
+
end
|
398
367
|
let(:name_id) { '12312312' }
|
399
368
|
before do
|
400
369
|
allow(OneLogin::RubySaml::SloLogoutrequest).to receive(:new).and_return(saml_request)
|
@@ -407,27 +376,28 @@ describe Devise::SamlSessionsController, type: :controller do
|
|
407
376
|
expect(User).to have_received(:reset_session_key_for).with(name_id)
|
408
377
|
end
|
409
378
|
|
410
|
-
context
|
411
|
-
let(:idp_entity_id) {
|
379
|
+
context 'with a specified idp' do
|
380
|
+
let(:idp_entity_id) { 'http://www.example.com' }
|
412
381
|
before do
|
413
382
|
Devise.idp_settings_adapter = idp_providers_adapter
|
414
383
|
end
|
415
384
|
|
416
|
-
it
|
385
|
+
it 'accepts a LogoutResponse for the associated slo_target_url and redirects to sign_in' do
|
417
386
|
do_post
|
418
387
|
expect(response.status).to eq 302
|
419
388
|
expect(idp_providers_adapter).to have_received(:settings).with(idp_entity_id)
|
420
|
-
expect(response).to redirect_to
|
389
|
+
expect(response).to redirect_to 'http://localhost/logout_response'
|
421
390
|
end
|
422
391
|
end
|
423
392
|
|
424
|
-
context
|
425
|
-
let(:relay_state) { ->(
|
393
|
+
context 'with a relay_state lambda defined' do
|
394
|
+
let(:relay_state) { ->(_request) { '123' } }
|
426
395
|
|
427
|
-
it
|
396
|
+
it 'includes the RelayState param in the request to the IdP' do
|
428
397
|
expect(Devise).to receive(:saml_relay_state).at_least(:once).and_return(relay_state)
|
429
398
|
do_post
|
430
|
-
expect(saml_response).to have_received(:create).with(Devise.saml_config, saml_request.id, nil,
|
399
|
+
expect(saml_response).to have_received(:create).with(Devise.saml_config, saml_request.id, nil,
|
400
|
+
{ RelayState: '123' })
|
431
401
|
end
|
432
402
|
end
|
433
403
|
|
@@ -3,8 +3,21 @@ require 'net/http'
|
|
3
3
|
require 'timeout'
|
4
4
|
require 'uri'
|
5
5
|
require 'capybara/rspec'
|
6
|
-
require '
|
7
|
-
|
6
|
+
require 'selenium-webdriver'
|
7
|
+
|
8
|
+
Capybara.register_driver :chrome do |app|
|
9
|
+
options = Selenium::WebDriver::Chrome::Options.new
|
10
|
+
options.add_argument('--headless')
|
11
|
+
options.add_argument('--allow-insecure-localhost')
|
12
|
+
options.add_argument('--ignore-certificate-errors')
|
13
|
+
|
14
|
+
Capybara::Selenium::Driver.new(
|
15
|
+
app,
|
16
|
+
browser: :chrome,
|
17
|
+
capabilities: [options]
|
18
|
+
)
|
19
|
+
end
|
20
|
+
Capybara.default_driver = :chrome
|
8
21
|
Capybara.server = :webrick
|
9
22
|
|
10
23
|
describe "SAML Authentication", type: :feature do
|
@@ -165,7 +178,7 @@ describe "SAML Authentication", type: :feature do
|
|
165
178
|
let(:valid_destination) { "true" }
|
166
179
|
before(:each) do
|
167
180
|
create_app('idp', 'INCLUDE_SUBJECT_IN_ATTRIBUTES' => "false", 'VALID_DESTINATION' => valid_destination)
|
168
|
-
create_app('sp', 'USE_SUBJECT_TO_AUTHENTICATE' => "true", 'SAML_FAILED_CALLBACK' => "OurSamlFailedCallbackHandler")
|
181
|
+
create_app('sp', 'USE_SUBJECT_TO_AUTHENTICATE' => "true", 'SAML_FAILED_CALLBACK' => '"OurSamlFailedCallbackHandler"')
|
169
182
|
|
170
183
|
@idp_pid = start_app('idp', idp_port)
|
171
184
|
@sp_pid = start_app('sp', sp_port)
|
@@ -224,7 +237,7 @@ describe "SAML Authentication", type: :feature do
|
|
224
237
|
end
|
225
238
|
|
226
239
|
def sign_in(entity_id: "")
|
227
|
-
visit "http://localhost:8020/users/saml/sign_in/?entity_id=#{URI.
|
240
|
+
visit "http://localhost:8020/users/saml/sign_in/?entity_id=#{URI.encode_www_form_component(entity_id)}"
|
228
241
|
fill_in "Email", with: "you@example.com"
|
229
242
|
fill_in "Password", with: "asdf"
|
230
243
|
click_on "Sign in"
|
@@ -10,16 +10,5 @@ group :test do
|
|
10
10
|
gem 'rspec-rails', '~> 3.9'
|
11
11
|
gem 'sqlite3', '~> 1.3.6'
|
12
12
|
gem 'capybara'
|
13
|
-
gem '
|
14
|
-
|
15
|
-
# Lock down versions of gems for older versions of Ruby
|
16
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
|
17
|
-
gem 'responders', '~> 2.4'
|
18
|
-
end
|
19
|
-
|
20
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.3")
|
21
|
-
gem 'byebug', '~> 10.0'
|
22
|
-
elsif Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
|
23
|
-
gem 'byebug', '~> 11.0.0'
|
24
|
-
end
|
13
|
+
gem 'selenium-webdriver'
|
25
14
|
end
|
data/spec/support/Gemfile.rails6
CHANGED
@@ -0,0 +1,24 @@
|
|
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', '~> 6.1.0'
|
10
|
+
gem 'rspec-rails', '~> 5.0'
|
11
|
+
gem 'sqlite3', '~> 1.4.0'
|
12
|
+
gem 'capybara'
|
13
|
+
gem 'selenium-webdriver'
|
14
|
+
|
15
|
+
if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new("3.0")
|
16
|
+
gem 'webrick'
|
17
|
+
end
|
18
|
+
|
19
|
+
if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new("3.1")
|
20
|
+
gem 'net-smtp', require: false
|
21
|
+
gem 'net-imap', require: false
|
22
|
+
gem 'net-pop', require: false
|
23
|
+
end
|
24
|
+
end
|
@@ -5,22 +5,14 @@
|
|
5
5
|
@include_subject_in_attributes = ENV.fetch('INCLUDE_SUBJECT_IN_ATTRIBUTES')
|
6
6
|
@valid_destination = ENV.fetch('VALID_DESTINATION', "true")
|
7
7
|
|
8
|
-
|
9
|
-
gsub_file 'config/secrets.yml', /secret_key_base:.*$/, 'secret_key_base: "34814fd41f91c493b89aa01ac73c44d241a31245b5bc5542fa4b7317525e1dcfa60ba947b3d085e4e229456fdee0d8af6aac6a63cf750d807ea6fe5d853dff4a"'
|
10
|
-
end
|
11
|
-
|
12
|
-
gem 'ruby-saml-idp', '~> 0.3.3'
|
8
|
+
gem 'stub_saml_idp'
|
13
9
|
gem 'thin'
|
14
10
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
gem 'devise', '~> 3.5'
|
20
|
-
gem 'nokogiri', '~> 1.6.8'
|
11
|
+
if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new("3.1")
|
12
|
+
gem 'net-smtp', require: false
|
13
|
+
gem 'net-imap', require: false
|
14
|
+
gem 'net-pop', require: false
|
21
15
|
end
|
22
|
-
GEMFILE
|
23
|
-
}
|
24
16
|
|
25
17
|
route "get '/saml/auth' => 'saml_idp#new'"
|
26
18
|
route "post '/saml/auth' => 'saml_idp#create'"
|
data/spec/support/rails_app.rb
CHANGED
@@ -19,7 +19,7 @@ end
|
|
19
19
|
|
20
20
|
def create_app(name, env = {})
|
21
21
|
puts "[#{name}] Creating Rails app"
|
22
|
-
rails_new_options = %w[-T -J -S --skip-spring --skip-listen --skip-bootsnap]
|
22
|
+
rails_new_options = %w[-A -G -C -T -J -S --skip-spring --skip-listen --skip-bootsnap --skip-action-mailbox --skip-jbuilder --skip-active-storage]
|
23
23
|
rails_new_options << "-O" if name == "idp"
|
24
24
|
env.merge!("RUBY_SAML_VERSION" => OneLogin::RubySaml::VERSION)
|
25
25
|
Dir.chdir(working_directory) do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class SamlIdpController <
|
1
|
+
class SamlIdpController < StubSamlIdp::IdpController
|
2
2
|
def new
|
3
3
|
if session[:user_id]
|
4
4
|
@saml_response = idp_make_saml_response(session[:user_id])
|
@@ -79,13 +79,8 @@ class SamlIdpController < SamlIdp::IdpController
|
|
79
79
|
end
|
80
80
|
|
81
81
|
# == SLO functionality, see https://github.com/lawrencepit/ruby-saml-idp/pull/10
|
82
|
-
<% if Rails::VERSION::MAJOR < 5 %>
|
83
|
-
skip_before_filter :validate_saml_request, :only => [:logout, :sp_sign_out]
|
84
|
-
before_filter :validate_saml_slo_request, :only => [:logout]
|
85
|
-
<% else %>
|
86
82
|
skip_before_action :validate_saml_request, :only => [:logout, :sp_sign_out]
|
87
83
|
before_action :validate_saml_slo_request, :only => [:logout]
|
88
|
-
<% end %>
|
89
84
|
|
90
85
|
public
|
91
86
|
|
data/spec/support/sp_template.rb
CHANGED
@@ -10,25 +10,16 @@ idp_entity_id_reader = ENV.fetch('IDP_ENTITY_ID_READER', '"DeviseSamlAuthenticat
|
|
10
10
|
saml_failed_callback = ENV.fetch('SAML_FAILED_CALLBACK', "nil")
|
11
11
|
ruby_saml_version = ENV.fetch("RUBY_SAML_VERSION")
|
12
12
|
|
13
|
-
if Rails::VERSION::MAJOR < 5 || (Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR < 2)
|
14
|
-
gsub_file 'config/secrets.yml', /secret_key_base:.*$/, 'secret_key_base: "8b5889df1fcf03f76c7d66da02d8776bcc85b06bed7d9c592f076d9c8a5455ee6d4beae45986c3c030b40208db5e612f2a6ef8283036a352e3fae83c5eda36be"'
|
15
|
-
end
|
16
|
-
|
17
13
|
gem 'devise_saml_authenticatable', path: File.expand_path("../../..", __FILE__)
|
18
14
|
gem 'ruby-saml', ruby_saml_version
|
19
15
|
gem 'thin'
|
20
16
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
gem 'devise', '~> 3.5'
|
26
|
-
gem 'nokogiri', '~> 1.6.8'
|
27
|
-
elsif Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
|
28
|
-
gem 'responders', '~> 2.4'
|
17
|
+
if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new("3.1")
|
18
|
+
gem 'net-smtp', require: false
|
19
|
+
gem 'net-imap', require: false
|
20
|
+
gem 'net-pop', require: false
|
29
21
|
end
|
30
|
-
|
31
|
-
}
|
22
|
+
|
32
23
|
if Rails::VERSION::MAJOR < 6
|
33
24
|
# sqlite3 is hard-coded in Rails < 6 to v1.3.x
|
34
25
|
gsub_file 'Gemfile', /^gem 'sqlite3'.*$/, "gem 'sqlite3', '~> 1.3.6'"
|
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.
|
4
|
+
version: 1.8.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:
|
11
|
+
date: 2022-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: devise
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- ".github/workflows/ci.yml"
|
49
49
|
- ".gitignore"
|
50
50
|
- ".rspec"
|
51
|
+
- ".ruby-version"
|
51
52
|
- Gemfile
|
52
53
|
- LICENSE
|
53
54
|
- README.md
|
@@ -78,11 +79,9 @@ files:
|
|
78
79
|
- spec/rails_helper.rb
|
79
80
|
- spec/routes/routes_spec.rb
|
80
81
|
- spec/spec_helper.rb
|
81
|
-
- spec/support/Gemfile.rails4
|
82
|
-
- spec/support/Gemfile.rails5
|
83
|
-
- spec/support/Gemfile.rails5.1
|
84
82
|
- spec/support/Gemfile.rails5.2
|
85
83
|
- spec/support/Gemfile.rails6
|
84
|
+
- spec/support/Gemfile.rails6.1
|
86
85
|
- spec/support/attribute-map.yml
|
87
86
|
- spec/support/attribute_map_resolver.rb.erb
|
88
87
|
- spec/support/idp_settings_adapter.rb.erb
|
@@ -112,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
111
|
- !ruby/object:Gem::Version
|
113
112
|
version: '0'
|
114
113
|
requirements: []
|
115
|
-
rubygems_version: 3.
|
114
|
+
rubygems_version: 3.3.3
|
116
115
|
signing_key:
|
117
116
|
specification_version: 4
|
118
117
|
summary: SAML Authentication for devise
|
@@ -128,11 +127,9 @@ test_files:
|
|
128
127
|
- spec/rails_helper.rb
|
129
128
|
- spec/routes/routes_spec.rb
|
130
129
|
- spec/spec_helper.rb
|
131
|
-
- spec/support/Gemfile.rails4
|
132
|
-
- spec/support/Gemfile.rails5
|
133
|
-
- spec/support/Gemfile.rails5.1
|
134
130
|
- spec/support/Gemfile.rails5.2
|
135
131
|
- spec/support/Gemfile.rails6
|
132
|
+
- spec/support/Gemfile.rails6.1
|
136
133
|
- spec/support/attribute-map.yml
|
137
134
|
- spec/support/attribute_map_resolver.rb.erb
|
138
135
|
- spec/support/idp_settings_adapter.rb.erb
|
data/spec/support/Gemfile.rails4
DELETED
@@ -1,41 +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 'rspec', '~> 3.0'
|
8
|
-
gem 'rails', '~> 4.0'
|
9
|
-
gem 'rspec-rails', '~> 3.9'
|
10
|
-
gem 'sqlite3', '~> 1.3.6'
|
11
|
-
gem 'capybara'
|
12
|
-
gem 'poltergeist'
|
13
|
-
|
14
|
-
# Lock down versions of gems for older versions of Ruby
|
15
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.1")
|
16
|
-
gem 'rake', '~> 12.2'
|
17
|
-
else
|
18
|
-
gem 'rake'
|
19
|
-
end
|
20
|
-
|
21
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.1")
|
22
|
-
gem 'devise', '~> 3.5'
|
23
|
-
gem 'minitest', '~> 5.11.0'
|
24
|
-
gem 'nokogiri', '~> 1.6.8'
|
25
|
-
gem 'public_suffix', '~> 2.0.5'
|
26
|
-
end
|
27
|
-
|
28
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.1")
|
29
|
-
gem 'responders', '~> 1.0'
|
30
|
-
elsif Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
|
31
|
-
gem 'responders', '~> 2.0'
|
32
|
-
end
|
33
|
-
|
34
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.2")
|
35
|
-
gem 'byebug', '~> 9.0'
|
36
|
-
elsif Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.3")
|
37
|
-
gem 'byebug', '~> 10.0'
|
38
|
-
elsif Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
|
39
|
-
gem 'byebug', '~> 11.0.0'
|
40
|
-
end
|
41
|
-
end
|
data/spec/support/Gemfile.rails5
DELETED
@@ -1,25 +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.0'
|
10
|
-
gem 'rspec-rails', '~> 3.9'
|
11
|
-
gem 'sqlite3', '~> 1.3.6'
|
12
|
-
gem 'capybara'
|
13
|
-
gem 'poltergeist'
|
14
|
-
|
15
|
-
# Lock down versions of gems for older versions of Ruby
|
16
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
|
17
|
-
gem 'responders', '~> 2.4'
|
18
|
-
end
|
19
|
-
|
20
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.3")
|
21
|
-
gem 'byebug', '~> 10.0'
|
22
|
-
elsif Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
|
23
|
-
gem 'byebug', '~> 11.0.0'
|
24
|
-
end
|
25
|
-
end
|
@@ -1,25 +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.1.0'
|
10
|
-
gem 'rspec-rails', '~> 3.9'
|
11
|
-
gem 'sqlite3', '~> 1.3.6'
|
12
|
-
gem 'capybara'
|
13
|
-
gem 'poltergeist'
|
14
|
-
|
15
|
-
# Lock down versions of gems for older versions of Ruby
|
16
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
|
17
|
-
gem 'responders', '~> 2.4'
|
18
|
-
end
|
19
|
-
|
20
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.3")
|
21
|
-
gem 'byebug', '~> 10.0'
|
22
|
-
elsif Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new("2.4")
|
23
|
-
gem 'byebug', '~> 11.0.0'
|
24
|
-
end
|
25
|
-
end
|