devise_cas_authenticatable 1.7.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 982f05c3b4f817eeeb431e6a342014e70beca12b
4
- data.tar.gz: 880dcb8f9fd445e2e3d19de68abd6d202484434e
3
+ metadata.gz: 4e7a21d56c086e07750dfdf7e6ad8759233919ae
4
+ data.tar.gz: 3a9d7c28cf8889001a89e3f4eb5cdb46439b42e9
5
5
  SHA512:
6
- metadata.gz: db03ed7056af129f37a7dfcdf8cb9486484f69e5a739060eca124087a2146affbc108cc37c42dfe1f2411041846c0b4e5414fb2bb5e0c36c7ef10c332e9b42cd
7
- data.tar.gz: 8bd1b15e5740dda654de992bbe12e68ad85138e2a130440c944ac5253cdc7291a6fd3a70403b8f22fbb16cb2841f778f051ca4c2f54b4b626acb37b1edea3945
6
+ metadata.gz: ba4cffad023fd9a1507c20f2a4145e4575f8173232e3aab9784f3c258082c6f1a82371f9f2ad300be5bbe3e491a7e97350bed01aff273a0ab0178673fd78ec61
7
+ data.tar.gz: 9512c05944ed91ae97221ba2f3ce22a89ee12384cd04c6a87e139cf203d9d1e132c8de754124e326dd11c327d8e62188543c092bf76372cedf95bf4be0c7ca2e
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.travis.yml CHANGED
@@ -1,6 +1,11 @@
1
1
  rvm:
2
2
  - 1.9.3
3
3
  - 2.0.0
4
+ - 2.1.2
5
+ - 2.2.4
6
+ - 2.3.0
7
+ before_install:
8
+ - gem update bundler
4
9
  gemfile:
5
10
  - Gemfile.devise12
6
11
  - Gemfile.devise13
@@ -10,4 +15,5 @@ gemfile:
10
15
  - Gemfile.devise21
11
16
  - Gemfile.devise30
12
17
  script: "bundle exec rake spec"
13
-
18
+ sudo: required
19
+ dist: trusty
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog for devise\_cas\_authenticatable
2
2
 
3
+ ## Version 1.8.0 - May 4, 2016
4
+
5
+ * May the 4th be with you!
6
+ * Prevent redirect loops when using memcached as a session store (thanks @fabioperrella!)
7
+
3
8
  ## Version 1.7.1 - February 2, 2016
4
9
 
5
10
  * Work around weird `#try` behavior on older Rails versions
@@ -8,6 +8,10 @@ class Devise::CasSessionsController < Devise::SessionsController
8
8
  skip_before_filter :verify_authenticity_token, :only => [:single_sign_out]
9
9
 
10
10
  def new
11
+ if memcache_checker.session_store_memcache? && !memcache_checker.alive?
12
+ raise "memcache is down, can't get session data from it"
13
+ end
14
+
11
15
  redirect_to(cas_login_url)
12
16
  end
13
17
 
@@ -115,4 +119,8 @@ class Devise::CasSessionsController < Devise::SessionsController
115
119
  ::Devise.cas_client.logout_url(cas_destination_url, cas_follow_url)
116
120
  end
117
121
  end
122
+
123
+ def memcache_checker
124
+ @memcache_checker ||= DeviseCasAuthenticatable::MemcacheChecker.new(Rails.configuration)
125
+ end
118
126
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{devise_cas_authenticatable}
5
- s.version = "1.7.1"
5
+ s.version = "1.8.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Nat Budin", "Jeremy Haile"]
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
26
26
 
27
27
  s.add_development_dependency("rails", ">= 3.0.7")
28
28
  s.add_development_dependency("rspec-rails")
29
+ s.add_development_dependency("test-unit", "~> 3.0")
29
30
  s.add_development_dependency("mocha")
30
31
  s.add_development_dependency("shoulda")
31
32
  s.add_development_dependency("sqlite3")
@@ -5,6 +5,7 @@ require 'devise_cas_authenticatable/routes'
5
5
  require 'devise_cas_authenticatable/strategy'
