devise_cas_authenticatable 1.10.4 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +32 -0
  3. data/.gitignore +0 -1
  4. data/CHANGELOG.md +65 -44
  5. data/Gemfile +8 -0
  6. data/README.md +85 -89
  7. data/app/controllers/devise/cas_sessions_controller.rb +25 -69
  8. data/app/views/devise/cas_sessions/unregistered.html.erb +3 -3
  9. data/devise_cas_authenticatable.gemspec +19 -26
  10. data/lib/devise_cas_authenticatable/model.rb +21 -28
  11. data/lib/devise_cas_authenticatable/routes.rb +22 -44
  12. data/lib/devise_cas_authenticatable/strategy.rb +14 -30
  13. data/lib/devise_cas_authenticatable.rb +27 -79
  14. data/spec/model_spec.rb +29 -35
  15. data/spec/routes_spec.rb +26 -26
  16. data/spec/scenario/app/assets/config/manifest.js +0 -0
  17. data/spec/scenario/app/controllers/home_controller.rb +2 -2
  18. data/spec/scenario/app/views/layouts/application.html.erb +1 -3
  19. data/spec/scenario/config/application.rb +1 -27
  20. data/spec/scenario/config/initializers/backtrace_silencers.rb +1 -1
  21. data/spec/scenario/config/initializers/devise.rb +2 -2
  22. data/spec/scenario/config/routes.rb +0 -4
  23. data/spec/scenario/db/migrate/20100401102949_create_tables.rb +3 -3
  24. data/spec/scenario/db/migrate/20111002012903_add_sessions_table.rb +1 -1
  25. data/spec/scenario/db/migrate/20121009092400_add_deactivated_flag_to_users.rb +1 -1
  26. data/spec/spec_helper.rb +38 -8
  27. data/spec/strategy_spec.rb +43 -82
  28. data/spec/support/migrations.rb +1 -1
  29. metadata +21 -126
  30. data/.travis.yml +0 -45
  31. data/Gemfile.devise12 +0 -11
  32. data/Gemfile.devise13 +0 -11
  33. data/Gemfile.devise14 +0 -11
  34. data/Gemfile.devise15 +0 -11
  35. data/Gemfile.devise20 +0 -11
  36. data/Gemfile.devise21 +0 -13
  37. data/Gemfile.devise30 +0 -12
  38. data/Gemfile.devise42 +0 -13
  39. data/lib/devise_cas_authenticatable/exceptions.rb +0 -10
  40. data/lib/devise_cas_authenticatable/memcache_checker.rb +0 -42
  41. data/lib/devise_cas_authenticatable/railtie.rb +0 -14
  42. data/lib/devise_cas_authenticatable/schema.rb +0 -20
  43. data/lib/devise_cas_authenticatable/session_store_identifier.rb +0 -29
  44. data/lib/devise_cas_authenticatable/single_sign_out/rack.rb +0 -39
  45. data/lib/devise_cas_authenticatable/single_sign_out/strategies/base.rb +0 -11
  46. data/lib/devise_cas_authenticatable/single_sign_out/strategies/rails_cache.rb +0 -31
  47. data/lib/devise_cas_authenticatable/single_sign_out/strategies/redis_cache.rb +0 -38
  48. data/lib/devise_cas_authenticatable/single_sign_out/strategies.rb +0 -58
  49. data/lib/devise_cas_authenticatable/single_sign_out/warden_failure_app.rb +0 -46
  50. data/lib/devise_cas_authenticatable/single_sign_out/with_conn.rb +0 -14
  51. data/lib/devise_cas_authenticatable/single_sign_out.rb +0 -69
  52. data/spec/config_spec.rb +0 -27
  53. data/spec/memcache_checker_spec.rb +0 -49
  54. data/spec/scenario/config/castronaut.yml +0 -32
  55. data/spec/scenario/config/initializers/castronaut.rb +0 -1
  56. data/spec/scenario/config/initializers/session_store.rb +0 -8
  57. data/spec/single_sign_out_spec.rb +0 -51
  58. data/spec/support/urls.rb +0 -19
  59. data/spec/warden_failure_app_spec.rb +0 -53
