devise 4.7.2 → 4.9.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +70 -1
- data/MIT-LICENSE +1 -1
- data/README.md +55 -29
- data/app/controllers/devise/confirmations_controller.rb +1 -0
- data/app/controllers/devise/passwords_controller.rb +2 -2
- data/app/controllers/devise/registrations_controller.rb +1 -1
- data/app/controllers/devise/sessions_controller.rb +1 -1
- data/app/controllers/devise/unlocks_controller.rb +1 -0
- data/app/controllers/devise_controller.rb +1 -0
- data/app/helpers/devise_helper.rb +18 -6
- data/app/mailers/devise/mailer.rb +5 -5
- data/app/views/devise/registrations/edit.html.erb +1 -1
- data/app/views/devise/shared/_error_messages.html.erb +1 -1
- data/app/views/devise/shared/_links.html.erb +1 -1
- data/config/locales/en.yml +1 -1
- data/lib/devise/controllers/helpers.rb +7 -7
- data/lib/devise/controllers/responder.rb +35 -0
- data/lib/devise/controllers/sign_in_out.rb +6 -4
- data/lib/devise/controllers/url_helpers.rb +1 -1
- data/lib/devise/failure_app.rb +6 -3
- data/lib/devise/hooks/csrf_cleaner.rb +6 -1
- data/lib/devise/hooks/lockable.rb +2 -5
- data/lib/devise/mapping.rb +1 -1
- data/lib/devise/models/authenticatable.rb +11 -7
- data/lib/devise/models/confirmable.rb +18 -39
- data/lib/devise/models/database_authenticatable.rb +9 -28
- data/lib/devise/models/lockable.rb +11 -3
- data/lib/devise/models/omniauthable.rb +2 -2
- data/lib/devise/models/recoverable.rb +8 -19
- data/lib/devise/models/rememberable.rb +1 -1
- data/lib/devise/models/timeoutable.rb +1 -1
- data/lib/devise/models/validatable.rb +4 -9
- data/lib/devise/models.rb +1 -0
- data/lib/devise/omniauth.rb +2 -5
- data/lib/devise/orm.rb +71 -0
- data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
- data/lib/devise/rails/routes.rb +4 -4
- data/lib/devise/test/controller_helpers.rb +1 -1
- data/lib/devise/version.rb +1 -1
- data/lib/devise.rb +30 -7
- data/lib/generators/active_record/devise_generator.rb +17 -2
- data/lib/generators/devise/devise_generator.rb +1 -1
- data/lib/generators/devise/install_generator.rb +1 -1
- data/lib/generators/templates/devise.rb +10 -8
- data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +1 -1
- metadata +17 -5
@@ -4,6 +4,11 @@ Warden::Manager.after_authentication do |record, warden, options|
|
|
4
4
|
clean_up_for_winning_strategy = !warden.winning_strategy.respond_to?(:clean_up_csrf?) ||
|
5
5
|
warden.winning_strategy.clean_up_csrf?
|
6
6
|
if Devise.clean_up_csrf_token_on_authentication && clean_up_for_winning_strategy
|
7
|
-
warden.request.
|
7
|
+
if warden.request.respond_to?(:reset_csrf_token)
|
8
|
+
# Rails 7.1+
|
9
|
+
warden.request.reset_csrf_token
|
10
|
+
else
|
11
|
+
warden.request.session.try(:delete, :_csrf_token)
|
12
|
+
end
|
8
13
|
end
|
9
14
|
end
|
@@ -3,10 +3,7 @@
|
|
3
3
|
# After each sign in, if resource responds to failed_attempts, sets it to 0
|
4
4
|
# This is only triggered when the user is explicitly set (with set_user)
|
5
5
|
Warden::Manager.after_set_user except: :fetch do |record, warden, options|
|
6
|
-
if record.respond_to?(:
|
7
|
-
|
8
|
-
record.failed_attempts = 0
|
9
|
-
record.save(validate: false)
|
10
|
-
end
|
6
|
+
if record.respond_to?(:reset_failed_attempts!) && warden.authenticated?(options[:scope])
|
7
|
+
record.reset_failed_attempts!
|
11
8
|
end
|
12
9
|
end
|
data/lib/devise/mapping.rb
CHANGED
@@ -46,7 +46,7 @@ module Devise
|
|
46
46
|
raise "Could not find a valid mapping for #{obj.inspect}"
|
47
47
|
end
|
48
48
|
|
49
|
-
def self.find_by_path!(path, path_type
|
49
|
+
def self.find_by_path!(path, path_type = :fullpath)
|
50
50
|
Devise.mappings.each_value { |m| return m if path.include?(m.send(path_type)) }
|
51
51
|
raise "Could not find a valid mapping for path #{path.inspect}"
|
52
52
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'devise/hooks/activatable'
|
4
4
|
require 'devise/hooks/csrf_cleaner'
|
5
|
+
require 'devise/rails/deprecated_constant_accessor'
|
5
6
|
|
6
7
|
module Devise
|
7
8
|
module Models
|
@@ -9,7 +10,7 @@ module Devise
|
|
9
10
|
#
|
10
11
|
# == Options
|
11
12
|
#
|
12
|
-
# Authenticatable adds the following options to
|
13
|
+
# Authenticatable adds the following options to +devise+:
|
13
14
|
#
|
14
15
|
# * +authentication_keys+: parameters used for authentication. By default [:email].
|
15
16
|
#
|
@@ -55,11 +56,14 @@ module Devise
|
|
55
56
|
module Authenticatable
|
56
57
|
extend ActiveSupport::Concern
|
57
58
|
|
58
|
-
|
59
|
+
UNSAFE_ATTRIBUTES_FOR_SERIALIZATION = [:encrypted_password, :reset_password_token, :reset_password_sent_at,
|
59
60
|
:remember_created_at, :sign_in_count, :current_sign_in_at, :last_sign_in_at, :current_sign_in_ip,
|
60
61
|
:last_sign_in_ip, :password_salt, :confirmation_token, :confirmed_at, :confirmation_sent_at,
|
61
62
|
:remember_token, :unconfirmed_email, :failed_attempts, :unlock_token, :locked_at]
|
62
63
|
|
64
|
+
include Devise::DeprecatedConstantAccessor
|
65
|
+
deprecate_constant "BLACKLIST_FOR_SERIALIZATION", "Devise::Models::Authenticatable::UNSAFE_ATTRIBUTES_FOR_SERIALIZATION"
|
66
|
+
|
63
67
|
included do
|
64
68
|
class_attribute :devise_modules, instance_writer: false
|
65
69
|
self.devise_modules ||= []
|
@@ -104,12 +108,12 @@ module Devise
|
|
104
108
|
# given to :except will simply add names to exempt to Devise internal list.
|
105
109
|
def serializable_hash(options = nil)
|
106
110
|
options = options.try(:dup) || {}
|
107
|
-
options[:except] = Array(options[:except])
|
111
|
+
options[:except] = Array(options[:except]).dup
|
108
112
|
|
109
113
|
if options[:force_except]
|
110
114
|
options[:except].concat Array(options[:force_except])
|
111
115
|
else
|
112
|
-
options[:except].concat
|
116
|
+
options[:except].concat UNSAFE_ATTRIBUTES_FOR_SERIALIZATION
|
113
117
|
end
|
114
118
|
|
115
119
|
super(options)
|
@@ -272,17 +276,17 @@ module Devise
|
|
272
276
|
find_first_by_auth_conditions(tainted_conditions)
|
273
277
|
end
|
274
278
|
|
275
|
-
def find_first_by_auth_conditions(tainted_conditions, opts={})
|
279
|
+
def find_first_by_auth_conditions(tainted_conditions, opts = {})
|
276
280
|
to_adapter.find_first(devise_parameter_filter.filter(tainted_conditions).merge(opts))
|
277
281
|
end
|
278
282
|
|
279
283
|
# Find or initialize a record setting an error if it can't be found.
|
280
|
-
def find_or_initialize_with_error_by(attribute, value, error
|
284
|
+
def find_or_initialize_with_error_by(attribute, value, error = :invalid) #:nodoc:
|
281
285
|
find_or_initialize_with_errors([attribute], { attribute => value }, error)
|
282
286
|
end
|
283
287
|
|
284
288
|
# Find or initialize a record with group of attributes based on a list of required attributes.
|
285
|
-
def find_or_initialize_with_errors(required_attributes, attributes, error
|
289
|
+
def find_or_initialize_with_errors(required_attributes, attributes, error = :invalid) #:nodoc:
|
286
290
|
attributes.try(:permit!)
|
287
291
|
attributes = attributes.to_h.with_indifferent_access
|
288
292
|
.slice(*required_attributes)
|
@@ -48,7 +48,7 @@ module Devise
|
|
48
48
|
included do
|
49
49
|
before_create :generate_confirmation_token, if: :confirmation_required?
|
50
50
|
after_create :skip_reconfirmation_in_callback!, if: :send_confirmation_notification?
|
51
|
-
if
|
51
|
+
if Devise::Orm.active_record?(self) # ActiveRecord
|
52
52
|
after_commit :send_on_create_confirmation_instructions, on: :create, if: :send_confirmation_notification?
|
53
53
|
after_commit :send_reconfirmation_instructions, on: :update, if: :reconfirmation_required?
|
54
54
|
else # Mongoid
|
@@ -76,7 +76,7 @@ module Devise
|
|
76
76
|
# Confirm a user by setting it's confirmed_at to actual time. If the user
|
77
77
|
# is already confirmed, add an error to email field. If the user is invalid
|
78
78
|
# add errors
|
79
|
-
def confirm(args={})
|
79
|
+
def confirm(args = {})
|
80
80
|
pending_any_confirmation do
|
81
81
|
if confirmation_period_expired?
|
82
82
|
self.errors.add(:email, :confirmation_period_expired,
|
@@ -258,44 +258,23 @@ module Devise
|
|
258
258
|
generate_confirmation_token && save(validate: false)
|
259
259
|
end
|
260
260
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
end
|
269
|
-
else
|
270
|
-
def postpone_email_change_until_confirmation_and_regenerate_confirmation_token
|
271
|
-
@reconfirmation_required = true
|
272
|
-
self.unconfirmed_email = self.email
|
273
|
-
self.email = self.email_was
|
274
|
-
self.confirmation_token = nil
|
275
|
-
generate_confirmation_token
|
276
|
-
end
|
261
|
+
|
262
|
+
def postpone_email_change_until_confirmation_and_regenerate_confirmation_token
|
263
|
+
@reconfirmation_required = true
|
264
|
+
self.unconfirmed_email = self.email
|
265
|
+
self.email = self.devise_email_in_database
|
266
|
+
self.confirmation_token = nil
|
267
|
+
generate_confirmation_token
|
277
268
|
end
|
278
269
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
postpone
|
288
|
-
end
|
289
|
-
else
|
290
|
-
def postpone_email_change?
|
291
|
-
postpone = self.class.reconfirmable &&
|
292
|
-
email_changed? &&
|
293
|
-
!@bypass_confirmation_postpone &&
|
294
|
-
self.email.present? &&
|
295
|
-
(!@skip_reconfirmation_in_callback || !self.email_was.nil?)
|
296
|
-
@bypass_confirmation_postpone = false
|
297
|
-
postpone
|
298
|
-
end
|
270
|
+
def postpone_email_change?
|
271
|
+
postpone = self.class.reconfirmable &&
|
272
|
+
devise_will_save_change_to_email? &&
|
273
|
+
!@bypass_confirmation_postpone &&
|
274
|
+
self.email.present? &&
|
275
|
+
(!@skip_reconfirmation_in_callback || !self.devise_email_in_database.nil?)
|
276
|
+
@bypass_confirmation_postpone = false
|
277
|
+
postpone
|
299
278
|
end
|
300
279
|
|
301
280
|
def reconfirmation_required?
|
@@ -334,7 +313,7 @@ module Devise
|
|
334
313
|
# confirmation instructions to it. If not, try searching for a user by unconfirmed_email
|
335
314
|
# field. If no user is found, returns a new user with an email not found error.
|
336
315
|
# Options must contain the user email
|
337
|
-
def send_confirmation_instructions(attributes={})
|
316
|
+
def send_confirmation_instructions(attributes = {})
|
338
317
|
confirmable = find_by_unconfirmed_email_with_errors(attributes) if reconfirmable
|
339
318
|
unless confirmable.try(:persisted?)
|
340
319
|
confirmable = find_or_initialize_with_errors(confirmation_keys, attributes, :not_found)
|
@@ -13,7 +13,7 @@ module Devise
|
|
13
13
|
#
|
14
14
|
# == Options
|
15
15
|
#
|
16
|
-
# DatabaseAuthenticatable adds the following options to
|
16
|
+
# DatabaseAuthenticatable adds the following options to +devise+:
|
17
17
|
#
|
18
18
|
# * +pepper+: a random string used to provide a more secure hash. Use
|
19
19
|
# `rails secret` to generate new keys.
|
@@ -42,7 +42,7 @@ module Devise
|
|
42
42
|
def initialize(*args, &block)
|
43
43
|
@skip_email_changed_notification = false
|
44
44
|
@skip_password_change_notification = false
|
45
|
-
super
|
45
|
+
super
|
46
46
|
end
|
47
47
|
|
48
48
|
# Skips sending the email changed notification after_update
|
@@ -177,16 +177,9 @@ module Devise
|
|
177
177
|
encrypted_password[0,29] if encrypted_password
|
178
178
|
end
|
179
179
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
send_devise_notification(:email_changed, to: email_before_last_save)
|
184
|
-
end
|
185
|
-
else
|
186
|
-
# Send notification to user when email changes.
|
187
|
-
def send_email_changed_notification
|
188
|
-
send_devise_notification(:email_changed, to: email_was)
|
189
|
-
end
|
180
|
+
# Send notification to user when email changes.
|
181
|
+
def send_email_changed_notification
|
182
|
+
send_devise_notification(:email_changed, to: devise_email_before_last_save)
|
190
183
|
end
|
191
184
|
|
192
185
|
# Send notification to user when password changes.
|
@@ -205,24 +198,12 @@ module Devise
|
|
205
198
|
Devise::Encryptor.digest(self.class, password)
|
206
199
|
end
|
207
200
|
|
208
|
-
|
209
|
-
|
210
|
-
self.class.send_email_changed_notification && saved_change_to_email? && !@skip_email_changed_notification
|
211
|
-
end
|
212
|
-
else
|
213
|
-
def send_email_changed_notification?
|
214
|
-
self.class.send_email_changed_notification && email_changed? && !@skip_email_changed_notification
|
215
|
-
end
|
201
|
+
def send_email_changed_notification?
|
202
|
+
self.class.send_email_changed_notification && devise_saved_change_to_email? && !@skip_email_changed_notification
|
216
203
|
end
|
217
204
|
|
218
|
-
|
219
|
-
|
220
|
-
self.class.send_password_change_notification && saved_change_to_encrypted_password? && !@skip_password_change_notification
|
221
|
-
end
|
222
|
-
else
|
223
|
-
def send_password_change_notification?
|
224
|
-
self.class.send_password_change_notification && encrypted_password_changed? && !@skip_password_change_notification
|
225
|
-
end
|
205
|
+
def send_password_change_notification?
|
206
|
+
self.class.send_password_change_notification && devise_saved_change_to_encrypted_password? && !@skip_password_change_notification
|
226
207
|
end
|
227
208
|
|
228
209
|
module ClassMethods
|
@@ -18,7 +18,7 @@ module Devise
|
|
18
18
|
# * +maximum_attempts+: how many attempts should be accepted before blocking the user.
|
19
19
|
# * +lock_strategy+: lock the user account by :failed_attempts or :none.
|
20
20
|
# * +unlock_strategy+: unlock the user account by :time, :email, :both or :none.
|
21
|
-
# * +unlock_in+: the time you want to
|
21
|
+
# * +unlock_in+: the time you want to unlock the user after lock happens. Only available when unlock_strategy is :time or :both.
|
22
22
|
# * +unlock_keys+: the keys you want to use when locking and unlocking an account
|
23
23
|
#
|
24
24
|
module Lockable
|
@@ -57,6 +57,14 @@ module Devise
|
|
57
57
|
save(validate: false)
|
58
58
|
end
|
59
59
|
|
60
|
+
# Resets failed attempts counter to 0.
|
61
|
+
def reset_failed_attempts!
|
62
|
+
if respond_to?(:failed_attempts) && !failed_attempts.to_i.zero?
|
63
|
+
self.failed_attempts = 0
|
64
|
+
save(validate: false)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
60
68
|
# Verifies whether a user is locked or not.
|
61
69
|
def access_locked?
|
62
70
|
!!locked_at && !lock_expired?
|
@@ -110,7 +118,7 @@ module Devise
|
|
110
118
|
false
|
111
119
|
end
|
112
120
|
end
|
113
|
-
|
121
|
+
|
114
122
|
def increment_failed_attempts
|
115
123
|
self.class.increment_counter(:failed_attempts, id)
|
116
124
|
reload
|
@@ -168,7 +176,7 @@ module Devise
|
|
168
176
|
# unlock instructions to it. If not user is found, returns a new user
|
169
177
|
# with an email not found error.
|
170
178
|
# Options must contain the user's unlock keys
|
171
|
-
def send_unlock_instructions(attributes={})
|
179
|
+
def send_unlock_instructions(attributes = {})
|
172
180
|
lockable = find_or_initialize_with_errors(unlock_keys, attributes, :not_found)
|
173
181
|
lockable.resend_unlock_instructions if lockable.persisted?
|
174
182
|
lockable
|
@@ -8,11 +8,11 @@ module Devise
|
|
8
8
|
#
|
9
9
|
# == Options
|
10
10
|
#
|
11
|
-
# Oauthable adds the following options to
|
11
|
+
# Oauthable adds the following options to +devise+:
|
12
12
|
#
|
13
13
|
# * +omniauth_providers+: Which providers are available to this model. It expects an array:
|
14
14
|
#
|
15
|
-
#
|
15
|
+
# devise :database_authenticatable, :omniauthable, omniauth_providers: [:twitter]
|
16
16
|
#
|
17
17
|
module Omniauthable
|
18
18
|
extend ActiveSupport::Concern
|
@@ -7,7 +7,7 @@ module Devise
|
|
7
7
|
#
|
8
8
|
# ==Options
|
9
9
|
#
|
10
|
-
# Recoverable adds the following options to
|
10
|
+
# Recoverable adds the following options to +devise+:
|
11
11
|
#
|
12
12
|
# * +reset_password_keys+: the keys you want to use when recovering the password for an account
|
13
13
|
# * +reset_password_within+: the time period within which the password must be reset or the token expires.
|
@@ -99,24 +99,13 @@ module Devise
|
|
99
99
|
send_devise_notification(:reset_password_instructions, token, {})
|
100
100
|
end
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
respond_to?("will_save_change_to_#{attribute}?") && send("will_save_change_to_#{attribute}?")
|
107
|
-
end
|
108
|
-
|
109
|
-
authentication_keys_changed || encrypted_password_changed
|
102
|
+
def clear_reset_password_token?
|
103
|
+
encrypted_password_changed = devise_respond_to_and_will_save_change_to_attribute?(:encrypted_password)
|
104
|
+
authentication_keys_changed = self.class.authentication_keys.any? do |attribute|
|
105
|
+
devise_respond_to_and_will_save_change_to_attribute?(attribute)
|
110
106
|
end
|
111
|
-
else
|
112
|
-
def clear_reset_password_token?
|
113
|
-
encrypted_password_changed = respond_to?(:encrypted_password_changed?) && encrypted_password_changed?
|
114
|
-
authentication_keys_changed = self.class.authentication_keys.any? do |attribute|
|
115
|
-
respond_to?("#{attribute}_changed?") && send("#{attribute}_changed?")
|
116
|
-
end
|
117
107
|
|
118
|
-
|
119
|
-
end
|
108
|
+
authentication_keys_changed || encrypted_password_changed
|
120
109
|
end
|
121
110
|
|
122
111
|
module ClassMethods
|
@@ -131,7 +120,7 @@ module Devise
|
|
131
120
|
# password instructions to it. If user is not found, returns a new user
|
132
121
|
# with an email not found error.
|
133
122
|
# Attributes must contain the user's email
|
134
|
-
def send_reset_password_instructions(attributes={})
|
123
|
+
def send_reset_password_instructions(attributes = {})
|
135
124
|
recoverable = find_or_initialize_with_errors(reset_password_keys, attributes, :not_found)
|
136
125
|
recoverable.send_reset_password_instructions if recoverable.persisted?
|
137
126
|
recoverable
|
@@ -142,7 +131,7 @@ module Devise
|
|
142
131
|
# try saving the record. If not user is found, returns a new user
|
143
132
|
# containing an error in reset_password_token attribute.
|
144
133
|
# Attributes must contain reset_password_token, password and confirmation
|
145
|
-
def reset_password_by_token(attributes={})
|
134
|
+
def reset_password_by_token(attributes = {})
|
146
135
|
original_token = attributes[:reset_password_token]
|
147
136
|
reset_password_token = Devise.token_generator.digest(self, :reset_password_token, original_token)
|
148
137
|
|
@@ -15,7 +15,7 @@ module Devise
|
|
15
15
|
#
|
16
16
|
# == Options
|
17
17
|
#
|
18
|
-
# Rememberable adds the following options
|
18
|
+
# Rememberable adds the following options to +devise+:
|
19
19
|
#
|
20
20
|
# * +remember_for+: the time you want the user will be remembered without
|
21
21
|
# asking for credentials. After this time the user will be blocked and
|
@@ -9,7 +9,7 @@ module Devise
|
|
9
9
|
#
|
10
10
|
# == Options
|
11
11
|
#
|
12
|
-
# Validatable adds the following options to
|
12
|
+
# Validatable adds the following options to +devise+:
|
13
13
|
#
|
14
14
|
# * +email_regexp+: the regular expression used to validate e-mails;
|
15
15
|
# * +password_length+: a range expressing password length. Defaults to 6..128.
|
@@ -29,13 +29,8 @@ module Devise
|
|
29
29
|
|
30
30
|
base.class_eval do
|
31
31
|
validates_presence_of :email, if: :email_required?
|
32
|
-
if
|
33
|
-
|
34
|
-
validates_format_of :email, with: email_regexp, allow_blank: true, if: :will_save_change_to_email?
|
35
|
-
else
|
36
|
-
validates_uniqueness_of :email, allow_blank: true, if: :email_changed?
|
37
|
-
validates_format_of :email, with: email_regexp, allow_blank: true, if: :email_changed?
|
38
|
-
end
|
32
|
+
validates_uniqueness_of :email, allow_blank: true, case_sensitive: true, if: :devise_will_save_change_to_email?
|
33
|
+
validates_format_of :email, with: email_regexp, allow_blank: true, if: :devise_will_save_change_to_email?
|
39
34
|
|
40
35
|
validates_presence_of :password, if: :password_required?
|
41
36
|
validates_confirmation_of :password, if: :password_required?
|
@@ -47,7 +42,7 @@ module Devise
|
|
47
42
|
unavailable_validations = VALIDATIONS.select { |v| !base.respond_to?(v) }
|
48
43
|
|
49
44
|
unless unavailable_validations.empty?
|
50
|
-
raise "Could not use :validatable module since #{base} does not respond "
|
45
|
+
raise "Could not use :validatable module since #{base} does not respond " \
|
51
46
|
"to the following methods: #{unavailable_validations.to_sentence}."
|
52
47
|
end
|
53
48
|
end
|
data/lib/devise/models.rb
CHANGED
data/lib/devise/omniauth.rb
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
begin
|
4
|
+
gem "omniauth", ">= 1.0.0"
|
5
|
+
|
4
6
|
require "omniauth"
|
5
|
-
require "omniauth/version"
|
6
7
|
rescue LoadError
|
7
8
|
warn "Could not load 'omniauth'. Please ensure you have the omniauth gem >= 1.0.0 installed and listed in your Gemfile."
|
8
9
|
raise
|
9
10
|
end
|
10
11
|
|
11
|
-
unless OmniAuth::VERSION =~ /^1\./
|
12
|
-
raise "You are using an old OmniAuth version, please ensure you have 1.0.0.pr2 version or later installed."
|
13
|
-
end
|
14
|
-
|
15
12
|
# Clean up the default path_prefix. It will be automatically set by Devise.
|
16
13
|
OmniAuth.config.path_prefix = nil
|
17
14
|
|
data/lib/devise/orm.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
module Devise
|
2
|
+
module Orm # :nodoc:
|
3
|
+
def self.active_record?(model)
|
4
|
+
defined?(ActiveRecord) && model < ActiveRecord::Base
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.active_record_51?(model)
|
8
|
+
active_record?(model) && ActiveRecord.gem_version >= Gem::Version.new("5.1.x")
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.included(model)
|
12
|
+
if Devise::Orm.active_record_51?(model)
|
13
|
+
model.include DirtyTrackingNewMethods
|
14
|
+
else
|
15
|
+
model.include DirtyTrackingOldMethods
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module DirtyTrackingNewMethods
|
20
|
+
def devise_email_before_last_save
|
21
|
+
email_before_last_save
|
22
|
+
end
|
23
|
+
|
24
|
+
def devise_email_in_database
|
25
|
+
email_in_database
|
26
|
+
end
|
27
|
+
|
28
|
+
def devise_saved_change_to_email?
|
29
|
+
saved_change_to_email?
|
30
|
+
end
|
31
|
+
|
32
|
+
def devise_saved_change_to_encrypted_password?
|
33
|
+
saved_change_to_encrypted_password?
|
34
|
+
end
|
35
|
+
|
36
|
+
def devise_will_save_change_to_email?
|
37
|
+
will_save_change_to_email?
|
38
|
+
end
|
39
|
+
|
40
|
+
def devise_respond_to_and_will_save_change_to_attribute?(attribute)
|
41
|
+
respond_to?("will_save_change_to_#{attribute}?") && send("will_save_change_to_#{attribute}?")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module DirtyTrackingOldMethods
|
46
|
+
def devise_email_before_last_save
|
47
|
+
email_was
|
48
|
+
end
|
49
|
+
|
50
|
+
def devise_email_in_database
|
51
|
+
email_was
|
52
|
+
end
|
53
|
+
|
54
|
+
def devise_saved_change_to_email?
|
55
|
+
email_changed?
|
56
|
+
end
|
57
|
+
|
58
|
+
def devise_saved_change_to_encrypted_password?
|
59
|
+
encrypted_password_changed?
|
60
|
+
end
|
61
|
+
|
62
|
+
def devise_will_save_change_to_email?
|
63
|
+
email_changed?
|
64
|
+
end
|
65
|
+
|
66
|
+
def devise_respond_to_and_will_save_change_to_attribute?(attribute)
|
67
|
+
respond_to?("#{attribute}_changed?") && send("#{attribute}_changed?")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'active_support/deprecation/constant_accessor'
|
5
|
+
|
6
|
+
module Devise
|
7
|
+
DeprecatedConstantAccessor = ActiveSupport::Deprecation::DeprecatedConstantAccessor #:nodoc:
|
8
|
+
end
|
9
|
+
rescue LoadError
|
10
|
+
|
11
|
+
# Copy of constant deprecation module from Rails / Active Support version 6, so we can use it
|
12
|
+
# with Rails <= 5.0 versions. This can be removed once we support only Rails 5.1 or greater.
|
13
|
+
module Devise
|
14
|
+
module DeprecatedConstantAccessor #:nodoc:
|
15
|
+
def self.included(base)
|
16
|
+
require "active_support/inflector/methods"
|
17
|
+
|
18
|
+
extension = Module.new do
|
19
|
+
def const_missing(missing_const_name)
|
20
|
+
if class_variable_defined?(:@@_deprecated_constants)
|
21
|
+
if (replacement = class_variable_get(:@@_deprecated_constants)[missing_const_name.to_s])
|
22
|
+
replacement[:deprecator].warn(replacement[:message] || "#{name}::#{missing_const_name} is deprecated! Use #{replacement[:new]} instead.", Rails::VERSION::MAJOR == 4 ? caller : caller_locations)
|
23
|
+
return ActiveSupport::Inflector.constantize(replacement[:new].to_s)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
def deprecate_constant(const_name, new_constant, message: nil, deprecator: ActiveSupport::Deprecation.instance)
|
30
|
+
class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants)
|
31
|
+
class_variable_get(:@@_deprecated_constants)[const_name.to_s] = { new: new_constant, message: message, deprecator: deprecator }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
base.singleton_class.prepend extension
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/lib/devise/rails/routes.rb
CHANGED
@@ -287,7 +287,7 @@ module ActionDispatch::Routing
|
|
287
287
|
# root to: "admin/dashboard#show", as: :user_root
|
288
288
|
# end
|
289
289
|
#
|
290
|
-
def authenticate(scope=nil, block=nil)
|
290
|
+
def authenticate(scope = nil, block = nil)
|
291
291
|
constraints_for(:authenticate!, scope, block) do
|
292
292
|
yield
|
293
293
|
end
|
@@ -311,7 +311,7 @@ module ActionDispatch::Routing
|
|
311
311
|
#
|
312
312
|
# root to: 'landing#show'
|
313
313
|
#
|
314
|
-
def authenticated(scope=nil, block=nil)
|
314
|
+
def authenticated(scope = nil, block = nil)
|
315
315
|
constraints_for(:authenticate?, scope, block) do
|
316
316
|
yield
|
317
317
|
end
|
@@ -328,7 +328,7 @@ module ActionDispatch::Routing
|
|
328
328
|
#
|
329
329
|
# root to: 'dashboard#show'
|
330
330
|
#
|
331
|
-
def unauthenticated(scope=nil)
|
331
|
+
def unauthenticated(scope = nil)
|
332
332
|
constraint = lambda do |request|
|
333
333
|
not request.env["warden"].authenticate? scope: scope
|
334
334
|
end
|
@@ -474,7 +474,7 @@ ERROR
|
|
474
474
|
@scope = current_scope
|
475
475
|
end
|
476
476
|
|
477
|
-
def constraints_for(method_to_apply, scope=nil, block=nil)
|
477
|
+
def constraints_for(method_to_apply, scope = nil, block = nil)
|
478
478
|
constraint = lambda do |request|
|
479
479
|
request.env['warden'].send(method_to_apply, scope: scope) &&
|
480
480
|
(block.nil? || block.call(request.env["warden"].user(scope)))
|
@@ -143,7 +143,7 @@ module Devise
|
|
143
143
|
@controller.response.headers.merge!(headers)
|
144
144
|
@controller.response.content_type = headers["Content-Type"] unless Rails::VERSION::MAJOR >= 5
|
145
145
|
@controller.status = status
|
146
|
-
@controller.
|
146
|
+
@controller.response_body = response.body
|
147
147
|
nil # causes process return @response
|
148
148
|
end
|
149
149
|
|
data/lib/devise/version.rb
CHANGED