devise 3.2.4 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of devise might be problematic. Click here for more details.

Files changed (178) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.travis.yml +33 -17
  4. data/CHANGELOG.md +57 -1033
  5. data/CODE_OF_CONDUCT.md +22 -0
  6. data/CONTRIBUTING.md +2 -0
  7. data/Gemfile +5 -5
  8. data/Gemfile.lock +138 -115
  9. data/MIT-LICENSE +1 -1
  10. data/README.md +124 -65
  11. data/Rakefile +2 -1
  12. data/app/controllers/devise/confirmations_controller.rb +7 -3
  13. data/app/controllers/devise/omniauth_callbacks_controller.rb +8 -4
  14. data/app/controllers/devise/passwords_controller.rb +16 -6
  15. data/app/controllers/devise/registrations_controller.rb +22 -10
  16. data/app/controllers/devise/sessions_controller.rb +42 -14
  17. data/app/controllers/devise/unlocks_controller.rb +5 -2
  18. data/app/controllers/devise_controller.rb +63 -29
  19. data/app/mailers/devise/mailer.rb +4 -0
  20. data/app/views/devise/confirmations/new.html.erb +7 -3
  21. data/app/views/devise/mailer/password_change.html.erb +3 -0
  22. data/app/views/devise/passwords/edit.html.erb +14 -5
  23. data/app/views/devise/passwords/new.html.erb +7 -3
  24. data/app/views/devise/registrations/edit.html.erb +19 -9
  25. data/app/views/devise/registrations/new.html.erb +18 -7
  26. data/app/views/devise/sessions/new.html.erb +16 -7
  27. data/app/views/devise/shared/{_links.erb → _links.html.erb} +2 -2
  28. data/app/views/devise/unlocks/new.html.erb +7 -3
  29. data/bin/test +13 -0
  30. data/config/locales/en.yml +19 -16
  31. data/devise.gemspec +3 -4
  32. data/gemfiles/{Gemfile.rails-3.2-stable → Gemfile.rails-4.1-stable} +6 -6
  33. data/gemfiles/Gemfile.rails-4.1-stable.lock +167 -0
  34. data/gemfiles/{Gemfile.rails-head → Gemfile.rails-4.2-stable} +6 -6
  35. data/gemfiles/Gemfile.rails-4.2-stable.lock +189 -0
  36. data/gemfiles/Gemfile.rails-5.0-beta +37 -0
  37. data/gemfiles/Gemfile.rails-5.0-beta.lock +199 -0
  38. data/lib/devise/controllers/helpers.rb +94 -27
  39. data/lib/devise/controllers/rememberable.rb +9 -2
  40. data/lib/devise/controllers/sign_in_out.rb +2 -9
  41. data/lib/devise/controllers/store_location.rb +11 -3
  42. data/lib/devise/controllers/url_helpers.rb +7 -7
  43. data/lib/devise/encryptor.rb +22 -0
  44. data/lib/devise/failure_app.rb +72 -23
  45. data/lib/devise/hooks/activatable.rb +3 -4
  46. data/lib/devise/hooks/csrf_cleaner.rb +3 -1
  47. data/lib/devise/hooks/timeoutable.rb +13 -8
  48. data/lib/devise/mailers/helpers.rb +1 -1
  49. data/lib/devise/mapping.rb +6 -2
  50. data/lib/devise/models/authenticatable.rb +32 -28
  51. data/lib/devise/models/confirmable.rb +55 -22
  52. data/lib/devise/models/database_authenticatable.rb +32 -19
  53. data/lib/devise/models/lockable.rb +5 -5
  54. data/lib/devise/models/recoverable.rb +44 -20
  55. data/lib/devise/models/rememberable.rb +54 -27
  56. data/lib/devise/models/timeoutable.rb +0 -6
  57. data/lib/devise/models/trackable.rb +5 -3
  58. data/lib/devise/models/validatable.rb +3 -3
  59. data/lib/devise/models.rb +1 -1
  60. data/lib/devise/omniauth/url_helpers.rb +62 -4
  61. data/lib/devise/parameter_sanitizer.rb +176 -61
  62. data/lib/devise/rails/routes.rb +76 -59
  63. data/lib/devise/rails/warden_compat.rb +1 -10
  64. data/lib/devise/rails.rb +2 -11
  65. data/lib/devise/strategies/authenticatable.rb +15 -6
  66. data/lib/devise/strategies/database_authenticatable.rb +5 -4
  67. data/lib/devise/strategies/rememberable.rb +13 -3
  68. data/lib/devise/test_helpers.rb +12 -7
  69. data/lib/devise/token_generator.rb +1 -41
  70. data/lib/devise/version.rb +1 -1
  71. data/lib/devise.rb +150 -58
  72. data/lib/generators/active_record/devise_generator.rb +28 -4
  73. data/lib/generators/active_record/templates/migration.rb +3 -3
  74. data/lib/generators/active_record/templates/migration_existing.rb +3 -3
  75. data/lib/generators/devise/controllers_generator.rb +44 -0
  76. data/lib/generators/devise/install_generator.rb +15 -0
  77. data/lib/generators/devise/orm_helpers.rb +1 -18
  78. data/lib/generators/devise/views_generator.rb +14 -3
  79. data/lib/generators/templates/README +1 -1
  80. data/lib/generators/templates/controllers/README +14 -0
  81. data/lib/generators/templates/controllers/confirmations_controller.rb +28 -0
  82. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +28 -0
  83. data/lib/generators/templates/controllers/passwords_controller.rb +32 -0
  84. data/lib/generators/templates/controllers/registrations_controller.rb +60 -0
  85. data/lib/generators/templates/controllers/sessions_controller.rb +25 -0
  86. data/lib/generators/templates/controllers/unlocks_controller.rb +28 -0
  87. data/lib/generators/templates/devise.rb +36 -28
  88. data/lib/generators/templates/markerb/confirmation_instructions.markerb +1 -1
  89. data/lib/generators/templates/markerb/password_change.markerb +3 -0
  90. data/lib/generators/templates/markerb/reset_password_instructions.markerb +1 -1
  91. data/lib/generators/templates/markerb/unlock_instructions.markerb +1 -1
  92. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +1 -1
  93. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +1 -1
  94. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +2 -2
  95. data/test/controllers/custom_registrations_controller_test.rb +40 -0
  96. data/test/controllers/custom_strategy_test.rb +7 -5
  97. data/test/controllers/helper_methods_test.rb +22 -0
  98. data/test/controllers/helpers_test.rb +41 -1
  99. data/test/controllers/inherited_controller_i18n_messages_test.rb +51 -0
  100. data/test/controllers/internal_helpers_test.rb +19 -15
  101. data/test/controllers/load_hooks_controller_test.rb +19 -0
  102. data/test/controllers/passwords_controller_test.rb +5 -4
  103. data/test/controllers/sessions_controller_test.rb +24 -21
  104. data/test/controllers/url_helpers_test.rb +7 -1
  105. data/test/devise_test.rb +48 -8
  106. data/test/failure_app_test.rb +107 -19
  107. data/test/generators/active_record_generator_test.rb +6 -26
  108. data/test/generators/controllers_generator_test.rb +48 -0
  109. data/test/generators/install_generator_test.rb +14 -3
  110. data/test/generators/views_generator_test.rb +8 -1
  111. data/test/helpers/devise_helper_test.rb +10 -12
  112. data/test/integration/authenticatable_test.rb +37 -21
  113. data/test/integration/confirmable_test.rb +54 -14
  114. data/test/integration/database_authenticatable_test.rb +12 -1
  115. data/test/integration/http_authenticatable_test.rb +4 -5
  116. data/test/integration/lockable_test.rb +10 -9
  117. data/test/integration/omniauthable_test.rb +13 -11
  118. data/test/integration/recoverable_test.rb +28 -15
  119. data/test/integration/registerable_test.rb +41 -33
  120. data/test/integration/rememberable_test.rb +51 -7
  121. data/test/integration/timeoutable_test.rb +23 -22
  122. data/test/integration/trackable_test.rb +3 -3
  123. data/test/mailers/confirmation_instructions_test.rb +10 -10
  124. data/test/mailers/reset_password_instructions_test.rb +8 -8
  125. data/test/mailers/unlock_instructions_test.rb +8 -8
  126. data/test/mapping_test.rb +7 -0
  127. data/test/models/authenticatable_test.rb +11 -1
  128. data/test/models/confirmable_test.rb +91 -42
  129. data/test/models/database_authenticatable_test.rb +26 -6
  130. data/test/models/lockable_test.rb +29 -17
  131. data/test/models/recoverable_test.rb +74 -7
  132. data/test/models/rememberable_test.rb +68 -94
  133. data/test/models/trackable_test.rb +28 -0
  134. data/test/models/validatable_test.rb +9 -17
  135. data/test/models_test.rb +15 -6
  136. data/test/omniauth/url_helpers_test.rb +4 -7
  137. data/test/orm/active_record.rb +6 -1
  138. data/test/parameter_sanitizer_test.rb +103 -53
  139. data/test/rails_app/app/active_record/user.rb +1 -0
  140. data/test/rails_app/app/active_record/user_on_engine.rb +7 -0
  141. data/test/rails_app/app/active_record/user_on_main_app.rb +7 -0
  142. data/test/rails_app/app/active_record/user_without_email.rb +8 -0
  143. data/test/rails_app/app/controllers/admins_controller.rb +1 -6
  144. data/test/rails_app/app/controllers/application_controller.rb +5 -2
  145. data/test/rails_app/app/controllers/application_with_fake_engine.rb +30 -0
  146. data/test/rails_app/app/controllers/custom/registrations_controller.rb +31 -0
  147. data/test/rails_app/app/controllers/home_controller.rb +5 -1
  148. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +3 -3
  149. data/test/rails_app/app/controllers/users_controller.rb +6 -6
  150. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +3 -0
  151. data/test/rails_app/app/mailers/users/mailer.rb +0 -9
  152. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +4 -0
  153. data/test/rails_app/app/mongoid/user_on_engine.rb +39 -0
  154. data/test/rails_app/app/mongoid/user_on_main_app.rb +39 -0
  155. data/test/rails_app/app/mongoid/user_without_email.rb +33 -0
  156. data/test/rails_app/config/application.rb +3 -3
  157. data/test/rails_app/config/boot.rb +4 -4
  158. data/test/rails_app/config/environments/production.rb +6 -2
  159. data/test/rails_app/config/environments/test.rb +13 -3
  160. data/test/rails_app/config/initializers/devise.rb +15 -16
  161. data/test/rails_app/config/initializers/secret_token.rb +1 -6
  162. data/test/rails_app/config/routes.rb +23 -3
  163. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +2 -2
  164. data/test/rails_app/lib/shared_user.rb +1 -1
  165. data/test/rails_app/lib/shared_user_without_email.rb +26 -0
  166. data/test/rails_app/lib/shared_user_without_omniauth.rb +13 -0
  167. data/test/rails_test.rb +9 -0
  168. data/test/routes_test.rb +33 -16
  169. data/test/support/assertions.rb +2 -3
  170. data/test/support/helpers.rb +13 -6
  171. data/test/support/http_method_compatibility.rb +51 -0
  172. data/test/support/integration.rb +4 -4
  173. data/test/support/webrat/integrations/rails.rb +9 -0
  174. data/test/test_helper.rb +7 -0
  175. data/test/test_helpers_test.rb +43 -38
  176. data/test/test_models.rb +3 -3
  177. metadata +77 -23
  178. data/gemfiles/Gemfile.rails-4.0-stable +0 -29
