devise_cas_authenticatable 1.1.4 → 1.2.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 CHANGED
@@ -1,6 +1,7 @@
1
1
  rvm:
2
2
  - 1.8.7 # (current default)
3
- - 1.9.2
3
+ - 1.9.3
4
+ - 2.0.0
4
5
  gemfile:
5
6
  - Gemfile.devise10
6
7
  - Gemfile.devise11
@@ -11,3 +12,4 @@ gemfile:
11
12
  - Gemfile.devise20
12
13
  - Gemfile.devise21
13
14
  script: "bundle exec rake spec"
15
+
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog for devise\_cas\_authenticatable
2
2
 
3
+ ## Version 1.2.0 - March 6, 2013
4
+
5
+ * Rewrite of the single sign-out module to improve compatibility with newer Devise versions, other ORMs, and be less complex overall (thanks [Jeremy Haile](https://github.com/jeremyhaile) and [Endel Dreyer](https://github.com/endel)!)
6
+
3
7
  ## Version 1.1.4 - January 23, 2013
4
8
 
5
9
  * Bug fix: don't modify request.protocol when generating a logout_url (thanks [Tse-Ching Ho](https://github.com/tsechingho)!)
@@ -1,6 +1,9 @@
1
- class Devise::CasSessionsController < Devise::SessionsController
1
+ class Devise::CasSessionsController < Devise::SessionsController
2
+ include DeviseCasAuthenticatable::SingleSignOut::DestroySession
2
3
  unloadable
3
4
 
5
+ skip_before_filter :verify_authenticity_token, :only => [:single_sign_out]
6
+
4
7
  def new
5
8
  unless returning_from_cas?
6
9
  redirect_to(cas_login_url)
@@ -15,11 +18,6 @@ class Devise::CasSessionsController < Devise::SessionsController
15
18
  end
16
19
 
17
20
  def destroy
18
- # Delete the ticket->session ID mapping if one exists for this session
19
- if ticket = session['cas_last_valid_ticket']
20
- ::DeviseCasAuthenticatable::SingleSignOut::Strategies.current_strategy.delete_session_index(ticket)
21
- end
22
-
23
21
  # if :cas_create_user is false a CAS session might be open but not signed_in
24
22
  # in such case we destroy the session here
25
23
  if signed_in?(resource_name)
@@ -64,23 +62,14 @@ class Devise::CasSessionsController < Devise::SessionsController
64
62
  end
65
63
 
66
64
  def destroy_cas_session(session_id, session_index)
67
- if session_store && session_store.respond_to?(:destroy_session)
68
- if session_store.destroy_session(session_id)
69
- logger.debug "Destroyed session #{session_id} corresponding to service ticket #{session_index}."
70
- else
71
- logger.debug "Data for session #{session_id} was not found. It may have already been cleared by a local CAS logout request."
72
- end
73
- else
74
- logger.warn "A single sign out request was received for ticket #{session_index} but the Rails session_store is not a type supported for single-sign-out by devise_cas_authenticatable."
65
+ logger.debug "Destroying cas session #{session_id} for ticket #{session_index}"
66
+ if destroy_session_by_id(session_id)
67
+ logger.debug "Destroyed session #{session_id} corresponding to service ticket #{session_index}."
75
68
  end
76
69
 
77
70
  ::DeviseCasAuthenticatable::SingleSignOut::Strategies.current_strategy.delete_session_index(session_index)
78
71
  end
79
72
 
80
- def session_store
81
- @session_store ||= (Rails.respond_to?(:application) && Rails.application.config.session_store)
82
- end
83
-
84
73
  def returning_from_cas?
85
74
  params[:ticket] || request.referer =~ /^#{::Devise.cas_client.cas_base_url}/ || request.referer =~ /^#{url_for :action => "service"}/
86
75
  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.1.4"
5
+ s.version = "1.2.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"]
@@ -7,16 +7,10 @@ require 'devise_cas_authenticatable/exceptions'
7
7
 
8
8
  require 'devise_cas_authenticatable/single_sign_out'
9
9
 
10
- if defined?(ActiveRecord::SessionStore)
11
- require 'devise_cas_authenticatable/single_sign_out/session_store/active_record'
12
- end
13
-
14
- if defined?(Redis::Store)
15
- require 'devise_cas_authenticatable/single_sign_out/session_store/redis'
16
- end
17
-
18
10
  require 'rubycas-client'
19
11
 
12
+ require 'devise_cas_authenticatable/railtie' if defined?(Rails::Railtie)
13
+
20
14
  # Register as a Rails engine if Rails::Engine exists
21
15
  begin
22
16
  Rails::Engine
@@ -0,0 +1,10 @@
1
+ require 'devise_cas_authenticatable'
2
+ require 'rails'
3
+
4
+ module DeviseCasAuthenticatable
5
+ class Railtie < ::Rails::Railtie
6
+ initializer "devise_cas_authenticatable.use_rack_middleware" do |app|
7
+ app.config.middleware.use "DeviseCasAuthenticatable::SingleSignOut::StoreSessionId"
8
+ end
9
+ end
10
+ end
@@ -1,22 +1,62 @@
1
1
  module DeviseCasAuthenticatable
2
2
  module SingleSignOut
3
- module SetSession
4
- def set_session_with_storage(env, sid, session_data, options={})
5
- if session_data['cas_last_valid_ticket_store']
6
- ::DeviseCasAuthenticatable::SingleSignOut::Strategies.current_strategy.store_session_id_for_index(session_data['cas_last_valid_ticket'], sid)
7
- session_data['cas_last_valid_ticket_store'] = nil
8
- end
9
3
 
10
- if method(:set_session_without_storage).arity == 4
11
- set_session_without_storage(env, sid, session_data, options)
4
+ def self.rails3?
5
+ defined?(::Rails) && ::Rails::VERSION::MAJOR == 3
6
+ end
7
+
8
+ # Supports destroying sessions by ID for ActiveRecord and Redis session stores
9
+ module DestroySession
10
+ def session_store_class
11
+ @session_store_class ||=
12
+ begin
13
+ if ::DeviseCasAuthenticatable::SingleSignOut.rails3?
14
+ # => Rails 3
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))
31
+ end until app.nil? or app.class == session_store_class
32
+ app
33
+ end
34
+
35
+ def destroy_session_by_id(sid)
36
+ logger.debug "Single Sign Out from session store: #{current_session_store.inspect}"
37
+
38
+ if session_store_class.name =~ /ActiveRecord::SessionStore/
39
+ session = session_store_class::Session.find_by_session_id(sid)
40
+ session.destroy if session
41
+ true
42
+ elsif session_store_class.name =~ /Redis/
43
+ current_session_store.instance_variable_get(:@pool).del(sid)
44
+ true
45
+ elsif session_store_class.name =~ /CacheStore/
46
+ current_session_store.destroy_session({}, sid, {})
47
+ true
12
48
  else