@@ -1,39 +1,32 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  Gem::Specification.new do |s|
4
- s.name = %q{devise_cas_authenticatable}
5
- s.version = "1.10.4"
2
+ s.name = 'devise_cas_authenticatable'
3
+ s.version = '2.0.2'
6
4
 
7
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Nat Budin", "Jeremy Haile"]
9
- s.description = %q{CAS authentication module for Devise}
10
- s.license = "MIT"
11
- s.email = %q{natbudin@gmail.com}
5
+ s.required_rubygems_version = Gem::Requirement.new('> 1.3.1') if s.respond_to? :required_rubygems_version=
6
+ s.authors = ['Nat Budin', 'Jeremy Haile']
7
+ s.description = 'CAS authentication module for Devise'
8
+ s.license = 'MIT'
9
+ s.email = 'natbudin@gmail.com'
12
10
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
13
11
  s.files = `git ls-files`.split("\n")
14
12
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
13
  s.extra_rdoc_files = [
16
- "README.md"
14
+ 'README.md'
17
15
  ]
18
16
 
19
- s.homepage = %q{http://github.com/nbudin/devise_cas_authenticatable}
20
- s.require_paths = ["lib"]
21
- s.rubygems_version = %q{1.5.0}
22
- s.summary = %q{CAS authentication module for Devise}
17
+ s.homepage = 'http://github.com/nbudin/devise_cas_authenticatable'
18
+ s.require_paths = ['lib']
19
+ s.rubygems_version = '1.5.0'
20
+ s.summary = 'CAS authentication module for Devise'
23
21
 
24
- s.add_runtime_dependency(%q<devise>, [">= 1.2.0"])
25
- s.add_runtime_dependency(%q<rubycas-client>, [">= 2.2.1"])
22
+ s.add_runtime_dependency('devise', ['>= 4.0.0'])
23
+ s.add_runtime_dependency('rack-cas')
26
24
 
27
- s.add_development_dependency("rails", ">= 3.0.7")
28
- s.add_development_dependency("rspec-rails")
29
- s.add_development_dependency("test-unit", "~> 3.0")
30
- s.add_development_dependency("mocha")
31
- s.add_development_dependency("shoulda")
32
- s.add_development_dependency("sqlite3")
33
- s.add_development_dependency("sham_rack")
34
- s.add_development_dependency("capybara")
35
- s.add_development_dependency('crypt-isaac')
25
+ s.add_development_dependency('capybara')
26
+ s.add_development_dependency('database_cleaner-active_record')
36
27
  s.add_development_dependency('launchy')
37
- s.add_development_dependency('timecop')
38
28
  s.add_development_dependency('pry')
29
+ s.add_development_dependency('rails')
30
+ s.add_development_dependency('rspec-rails')
31
+ s.add_development_dependency('sqlite3')
39
32
  end
@@ -5,44 +5,39 @@ module Devise
5
5
  def self.included(base)
6
6
  base.extend ClassMethods
7
7
  end
8
-
8
+
9
9
  module ClassMethods
10
- # Authenticate a CAS ticket and return the resulting user object. Behavior is as follows:
11
- #
12
- # * Check ticket validity using RubyCAS::Client. Return nil if the ticket is invalid.
10
+ # Given a CAS details hash returned by rack-cas, return the resulting user object.
11
+ # Behavior is as follows:
12
+ #
13
13
  # * Find a matching user by username (will use find_for_authentication if available).
14
14
  # * If the user does not exist, but Devise.cas_create_user is set, attempt to create the
15
15
  # user object in the database. If cas_extra_attributes= is defined, this will also
16
- # pass in the ticket's extra_attributes hash.
16
+ # pass in the extra_attributes hash.
17
17
  # * Return the resulting user object.
18
- def authenticate_with_cas_ticket(ticket)
19
- ::Devise.cas_client.validate_service_ticket(ticket) unless ticket.has_been_validated?
20
-
21
- if ticket.is_valid?
22
- identifier = nil
23
- ticket_response = ticket.respond_to?(:user) ? ticket : ticket.response
24
-
25
- identifier = extract_user_identifier(ticket_response)
18
+ def authenticate_with_cas_details(cas_details)
19
+ identifier = cas_details['user']
26
20
 
27
- # If cas_user_identifier isn't in extra_attributes,
28
- # or the value is blank, then we're done here
29
- return log_and_exit if identifier.nil?
21
+ # If cas_user_identifier isn't in extra_attributes,
22
+ # or the value is blank, then we're done here
23
+ return log_and_exit if identifier.nil?
30
24
 
31
- logger.debug("Using conditions {#{::Devise.cas_username_column} => #{identifier}} to find the User")
25
+ logger.debug("Using conditions {#{::Devise.cas_username_column} => #{identifier}} to find the User")
32
26
 
33
- conditions = { ::Devise.cas_username_column => identifier }
34
- resource = find_or_build_resource_from_conditions(conditions)
35
- return nil unless resource
36
-
37
- resource.cas_extra_attributes = ticket_response.extra_attributes \
38
- if resource.respond_to?(:cas_extra_attributes=)
27
+ conditions = { ::Devise.cas_username_column => identifier }
28
+ resource = find_or_build_resource_from_conditions(conditions)
29
+ return nil unless resource
39
30
 
40
- resource.save
41
- resource
31
+ if resource.respond_to?(:cas_extra_attributes=)
32
+ resource.cas_extra_attributes = cas_details['extra_attributes']
42
33
  end
34
+
35
+ resource.save
36
+ resource
43
37
  end
44
38
 
45
39
  private
40
+
46
41
  def should_create_cas_users?
47
42
  respond_to?(:cas_create_user?) ? cas_create_user? : ::Devise.cas_create_user?
48
43
  end
@@ -65,9 +60,7 @@ module Devise
65
60
  end
66
61
 
67
62
  def find_resource_with_conditions(conditions)
68
- # We don't want to override Devise 1.1's find_for_authentication
69
- return find_for_authentication(conditions) if respond_to?(:find_for_authentication)
70
- find(:first, :conditions => conditions)
63
+ find_for_authentication(conditions)
71
64
  end
72
65
  end
73
66
  end
@@ -1,55 +1,33 @@
1
- if defined? ActionDispatch::Routing
2
- # Rails 3, 4
3
-
4
- ActionDispatch::Routing::Mapper.class_eval do
5
- protected
6
-
7
- def devise_cas_authenticatable(mapping, controllers)
8
- sign_out_via = (Devise.respond_to?(:sign_out_via) && Devise.sign_out_via) || [:get, :post]
9
-
10
- # service endpoint for CAS server
11
- get "service", :to => "#{controllers[:cas_sessions]}#service", :as => "service"
12
- post "service", :to => "#{controllers[:cas_sessions]}#single_sign_out", :as => "single_sign_out"
13
-
14
- resource :session, :only => [], :controller => controllers[:cas_sessions], :path => "" do
15
- get :new, :path => mapping.path_names[:sign_in], :as => "new"
16
- get :unregistered
17
- post :create, :path => mapping.path_names[:sign_in]
18
- match :destroy, :path => mapping.path_names[:sign_out], :as => "destroy", :via => sign_out_via
19
- end
1
+ ActionDispatch::Routing::Mapper.class_eval do
2
+ protected
3
+
4
+ def devise_cas_authenticatable(mapping, controllers)
5
+ sign_out_via = (Devise.respond_to?(:sign_out_via) && Devise.sign_out_via) || [:get, :post]
6
+
7
+ # service endpoint for CAS server
8
+ get 'service', to: "#{controllers[:cas_sessions]}#service", as: 'service'
9
+
10
+ resource :session, only: [], controller: controllers[:cas_sessions], path: '' do
11
+ get :new, path: mapping.path_names[:sign_in], as: 'new'
12
+ get :unregistered
13
+ post :create, path: mapping.path_names[:sign_in]
14
+ match :destroy, path: mapping.path_names[:sign_out], as: 'destroy', via: sign_out_via
20
15
  end
16
+ end
21
17
 
22
- def raise_no_secret_key #:nodoc:
23
- # Devise_cas_authenticatable does not store passwords, so does not need a secret!
24
- Rails.logger.warn <<-WARNING
18
+ def raise_no_secret_key #:nodoc:
19
+ # Devise_cas_authenticatable does not store passwords, so does not need a secret!
20
+ Rails.logger.warn <<~WARNING
25
21
  Devise_cas_authenticatable has suppressed an exception from being raised for missing Devise.secret_key.
26
22
  If devise_cas_authenticatable is the only devise module you are using for authentication you can safely ignore this warning.
27
23
  However, if you use another module that requires the secret_key please follow these instructions from Devise:
28
24
 
29
25
  Devise.secret_key was not set. Please add the following to your Devise initializer:
30
-
26
+
31
27
  config.secret_key = '#{SecureRandom.hex(64)}'
32
-
33
- Please ensure you restarted your application after installing Devise or setting the key.
34
- WARNING
35
28
 
36
- end
37
- end
38
- else
39
- # Rails 2
40
-
41
- ActionController::Routing::RouteSet::Mapper.class_eval do
42
- protected
43
-
44
- def cas_authenticatable(routes, mapping)
45
- routes.with_options(:controller => 'devise/cas_sessions', :name_prefix => nil) do |session|
46
- session.send(:"#{mapping.name}_service", '/service', :action => 'service', :conditions => {:method => :get})
47
- session.send(:"#{mapping.name}_service", '/service', :action => 'single_sign_out', :conditions => {:method => :post})
48
- session.send(:"unregistered_#{mapping.name}_session", '/unregistered', :action => "unregistered", :conditions => {:method => :get})
49
- session.send(:"new_#{mapping.name}_session", mapping.path_names[:sign_in], :action => 'new', :conditions => {:method => :get})
50
- session.send(:"#{mapping.name}_session", mapping.path_names[:sign_in], :action => 'create', :conditions => {:method => :post})
51
- session.send(:"destroy_#{mapping.name}_session", mapping.path_names[:sign_out], :action => 'destroy', :conditions => { :method => :get })
52
- end
53
- end
29
+ Please ensure you restarted your application after installing Devise or setting the key.
30
+ WARNING
54
31
  end
55
32
  end
33
+
@@ -5,47 +5,31 @@ module Devise
5
5
  class CasAuthenticatable < Base
6
6
  # True if the mapping supports authenticate_with_cas_ticket.
7
7
  def valid?
8
- mapping.to.respond_to?(:authenticate_with_cas_ticket) && params[:ticket]
8
+ request = Rack::Request.new(env)
9
+ mapping.to.respond_to?(:authenticate_with_cas_details) && request.session['cas']
9
10
  end
10
-
11
+
11
12
  # Try to authenticate a user using the CAS ticket passed in params.
12
13
  # If the ticket is valid and the model's authenticate_with_cas_ticket method
13
14
  # returns a user, then return success. If the ticket is invalid, then either
14
15
  # fail (if we're just returning from the CAS server, based on the referrer)
15
16
  # or attempt to redirect to the CAS server's login URL.
16
17
  def authenticate!
17
- ticket = read_ticket(params)
18
- if ticket
19
- if resource = mapping.to.authenticate_with_cas_ticket(ticket)
20
- # Store the ticket in the session for later usage
21
- if ::Devise.cas_enable_single_sign_out
22
- session['cas_last_valid_ticket'] = ticket.ticket
23
- session['cas_last_valid_ticket_store'] = true
24
- end
25
-
18
+ request = Rack::Request.new(env)
19
+ cas_details = request.session['cas']
20
+ if cas_details
21
+ resource = mapping.to.authenticate_with_cas_details(cas_details)
22
+ if resource
26
23
  success!(resource)
27
- elsif ticket.is_valid?
28
- username = ticket.respond_to?(:user) ? ticket.user : ticket.response.user
29
- redirect!(::Devise.cas_unregistered_url(request.url, mapping), :username => username)
30
24
  else
31
- fail!(:invalid)
25
+ username = cas_details['user']
26
+ redirect!(::Devise.cas_unregistered_url(request.url, mapping), :username => username)
32
27
  end
33
28
  else
34
- fail!(:invalid)
35
- end
36
- end
37
-
38
- protected
39
-
40
- def read_ticket(params)
41
- ticket = params[:ticket]
42
- return nil unless ticket
43
-
44
- service_url = ::Devise.cas_service_url(request.url, mapping)
45
- if ticket =~ /^PT-/
46
- ::CASClient::ProxyTicket.new(ticket, service_url, params[:renew])
47
- else
48
- ::CASClient::ServiceTicket.new(ticket, service_url, params[:renew])
29
+ # Throw to rack-cas to initiate a login
30
+ rack_cas_authenticate_response = Rack::Response.new(nil, 401)
31
+ custom!(rack_cas_authenticate_response.to_a)
32
+ throw :warden
49
33
  end
50
34
  end
51
35
  end
@@ -1,50 +1,16 @@
1
1
  require 'devise'
2
+ require 'rack-cas'
3
+ require 'rack-cas/server'
2
4
 
3
- require 'devise_cas_authenticatable/schema'
4
5
  require 'devise_cas_authenticatable/routes'
5
6
  require 'devise_cas_authenticatable/strategy'
6
- require 'devise_cas_authenticatable/exceptions'
7
-
8
- require 'devise_cas_authenticatable/session_store_identifier'
9
- require 'devise_cas_authenticatable/single_sign_out'
10
-
11
7
  require 'devise_cas_authenticatable/cas_action_url_factory_base'
12
8
 
13
- require 'rubycas-client'
14
-
15
- require 'devise_cas_authenticatable/railtie' if defined?(Rails::Railtie)
16
- require 'devise_cas_authenticatable/memcache_checker'
17
-
18
- # Register as a Rails engine if Rails::Engine exists
19
- begin
20
- Rails::Engine
21
- rescue
22
- else
23
- module DeviseCasAuthenticatable
24
- class Engine < Rails::Engine
25
- initializer "devise_cas_authenticatable.single_sign_on.warden_failure_app" do |app|
26
- # requiring this here because the parent class calls Rails.application, which
27
- # isn't set up until after bundler has required the modules in this engine
28
- require 'devise_cas_authenticatable/single_sign_out/warden_failure_app'
29
- end
30
- end
31
- end
9
+ module DeviseCasAuthenticatable
10
+ class Engine < Rails::Engine ; end
32
11
  end
33
12
 
34
13
  module Devise
35
- # The base URL of the CAS server. For example, http://cas.example.com. Specifying this
36
- # is mandatory.
37
- @@cas_base_url = nil
38
-
39
- # The login URL of the CAS server. If undefined, will default based on cas_base_url.
40
- @@cas_login_url = nil
41
-
42
- # The login URL of the CAS server. If undefined, will default based on cas_base_url.
43
- @@cas_logout_url = nil
44
-
45
- # The login URL of the CAS server. If undefined, will default based on cas_base_url.
46
- @@cas_validate_url = nil
47
-
48
14
  # The destination url for logout.
49
15
  @@cas_destination_url = nil
50
16
 
@@ -54,21 +20,11 @@ module Devise
54
20
  # Which url to send with logout, destination or follow. Can either be nil, destination or follow.
55
21
  @@cas_logout_url_param = nil
56
22
 
57
- # Should devise_cas_authenticatable enable single-sign-out? Requires use of a supported
58
- # session_store. Currently supports active_record or redis.
59
- # False by default.
60
- @@cas_enable_single_sign_out = false
61
-
62
- # What strategy should single sign out use for tracking token->session ID mapping.
63
- # :rails_cache by default.
64
- @@cas_single_sign_out_mapping_strategy = :rails_cache
65
-
66
23
  # Should devise_cas_authenticatable attempt to create new user records for
67
24
  # unknown usernames? True by default.
68
25
  @@cas_create_user = true
69
26
 
70
- # The model attribute used for query conditions. Should be the same as
71
- # the rubycas-server username_column. :username by default
27
+ # The model attribute used for query conditions. :username by default
72
28
  @@cas_username_column = :username
73
29
 
74
30
  # The CAS reponse value used to find users in the local database
@@ -78,42 +34,20 @@ module Devise
78
34
  # Name of the parameter passed in the logout query
79
35
  @@cas_destination_logout_param_name = nil
80
36
 
81
- # Additional options for CAS client object
82
- @@cas_client_config_options = {}
83
-
84
- mattr_accessor :cas_base_url, :cas_login_url, :cas_logout_url, :cas_validate_url, :cas_destination_url, :cas_follow_url, :cas_logout_url_param, :cas_create_user, :cas_destination_logout_param_name, :cas_username_column, :cas_enable_single_sign_out, :cas_single_sign_out_mapping_strategy, :cas_user_identifier, :cas_client_config_options
37
+ mattr_accessor :cas_destination_url, :cas_follow_url, :cas_logout_url_param, :cas_create_user, :cas_destination_logout_param_name, :cas_username_column, :cas_user_identifier
85
38
 
86
39
  def self.cas_create_user?
87
40
  cas_create_user
88
41
  end
89
42
 
90
- # Return a CASClient::Client instance based on configuration parameters.
91
- def self.cas_client
92
- @@cas_client ||= begin
93
- cas_options = {
94
- :cas_destination_logout_param_name => @@cas_destination_logout_param_name,
95
- :cas_base_url => @@cas_base_url,
96
- :login_url => @@cas_login_url,
97
- :logout_url => @@cas_logout_url,
98
- :validate_url => @@cas_validate_url,
99
- :enable_single_sign_out => @@cas_enable_single_sign_out
100
- }
101
-
102
- cas_options.merge!(@@cas_client_config_options) if @@cas_client_config_options
103
-
104
- CASClient::Client.new(cas_options)
105
- end
106
- end
107
-
108
43
  def self.cas_service_url(base_url, mapping)
109
- cas_action_url(base_url, mapping, "service")
44
+ cas_action_url(base_url, mapping, 'service')
110
45
  end
111
46
 
112
47
  def self.cas_unregistered_url(base_url, mapping)
113
- cas_action_url(base_url, mapping, "unregistered")
48
+ cas_action_url(base_url, mapping, 'unregistered')
114
49
  end
115
50
 
116
- private
117
51
  def self.cas_action_url(base_url, mapping, action)
118
52
  cas_action_url_factory_class.new(base_url, mapping, action).call
119
53
  end
@@ -121,10 +55,24 @@ module Devise
121
55
  def self.cas_action_url_factory_class
122
56
  @cas_action_url_factory_class ||= CasActionUrlFactoryBase.prepare_class
123
57
  end
58
+
59
+ def self.cas_enable_single_sign_out=(_value)
60
+ puts "Devise.cas_enable_single_sign_out is deprecated as of devise_cas_authenticatable 2.0, and has no effect."
61
+ puts "Single sign out is now handled via rack-cas. To set it up, see the rack-cas readme:"
62
+ puts "https://github.com/biola/rack-cas#single-logout"
63
+ end
64
+
65
+ def self.cas_single_sign_out_mapping_strategy=(_value)
66
+ puts "Devise.cas_single_sign_out_mapping_strategy is deprecated as of devise_cas_authenticatable 2.0, and has no effect."
67
+ puts "Single sign out is now handled via rack-cas. To set it up, see the rack-cas readme:"
68
+ puts "https://github.com/biola/rack-cas#single-logout"
69
+ end
124
70
  end
125
71
 
126
- Devise.add_module(:cas_authenticatable,
127
- :strategy => true,
128
- :controller => :cas_sessions,
129
- :route => :cas_authenticatable,
130
- :model => 'devise_cas_authenticatable/model')
72
+ Devise.add_module(
73
+ :cas_authenticatable,
74
+ strategy: true,
75
+ controller: :cas_sessions,
76
+ route: :cas_authenticatable,
77
+ model: 'devise_cas_authenticatable/model'
78
+ )
data/spec/model_spec.rb CHANGED
@@ -1,57 +1,51 @@
1
+ # rubocop:disable Metrics/BlockLength
2
+
1
3
  require 'spec_helper'
2
4
 
3
- describe Devise::Models::CasAuthenticatable do
5
+ describe Devise::Models::CasAuthenticatable do
4
6
 
5
- describe "When the user lookup is by something other than username" do
7
+ describe 'When the user lookup is by something other than username' do
6
8
  before(:each) do
7
- @ticket = CASClient::ServiceTicket.new("ST-test", nil)
8
- @ticket.extra_attributes = {:id => 10}
9
- @ticket.success = true
10
- @ticket.user = "testusername"
11
-
12
9
  Devise.cas_create_user = false
13
-
14
- #
15
- # We needed to stub :find_for_authentication to return false
16
- # but wanted to allow other respond_to? calls to function
17
- # normally
18
- #
19
- User.stubs(:respond_to?) do |arg|
20
- if arg == :find_for_authentication
21
- return false
22
- else
23
- return User.respond_to? arg
24
- end
25
- end
26
10
  end
27
11
 
28
- it "should authenticate using whatever is specified in config.cas_user_identifier" do
12
+ it 'should authenticate using whatever is specified in config.cas_user_identifier' do
29
13
  Devise.cas_user_identifier = :id
30
14
  Devise.cas_username_column = :id
31
15
 
32
- User.expects(:find).with(:first, {:conditions => {:id => 10}})
16
+ user = User.create!(username: 'testusername')
17
+ User.authenticate_with_cas_details(cas_details_for_user(user))
33
18
 
34
- User.authenticate_with_cas_ticket(@ticket)
35
-
36
- #Reset this otherwise it'll blow up other specs
19
+ # Reset this otherwise it'll blow up other specs
37
20
  Devise.cas_user_identifier = nil
38
21
  end
39
22
 
40
- it "should authenticate as normal is config.cas_user_identifier is not set" do
23
+ it 'should authenticate as normal is config.cas_user_identifier is not set' do
41
24
  Devise.cas_user_identifier = nil
42
25
  Devise.cas_username_column = :username
43
- User.expects(:find).with(:first, {:conditions => {:username => @ticket.user}})
44
- User.authenticate_with_cas_ticket(@ticket)
26
+
27
+ user = User.create!(username: 'testusername')
28
+ User.authenticate_with_cas_details(cas_details_for_user(user))
45
29
  end
46
30
 
47
- it "should return nil if cas_user_identifier is not in cas_extra_attributes" do
31
+ it 'should return nil if cas_user_identifier is not in cas_extra_attributes' do
48
32
  Devise.cas_user_identifier = :unknown_ticket_field
49
- Devise.cas_username_column = :username
50
- User.expects(:find).never
51
- User.authenticate_with_cas_ticket(@ticket).should be_nil
52
-
53
- #Reset this otherwise it'll blow up other specs
33
+ Devise.cas_username_column = :username
34
+ expect(
35
+ User.authenticate_with_cas_details(
36
+ {
37
+ 'user' => 'testusername',
38
+ 'extra_attributes' => { id: 10 }
39
+ }
40
+ )
41
+ ).to be_nil
42
+
43
+ # Reset this otherwise it'll blow up other specs
54
44
  Devise.cas_user_identifier = nil
55
45
  end
46
+
47
+ def cas_details_for_user(user)
48
+ { 'user' => user.username, 'extra_attributes' => { id: user.id } }
49
+ end
56
50
  end
57
- end
51
+ end
data/spec/routes_spec.rb CHANGED
@@ -1,38 +1,38 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "routing" do
3
+ describe 'routing' do
4
4
  include RSpec::Rails::RoutingExampleGroup
5
5
 
6
- it "routes to #service" do
7
- get("/users/service").should route_to("devise/cas_sessions#service")
6
+ it 'routes to #service' do
7
+ expect(get('/users/service')).to route_to('devise/cas_sessions#service')
8
8
  end
9
-
10
- it "routes to #new" do
11
- get("/users/sign_in").should route_to("devise/cas_sessions#new")
9
+
10
+ it 'routes to #new' do
11
+ expect(get('/users/sign_in')).to route_to('devise/cas_sessions#new')
12
12
  end
13
-
14
- it "routes to #create" do
15
- post("/users/sign_in").should route_to("devise/cas_sessions#create")
13
+
14
+ it 'routes to #create' do
15
+ expect(post('/users/sign_in')).to route_to('devise/cas_sessions#create')
16
16
  end
17
-
18
- it "routes to #destroy" do
19
- get("/users/sign_out").should route_to("devise/cas_sessions#destroy")
17
+
18
+ it 'routes to #destroy' do
19
+ expect(delete('/users/sign_out')).to route_to('devise/cas_sessions#destroy')
20
20
  end
21
-
22
- it "routes to #unregistered" do
23
- get("/users/unregistered").should route_to("devise/cas_sessions#unregistered")
21
+
22
+ it 'routes to #unregistered' do
23
+ expect(get('/users/unregistered')).to route_to('devise/cas_sessions#unregistered')
24
24
  end
25
25
  end
26
-
26
+
27
27
  describe Devise::CasSessionsController do
28
- include RSpec::Rails::ControllerExampleGroup
29
-
30
- it "should have the right route names" do
31
- controller.should respond_to("user_service_path", "new_user_session_path", "user_session_path", "destroy_user_session_path")
32
- controller.user_service_path.should == "/users/service"
33
- controller.new_user_session_path.should == "/users/sign_in"
34
- controller.user_session_path.should == "/users/sign_in"
35
- controller.destroy_user_session_path.should == "/users/sign_out"
36
- controller.unregistered_user_session_path.should == "/users/unregistered"
28
+ include RSpec::Rails::ControllerExampleGroup
29
+
30
+ it 'should have the right route names' do
31
+ expect(controller).to respond_to('user_service_path', 'new_user_session_path', 'user_session_path', 'destroy_user_session_path')
32
+ expect(controller.user_service_path).to eq('/users/service')
33
+ expect(controller.new_user_session_path).to eq('/users/sign_in')
34
+ expect(controller.user_session_path).to eq('/users/sign_in')
35
+ expect(controller.destroy_user_session_path).to eq('/users/sign_out')
36
+ expect(controller.unregistered_user_session_path).to eq('/users/unregistered')
37
37
  end
38
- end
38
+ end
File without changes
@@ -1,6 +1,6 @@
1
1
  class HomeController < ApplicationController
2
- before_filter :authenticate_user!
3
-
2
+ before_action :authenticate_user!
3
+
4
4
  def index
5
5
  head(:ok)
6
6
  end
@@ -2,12 +2,10 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>Scenario</title>
5
- <%= stylesheet_link_tag :all %>
6
- <%= javascript_include_tag :defaults %>
7
5
  <%= csrf_meta_tag %>
8
6
  </head>
9
7
  <body>
10
-
8
+
11
9
  <p class="alert"><%= alert %></p>
12
10
  <p class="notice"><%= notice %></p>
13
11
 
@@ -4,35 +4,9 @@ require 'rails/all'
4
4
 
5
5
  Bundler.require(:default, Rails.env) if defined?(Bundler)
6
6
 
7
- require 'castronaut'
8
- class TestAdapter
9
- def self.reset_valid_users!
10
- @@valid_users = {
11
- "joeuser" => "joepassword"
12
- }
13
- end
14
- reset_valid_users!
15
-
16
- def self.register_valid_user(username, password)
17
- @@valid_users[username] = password
18
- end
19
-
20
- def self.authenticate(username, password)
21
- error_message = if @@valid_users[username] == password
22
- nil
23
- else
24
- "Invalid password"
25
- end
26
-
27
- Castronaut::AuthenticationResult.new(username, error_message)
28
- end
29
- end
30
-
31
- Castronaut::Adapters.register("test_adapter", TestAdapter)
32
- Castronaut.config = Castronaut::Configuration.load(File.expand_path(File.join(File.dirname(__FILE__), "castronaut.yml")))
33
-
34
7
  module Scenario
35
8
  class Application < Rails::Application
36
9
  config.active_support.deprecation = :stderr
10
+ config.rack_cas.fake = true
37
11
  end
38
12
  end
@@ -4,4 +4,4 @@
4
4
  # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
5
 
6
6
  # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
- # Rails.backtrace_cleaner.remove_silencers!
7
+ Rails.backtrace_cleaner.remove_silencers!