@@ -7,7 +7,7 @@ module Devise
7
7
  # blocked: email and time. The former will send an email to the user when
8
8
  # the lock happens, containing a link to unlock its account. The second
9
9
  # will unlock the user automatically after some configured time (ie 2.hours).
10
- # It's also possible to setup lockable to use both email and time strategies.
10
+ # It's also possible to set up lockable to use both email and time strategies.
11
11
  #
12
12
  # == Options
13
13
  #
@@ -115,10 +115,10 @@ module Devise
115
115
  # leaks the existence of an account.
116
116
  if Devise.paranoid
117
117
  super
118
- elsif lock_strategy_enabled?(:failed_attempts) && last_attempt?
119
- :last_attempt
120
- elsif lock_strategy_enabled?(:failed_attempts) && attempts_exceeded?
118
+ elsif access_locked? || (lock_strategy_enabled?(:failed_attempts) && attempts_exceeded?)
121
119
  :locked
120
+ elsif lock_strategy_enabled?(:failed_attempts) && last_attempt? && self.class.last_attempt_warning
121
+ :last_attempt
122
122
  else
123
123
  super
124
124
  end
@@ -189,7 +189,7 @@ module Devise
189
189
  self.lock_strategy == strategy
190
190
  end
191
191
 
192
- Devise::Models.config(self, :maximum_attempts, :lock_strategy, :unlock_strategy, :unlock_in, :unlock_keys)
192
+ Devise::Models.config(self, :maximum_attempts, :lock_strategy, :unlock_strategy, :unlock_in, :unlock_keys, :last_attempt_warning)
193
193
  end