13
- set_session_without_storage(env, sid, session_data)
14
- end
49
+ logger.error "Cannot process logout request because this Rails application's session store is "+
50
+ " #{current_session_store.name.inspect} and is not a support session store type for Single Sign-Out."
51
+ false
52
+ end
15
53
  end
16
54
  end
55
+
17
56
  end
18
57
  end
19
58
 
20
59
  require 'devise_cas_authenticatable/single_sign_out/strategies'
21
60
  require 'devise_cas_authenticatable/single_sign_out/strategies/base'
22
- require 'devise_cas_authenticatable/single_sign_out/strategies/rails_cache'
61
+ require 'devise_cas_authenticatable/single_sign_out/strategies/rails_cache'
62
+ require 'devise_cas_authenticatable/single_sign_out/rack'
@@ -0,0 +1,30 @@
1
+ module DeviseCasAuthenticatable
2
+ module SingleSignOut
3
+
4
+ class StoreSessionId
5
+ def initialize(app)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ store_session_id_for_cas_ticket(env)
11
+ @app.call(env)
12
+ end
13
+
14
+ private
15
+
16
+ def store_session_id_for_cas_ticket(env)
17
+ request = Rack::Request.new(env)
18
+ session = request.session
19
+
20
+ if session['cas_last_valid_ticket_store']
21
+ sid = env['rack.session.options'][:id]
22
+ Rails.logger.info "Storing sid #{sid} for ticket #{session['cas_last_valid_ticket']}"
23
+ ::DeviseCasAuthenticatable::SingleSignOut::Strategies.current_strategy.store_session_id_for_index(session['cas_last_valid_ticket'], sid)
24
+ session['cas_last_valid_ticket_store'] = false
25
+ end
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -28,4 +28,4 @@ module DeviseCasAuthenticatable
28
28
  end