6
6
  require 'devise_cas_authenticatable/exceptions'
7
7
 
8
+ require 'devise_cas_authenticatable/session_store_identifier'
8
9
  require 'devise_cas_authenticatable/single_sign_out'
9
10
 
10
11
  require 'devise_cas_authenticatable/cas_action_url_factory_base'
@@ -12,6 +13,7 @@ require 'devise_cas_authenticatable/cas_action_url_factory_base'
12
13
  require 'rubycas-client'
13
14
 
14
15
  require 'devise_cas_authenticatable/railtie' if defined?(Rails::Railtie)
16
+ require 'devise_cas_authenticatable/memcache_checker'
15
17
 
16
18
  # Register as a Rails engine if Rails::Engine exists
17
19
  begin
@@ -22,7 +24,7 @@ else
22
24
  class Engine < Rails::Engine
23
25
  initializer "devise_cas_authenticatable.single_sign_on.warden_failure_app" do |app|
24
26
  # requiring this here because the parent class calls Rails.application, which
25
- # isn't set up until after bundler has required the modules in this engine
27
+ # isn't set up until after bundler has required the modules in this engine
26
28
  require 'devise_cas_authenticatable/single_sign_out/warden_failure_app'
27
29
  end
28
30
  end
@@ -33,13 +35,13 @@ module Devise
33
35
  # The base URL of the CAS server. For example, http://cas.example.com. Specifying this
34
36
  # is mandatory.
35
37
  @@cas_base_url = nil
36
-
38
+
37
39
  # The login URL of the CAS server. If undefined, will default based on cas_base_url.
38
40
  @@cas_login_url = nil
39
-
41
+
40
42
  # The login URL of the CAS server. If undefined, will default based on cas_base_url.
41
43
  @@cas_logout_url = nil
42
-
44
+
43
45
  # The login URL of the CAS server. If undefined, will default based on cas_base_url.
44
46
  @@cas_validate_url = nil
45
47
 
@@ -64,18 +66,18 @@ module Devise
64
66
  # Should devise_cas_authenticatable attempt to create new user records for
65
67
  # unknown usernames? True by default.
66
68
  @@cas_create_user = true
67
-
69
+
68
70
  # The model attribute used for query conditions. Should be the same as
69
71
  # the rubycas-server username_column. :username by default
70
72
  @@cas_username_column = :username
71
-
73
+
72
74
  # The CAS reponse value used to find users in the local database
73
75
  # it is required that this field be in cas_extra_attributes
74
76
  @@cas_user_identifier = nil
75
77
 
76
- # Name of the parameter passed in the logout query
78
+ # Name of the parameter passed in the logout query
77
79
  @@cas_destination_logout_param_name = nil
78
-
80
+
79
81
  # Additional options for CAS client object
80
82
  @@cas_client_config_options = {}
81
83
 
@@ -96,21 +98,21 @@ module Devise
96
98
  :validate_url => @@cas_validate_url,
97
99
  :enable_single_sign_out => @@cas_enable_single_sign_out
98
100
  }
99
-
101
+
100
102
  cas_options.merge!(@@cas_client_config_options) if @@cas_client_config_options
101
-
103
+
102
104
  CASClient::Client.new(cas_options)
103
105
  end
104
106
  end
105
-
107
+
106
108
  def self.cas_service_url(base_url, mapping)
107
109
  cas_action_url(base_url, mapping, "service")
108
110
  end
109
-
111
+
110
112
  def self.cas_unregistered_url(base_url, mapping)
111
113
  cas_action_url(base_url, mapping, "unregistered")
112
114
  end
113
-
115
+
114
116
  private
115
117
  def self.cas_action_url(base_url, mapping, action)
116
118
  cas_action_url_factory_class.new(base_url, mapping, action).call