194
194
  end
195
195
  end
@@ -8,15 +8,13 @@ module Devise
8
8
  # Recoverable adds the following options to devise_for:
9
9
  #
10
10
  # * +reset_password_keys+: the keys you want to use when recovering the password for an account
11
+ # * +reset_password_within+: the time period within which the password must be reset or the token expires.
12
+ # * +sign_in_after_reset_password+: whether or not to sign in the user automatically after a password reset.
11
13
  #
12
14
  # == Examples
13
15
  #
14
16
  # # resets the user password and save the record, true if valid passwords are given, otherwise false
15
- # User.find(1).reset_password!('password123', 'password123')
16
- #
17
- # # only resets the user password, without saving the record
18
- # user = User.find(1)
19
- # user.reset_password('password123', 'password123')
17
+ # User.find(1).reset_password('password123', 'password123')
20
18
  #
21
19
  # # creates a new token and send it with instructions about how to reset the password
22
20
  # User.find(1).send_reset_password_instructions
@@ -28,31 +26,40 @@ module Devise
28
26
  [:reset_password_sent_at, :reset_password_token]
29
27
  end
30
28
 
29
+ included do
30
+ before_update do
31
+ if (respond_to?(:email_changed?) && email_changed?) || encrypted_password_changed?
32
+ clear_reset_password_token
33
+ end
34
+ end
35
+ end
36
+
31
37
  # Update password saving the record and clearing token. Returns true if