29
29
  end
30
30
 
31
- ::DeviseCasAuthenticatable::SingleSignOut::Strategies.add( :rails_cache, DeviseCasAuthenticatable::SingleSignOut::Strategies::RailsCache )
31
+ ::DeviseCasAuthenticatable::SingleSignOut::Strategies.add( :rails_cache, DeviseCasAuthenticatable::SingleSignOut::Strategies::RailsCache )
@@ -27,7 +27,6 @@ module Devise
27
27
  elsif ticket.is_valid?
28
28
  username = ticket.respond_to?(:user) ? ticket.user : ticket.response.user
29
29
  redirect!(::Devise.cas_unregistered_url(request.url, mapping), :username => username)
30
- #fail!("The user #{ticket.response.user} is not registered with this site. Please use a different account.")
31
30
  else
32
31
  fail!(:invalid)
33
32
  end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_cas_authenticatable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
5
4
  prerelease:
5
+ version: 1.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nat Budin
@@ -10,195 +10,195 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-01-23 00:00:00.000000000 Z
13
+ date: 2013-03-06 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
+ type: :runtime
17
+ version_requirements: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.6
16
23
  name: devise
24
+ prerelease: false
17
25
  requirement: !ruby/object:Gem::Requirement
18
26
  none: false
19
27
  requirements:
20
28
  - - ! '>='
21
29
  - !ruby/object:Gem::Version
22
30
  version: 1.0.6
31
+ - !ruby/object:Gem::Dependency
23
32
  type: :runtime
24
- prerelease: false
25
33
  version_requirements: !ruby/object:Gem::Requirement
26
34
  none: false
27
35
  requirements:
28
36
  - - ! '>='
29
37
  - !ruby/object:Gem::Version
30
- version: 1.0.6
31
- - !ruby/object:Gem::Dependency
38
+ version: 2.2.1
32
39
  name: rubycas-client
40
+ prerelease: false
33
41
  requirement: !ruby/object:Gem::Requirement
34
42
  none: false
35
43
  requirements:
36
44
  - - ! '>='
37
45
  - !ruby/object:Gem::Version
38
46
  version: 2.2.1
39
- type: :runtime
40
- prerelease: false
47
+ - !ruby/object:Gem::Dependency
48
+ type: :development
41
49
  version_requirements: !ruby/object:Gem::Requirement
42
50
  none: false
43
51
  requirements:
44
52
  - - ! '>='
45
53
  - !ruby/object:Gem::Version
46
- version: 2.2.1
47
- - !ruby/object:Gem::Dependency
54
+ version: 3.0.7
48
55
  name: rails
56
+ prerelease: false
49
57
  requirement: !ruby/object:Gem::Requirement
50
58
  none: false
51
59
  requirements:
52
60
  - - ! '>='
53
61
  - !ruby/object:Gem::Version
54
62
  version: 3.0.7
63
+ - !ruby/object:Gem::Dependency
55
64
  type: :development
56
- prerelease: false
57
65
  version_requirements: !ruby/object:Gem::Requirement
58
66
  none: false
59
67
  requirements:
60
68
  - - ! '>='
61
69
  - !ruby/object:Gem::Version
62
- version: 3.0.7
63
- - !ruby/object:Gem::Dependency
70
+ version: '0'
64
71
  name: rspec-rails
72
+ prerelease: false
65
73
  requirement: !ruby/object:Gem::Requirement
66
74
  none: false
67
75
  requirements:
68
76
  - - ! '>='
69
77
  - !ruby/object:Gem::Version
70
78
  version: '0'
79
+ - !ruby/object:Gem::Dependency
71
80
  type: :development
