devise_saml_authenticatable 1.7.0 → 1.8.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.
- 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
|