32
38
  # the passwords are valid and the record was saved, false otherwise.
33
- def reset_password!(new_password, new_password_confirmation)
39
+ def reset_password(new_password, new_password_confirmation)
34
40
  self.password = new_password
35
41
  self.password_confirmation = new_password_confirmation
36
42
 
37
- if valid?
38
- clear_reset_password_token
43
+ if respond_to?(:after_password_reset) && valid?
44
+ ActiveSupport::Deprecation.warn "after_password_reset is deprecated"
39
45
  after_password_reset
40
46
  end
41
47
 
42
48
  save
43
49
  end
44
50
 
51
+ def reset_password!(new_password, new_password_confirmation)
52
+ ActiveSupport::Deprecation.warn "reset_password! is deprecated in favor of reset_password"
53
+ reset_password(new_password, new_password_confirmation)
54
+ end
55
+
45
56
  # Resets reset password token and send reset password instructions by email.
46
57
  # Returns the token sent in the e-mail.
47
58
  def send_reset_password_instructions
48
- raw, enc = Devise.token_generator.generate(self.class, :reset_password_token)
49
-
50
- self.reset_password_token = enc
51
- self.reset_password_sent_at = Time.now.utc
52
- self.save(validate: false)
59
+ token = set_reset_password_token
60
+ send_reset_password_instructions_notification(token)
53
61
 