72
- prerelease: false
73
81
  version_requirements: !ruby/object:Gem::Requirement
74
82
  none: false
75
83
  requirements:
76
84
  - - ! '>='
77
85
  - !ruby/object:Gem::Version
78
86
  version: '0'
79
- - !ruby/object:Gem::Dependency
80
87
  name: mocha
88
+ prerelease: false
81
89
  requirement: !ruby/object:Gem::Requirement
82
90
  none: false
83
91
  requirements:
84
92
  - - ! '>='
85
93
  - !ruby/object:Gem::Version
86
94
  version: '0'
95
+ - !ruby/object:Gem::Dependency
87
96
  type: :development
88
- prerelease: false
89
97
  version_requirements: !ruby/object:Gem::Requirement
90
98
  none: false
91
99
  requirements:
92
100
  - - ! '>='
93
101
  - !ruby/object:Gem::Version
94
102
  version: '0'
95
- - !ruby/object:Gem::Dependency
96
103
  name: shoulda
104
+ prerelease: false
97
105
  requirement: !ruby/object:Gem::Requirement
98
106
  none: false
99
107
  requirements:
100
108
  - - ! '>='
101
109
  - !ruby/object:Gem::Version
102
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
103
112
  type: :development
104
- prerelease: false
105
113
  version_requirements: !ruby/object:Gem::Requirement
106
114
  none: false
107
115
  requirements:
108
116
  - - ! '>='
109
117
  - !ruby/object:Gem::Version
110
118
  version: '0'
111
- - !ruby/object:Gem::Dependency
112
119
  name: sqlite3-ruby
120
+ prerelease: false
113
121
  requirement: !ruby/object:Gem::Requirement
114
122
  none: false
115
123
  requirements:
116
124
  - - ! '>='
117
125
  - !ruby/object:Gem::Version
118
126
  version: '0'
127
+ - !ruby/object:Gem::Dependency
119
128
  type: :development
120
- prerelease: false
121
129
  version_requirements: !ruby/object:Gem::Requirement
122
130
  none: false
123
131
  requirements:
124
132
  - - ! '>='
125
133
  - !ruby/object:Gem::Version
126
134
  version: '0'
127
- - !ruby/object:Gem::Dependency
128
135
  name: sham_rack
136
+ prerelease: false
129
137
  requirement: !ruby/object:Gem::Requirement
130
138
  none: false
131
139
  requirements:
132
140
  - - ! '>='
133
141
  - !ruby/object:Gem::Version
134
142
  version: '0'
143
+ - !ruby/object:Gem::Dependency
135
144
  type: :development
136
- prerelease: false
137
145
  version_requirements: !ruby/object:Gem::Requirement
138
146
  none: false
139
147
  requirements:
140
148
  - - ! '>='
141
149
  - !ruby/object:Gem::Version
142
150
  version: '0'
143
- - !ruby/object:Gem::Dependency
144
151
  name: capybara
152
+ prerelease: false
145
153
  requirement: !ruby/object:Gem::Requirement
146
154
  none: false
147
155
  requirements:
148
156
  - - ! '>='
149
157
  - !ruby/object:Gem::Version
150
158
  version: '0'
159
+ - !ruby/object:Gem::Dependency
151
160
  type: :development
152
- prerelease: false
153
161
  version_requirements: !ruby/object:Gem::Requirement
154
162
  none: false
155
163
  requirements:
156
164
  - - ! '>='
157
165
  - !ruby/object:Gem::Version
158
166
  version: '0'
159
- - !ruby/object:Gem::Dependency
160
167
  name: crypt-isaac
168
+ prerelease: false
161
169
  requirement: !ruby/object:Gem::Requirement
162
170
  none: false
163
171
  requirements:
164
172
  - - ! '>='
165
173
  - !ruby/object:Gem::Version
166
174
  version: '0'
175
+ - !ruby/object:Gem::Dependency
167
176
  type: :development
168
- prerelease: false
169
177
  version_requirements: !ruby/object:Gem::Requirement
170
178
  none: false
171
179
  requirements:
172
180
  - - ! '>='
173
181
  - !ruby/object:Gem::Version
174
182
  version: '0'