@@ -0,0 +1,34 @@
1
+ require 'net/telnet'
2
+
3
+ module DeviseCasAuthenticatable
4
+ class MemcacheChecker
5
+ attr_reader :rails_configuration
6
+
7
+ def initialize(rails_configuration)
8
+ @rails_configuration = rails_configuration
9
+ end
10
+
11
+ def session_store_memcache?
12
+ !!(session_store_class.name =~ /memcache/i)
13
+ end
14
+
15
+ def alive?
16
+ memcache_servers = rails_configuration.session_options[:memcache_server] || ["127.0.0.1:11211"]
17
+ memcache_servers.each do |server|
18
+ host, port = server.split(":")
19
+ begin
20
+ Net::Telnet.new("Host" => host, "Port" => port, "Timeout" => 1)
21
+ return true
22
+ rescue Errno::ECONNREFUSED
23
+ return false
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def session_store_class
31
+ @session_store_class ||= DeviseCasAuthenticatable::SessionStoreIdentifier.new.session_store_class
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,29 @@
1
+ module DeviseCasAuthenticatable
2
+ class SessionStoreIdentifier
3
+
4
+ def current_session_store
5
+ app = Rails.application.app
6
+ begin
7
+ app = (app.instance_variable_get(:@backend) || app.instance_variable_get(:@app) || app.instance_variable_get(:@target))
8
+ end until app.nil? or app.class == session_store_class
9
+ app
10
+ end
11
+
12
+ def session_store_class
13
+ @session_store_class ||=
14
+ begin
15
+ # Rails 3 & 4 session store
16
+ if ::DeviseCasAuthenticatable::SingleSignOut.rails3_or_greater?
17
+ Rails.configuration.session_store
18
+ ::Rails.application.config.session_store
19
+ else
20
+ # => Rails 2
21
+ ActionController::Base.session_store
22
+ end
23
+ rescue NameError => e
24
+ # for older versions of Rails (prior to 2.3)
25
+ ActionController::Base.session_options[:database_manager]
26
+ end
27
+ end
28
+ end
29
+ end
@@ -7,31 +7,6 @@ module DeviseCasAuthenticatable
7
7
 
8
8
  # Supports destroying sessions by ID for ActiveRecord and Redis session stores
9
9
  module DestroySession
10
- def session_store_class
11
- @session_store_class ||=
12
- begin
13
- # Rails 3 & 4 session store
14
- if ::DeviseCasAuthenticatable::SingleSignOut.rails3_or_greater?
15
- Rails.configuration.session_store
16
- ::Rails.application.config.session_store
17
- else
18
- # => Rails 2
19
- ActionController::Base.session_store
20
- end
21
- rescue NameError => e
22
- # for older versions of Rails (prior to 2.3)
23
- ActionController::Base.session_options[:database_manager]
24
- end
25
- end
26
-
27
- def current_session_store
28
- app = Rails.application.app
29
- begin
30
- app = (app.instance_variable_get(:@backend) || app.instance_variable_get(:@app) || app.instance_variable_get(:@target))
31
- end until app.nil? or app.class == session_store_class
32
- app
33
- end
34
-
35
10
  def destroy_session_by_id(sid)
36
11
  logger.debug "Single Sign Out from session store: #{current_session_store.class}"
37
12
 
@@ -61,6 +36,18 @@ module DeviseCasAuthenticatable
61
36
  false
62
37
  end
63
38
  end
39
+
40
+ def session_store_identifier
41
+ @session_store_identifier ||= DeviseCasAuthenticatable::SessionStoreIdentifier.new
42
+ end
43
+
44
+ def current_session_store
45
+ session_store_identifier.current_session_store
46
+ end
47
+
48
+ def session_store_class
49
+ session_store_identifier.session_store_class
50
+ end
64
51
  end
65
52
 
66
53
  end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe DeviseCasAuthenticatable::MemcacheChecker do