54
- send_devise_notification(:reset_password_instructions, raw, {})
55
- raw
62
+ token
56
63
  end
57
64
 
58
65
  # Checks if the reset password token sent is within the limit time.
@@ -76,7 +83,7 @@ module Devise
76
83
  # reset_password_period_valid? # will always return false
77
84
  #
78
85
  def reset_password_period_valid?
79
- reset_password_sent_at && reset_password_sent_at.utc >= self.class.reset_password_within.ago
86
+ reset_password_sent_at && reset_password_sent_at.utc >= self.class.reset_password_within.ago.utc
80
87
  end
81
88
 
82
89
  protected
@@ -87,10 +94,27 @@ module Devise
87
94
  self.reset_password_sent_at = nil
88
95
  end
89
96
 
90
- def after_password_reset
97
+ def set_reset_password_token
98
+ raw, enc = Devise.token_generator.generate(self.class, :reset_password_token)
99
+
100
+ self.reset_password_token = enc
101
+ self.reset_password_sent_at = Time.now.utc
102
+ self.save(validate: false)
103
+ raw
104
+ end
105
+
106
+ def send_reset_password_instructions_notification(token)
107
+ send_devise_notification(:reset_password_instructions, token, {})
91
108
  end
92
109
 
93
110
  module ClassMethods
111
+ # Attempt to find a user by password reset token. If a user is found, return it
112
+ # If a user is not found, return nil
113
+ def with_reset_password_token(token)
114
+ reset_password_token = Devise.token_generator.digest(self, :reset_password_token, token)
115
+ to_adapter.find_first(reset_password_token: reset_password_token)
116
+ end
117
+
94
118
  # Attempt to find a user by its email. If a record is found, send new
95
119
  # password instructions to it. If user is not found, returns a new user
96
120
  # with an email not found error.
@@ -114,17 +138,17 @@ module Devise
114
138
 
115
139
  if recoverable.persisted?
116
140
  if recoverable.reset_password_period_valid?
117
- recoverable.reset_password!(attributes[:password], attributes[:password_confirmation])
141
+ recoverable.reset_password(attributes[:password], attributes[:password_confirmation])
118
142
  else
119
143
  recoverable.errors.add(:reset_password_token, :expired)
120
144
  end
121
145
  end
122
146
 
123
- recoverable.reset_password_token = original_token
147
+ recoverable.reset_password_token = original_token if recoverable.reset_password_token.present?
124
148
  recoverable
125
149
  end
126
150
 
127
- Devise::Models.config(self, :reset_password_keys, :reset_password_within)
151
+ Devise::Models.config(self, :reset_password_keys, :reset_password_within, :sign_in_after_reset_password)
128
152
  end
129
153
  end
130
154
  end
@@ -39,17 +39,15 @@ module Devise
39
39
  module Rememberable
40
40
  extend ActiveSupport::Concern
41
41
 
42
- attr_accessor :remember_me, :extend_remember_period
42
+ attr_accessor :remember_me
43
43
 
44
44
  def self.required_fields(klass)
45
45
  [:remember_created_at]
46
46
  end
47
47
 
48
- # Generate a new remember token and save the record without validations
49
- # unless remember_across_browsers is true and the user already has a valid token.
50
- def remember_me!(extend_period=false)
51
- self.remember_token = self.class.remember_token if generate_remember_token?
52
- self.remember_created_at = Time.now.utc if generate_remember_timestamp?(extend_period)
48
+ def remember_me!
49
+ self.remember_token = self.class.remember_token if respond_to?(:remember_token)
50
+ self.remember_created_at ||= Time.now.utc
53
51
  save(validate: false) if self.changed?
54
52
  end
55
53
 