175
- - !ruby/object:Gem::Dependency
176
183
  name: launchy
184
+ prerelease: false
177
185
  requirement: !ruby/object:Gem::Requirement
178
186
  none: false
179
187
  requirements:
180
188
  - - ! '>='
181
189
  - !ruby/object:Gem::Version
182
190
  version: '0'
191
+ - !ruby/object:Gem::Dependency
183
192
  type: :development
184
- prerelease: false
185
193
  version_requirements: !ruby/object:Gem::Requirement
186
194
  none: false
187
195
  requirements:
188
196
  - - ! '>='
189
197
  - !ruby/object:Gem::Version
190
198
  version: '0'
191
- - !ruby/object:Gem::Dependency
192
199
  name: pry
193
- requirement: !ruby/object:Gem::Requirement
194
- none: false
195
- requirements:
196
- - - ! '>='
197
- - !ruby/object:Gem::Version
198
- version: '0'
199
- type: :development
200
200
  prerelease: false
201
- version_requirements: !ruby/object:Gem::Requirement
201
+ requirement: !ruby/object:Gem::Requirement
202
202
  none: false
203
203
  requirements:
204
204
  - - ! '>='
@@ -234,11 +234,11 @@ files:
234
234
  - lib/devise_cas_authenticatable.rb
235
235
  - lib/devise_cas_authenticatable/exceptions.rb
236
236
  - lib/devise_cas_authenticatable/model.rb
237
+ - lib/devise_cas_authenticatable/railtie.rb
237
238
  - lib/devise_cas_authenticatable/routes.rb
238
239
  - lib/devise_cas_authenticatable/schema.rb
239
240
  - lib/devise_cas_authenticatable/single_sign_out.rb
240
- - lib/devise_cas_authenticatable/single_sign_out/session_store/active_record.rb
241
- - lib/devise_cas_authenticatable/single_sign_out/session_store/redis.rb
241
+ - lib/devise_cas_authenticatable/single_sign_out/rack.rb
242
242
  - lib/devise_cas_authenticatable/single_sign_out/strategies.rb
243
243
  - lib/devise_cas_authenticatable/single_sign_out/strategies/base.rb
244
244
  - lib/devise_cas_authenticatable/single_sign_out/strategies/rails_cache.rb
@@ -290,10 +290,10 @@ required_ruby_version: !ruby/object:Gem::Requirement
290
290
  requirements:
291
291
  - - ! '>='
292
292
  - !ruby/object:Gem::Version
293
- version: '0'
294
293
  segments:
295
294
  - 0
296
- hash: -1377956398748229167
295
+ hash: -2741106234440343687
296
+ version: '0'
297
297
  required_rubygems_version: !ruby/object:Gem::Requirement
298
298
  none: false
299
299
  requirements:
@@ -1,12 +0,0 @@
1
- ActiveRecord::SessionStore.class_eval do
2
-
3
- include DeviseCasAuthenticatable::SingleSignOut::SetSession
4
- alias_method_chain :set_session, :storage
5
-
6
- #def destroy_session(env, session_id, options)
7
- # if session = Session::find_by_session_id(sid)
8
- # session.destroy
9
- # end
10
- #end
11
-
12
- end
@@ -1,27 +0,0 @@
1
- require "action_controller/session/redis_session_store"
2
-
3
- module DeviseCasAuthenticatable
4
- module SingleSignOut
5
- module RedisSessionStore
6
-
7
- include DeviseCasAuthenticatable::SingleSignOut::SetSession
8
-
9
- def destroy_session(sid)
10
- @pool.del(sid)
11
- end
12
- end
13
- end
14
- end
15
-
16
-
17
- if ::Redis::Store.rails3?
18
- ActionDispatch::Session::RedisSessionStore.class_eval do
19
- include DeviseCasAuthenticatable::SingleSignOut::RedisSessionStore
20
- alias_method_chain :set_session, :storage
21
- end
22
- else
23
- ActionController::Session::RedisSessionStore.class_eval do
24
- include DeviseCasAuthenticatable::SingleSignOut::RedisSessionStore
25
- alias_method_chain :set_session, :storage
26
- end
27
- end