4
+ let(:conf_double) { stub(session_options: {}) }
5
+
6
+ describe '#session_store_memcache?' do
7
+ subject(:session_store_memcache?) { described_class.new(conf_double).session_store_memcache? }
8
+
9
+ before do
10
+ DeviseCasAuthenticatable::SessionStoreIdentifier.any_instance
11
+ .stubs(:session_store_class).returns(session_store_class)
12
+ end
13
+
14
+ context "when session store is memcache" do
15
+ let(:session_store_class) { FakeMemcacheStore }
16
+
17
+ it { expect(session_store_memcache?).to eq true }
18
+ end
19
+
20
+ context "when session store is NOT memcache" do
21
+ let(:session_store_class) { String }
22
+
23
+ it { expect(session_store_memcache?).to eq false }
24
+ end
25
+ end
26
+
27
+ describe 'alive?' do
28
+ context "when memcache is down" do
29
+ let(:conf_double) { stub(session_options: {memcache_server: ['127.0.0.1:11223']}) }
30
+ subject(:alive?) { described_class.new(conf_double).alive? }
31
+
32
+ it { expect(alive?).to eq false }
33
+ end
34
+
35
+ context "when memcache is running" do
36
+ let(:conf_double) { stub(session_options: {memcache_server: ['127.0.0.1:11214']}) }
37
+ subject(:alive?) { described_class.new(conf_double).alive? }
38
+
39
+ before do
40
+ Net::Telnet.stubs(:new)
41
+ end
42
+
43
+ it { expect(alive?).to eq true }
44
+ end
45
+ end
46
+ end
47
+
48
+ class FakeMemcacheStore
49
+ end
data/spec/spec_helper.rb CHANGED
@@ -7,6 +7,7 @@ require 'rspec/rails'
7
7
  require 'sham_rack'
8
8
  require 'capybara/rspec'
9
9
  require 'timecop'
10
+ require 'pry'
10
11
 
11
12
  RSpec.configure do |config|
12
13
  config.mock_with :mocha
@@ -15,7 +16,7 @@ end
15
16
  ShamRack.at('www.example.com') do |env|
16
17
  request = Rack::Request.new(env)
17
18
  request.path_info = request.path_info.sub(/^\/cas_server/, '')
18
-
19
+
19
20
  Castronaut::Application.call(request.env)
20
21
  end
21
22
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_cas_authenticatable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.1
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nat Budin
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-02-02 00:00:00.000000000 Z
12
+ date: 2016-05-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: devise
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: test-unit
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '3.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '3.0'
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: mocha
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -202,6 +216,7 @@ extra_rdoc_files:
202
216
  files:
203
217
  - ".gitignore"
204
218
  - ".project"
219
+ - ".rspec"
205
220
  - ".travis.yml"
206
221
  - CHANGELOG.md
207
222
  - Gemfile
@@ -222,10 +237,12 @@ files:
222
237
  - lib/devise_cas_authenticatable.rb
223
238
  - lib/devise_cas_authenticatable/cas_action_url_factory_base.rb
224
239
  - lib/devise_cas_authenticatable/exceptions.rb
240
+ - lib/devise_cas_authenticatable/memcache_checker.rb
225
241
  - lib/devise_cas_authenticatable/model.rb
226
242
  - lib/devise_cas_authenticatable/railtie.rb
227
243
  - lib/devise_cas_authenticatable/routes.rb
228
244
  - lib/devise_cas_authenticatable/schema.rb
245
+ - lib/devise_cas_authenticatable/session_store_identifier.rb
229
246
  - lib/devise_cas_authenticatable/single_sign_out.rb
230
247
  - lib/devise_cas_authenticatable/single_sign_out/rack.rb
231
248
  - lib/devise_cas_authenticatable/single_sign_out/strategies.rb
@@ -235,6 +252,7 @@ files:
235
252
  - lib/devise_cas_authenticatable/strategy.rb
236
253
  - rails/init.rb
237
254
  - spec/config_spec.rb
255
+ - spec/memcache_checker_spec.rb
238
256
  - spec/model_spec.rb
239
257
  - spec/routes_spec.rb
240
258
  - spec/scenario/.gitignore
@@ -298,6 +316,7 @@ specification_version: 4
298
316
  summary: CAS authentication module for Devise
299
317
  test_files:
300
318
  - spec/config_spec.rb
319
+ - spec/memcache_checker_spec.rb
301
320
  - spec/model_spec.rb
302
321
  - spec/routes_spec.rb
303
322
  - spec/scenario/.gitignore