@@ -57,25 +55,23 @@ module Devise
57
55
  # it exists), and save the record without validations.
58
56
  def forget_me!
59
57
  return unless persisted?
60
- self.remember_token = nil if respond_to?(:remember_token=)
61
- self.remember_created_at = nil
58
+ self.remember_token = nil if respond_to?(:remember_token)
59
+ self.remember_created_at = nil if self.class.expire_all_remember_me_on_sign_out
62
60
  save(validate: false)
63
61
  end
64
62
 
65
- # Remember token should be expired if expiration time not overpass now.
66
- def remember_expired?
67
- remember_created_at.nil? || (remember_expires_at <= Time.now.utc)
63
+ def remember_expires_at
64
+ self.class.remember_for.from_now
68
65
  end
69
66
 
70
- # Remember token expires at created time + remember_for configuration
71
- def remember_expires_at
72
- remember_created_at + self.class.remember_for
67
+ def extend_remember_period
68
+ self.class.extend_remember_period
73
69
  end
74
70
 
75
71
  def rememberable_value
76
72
  if respond_to?(:remember_token)
77
73
  remember_token
78
- elsif respond_to?(:authenticatable_salt) && (salt = authenticatable_salt)
74
+ elsif respond_to?(:authenticatable_salt) && (salt = authenticatable_salt.presence)
79
75
  salt
80
76
  else
81
77
  raise "authenticable_salt returned nil for the #{self.class.name} model. " \
@@ -89,29 +85,60 @@ module Devise
89
85
  self.class.rememberable_options
90
86
  end
91
87
 
92
- protected
88
+ # A callback initiated after successfully being remembered. This can be
89
+ # used to insert your own logic that is only run after the user is
90
+ # remembered.
91
+ #
92
+ # Example:
93
+ #
94
+ # def after_remembered
95
+ # self.update_attribute(:invite_code, nil)
96
+ # end
97
+ #
98
+ def after_remembered
99
+ end
100
+
101
+ def remember_me?(token, generated_at)
102
+ # TODO: Normalize the JSON type coercion along with the Timeoutable hook
103
+ # in a single place https://github.com/plataformatec/devise/blob/ffe9d6d406e79108cf32a2c6a1d0b3828849c40b/lib/devise/hooks/timeoutable.rb#L14-L18
104
+ if generated_at.is_a?(String)
105
+ generated_at = time_from_json(generated_at)
106
+ end
93
107
 
94
- def generate_remember_token? #:nodoc:
95
- respond_to?(:remember_token) && remember_expired?
108
+ # The token is only valid if:
109
+ # 1. we have a date
110
+ # 2. the current time does not pass the expiry period
111
+ # 3. the record has a remember_created_at date
112
+ # 4. the token date is bigger than the remember_created_at
113
+ # 5. the token matches
114
+ generated_at.is_a?(Time) &&
115
+ (self.class.remember_for.ago < generated_at) &&
116
+ (generated_at > (remember_created_at || Time.now).utc) &&
117
+ Devise.secure_compare(rememberable_value, token)
96
118
  end
97
119
 
98
- # Generate a timestamp if extend_remember_period is true, if no remember_token
99
- # exists, or if an existing remember token has expired.
100
- def generate_remember_timestamp?(extend_period) #:nodoc:
101
- extend_period || remember_created_at.nil? || remember_expired?
120
+ private
121
+
122
+ def time_from_json(value)
123
+ if value =~ /\A\d+\.\d+\Z/
124
+ Time.at(value.to_f)
125
+ else
126
+ Time.parse(value) rescue nil
127
+ end
102
128
  end
103
129
 
104
130
  module ClassMethods
105
131
  # Create the cookie key using the record id and remember_token
106
132
  def serialize_into_cookie(record)
107
- [record.to_key, record.rememberable_value]
133
+ [record.to_key, record.rememberable_value, Time.now.utc.to_f.to_s]
108
134
  end
109
135
 
110
136
  # Recreate the user based on the stored cookie
