devise_saml_authenticatable 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YzUzNzQwNTZmMTVkNDAyZDc5NmM1OTUxMzIyNGJjYTdlOTJkZDljZQ==
5
- data.tar.gz: !binary |-
6
- MDY1NTJiZTA4NjhlOTc2YmM2ZjlhYWMxNDcyMDNiMzUxMTBiNTBkNA==
2
+ SHA1:
3
+ metadata.gz: d2e501ba6f2facaaa55601864a66fbf5799f2b93
4
+ data.tar.gz: 644a41f1ef4dafdac806600b8a5646e3a00acbf6
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MDkxOWU4OTc5NWNhNDQ4ZDc3NThhZDc1ZDhkZjc2MzNlMTZmYTI0NTk3MGJk
10
- NjMwMTg4YWVhMDQyM2NhNWVkYzNiY2JmYWViNzY5ZWJjN2FkMzk2ZGExNzlh
11
- ZGMzNzU0NWU2MDZiZjM5MTMxNTNkZjA1MGUxZTgwOTljYTNhODE=
12
- data.tar.gz: !binary |-
13
- ZDYzODA0NzBlMWFmMjNhMjZmNzE4ZjBmMDllYzkyMzM3YWYxOGY4NTNiMTEy
14
- ZTJhYjZmYTg4MDY5MDAyZmVmYzkzYWMzNjY0YzRkZGQxMzZlOWJkMzkwMzQx
15
- NDYxMzAwMDU0OTE1ZTZlYWI5MTE3YzJlZjU1YzM4NjkxY2M3YmE=
6
+ metadata.gz: a4096feb553134033f04079e7c10a1ace113fc048f79dbf712ee0fe5b478ce6696ccd4434c5c05f4aecced1c55e79f13415027bfa613ca2937a216e8bb6949cd
7
+ data.tar.gz: 20c0f29acc30f4db788fa8ada4bfbff4df88421d48403f52b39cdb9876f1907be732a3641a0d9cdd7e3997f63809f71894769e8791014183a226333bedc2353e
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
1
  --color
2
+ --format doc
2
3
  --require spec_helper
data/.travis.yml CHANGED
@@ -11,7 +11,7 @@ script:
11
11
  notifications:
12
12
  hipchat:
13
13
  rooms:
14
- secure: eWahLFbtvZaJgulhDdnmbIxtSnl2lGR4zHqcJ6d7ExG0HzfxzCknHkau4YfqhANRa3+e66F4rCNoU3+db1EKE5jij7+oIOgRHAmVwLi9WRswzb7NQfWV0/PyUjdF6T7Ac/sfQRkFIDTUL2npYMr2zTQnjDcYrT7e0IkRxNA3VXWogzhqnC4sXKLr8j9zLLw5BdFfELcJD021Rpd7O1EmAt+hahxaJCipyXV2l/kDANR24jnlXgaQn8HJwgRXsBARAQe1QgApnrmbqnGnWc4T1GbI7kExsKGCUbHxYBOp+99m25T6MK66xnvRltwKaUeMXuUyWRZtmAV3LlbACRMX3n5qkDqg8P2OPNvWWua84hkRmUNUska7YrSLX7aCWvGfA6Vr1INnsueLl5sYjHhHZnaS8Wl0iC9ltxBUY4ikg1QlHSghXFQvMC5UAROJ2x7BHGV3kDRTc52ZLdy5BDuJrf/OFEhpuTp+HQALmEKkcJKFUdBn8Cu20wF0pF8o5XvYnSozuqytJKP+b/3+U0X4SEYqbkYCi/PcSnXTtSTIl0+7uxmEBCwPKpXRkkCfVsLqIVUkyVj1d1qIxG8Zbikn5NxK6USV5+Zl4KTDFUVD4r4T8fXCV09+8q0t/uyVjCDv3g1vGRcHvxQyDiLrs7q4DL3GNQY3trrEQ6WneA8nsLw=
14
+ secure: cuDak5a6fBeg+sp61COqxQfzdcFEsjwCqtwvCISso0RNh5SR8v+uVYKcA8rlK+GE1l9uR7tLRHeHF3ZmzvFSOat07NvpScvjZXi+OSpWlc6rwQ6Pl6bBP6gu6sREiKVe0eT/uGrvJloyWKZaXIhiiBzQ+ZERx/ssGA9WMmNkhlwy1OgGnPNurNNHZLBjEZn1V6kdyxiXx6QPASNpjNEgN1G8dUh3qzcWUGVQGNZSJk65A6ie1MveNyecTjDhw+ADBU8nS28Ja4y6ohRm4FzofSgespYrvfygIZ5rYF0HPMj5FW1ZDWtM5355ojCk8RLT+ZkuhssCn1OJk7ogaOVjnYcOFRxEfpu3eIbjtMmUz3j4umatFqbgas+6SXMVIPkr5HUoTrP8HNFssIpcEBOnPwAF8QCpx+daHc0r2cc8lGuXhtJfpW0P2F0dmwJNiQ7//nz2y2xs84x4Gb7MV9tEDYp0FqEClMuFBkPNizBljarm04PkiLSrqvR52aMDfQz7YAX2oXAvFjPzI1GC0K8x7xX8TuHT9yuHy7fI+rUSNivZYLKO+IEZqPPDdJpXISUbVwanZoNvmQYk5PZV21MfDSGwQrz8eO/uFiAblj18yIlNbAfb2hdZDVYsm4EvWxELJtfaTxgrj6M3Y3m/KbCbCoDp+2jE307M2rxL0Gum2gk=
15
15
  template:
