devise_cas_authenticatable 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,10 +1,8 @@
1
1
  rvm:
2
- - 1.8.7 # (current default)
2
+ - 1.8.7
3
3
  - 1.9.3
4
4
  - 2.0.0
5
5
  gemfile:
6
- - Gemfile.devise10
7
- - Gemfile.devise11
8
6
  - Gemfile.devise12
9
7
  - Gemfile.devise13
10
8
  - Gemfile.devise14
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.2.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.6"])
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
@@ -1,5 +1,5 @@
1
1
  class User < ActiveRecord::Base
2
- devise :cas_authenticatable, :rememberable
2
+ devise :cas_authenticatable, :rememberable, :timeoutable
3
3
 
4
4
  def active_for_authentication?
5
5
  super && !deactivated
@@ -1,3 +1,4 @@
1
1
  Devise.setup do |config|
2
2
  require "devise/orm/active_record"
3
+ config.timeout_in = 7200
3
4
  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|
@@ -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.2.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-04-16 00:00:00.000000000 Z
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.6
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.6
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: '0'
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: '0'
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: crypt-isaac
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: launchy
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: -2394567349096225548
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