111
- def serialize_from_cookie(id, remember_token)
137
+ def serialize_from_cookie(*args)
138
+ id, token, generated_at = *args
139
+
112
140
  record = to_adapter.get(id)
113
- record if record && !record.remember_expired? &&
114
- Devise.secure_compare(record.rememberable_value, remember_token)
141
+ record if record && record.remember_me?(token, generated_at)
115
142
  end
116
143
 
117
144
  # Generate a token checking if one does not already exist in the database.
@@ -122,7 +149,7 @@ module Devise
122
149
  end
123
150
  end
124
151
 
125
- Devise::Models.config(self, :remember_for, :extend_remember_period, :rememberable_options)
152
+ Devise::Models.config(self, :remember_for, :extend_remember_period, :rememberable_options, :expire_all_remember_me_on_sign_out)
126
153
  end
127
154
  end
128
155
  end
@@ -26,7 +26,6 @@ module Devise
26
26
 
27
27
  # Checks whether the user session has expired based on configured time.
28
28
  def timedout?(last_access)
29
- return false if remember_exists_and_not_expired?
30
29
  !timeout_in.nil? && last_access && last_access <= timeout_in.ago
31
30
  end
32
31
 
@@ -36,11 +35,6 @@ module Devise
36
35
 
37
36
  private
38
37
 
39
- def remember_exists_and_not_expired?
40
- return false unless respond_to?(:remember_created_at) && respond_to?(:remember_expired?)
41
- remember_created_at && !remember_expired?
42
- end
43
-
44
38
  module ClassMethods
45
39
  Devise::Models.config(self, :timeout_in)
46
40
  end
@@ -15,7 +15,7 @@ module Devise
15
15
  [:current_sign_in_at, :current_sign_in_ip, :last_sign_in_at, :last_sign_in_ip, :sign_in_count]
16
16
  end
17
17
 
18
- def update_tracked_fields!(request)
18
+ def update_tracked_fields(request)
19
19
  old_current, new_current = self.current_sign_in_at, Time.now.utc
20
20
  self.last_sign_in_at = old_current || new_current
21
21
  self.current_sign_in_at = new_current
@@ -26,9 +26,11 @@ module Devise
26
26
 
27
27
  self.sign_in_count ||= 0
28
28
  self.sign_in_count += 1
29
+ end
29
30
 
30
- save(validate: false) or raise "Devise trackable could not save #{inspect}." \
31
- "Please make sure a model using trackable can be saved at sign in."
31
+ def update_tracked_fields!(request)
32
+ update_tracked_fields(request)
33
+ save(validate: false)
32
34
  end
33
35
  end
34
36
  end
@@ -10,12 +10,12 @@ module Devise
10
10
  # Validatable adds the following options to devise_for:
11
11
  #
12
12
  # * +email_regexp+: the regular expression used to validate e-mails;
13
- # * +password_length+: a range expressing password length. Defaults to 8..128.
13
+ # * +password_length+: a range expressing password length. Defaults to 8..72.
14
14
  #
15
15
  module Validatable
16
16
  # All validations used by this module.
17
- VALIDATIONS = [ :validates_presence_of, :validates_uniqueness_of, :validates_format_of,
18
- :validates_confirmation_of, :validates_length_of ].freeze
17
+ VALIDATIONS = [:validates_presence_of, :validates_uniqueness_of, :validates_format_of,
18
+ :validates_confirmation_of, :validates_length_of].freeze
19
19
 
20
20
  def self.required_fields(klass)
21
21
  []
data/lib/devise/models.rb CHANGED
@@ -12,7 +12,7 @@ module Devise
12
12
 
13
13
  # Creates configuration values for Devise and for the given module.
14
14
  #
15
- # Devise::Models.config(Devise::Authenticatable, :stretches, 10)
15
+ # Devise::Models.config(Devise::DatabaseAuthenticatable, :stretches)
16
16
  #
17
17
  # The line above creates:
18
18
  #
@@ -2,16 +2,74 @@ module Devise
2
2
  module OmniAuth
