devise_cas_authenticatable 1.2.1 → 1.3.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.
- data/.travis.yml +1 -3
- data/CHANGELOG.md +5 -0
- data/README.md +10 -1
- data/Rakefile +0 -16
- data/devise_cas_authenticatable.gemspec +5 -4
- data/lib/devise_cas_authenticatable.rb +5 -0
- data/lib/devise_cas_authenticatable/single_sign_out/warden_failure_app.rb +46 -0
- data/spec/scenario/app/models/user.rb +1 -1
- data/spec/scenario/config/initializers/devise.rb +1 -0
- data/spec/single_sign_out_spec.rb +51 -0
- data/spec/spec_helper.rb +3 -3
- data/spec/strategy_spec.rb +1 -0
- data/spec/support/urls.rb +19 -0
- data/spec/warden_failure_app_spec.rb +41 -0
- metadata +34 -13
- data/Gemfile.devise10 +0 -12
- data/Gemfile.devise11 +0 -11
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog for devise\_cas\_authenticatable
|
2
2
|
|
3
|
+
## Version 1.3.0 - May 12, 2013
|
4
|
+
|
5
|
+
* Drop support for Rails 2.3, Devise 1.0 and 1.1
|
6
|
+
* Custom failure class for optional redirecting to logout url upon timeout (thanks to @geoffroh and @kylejginavan)
|
7
|
+
|
3
8
|
## Version 1.2.1 - April 16, 2013
|
4
9
|
|
5
10
|
* Bug fix: use Devise.sign_out_via to configure the HTTP verb sign_out will accept.
|
data/README.md
CHANGED
@@ -81,7 +81,16 @@ to tell your app how to talk to your CAS server:
|
|
81
81
|
# By default, devise_cas_authenticatable will create users. If you would rather
|
82
82
|
# require user records to already exist locally before they can authenticate via
|
83
83
|
# CAS, uncomment the following line.
|
84
|
-
# config.cas_create_user = false
|
84
|
+
# config.cas_create_user = false
|
85
|
+
|
86
|
+
# If you want to use the Devise Timeoutable module with single sign out,
|
87
|
+
# uncommenting this will redirect timeouts to the logout url, so that the CAS can
|
88
|
+
# take care of signing out the other serviced applocations. Note that each
|
89
|
+
# application manages timeouts independently, so one application timing out will
|
90
|
+
# kill the session on all applications serviced by the CAS.
|
91
|
+
# config.warden do |manager|
|
92
|
+
# manager.failure_app = DeviseCasAuthenticatable::SingleSignOut::WardenFailureApp
|
93
|
+
# end
|
85
94
|
end
|
86
95
|
|
87
96
|
Extra attributes
|
data/Rakefile
CHANGED
@@ -3,27 +3,11 @@ require 'bundler/gem_tasks'
|
|
3
3
|
|
4
4
|
Bundler.setup
|
5
5
|
|
6
|
-
require 'rake'
|
7
|
-
begin
|
8
|
-
require 'rdoc/task'
|
9
|
-
rescue LoadError
|
10
|
-
require 'rake/rdoctask'
|
11
|
-
end
|
12
|
-
|
13
6
|
require 'rspec/mocks/version'
|
14
7
|
require 'rspec/core/rake_task'
|
15
8
|
|
16
9
|
RSpec::Core::RakeTask.new(:spec)
|
17
10
|
|
18
|
-
desc 'Generate documentation for the devise_cas_authenticatable plugin.'
|
19
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
20
|
-
rdoc.rdoc_dir = 'rdoc'
|
21
|
-
rdoc.title = 'devise_cas_authenticatable'
|
22
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
23
|
-
rdoc.rdoc_files.include('README')
|
24
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
25
|
-
end
|
26
|
-
|
27
11
|
require File.expand_path('../spec/scenario/config/application', __FILE__)
|
28
12
|
|
29
13
|
Scenario::Application.load_tasks
|
@@ -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.
|
5
|
+
s.version = "1.3.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"]
|
@@ -21,18 +21,19 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.rubygems_version = %q{1.5.0}
|
22
22
|
s.summary = %q{CAS authentication module for Devise}
|
23
23
|
|
24
|
-
s.add_runtime_dependency(%q<devise>, [">= 1.0
|
24
|
+
s.add_runtime_dependency(%q<devise>, [">= 1.2.0"])
|
25
25
|
s.add_runtime_dependency(%q<rubycas-client>, [">= 2.2.1"])
|
26
26
|
|
27
27
|
s.add_development_dependency("rails", ">= 3.0.7")
|
28
28
|
s.add_development_dependency("rspec-rails")
|
29
29
|
s.add_development_dependency("mocha")
|
30
|
-
s.add_development_dependency("shoulda")
|
30
|
+
s.add_development_dependency("shoulda", "~> 3.4.0")
|
31
31
|
s.add_development_dependency("sqlite3-ruby")
|
32
32
|
s.add_development_dependency("sham_rack")
|
33
|
-
s.add_development_dependency("capybara")
|
33
|
+
s.add_development_dependency("capybara", "~> 1.1.4")
|
34
34
|
s.add_development_dependency('crypt-isaac')
|
35
35
|
s.add_development_dependency('launchy')
|
36
|
+
s.add_development_dependency('timecop')
|
36
37
|
s.add_development_dependency('pry')
|
37
38
|
end
|
38
39
|
|
@@ -18,6 +18,11 @@ rescue
|
|
18
18
|
else
|
19
19
|
module DeviseCasAuthenticatable
|
20
20
|
class Engine < Rails::Engine
|
21
|
+
initializer "devise_cas_authenticatable.single_sign_on.warden_failure_app" do |app|
|
22
|
+
# requiring this here because the parent class calls Rails.application, which
|
23
|
+
# isn't set up until after bundler has required the modules in this engine
|
24
|
+
require 'devise_cas_authenticatable/single_sign_out/warden_failure_app'
|
25
|
+
end
|
21
26
|
end
|
22
27
|
end
|
23
28
|
end
|
@@ -0,0 +1,46 @@
|
|
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 warden_message == :timeout
|
29
|
+
flash[:timedout] = true
|
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
|
@@ -0,0 +1,51 @@
|
|
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/spec_helper.rb
CHANGED
@@ -3,13 +3,13 @@ $:.unshift File.dirname(__FILE__)
|
|
3
3
|
$:.unshift File.expand_path('../../lib', __FILE__)
|
4
4
|
|
5
5
|
require "scenario/config/environment"
|
6
|
-
require "rails/test_help"
|
7
6
|
require 'rspec/rails'
|
8
7
|
require 'sham_rack'
|
9
8
|
require 'capybara/rspec'
|
9
|
+
require 'timecop'
|
10
10
|
|
11
|
-
RSpec.configure do |config|
|
12
|
-
config.mock_with :mocha
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.mock_with :mocha
|
13
13
|
end
|
14
14
|
|
15
15
|
ShamRack.at('www.example.com') do |env|
|
data/spec/strategy_spec.rb
CHANGED
@@ -124,6 +124,7 @@ describe Devise::Strategies::CasAuthenticatable, :type => "acceptance" do
|
|
124
124
|
User.find_by_username("newuser").should be_nil
|
125
125
|
|
126
126
|
click_on "sign in using a different account"
|
127
|
+
click_on "here"
|
127
128
|
current_url.should == cas_login_url
|
128
129
|
fill_in "Username", :with => "joeuser"
|
129
130
|
fill_in "Password", :with => "joepassword"
|
@@ -0,0 +1,19 @@
|
|
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
|
@@ -0,0 +1,41 @@
|
|
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 a generic warden :throw error" do
|
26
|
+
|
27
|
+
before do
|
28
|
+
@failure_app.stubs(:warden_message).returns(nil)
|
29
|
+
@failure_app.stubs(:flash).returns({})
|
30
|
+
end
|
31
|
+
|
32
|
+
it "calls the scope_path method to retrieve the standard redirect_url" do
|
33
|
+
@failure_app.expects(:scope_path)
|
34
|
+
@failure_app.send(:redirect_url)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: devise_cas_authenticatable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.
|
5
|
+
version: 1.3.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Nat Budin
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-05-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
prerelease: false
|
@@ -20,13 +20,13 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ! '>='
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 1.0
|
23
|
+
version: 1.2.0
|
24
24
|
none: false
|
25
25
|
requirement: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.0
|
29
|
+
version: 1.2.0
|
30
30
|
none: false
|
31
31
|
- !ruby/object:Gem::Dependency
|
32
32
|
prerelease: false
|
@@ -98,15 +98,15 @@ dependencies:
|
|
98
98
|
type: :development
|
99
99
|
version_requirements: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ~>
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 3.4.0
|
104
104
|
none: false
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
|
-
- -
|
107
|
+
- - ~>
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
109
|
+
version: 3.4.0
|
110
110
|
none: false
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
prerelease: false
|
@@ -144,6 +144,22 @@ dependencies:
|
|
144
144
|
prerelease: false
|
145
145
|
name: capybara
|
146
146
|
type: :development
|
147
|
+
version_requirements: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ~>
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: 1.1.4
|
152
|
+
none: false
|
153
|
+
requirement: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 1.1.4
|
158
|
+
none: false
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
prerelease: false
|
161
|
+
name: crypt-isaac
|
162
|
+
type: :development
|
147
163
|
version_requirements: !ruby/object:Gem::Requirement
|
148
164
|
requirements:
|
149
165
|
- - ! '>='
|
@@ -158,7 +174,7 @@ dependencies:
|
|
158
174
|
none: false
|
159
175
|
- !ruby/object:Gem::Dependency
|
160
176
|
prerelease: false
|
161
|
-
name:
|
177
|
+
name: launchy
|
162
178
|
type: :development
|
163
179
|
version_requirements: !ruby/object:Gem::Requirement
|
164
180
|
requirements:
|
@@ -174,7 +190,7 @@ dependencies:
|
|
174
190
|
none: false
|
175
191
|
- !ruby/object:Gem::Dependency
|
176
192
|
prerelease: false
|
177
|
-
name:
|
193
|
+
name: timecop
|
178
194
|
type: :development
|
179
195
|
version_requirements: !ruby/object:Gem::Requirement
|
180
196
|
requirements:
|
@@ -216,8 +232,6 @@ files:
|
|
216
232
|
- .travis.yml
|
217
233
|
- CHANGELOG.md
|
218
234
|
- Gemfile
|
219
|
-
- Gemfile.devise10
|
220
|
-
- Gemfile.devise11
|
221
235
|
- Gemfile.devise12
|
222
236
|
- Gemfile.devise13
|
223
237
|
- Gemfile.devise14
|
@@ -242,6 +256,7 @@ files:
|
|
242
256
|
- lib/devise_cas_authenticatable/single_sign_out/strategies.rb
|
243
257
|
- lib/devise_cas_authenticatable/single_sign_out/strategies/base.rb
|
244
258
|
- lib/devise_cas_authenticatable/single_sign_out/strategies/rails_cache.rb
|
259
|
+
- lib/devise_cas_authenticatable/single_sign_out/warden_failure_app.rb
|
245
260
|
- lib/devise_cas_authenticatable/strategy.rb
|
246
261
|
- rails/init.rb
|
247
262
|
- spec/config_spec.rb
|
@@ -275,9 +290,12 @@ files:
|
|
275
290
|
- spec/scenario/db/migrate/20121009092400_add_deactivated_flag_to_users.rb
|
276
291
|
- spec/scenario/db/schema.rb
|
277
292
|
- spec/scenario/public/.gitkeep
|
293
|
+
- spec/single_sign_out_spec.rb
|
278
294
|
- spec/spec_helper.rb
|
279
295
|
- spec/strategy_spec.rb
|
280
296
|
- spec/support/migrations.rb
|
297
|
+
- spec/support/urls.rb
|
298
|
+
- spec/warden_failure_app_spec.rb
|
281
299
|
homepage: http://github.com/nbudin/devise_cas_authenticatable
|
282
300
|
licenses:
|
283
301
|
- MIT
|
@@ -291,7 +309,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
291
309
|
- !ruby/object:Gem::Version
|
292
310
|
segments:
|
293
311
|
- 0
|
294
|
-
hash:
|
312
|
+
hash: 2546603475843590117
|
295
313
|
version: '0'
|
296
314
|
none: false
|
297
315
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
@@ -338,6 +356,9 @@ test_files:
|
|
338
356
|
- spec/scenario/db/migrate/20121009092400_add_deactivated_flag_to_users.rb
|
339
357
|
- spec/scenario/db/schema.rb
|
340
358
|
- spec/scenario/public/.gitkeep
|
359
|
+
- spec/single_sign_out_spec.rb
|
341
360
|
- spec/spec_helper.rb
|
342
361
|
- spec/strategy_spec.rb
|
343
362
|
- spec/support/migrations.rb
|
363
|
+
- spec/support/urls.rb
|
364
|
+
- spec/warden_failure_app_spec.rb
|
data/Gemfile.devise10
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
source "http://rubygems.org"
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in devise_cas_authenticatable.gemspec
|
4
|
-
gemspec
|
5
|
-
|
6
|
-
gem 'rails', '~> 2.3.14'
|
7
|
-
gem 'devise', '~> 1.0.0'
|
8
|
-
gem 'rspec-rails', '~> 1.2.0'
|
9
|
-
|
10
|
-
group :test do
|
11
|
-
gem 'castronaut', :git => 'https://github.com/nbudin/castronaut.git', :branch => 'dam5s-merge'
|
12
|
-
end
|
data/Gemfile.devise11
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
source "http://rubygems.org"
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in devise_cas_authenticatable.gemspec
|
4
|
-
gemspec
|
5
|
-
|
6
|
-
gem 'rails', '~> 3.0.0'
|
7
|
-
gem 'devise', '~> 1.1.0'
|
8
|
-
|
9
|
-
group :test do
|
10
|
-
gem 'castronaut', :git => 'https://github.com/nbudin/castronaut.git', :branch => 'dam5s-merge'
|
11
|
-
end
|