devise_cas_authenticatable 1.10.0 → 2.0.0.alpha1
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 +5 -5
- data/.github/workflows/ruby.yml +32 -0
- data/.gitignore +0 -1
- data/CHANGELOG.md +22 -0
- data/Gemfile +8 -0
- data/README.md +84 -80
- data/app/controllers/devise/cas_sessions_controller.rb +23 -67
- data/app/views/devise/cas_sessions/unregistered.html.erb +3 -3
- data/devise_cas_authenticatable.gemspec +19 -27
- data/lib/devise_cas_authenticatable.rb +15 -70
- data/lib/devise_cas_authenticatable/model.rb +21 -28
- data/lib/devise_cas_authenticatable/routes.rb +22 -44
- data/lib/devise_cas_authenticatable/strategy.rb +14 -24
- data/spec/model_spec.rb +29 -35
- data/spec/routes_spec.rb +26 -26
- data/spec/scenario/app/assets/config/manifest.js +0 -0
- data/spec/scenario/app/controllers/home_controller.rb +2 -2
- data/spec/scenario/app/views/layouts/application.html.erb +1 -3
- data/spec/scenario/config/application.rb +1 -27
- data/spec/scenario/config/initializers/backtrace_silencers.rb +1 -1
- data/spec/scenario/config/initializers/devise.rb +2 -2
- data/spec/scenario/config/routes.rb +0 -4
- data/spec/scenario/db/migrate/20100401102949_create_tables.rb +3 -3
- data/spec/scenario/db/migrate/20111002012903_add_sessions_table.rb +1 -1
- data/spec/scenario/db/migrate/20121009092400_add_deactivated_flag_to_users.rb +1 -1
- data/spec/spec_helper.rb +38 -8
- data/spec/strategy_spec.rb +43 -82
- data/spec/support/migrations.rb +1 -1
- metadata +18 -122
- data/.travis.yml +0 -45
- data/Gemfile.devise12 +0 -11
- data/Gemfile.devise13 +0 -11
- data/Gemfile.devise14 +0 -11
- data/Gemfile.devise15 +0 -11
- data/Gemfile.devise20 +0 -11
- data/Gemfile.devise21 +0 -13
- data/Gemfile.devise30 +0 -12
- data/Gemfile.devise42 +0 -13
- data/lib/devise_cas_authenticatable/exceptions.rb +0 -10
- data/lib/devise_cas_authenticatable/memcache_checker.rb +0 -42
- data/lib/devise_cas_authenticatable/railtie.rb +0 -14
- data/lib/devise_cas_authenticatable/schema.rb +0 -20
- data/lib/devise_cas_authenticatable/session_store_identifier.rb +0 -29
- data/lib/devise_cas_authenticatable/single_sign_out.rb +0 -60
- data/lib/devise_cas_authenticatable/single_sign_out/rack.rb +0 -39
- data/lib/devise_cas_authenticatable/single_sign_out/strategies.rb +0 -58
- data/lib/devise_cas_authenticatable/single_sign_out/strategies/base.rb +0 -11
- data/lib/devise_cas_authenticatable/single_sign_out/strategies/rails_cache.rb +0 -31
- data/lib/devise_cas_authenticatable/single_sign_out/strategies/redis_cache.rb +0 -33
- data/lib/devise_cas_authenticatable/single_sign_out/warden_failure_app.rb +0 -46
- data/spec/config_spec.rb +0 -27
- data/spec/memcache_checker_spec.rb +0 -49
- data/spec/scenario/config/castronaut.yml +0 -32
- data/spec/scenario/config/initializers/castronaut.rb +0 -1
- data/spec/scenario/config/initializers/session_store.rb +0 -8
- data/spec/single_sign_out_spec.rb +0 -51
- data/spec/support/urls.rb +0 -19
- data/spec/warden_failure_app_spec.rb +0 -53
@@ -1,31 +0,0 @@
|
|
1
|
-
module DeviseCasAuthenticatable
|
2
|
-
module SingleSignOut
|
3
|
-
module Strategies
|
4
|
-
class RailsCache < Base
|
5
|
-
def store_session_id_for_index(session_index, session_id)
|
6
|
-
logger.debug("Storing #{session_id} for index #{session_index}")
|
7
|
-
Rails.cache.write(cache_key(session_index), session_id)
|
8
|
-
end
|
9
|
-
|
10
|
-
def find_session_id_by_index(session_index)
|
11
|
-
sid = Rails.cache.read(cache_key(session_index))
|
12
|
-
logger.debug("Found session id #{sid} for index #{session_index}")
|
13
|
-
sid
|
14
|
-
end
|
15
|
-
|
16
|
-
def delete_session_index(session_index)
|
17
|
-
logger.debug("Deleting index #{session_index}")
|
18
|
-
Rails.cache.delete(cache_key(session_index))
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def cache_key(session_index)
|
24
|
-
"devise_cas_authenticatable:#{session_index}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
::DeviseCasAuthenticatable::SingleSignOut::Strategies.add( :rails_cache, DeviseCasAuthenticatable::SingleSignOut::Strategies::RailsCache )
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module DeviseCasAuthenticatable
|
2
|
-
module SingleSignOut
|
3
|
-
module Strategies
|
4
|
-
class RedisCache < Base
|
5
|
-
include ::DeviseCasAuthenticatable::SingleSignOut::DestroySession
|
6
|
-
|
7
|
-
def store_session_id_for_index(session_index, session_id)
|
8
|
-
logger.debug("Storing #{session_id} for index #{session_index}")
|
9
|
-
current_session_store.instance_variable_get(:@pool).set(
|
10
|
-
cache_key(session_index),
|
11
|
-
session_id
|
12
|
-
)
|
13
|
-
end
|
14
|
-
def find_session_id_by_index(session_index)
|
15
|
-
sid = current_session_store.instance_variable_get(:@pool).get(cache_key(session_index))
|
16
|
-
logger.debug("Found session id #{sid} for index #{session_index}")
|
17
|
-
sid
|
18
|
-
end
|
19
|
-
def delete_session_index(session_index)
|
20
|
-
logger.debug("Deleting index #{session_index}")
|
21
|
-
destroy_session_by_id(session_index)
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
def cache_key(session_index)
|
26
|
-
"devise_cas_authenticatable:#{session_index}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
::DeviseCasAuthenticatable::SingleSignOut::Strategies.add(:redis_cache, DeviseCasAuthenticatable::SingleSignOut::Strategies::RedisCache )
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# Redirect to the logout url when :warden is thrown,
|
2
|
-
# so that a single_sign_out request can be initiated
|
3
|
-
class DeviseCasAuthenticatable::SingleSignOut::WardenFailureApp < Devise::FailureApp
|
4
|
-
|
5
|
-
# You need to override respond to eliminate recall
|
6
|
-
def respond
|
7
|
-
if http_auth?
|
8
|
-
http_auth
|
9
|
-
else
|
10
|
-
redirect
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def redirect
|
15
|
-
store_location!
|
16
|
-
if flash[:timedout] && flash[:alert]
|
17
|
-
flash.keep(:timedout)
|
18
|
-
flash.keep(:alert)
|
19
|
-
else
|
20
|
-
flash[:alert] = i18n_message
|
21
|
-
end
|
22
|
-
redirect_to redirect_url
|
23
|
-
end
|
24
|
-
|
25
|
-
protected
|
26
|
-
|
27
|
-
def redirect_url
|
28
|
-
if [:timeout, :inactive].include? warden_message
|
29
|
-
flash[:timedout] = true if warden_message == :timeout
|
30
|
-
Devise.cas_client.logout_url
|
31
|
-
else
|
32
|
-
if respond_to?(:scope_path)
|
33
|
-
scope_path
|
34
|
-
else
|
35
|
-
super
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# Devise < 2.0 doesn't have this method, which we want to use
|
41
|
-
unless instance_methods.include?(:warden_message)
|
42
|
-
define_method :warden_message do
|
43
|
-
@message ||= warden.message || warden_options[:message]
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
data/spec/config_spec.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Devise
|
4
|
-
def self.reset_cas_client!
|
5
|
-
@@cas_client = nil
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
describe Devise do
|
10
|
-
before do
|
11
|
-
Devise.cas_base_url = "http://www.example.com/cas_server"
|
12
|
-
end
|
13
|
-
|
14
|
-
after { Devise.reset_cas_client! }
|
15
|
-
|
16
|
-
it "should figure out the base URL correctly" do
|
17
|
-
Devise.cas_client.cas_base_url.should == "http://www.example.com/cas_server"
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'should accept extra options for the CAS client object' do
|
21
|
-
Devise.cas_client_config_options = { :encode_extra_attributes_as => :json }
|
22
|
-
|
23
|
-
conf_options = Devise.cas_client.instance_variable_get(:@conf_options)
|
24
|
-
conf_options.should_not be_nil
|
25
|
-
conf_options[:encode_extra_attributes_as].should == :json
|
26
|
-
end
|
27
|
-
end
|
@@ -1,49 +0,0 @@
|
|
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
|
-
DeviseCasAuthenticatable::MemcacheChecker.any_instance.stubs(:try_connect)
|
41
|
-
end
|
42
|
-
|
43
|
-
it { expect(alive?).to eq true }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
class FakeMemcacheStore
|
49
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
organization_name: Foo Bar Baz Industries, LLC Inc. A division of Holdings Co.
|
2
|
-
|
3
|
-
environment: development
|
4
|
-
# The port the CAS webserver will start on
|
5
|
-
server_port: 4567
|
6
|
-
|
7
|
-
log_directory: log
|
8
|
-
|
9
|
-
log_level: Logger::DEBUG
|
10
|
-
|
11
|
-
ssl_enabled: false
|
12
|
-
|
13
|
-
cas_database:
|
14
|
-
adapter: sqlite3
|
15
|
-
database: db/cas.sqlite3
|
16
|
-
timeout: 5000
|
17
|
-
|
18
|
-
cas_adapter:
|
19
|
-
adapter: test_adapter
|
20
|
-
|
21
|
-
# Use this example if you are using LDAP as your authentication source
|
22
|
-
# cas_adapter:
|
23
|
-
# adapter: ldap
|
24
|
-
# host: localhost
|
25
|
-
# port: 389
|
26
|
-
# prefix: cn=
|
27
|
-
# base: dc=example, dc=com
|
28
|
-
|
29
|
-
# Uncomment these to enable authentication callbacks
|
30
|
-
# callbacks:
|
31
|
-
# on_authentication_success: http://example.com/authentication/success
|
32
|
-
# on_authentication_failed: http://example.com/authentication/failed
|
@@ -1 +0,0 @@
|
|
1
|
-
Castronaut.config.connect_activerecord
|
@@ -1,8 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
# Scenario::Application.config.session_store :cookie_store, :key => '_scenario_session'
|
4
|
-
|
5
|
-
# Use the database for sessions instead of the cookie-based default,
|
6
|
-
# which shouldn't be used to store highly confidential information
|
7
|
-
# (create the session table with "rake db:sessions:create")
|
8
|
-
Scenario::Application.config.session_store :active_record_store
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe DeviseCasAuthenticatable::SingleSignOut::WardenFailureApp do
|
4
|
-
include RSpec::Rails::RequestExampleGroup
|
5
|
-
include Capybara::DSL
|
6
|
-
|
7
|
-
describe "A logged in user with a timed out session" do
|
8
|
-
|
9
|
-
before do
|
10
|
-
Devise.cas_base_url = "http://www.example.com/cas_server"
|
11
|
-
User.delete_all
|
12
|
-
@user = User.create!(:username => "joeuser")
|
13
|
-
end
|
14
|
-
|
15
|
-
describe "using the default warden failure app" do
|
16
|
-
|
17
|
-
before do
|
18
|
-
sign_into_cas "joeuser", "joepassword"
|
19
|
-
end
|
20
|
-
|
21
|
-
it "redirects to cas_login_url when warden is thrown" do
|
22
|
-
Devise::FailureApp.any_instance.expects(:redirect_url).returns(cas_login_url)
|
23
|
-
Timecop.travel(Devise.timeout_in) do
|
24
|
-
visit root_url
|
25
|
-
end
|
26
|
-
current_url.should == root_url
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
describe "using the custom WardenFailureApp" do
|
32
|
-
|
33
|
-
before do
|
34
|
-
|
35
|
-
Devise.warden_config[:failure_app] = DeviseCasAuthenticatable::SingleSignOut::WardenFailureApp
|
36
|
-
sign_into_cas "joeuser", "joepassword"
|
37
|
-
end
|
38
|
-
|
39
|
-
it "uses the redirect_url from the custom failure class" do
|
40
|
-
DeviseCasAuthenticatable::SingleSignOut::WardenFailureApp.any_instance.expects(:redirect_url).returns(destroy_user_session_url)
|
41
|
-
Timecop.travel(Devise.timeout_in) do
|
42
|
-
visit root_url
|
43
|
-
end
|
44
|
-
current_url.should match(/#{cas_logout_url}/)
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
data/spec/support/urls.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
def cas_login_url
|
2
|
-
@cas_login_url ||= begin
|
3
|
-
uri = URI.parse(Devise.cas_base_url + "/login")
|
4
|
-
uri.query = Rack::Utils.build_nested_query(:service => user_service_url)
|
5
|
-
uri.to_s
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
def cas_logout_url
|
10
|
-
@cas_logout_url ||= Devise.cas_base_url + "/logout"
|
11
|
-
end
|
12
|
-
|
13
|
-
def sign_into_cas(username, password)
|
14
|
-
visit cas_login_url
|
15
|
-
fill_in "Username", :with => username
|
16
|
-
fill_in "Password", :with => password
|
17
|
-
click_on "Login"
|
18
|
-
current_url.should == root_url
|
19
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe DeviseCasAuthenticatable::SingleSignOut::WardenFailureApp do
|
4
|
-
|
5
|
-
describe "#redirect_url" do
|
6
|
-
|
7
|
-
before do
|
8
|
-
Devise.cas_base_url = "http://www.example.com/cas_server"
|
9
|
-
@failure_app = DeviseCasAuthenticatable::SingleSignOut::WardenFailureApp.new
|
10
|
-
@failure_app.stubs(:flash).returns({})
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "resulting from a timeout" do
|
14
|
-
|
15
|
-
before do
|
16
|
-
@failure_app.stubs(:warden_message).returns(:timeout)
|
17
|
-
end
|
18
|
-
|
19
|
-
it "returns the logout url" do
|
20
|
-
@failure_app.send(:redirect_url).should match(/#{cas_logout_url}/)
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
describe "resulting from an inactive" do
|
26
|
-
|
27
|
-
before do
|
28
|
-
@failure_app.stubs(:warden_message).returns(:inactive)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "returns the logout url" do
|
32
|
-
@failure_app.send(:redirect_url).should match(/#{cas_logout_url}/)
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
describe "resulting from a generic warden :throw error" do
|
38
|
-
|
39
|
-
before do
|
40
|
-
@failure_app.stubs(:warden_message).returns(nil)
|
41
|
-
@failure_app.stubs(:flash).returns({})
|
42
|
-
end
|
43
|
-
|
44
|
-
it "calls the scope_path method to retrieve the standard redirect_url" do
|
45
|
-
@failure_app.expects(:scope_path)
|
46
|
-
@failure_app.send(:redirect_url)
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|