16
16
  - '%{repository}<a href="%{build_url}">#%{build_number}</a> (%{branch} - <a href="%{compare_url}">%{commit}</a> : %{author}): %{message}'
17
17
  format: html
data/Gemfile CHANGED
@@ -6,9 +6,8 @@ gemspec
6
6
  group :test do
7
7
  gem 'rake'
8
8
  gem 'rspec', '~> 3.0'
9
- gem 'rails'
9
+ gem 'rails', '~> 4.0'
10
10
  gem 'rspec-rails'
11
11
  gem 'sqlite3'
12
12
  gem 'capybara-webkit'
13
13
  end
14
-
data/README.md CHANGED
@@ -127,9 +127,9 @@ Logout support is included by immediately terminating the local session and then
127
127
  Logout requests from the IDP are supported by the `idp_sign_out` end point. Directing logout requests to `users/saml/idp_sign_out` will logout the respective user by invalidating their current sessions.
128
128
  `saml_session_index_key` must be configured to support this feature.
129
129
 
130
- ## Limitations
130
+ ## Signing and Encrypting Authentication Requests
131
131
 
132
- 1. The Authentication Requests (from your app to the IdP) are not signed and encrypted
132
+ ruby-saml 1.0.0 supports signature and decrypt. Teh only requirement is to place the public certificate and the private key. Please reffer to these features in the ruby-saml documentation [here](https://github.com/onelogin/ruby-saml#signing)
133
133
 
134
134
  ## Thanks
135
135
 
@@ -3,23 +3,22 @@ require "ruby-saml"
3
3
  class Devise::SamlSessionsController < Devise::SessionsController
4
4
  include DeviseSamlAuthenticatable::SamlConfig
5
5
  unloadable if Rails::VERSION::MAJOR < 4
6
- before_filter :get_saml_config
7
6
  skip_before_filter :verify_authenticity_token
8
7
 
9
8
  def new
10
9
  request = OneLogin::RubySaml::Authrequest.new
11
- action = request.create(@saml_config)
10
+ action = request.create(saml_config)
12
11
  redirect_to action
13
12
  end
14
-
13
+
15
14
  def metadata
16
15
  meta = OneLogin::RubySaml::Metadata.new
17
- render :xml => meta.generate(@saml_config)
16
+ render :xml => meta.generate(saml_config)
18
17
  end
19
18
 
20
19
  def idp_sign_out
21
20
  if params[:SAMLRequest] && Devise.saml_session_index_key
22
- logout_request = OneLogin::RubySaml::SloLogoutrequest.new(params[:SAMLRequest], settings: @saml_config)
21
+ logout_request = OneLogin::RubySaml::SloLogoutrequest.new(params[:SAMLRequest], settings: saml_config)
23
22
  resource_class.reset_session_key_for(logout_request.name_id)
24
23
 
25
24
  redirect_to generate_idp_logout_response(logout_request)
@@ -42,12 +41,11 @@ class Devise::SamlSessionsController < Devise::SessionsController
42
41
  # Override devise to send user to IdP logout for SLO
43
42
  def after_sign_out_path_for(_)
44
43
  request = OneLogin::RubySaml::Logoutrequest.new
45
- request.create(@saml_config)
44
+ request.create(saml_config)
46
45
  end
47
46
 
48
47
  def generate_idp_logout_response(logout_request)
49
48
  logout_request_id = logout_request.id
50
- OneLogin::RubySaml::SloLogoutresponse.new.create(@saml_config, logout_request_id, nil)
49
+ OneLogin::RubySaml::SloLogoutresponse.new.create(saml_config, logout_request_id, nil)
51
50
  end
52
51
  end
53
-
@@ -25,13 +25,15 @@ module Devise
25
25
  end
26
26
 
27
27
  def after_saml_authentication(session_index)
28
- if self.respond_to? Devise.saml_session_index_key
28
+ if Devise.saml_session_index_key && self.respond_to?(Devise.saml_session_index_key)
29
29
  self.update_attribute(Devise.saml_session_index_key, session_index)
30
30
  end
31
31
  end
32
32
 
33
33
  def authenticatable_salt
34
- if self.respond_to?(Devise.saml_session_index_key) && self.send(Devise.saml_session_index_key).present?
34
+ if Devise.saml_session_index_key &&
35
+ self.respond_to?(Devise.saml_session_index_key) &&
36
+ self.send(Devise.saml_session_index_key).present?
35
37
  self.send(Devise.saml_session_index_key)
36
38
  else
37
39
  super
@@ -1,7 +1,9 @@
1
1
  require 'ruby-saml'
2
2
  module DeviseSamlAuthenticatable
3
3
  module SamlConfig
4
- def get_saml_config
4
+ def saml_config
5
+ return @saml_config if @saml_config
6
+
5
7
  idp_config_path = "#{Rails.root}/config/idp.yml"
6
8
  # Support 0.0.x-style configuration via a YAML file
7
9
  if File.exists?(idp_config_path)
@@ -1,4 +1,4 @@
1
- require 'devise/strategies/authenticatable'
1
+ require 'devise/strategies/authenticatable'
2
2
 
3
3
  module Devise
4
4
  module Strategies
@@ -6,7 +6,7 @@ module Devise
6
6
  include DeviseSamlAuthenticatable::SamlConfig
7
7
  def valid?
8
8
  if params[:SAMLResponse]
9
- response = OneLogin::RubySaml::Logoutresponse.new(params[:SAMLResponse], get_saml_config)
9
+ response = OneLogin::RubySaml::Logoutresponse.new(params[:SAMLResponse], saml_config)
10
10
  !(response.response.include? 'LogoutResponse')
11
11
  else
12
12
  false
@@ -14,7 +14,7 @@ module Devise
14
14
  end
15
15
 
16
16
  def authenticate!
17
- @response = OneLogin::RubySaml::Response.new(params[:SAMLResponse], settings: get_saml_config)
17
+ @response = OneLogin::RubySaml::Response.new(params[:SAMLResponse], settings: saml_config)
18
18
  resource = mapping.to.authenticate_with_saml(@response)
19
19
  if @response.is_valid? && resource
20
20
  resource.after_saml_authentication(@response.sessionindex)
@@ -1,3 +1,3 @@
1
1
  module DeviseSamlAuthenticatable
2
- VERSION = "1.2.1"
2
+ VERSION = "1.2.2"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DeviseSamlAuthenticatable::SamlConfig do
4
- subject(:saml_config) { controller.get_saml_config }
4
+ subject(:saml_config) { controller.saml_config }
5
5
  let(:controller) { Class.new { include DeviseSamlAuthenticatable::SamlConfig }.new }
6
6
 
7
7
  # Replace global config since this test changes it
@@ -11,7 +11,7 @@ describe Devise::Strategies::SamlAuthenticatable do
11
11
 
12
12
  let(:saml_config) { OneLogin::RubySaml::Settings.new }
13
13
  before do
14
- allow(strategy).to receive(:get_saml_config).and_return(saml_config)
14
+ allow(strategy).to receive(:saml_config).and_return(saml_config)
15
15
  end
16
16
 
17
17
  let(:mapping) { double(:mapping, to: user_class) }
@@ -63,8 +63,10 @@ describe "SAML Authentication", type: :feature do
63
63
  visit 'http://localhost:8020/'
64
64
  expect(current_url).to match(%r(\Ahttp://localhost:8009/saml/auth\?SAMLRequest=))
65
65
  end
66
+ end
66
67
 
67
- it 'logs a user out of the SP via the IpD' do
68
+ shared_examples_for "it logs a user out via the IdP" do
69
+ it 'logs a user out of the SP via the IdP' do
68
70
  sign_in
69
71
 
70
72
  visit "http://localhost:#{idp_port}/saml/sp_sign_out"
@@ -76,8 +78,8 @@ describe "SAML Authentication", type: :feature do
76
78
 
77
79
  context "when the attributes are used to authenticate" do
78
80
  before(:each) do
79
- create_app('idp', %w(y))
80
- create_app('sp', %w(n))
81
+ create_app('idp', 'INCLUDE_SUBJECT_IN_ATTRIBUTES' => "true")
82
+ create_app('sp', 'USE_SUBJECT_TO_AUTHENTICATE' => "false")
81
83
  @idp_pid = start_app('idp', idp_port)
82
84
  @sp_pid = start_app('sp', sp_port)
83
85
  end
@@ -91,8 +93,39 @@ describe "SAML Authentication", type: :feature do
91
93
 
92
94
  context "when the subject is used to authenticate" do
93
95
  before(:each) do
94
- create_app('idp', %w(n))
95
- create_app('sp', %w(y))
96
+ create_app('idp', 'INCLUDE_SUBJECT_IN_ATTRIBUTES' => "false")
97
+ create_app('sp', 'USE_SUBJECT_TO_AUTHENTICATE' => "true")
98
+ @idp_pid = start_app('idp', idp_port)
99
+ @sp_pid = start_app('sp', sp_port)
100
+ end
101
+ after(:each) do
102
+ stop_app(@idp_pid)
103
+ stop_app(@sp_pid)
104
+ end
105
+
106
+ it_behaves_like "it authenticates and creates users"
107
+ end
108
+
109
+ context "when the session index key is set" do
110
+ before(:each) do
111
+ create_app('idp', 'INCLUDE_SUBJECT_IN_ATTRIBUTES' => "false")
112
+ create_app('sp', 'USE_SUBJECT_TO_AUTHENTICATE' => "true", 'SAML_SESSION_INDEX_KEY' => ":session_index")
113
+ @idp_pid = start_app('idp', idp_port)
114
+ @sp_pid = start_app('sp', sp_port)
115
+ end
116
+ after(:each) do
117
+ stop_app(@idp_pid)
118
+ stop_app(@sp_pid)
119
+ end
120
+
121
+ it_behaves_like "it authenticates and creates users"
122
+ it_behaves_like "it logs a user out via the IdP"
123
+ end
124
+
125
+ context "when the session index key is not set" do
126
+ before(:each) do
127
+ create_app('idp', 'INCLUDE_SUBJECT_IN_ATTRIBUTES' => "false")
128
+ create_app('sp', 'USE_SUBJECT_TO_AUTHENTICATE' => "true", 'SAML_SESSION_INDEX_KEY' => "nil")
96
129
  @idp_pid = start_app('idp', idp_port)
97
130
  @sp_pid = start_app('sp', sp_port)
98
131
  end
data/spec/rails_helper.rb CHANGED
@@ -2,7 +2,7 @@ ENV["RAILS_ENV"] ||= 'test'
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- create_app('sp', %w(n))
5
+ create_app('sp', 'USE_SUBJECT_TO_AUTHENTICATE' => "false")
6
6
  require 'support/sp/config/environment'
7
7
  require 'rspec/rails'
8
8
 
@@ -17,4 +17,4 @@ end
17
17
  Devise.setup do |config|
18
18
  config.saml_default_user_key = :email
19
19
  config.saml_session_index_key = :session_index
20
- end
20
+ end
@@ -1,6 +1,6 @@
1
1
  # Set up a SAML IdP
2
2
 
3
- @include_subject_in_attributes = ask("Include the subject in the attributes?", limit: %w(y n)) == "y"
3
+ @include_subject_in_attributes = ENV.fetch('INCLUDE_SUBJECT_IN_ATTRIBUTES')
4
4
 
5
5
  gem 'ruby-saml-idp'
6
6
  gem 'thin'
@@ -18,4 +18,4 @@ gsub_file 'config/application.rb', /end[\n\w]*end$/, <<-CONFIG
18
18
  config.slo_sp_url = "http://localhost:8020/users/saml/idp_sign_out"
19
19
  end
20
20
  end
21
- CONFIG
21
+ CONFIG
@@ -11,24 +11,13 @@ def app_ready?(pid, port)
11
11
  system("lsof -i:#{port}", out: '/dev/null')
12
12
  end
13
13
 
14
- def create_app(name, answers = [])
14
+ def create_app(name, env = {})
15
15
  rails_new_options = %w(-T -J -S --skip-spring)
16
16
  rails_new_options << "-O" if name == 'idp'
17
17
  Bundler.with_clean_env do
18
18
  Dir.chdir(File.expand_path('../../support', __FILE__)) do
19
19
  FileUtils.rm_rf(name)
20
- Open3.popen3("rails", "new", name, *rails_new_options, "-m", "#{name}_template.rb") do |stdin, stdout, stderr, wait_thread|
21
- while answers.any?
22
- question = stdout.gets
23
- answer = answers.shift
24
- stdin.puts answer
25
- $stdout.puts "#{question} #{answer}"
26
- end
27
- wait_thread.join
28
-
29
- $stdout.puts stdout.read
30
- $stderr.puts stderr.read
31
- end
20
+ system(env, "rails", "new", name, *rails_new_options, "-m", "#{name}_template.rb")
32
21
  end
33
22
  end
34
23
  end
@@ -1,6 +1,7 @@
1
1
  # Set up a SAML Service Provider
2
2
 
3
- use_subject_to_authenticate = ask("Use subject to authenticate?", limit: %w(y n)) == "y"
3
+ saml_session_index_key = ENV.fetch('SAML_SESSION_INDEX_KEY', ":session_index")
4
+ use_subject_to_authenticate = ENV.fetch('USE_SUBJECT_TO_AUTHENTICATE')
4
5
 
5
6
  gem 'devise_saml_authenticatable', path: '../../..'
6
7
  gem 'thin'
@@ -32,7 +33,7 @@ after_bundle do
32
33
  generate 'devise:install'
33
34
  gsub_file 'config/initializers/devise.rb', /^end$/, <<-CONFIG
34
35
  config.saml_default_user_key = :email
35
- config.saml_session_index_key = :session_index
36
+ config.saml_session_index_key = #{saml_session_index_key}
36
37
 
37
38
  config.saml_use_subject = #{use_subject_to_authenticate}
38
39
  config.saml_create_user = true
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_saml_authenticatable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josef Sauter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-10 00:00:00.000000000 Z
11
+ date: 2016-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: devise
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>'
17
+ - - ">"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 2.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>'
24
+ - - ">"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ruby-saml
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.0'
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
40
  version: '1.0'
41
41
  description: SAML Authentication for devise
@@ -45,9 +45,9 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
- - .gitignore
49
- - .rspec
50
- - .travis.yml
48
+ - ".gitignore"
49
+ - ".rspec"
50
+ - ".travis.yml"
51
51
  - Gemfile
52
52
  - LICENSE
53
53
  - README.md
@@ -84,12 +84,12 @@ require_paths:
84
84
  - lib
85
85
  required_ruby_version: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ! '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  required_rubygems_version: !ruby/object:Gem::Requirement
91
91
  requirements:
92
- - - ! '>='
92
+ - - ">="
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
95
  requirements: []