3
3
  module UrlHelpers
4
4
  def self.define_helpers(mapping)
5
+ return unless mapping.omniauthable?
6
+
7
+ mapping = mapping.name
8
+
9
+ class_eval do
10
+ define_method("#{mapping}_omniauth_authorize_path") do |provider, *args|
11
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc)
12
+ [Devise] #{mapping}_omniauth_authorize_path(#{provider.inspect}) is deprecated and it will be removed from Devise 4.1.
13
+
14
+ Please use #{mapping}_#{provider}_omniauth_authorize_path instead.
15
+ DEPRECATION
16
+ send("#{mapping}_#{provider}_omniauth_authorize_path", *args)
17
+ end
18
+
19
+ define_method("#{mapping}_omniauth_authorize_url") do |provider, *args|
20
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc)
21
+ [Devise] #{mapping}_omniauth_authorize_url(#{provider.inspect}) is deprecated and it will be removed from Devise 4.1.
22
+
23
+ Please use #{mapping}_#{provider}_omniauth_authorize_url instead.
24
+ DEPRECATION
25
+ send("#{mapping}_#{provider}_omniauth_authorize_url", *args)
26
+ end
27
+
28
+ define_method("#{mapping}_omniauth_callback_path") do |provider, *args|
29
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc)
30
+ [Devise] #{mapping}_omniauth_callback_path(#{provider.inspect}) is deprecated and it will be removed from Devise 4.1.
31
+
32
+ Please use #{mapping}_#{provider}_omniauth_callback_path instead.
33
+ DEPRECATION
34
+ send("#{mapping}_#{provider}_omniauth_callback_path", *args)
35
+ end
36
+
37
+ define_method("#{mapping}_omniauth_callback_url") do |provider, *args|
38
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION.strip_heredoc)
39
+ [Devise] #{mapping}_omniauth_callback_url(#{provider.inspect}) is deprecated and it will be removed from Devise 4.1.
40
+
41
+ Please use #{mapping}_#{provider}_omniauth_callback_url instead.
42
+ DEPRECATION
43
+ send("#{mapping}_#{provider}_omniauth_callback_url", *args)
44
+ end
45
+ end
46
+
47
+ ActiveSupport.on_load(:action_controller) do
48
+ if respond_to?(:helper_method)
49
+ helper_method "#{mapping}_omniauth_authorize_path", "#{mapping}_omniauth_authorize_url"
50
+ helper_method "#{mapping}_omniauth_callback_path", "#{mapping}_omniauth_callback_url"
51
+ end
52
+ end
53
+ end
54
+
55
+ def omniauth_authorize_path(resource_or_scope, provider, *args)
56
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
57
+ _devise_route_context.send("#{scope}_#{provider}_omniauth_authorize_path", *args)
58
+ end
59
+
60
+ def omniauth_authorize_url(resource_or_scope, provider, *args)
61
+ scope = Devise::Mapping.find_scope!(resource_or_scope)
62
+ _devise_route_context.send("#{scope}_#{provider}_omniauth_authorize_url", *args)
5
63
  end
6
64
 
7
- def omniauth_authorize_path(resource_or_scope, *args)
65
+ def omniauth_callback_path(resource_or_scope, provider, *args)
8
66
  scope = Devise::Mapping.find_scope!(resource_or_scope)
9
- _devise_route_context.send("#{scope}_omniauth_authorize_path", *args)
67
+ _devise_route_context.send("#{scope}_#{provider}_omniauth_callback_path", *args)
10
68
  end
11
69
 
12
- def omniauth_callback_path(resource_or_scope, *args)
70
+ def omniauth_callback_url(resource_or_scope, provider, *args)
13
71
  scope = Devise::Mapping.find_scope!(resource_or_scope)
14
- _devise_route_context.send("#{scope}_omniauth_callback_path", *args)
72
+ _devise_route_context.send("#{scope}_#{provider}_omniauth_callback_url", *args)
15
73
  end
16
74
  end
17
75
  end