devise 4.1.1 → 4.8.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.
Files changed (255) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +224 -4
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +275 -90
  5. data/app/controllers/devise/confirmations_controller.rb +2 -0
  6. data/app/controllers/devise/omniauth_callbacks_controller.rb +7 -5
  7. data/app/controllers/devise/passwords_controller.rb +3 -0
  8. data/app/controllers/devise/registrations_controller.rb +34 -13
  9. data/app/controllers/devise/sessions_controller.rb +3 -1
  10. data/app/controllers/devise/unlocks_controller.rb +2 -0
  11. data/app/controllers/devise_controller.rb +5 -3
  12. data/app/helpers/devise_helper.rb +23 -18
  13. data/app/mailers/devise/mailer.rb +10 -4
  14. data/app/views/devise/confirmations/new.html.erb +2 -2
  15. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  16. data/app/views/devise/passwords/edit.html.erb +3 -3
  17. data/app/views/devise/passwords/new.html.erb +2 -2
  18. data/app/views/devise/registrations/edit.html.erb +9 -5
  19. data/app/views/devise/registrations/new.html.erb +4 -4
  20. data/app/views/devise/sessions/new.html.erb +4 -4
  21. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  22. data/app/views/devise/shared/_links.html.erb +8 -8
  23. data/app/views/devise/unlocks/new.html.erb +2 -2
  24. data/config/locales/en.yml +5 -2
  25. data/lib/devise.rb +39 -17
  26. data/lib/devise/controllers/helpers.rb +22 -9
  27. data/lib/devise/controllers/rememberable.rb +3 -1
  28. data/lib/devise/controllers/scoped_views.rb +2 -0
  29. data/lib/devise/controllers/sign_in_out.rb +39 -14
  30. data/lib/devise/controllers/store_location.rb +25 -7
  31. data/lib/devise/controllers/url_helpers.rb +3 -1
  32. data/lib/devise/delegator.rb +2 -0
  33. data/lib/devise/encryptor.rb +2 -0
  34. data/lib/devise/failure_app.rb +63 -33
  35. data/lib/devise/hooks/activatable.rb +2 -0
  36. data/lib/devise/hooks/csrf_cleaner.rb +2 -0
  37. data/lib/devise/hooks/forgetable.rb +2 -0
  38. data/lib/devise/hooks/lockable.rb +4 -2
  39. data/lib/devise/hooks/proxy.rb +3 -1
  40. data/lib/devise/hooks/rememberable.rb +2 -0
  41. data/lib/devise/hooks/timeoutable.rb +4 -2
  42. data/lib/devise/hooks/trackable.rb +2 -0
  43. data/lib/devise/mailers/helpers.rb +6 -3
  44. data/lib/devise/mapping.rb +3 -1
  45. data/lib/devise/models.rb +3 -1
  46. data/lib/devise/models/authenticatable.rb +63 -37
  47. data/lib/devise/models/confirmable.rb +79 -22
  48. data/lib/devise/models/database_authenticatable.rb +86 -17
  49. data/lib/devise/models/lockable.rb +17 -3
  50. data/lib/devise/models/omniauthable.rb +2 -0
  51. data/lib/devise/models/recoverable.rb +32 -20
  52. data/lib/devise/models/registerable.rb +4 -0
  53. data/lib/devise/models/rememberable.rb +5 -3
  54. data/lib/devise/models/timeoutable.rb +2 -0
  55. data/lib/devise/models/trackable.rb +15 -1
  56. data/lib/devise/models/validatable.rb +10 -3
  57. data/lib/devise/modules.rb +2 -0
  58. data/lib/devise/omniauth.rb +4 -5
  59. data/lib/devise/omniauth/config.rb +2 -0
  60. data/lib/devise/omniauth/url_helpers.rb +2 -51
  61. data/lib/devise/orm/active_record.rb +5 -1
  62. data/lib/devise/orm/mongoid.rb +6 -2
  63. data/lib/devise/parameter_filter.rb +4 -0
  64. data/lib/devise/parameter_sanitizer.rb +15 -56
  65. data/lib/devise/rails.rb +6 -6
  66. data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
  67. data/lib/devise/rails/routes.rb +9 -7
  68. data/lib/devise/rails/warden_compat.rb +2 -0
  69. data/lib/devise/secret_key_finder.rb +27 -0
  70. data/lib/devise/strategies/authenticatable.rb +3 -1
  71. data/lib/devise/strategies/base.rb +2 -0
  72. data/lib/devise/strategies/database_authenticatable.rb +8 -1
  73. data/lib/devise/strategies/rememberable.rb +2 -0
  74. data/lib/devise/test/controller_helpers.rb +167 -0
  75. data/lib/devise/test/integration_helpers.rb +63 -0
  76. data/lib/devise/test_helpers.rb +7 -129
  77. data/lib/devise/time_inflector.rb +2 -0
  78. data/lib/devise/token_generator.rb +2 -0
  79. data/lib/devise/version.rb +3 -1
  80. data/lib/generators/active_record/devise_generator.rb +40 -12
  81. data/lib/generators/active_record/templates/migration.rb +3 -1
  82. data/lib/generators/active_record/templates/migration_existing.rb +2 -0
  83. data/lib/generators/devise/controllers_generator.rb +3 -1
  84. data/lib/generators/devise/devise_generator.rb +5 -3
  85. data/lib/generators/devise/install_generator.rb +3 -5
  86. data/lib/generators/devise/orm_helpers.rb +9 -3
  87. data/lib/generators/devise/views_generator.rb +8 -9
  88. data/lib/generators/mongoid/devise_generator.rb +7 -5
  89. data/lib/generators/templates/README +9 -8
  90. data/lib/generators/templates/controllers/confirmations_controller.rb +2 -0
  91. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +3 -1
  92. data/lib/generators/templates/controllers/passwords_controller.rb +2 -0
  93. data/lib/generators/templates/controllers/registrations_controller.rb +4 -2
  94. data/lib/generators/templates/controllers/sessions_controller.rb +3 -1
  95. data/lib/generators/templates/controllers/unlocks_controller.rb +2 -0
  96. data/lib/generators/templates/devise.rb +49 -6
  97. data/lib/generators/templates/markerb/email_changed.markerb +7 -0
  98. data/lib/generators/templates/markerb/password_change.markerb +2 -2
  99. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +5 -1
  100. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +10 -2
  101. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +4 -1
  102. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +11 -3
  103. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +11 -3
  104. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +7 -2
  105. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +4 -1
  106. metadata +16 -297
  107. data/.gitignore +0 -10
  108. data/.travis.yml +0 -44
  109. data/.yardopts +0 -9
  110. data/CODE_OF_CONDUCT.md +0 -22
  111. data/CONTRIBUTING.md +0 -16
  112. data/Gemfile +0 -30
  113. data/Gemfile.lock +0 -182
  114. data/Rakefile +0 -36
  115. data/bin/test +0 -13
  116. data/devise.gemspec +0 -26
  117. data/devise.png +0 -0
  118. data/gemfiles/Gemfile.rails-4.1-stable +0 -30
  119. data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -170
  120. data/gemfiles/Gemfile.rails-4.2-stable +0 -30
  121. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -192
  122. data/gemfiles/Gemfile.rails-5.0-beta +0 -37
  123. data/gemfiles/Gemfile.rails-5.0-beta.lock +0 -199
  124. data/test/controllers/custom_registrations_controller_test.rb +0 -40
  125. data/test/controllers/custom_strategy_test.rb +0 -64
  126. data/test/controllers/helper_methods_test.rb +0 -22
  127. data/test/controllers/helpers_test.rb +0 -316
  128. data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -51
  129. data/test/controllers/internal_helpers_test.rb +0 -127
  130. data/test/controllers/load_hooks_controller_test.rb +0 -19
  131. data/test/controllers/passwords_controller_test.rb +0 -32
  132. data/test/controllers/sessions_controller_test.rb +0 -106
  133. data/test/controllers/url_helpers_test.rb +0 -65
  134. data/test/delegator_test.rb +0 -19
  135. data/test/devise_test.rb +0 -107
  136. data/test/failure_app_test.rb +0 -320
  137. data/test/generators/active_record_generator_test.rb +0 -83
  138. data/test/generators/controllers_generator_test.rb +0 -48
  139. data/test/generators/devise_generator_test.rb +0 -39
  140. data/test/generators/install_generator_test.rb +0 -24
  141. data/test/generators/mongoid_generator_test.rb +0 -23
  142. data/test/generators/views_generator_test.rb +0 -103
  143. data/test/helpers/devise_helper_test.rb +0 -49
  144. data/test/integration/authenticatable_test.rb +0 -698
  145. data/test/integration/confirmable_test.rb +0 -324
  146. data/test/integration/database_authenticatable_test.rb +0 -95
  147. data/test/integration/http_authenticatable_test.rb +0 -106
  148. data/test/integration/lockable_test.rb +0 -240
  149. data/test/integration/omniauthable_test.rb +0 -135
  150. data/test/integration/recoverable_test.rb +0 -347
  151. data/test/integration/registerable_test.rb +0 -357
  152. data/test/integration/rememberable_test.rb +0 -211
  153. data/test/integration/timeoutable_test.rb +0 -184
  154. data/test/integration/trackable_test.rb +0 -92
  155. data/test/mailers/confirmation_instructions_test.rb +0 -115
  156. data/test/mailers/reset_password_instructions_test.rb +0 -96
  157. data/test/mailers/unlock_instructions_test.rb +0 -91
  158. data/test/mapping_test.rb +0 -134
  159. data/test/models/authenticatable_test.rb +0 -23
  160. data/test/models/confirmable_test.rb +0 -511
  161. data/test/models/database_authenticatable_test.rb +0 -269
  162. data/test/models/lockable_test.rb +0 -350
  163. data/test/models/omniauthable_test.rb +0 -7
  164. data/test/models/recoverable_test.rb +0 -251
  165. data/test/models/registerable_test.rb +0 -7
  166. data/test/models/rememberable_test.rb +0 -169
  167. data/test/models/serializable_test.rb +0 -49
  168. data/test/models/timeoutable_test.rb +0 -51
  169. data/test/models/trackable_test.rb +0 -41
  170. data/test/models/validatable_test.rb +0 -119
  171. data/test/models_test.rb +0 -153
  172. data/test/omniauth/config_test.rb +0 -57
  173. data/test/omniauth/url_helpers_test.rb +0 -51
  174. data/test/orm/active_record.rb +0 -17
  175. data/test/orm/mongoid.rb +0 -13
  176. data/test/parameter_sanitizer_test.rb +0 -131
  177. data/test/rails_app/Rakefile +0 -6
  178. data/test/rails_app/app/active_record/admin.rb +0 -6
  179. data/test/rails_app/app/active_record/shim.rb +0 -2
  180. data/test/rails_app/app/active_record/user.rb +0 -7
  181. data/test/rails_app/app/active_record/user_on_engine.rb +0 -7
  182. data/test/rails_app/app/active_record/user_on_main_app.rb +0 -7
  183. data/test/rails_app/app/active_record/user_without_email.rb +0 -8
  184. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
  185. data/test/rails_app/app/controllers/admins_controller.rb +0 -6
  186. data/test/rails_app/app/controllers/application_controller.rb +0 -11
  187. data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -30
  188. data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -31
  189. data/test/rails_app/app/controllers/home_controller.rb +0 -29
  190. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
  191. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
  192. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
  193. data/test/rails_app/app/controllers/users_controller.rb +0 -31
  194. data/test/rails_app/app/helpers/application_helper.rb +0 -3
  195. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -3
  196. data/test/rails_app/app/mailers/users/mailer.rb +0 -3
  197. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -4
  198. data/test/rails_app/app/mongoid/admin.rb +0 -29
  199. data/test/rails_app/app/mongoid/shim.rb +0 -23
  200. data/test/rails_app/app/mongoid/user.rb +0 -39
  201. data/test/rails_app/app/mongoid/user_on_engine.rb +0 -39
  202. data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -39
  203. data/test/rails_app/app/mongoid/user_without_email.rb +0 -33
  204. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  205. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  206. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  207. data/test/rails_app/app/views/home/index.html.erb +0 -1
  208. data/test/rails_app/app/views/home/join.html.erb +0 -1
  209. data/test/rails_app/app/views/home/private.html.erb +0 -1
  210. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  211. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  212. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  213. data/test/rails_app/app/views/users/index.html.erb +0 -1
  214. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  215. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  216. data/test/rails_app/bin/bundle +0 -3
  217. data/test/rails_app/bin/rails +0 -4
  218. data/test/rails_app/bin/rake +0 -4
  219. data/test/rails_app/config.ru +0 -4
  220. data/test/rails_app/config/application.rb +0 -44
  221. data/test/rails_app/config/boot.rb +0 -14
  222. data/test/rails_app/config/database.yml +0 -18
  223. data/test/rails_app/config/environment.rb +0 -5
  224. data/test/rails_app/config/environments/development.rb +0 -30
  225. data/test/rails_app/config/environments/production.rb +0 -84
  226. data/test/rails_app/config/environments/test.rb +0 -46
  227. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  228. data/test/rails_app/config/initializers/devise.rb +0 -180
  229. data/test/rails_app/config/initializers/inflections.rb +0 -2
  230. data/test/rails_app/config/initializers/secret_token.rb +0 -3
  231. data/test/rails_app/config/initializers/session_store.rb +0 -1
  232. data/test/rails_app/config/routes.rb +0 -126
  233. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -71
  234. data/test/rails_app/db/schema.rb +0 -55
  235. data/test/rails_app/lib/shared_admin.rb +0 -17
  236. data/test/rails_app/lib/shared_user.rb +0 -30
  237. data/test/rails_app/lib/shared_user_without_email.rb +0 -26
  238. data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -13
  239. data/test/rails_app/public/404.html +0 -26
  240. data/test/rails_app/public/422.html +0 -26
  241. data/test/rails_app/public/500.html +0 -26
  242. data/test/rails_app/public/favicon.ico +0 -0
  243. data/test/rails_test.rb +0 -9
  244. data/test/routes_test.rb +0 -279
  245. data/test/support/action_controller/record_identifier.rb +0 -10
  246. data/test/support/assertions.rb +0 -39
  247. data/test/support/helpers.rb +0 -77
  248. data/test/support/http_method_compatibility.rb +0 -51
  249. data/test/support/integration.rb +0 -92
  250. data/test/support/locale/en.yml +0 -8
  251. data/test/support/mongoid.yml +0 -6
  252. data/test/support/webrat/integrations/rails.rb +0 -33
  253. data/test/test_helper.rb +0 -34
  254. data/test/test_helpers_test.rb +0 -178
  255. data/test/test_models.rb +0 -33
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module Models
3
5
  # Registerable is responsible for everything related to registering a new
@@ -19,6 +21,8 @@ module Devise
19
21
  def new_with_session(params, session)
20
22
  new(params)
21
23
  end
24
+
25
+ Devise::Models.config(self, :sign_in_after_change_password)
22
26
  end
23
27
  end
24
28
  end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'devise/strategies/rememberable'
2
4
  require 'devise/hooks/rememberable'
3
5
  require 'devise/hooks/forgetable'
4
6
 
5
7
  module Devise
6
8
  module Models
7
- # Rememberable manages generating and clearing token for remember the user
9
+ # Rememberable manages generating and clearing token for remembering the user
8
10
  # from a saved cookie. Rememberable also has utility methods for dealing
9
11
  # with serializing the user into the cookie and back from the cookie, trying
10
12
  # to lookup the record based on the saved information.
@@ -74,7 +76,7 @@ module Devise
74
76
  elsif respond_to?(:authenticatable_salt) && (salt = authenticatable_salt.presence)
75
77
  salt
76
78
  else
77
- raise "authenticable_salt returned nil for the #{self.class.name} model. " \
79
+ raise "authenticatable_salt returned nil for the #{self.class.name} model. " \
78
80
  "In order to use rememberable, you must ensure a password is always set " \
79
81
  "or have a remember_token column in your model or implement your own " \
80
82
  "rememberable_value in the model with custom logic."
@@ -100,7 +102,7 @@ module Devise
100
102
 
101
103
  def remember_me?(token, generated_at)
102
104
  # 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
105
+ # in a single place https://github.com/heartcombo/devise/blob/ffe9d6d406e79108cf32a2c6a1d0b3828849c40b/lib/devise/hooks/timeoutable.rb#L14-L18
104
106
  if generated_at.is_a?(String)
105
107
  generated_at = time_from_json(generated_at)
106
108
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'devise/hooks/timeoutable'
2
4
 
3
5
  module Devise
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'devise/hooks/trackable'
2
4
 
3
5
  module Devise
@@ -20,7 +22,7 @@ module Devise
20
22
  self.last_sign_in_at = old_current || new_current
21
23
  self.current_sign_in_at = new_current
22
24
 
23
- old_current, new_current = self.current_sign_in_ip, request.remote_ip
25
+ old_current, new_current = self.current_sign_in_ip, extract_ip_from(request)
24
26
  self.last_sign_in_ip = old_current || new_current
25
27
  self.current_sign_in_ip = new_current
26
28
 
@@ -29,9 +31,21 @@ module Devise
29
31
  end
30
32
 
31
33
  def update_tracked_fields!(request)
34
+ # We have to check if the user is already persisted before running
35
+ # `save` here because invalid users can be saved if we don't.
36
+ # See https://github.com/heartcombo/devise/issues/4673 for more details.
37
+ return if new_record?
38
+
32
39
  update_tracked_fields(request)
33
40
  save(validate: false)
34
41
  end
42
+
43
+ protected
44
+
45
+ def extract_ip_from(request)
46
+ request.remote_ip
47
+ end
48
+
35
49
  end
36
50
  end
37
51
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module Models
3
5
  # Validatable creates all needed validations for a user email and password.
@@ -10,7 +12,7 @@ module Devise
10
12
  # Validatable adds the following options to devise_for:
11
13
  #
12
14
  # * +email_regexp+: the regular expression used to validate e-mails;
13
- # * +password_length+: a range expressing password length. Defaults to 8..72.
15
+ # * +password_length+: a range expressing password length. Defaults to 6..128.
14
16
  #
15
17
  module Validatable
16
18
  # All validations used by this module.
@@ -27,8 +29,13 @@ module Devise
27
29
 
28
30
  base.class_eval do
29
31
  validates_presence_of :email, if: :email_required?
30
- validates_uniqueness_of :email, allow_blank: true, if: :email_changed?
31
- validates_format_of :email, with: email_regexp, allow_blank: true, if: :email_changed?
32
+ if Devise.activerecord51?
33
+ validates_uniqueness_of :email, allow_blank: true, case_sensitive: true, if: :will_save_change_to_email?
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
39
 
33
40
  validates_presence_of :password, if: :password_required?
34
41
  validates_confirmation_of :password, if: :password_required?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/core_ext/object/with_options'
2
4
 
3
5
  Devise.with_options model: true do |d|
@@ -1,15 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
4
+ gem "omniauth", ">= 1.0.0"
5
+
2
6
  require "omniauth"
3
- require "omniauth/version"
4
7
  rescue LoadError
5
8
  warn "Could not load 'omniauth'. Please ensure you have the omniauth gem >= 1.0.0 installed and listed in your Gemfile."
6
9
  raise
7
10
  end
8
11
 
9
- unless OmniAuth::VERSION =~ /^1\./
10
- raise "You are using an old OmniAuth version, please ensure you have 1.0.0.pr2 version or later installed."
11
- end
12
-
13
12
  # Clean up the default path_prefix. It will be automatically set by Devise.
14
13
  OmniAuth.config.path_prefix = nil
15
14
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module OmniAuth
3
5
  class StrategyNotFound < NameError
@@ -1,57 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  module OmniAuth
3
5
  module UrlHelpers
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.2.
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.2.
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.2.
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.2.
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
6
  def omniauth_authorize_path(resource_or_scope, provider, *args)
56
7
  scope = Devise::Mapping.find_scope!(resource_or_scope)
57
8
  _devise_route_context.send("#{scope}_#{provider}_omniauth_authorize_path", *args)
@@ -1,3 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'orm_adapter/adapters/active_record'
2
4
 
3
- ActiveRecord::Base.extend Devise::Models
5
+ ActiveSupport.on_load(:active_record) do
6
+ extend Devise::Models
7
+ end
@@ -1,3 +1,7 @@
1
- require 'orm_adapter/adapters/mongoid'
1
+ # frozen_string_literal: true
2
2
 
3
- Mongoid::Document::ClassMethods.send :include, Devise::Models
3
+ ActiveSupport.on_load(:mongoid) do
4
+ require 'orm_adapter/adapters/mongoid'
5
+
6
+ Mongoid::Document::ClassMethods.send :include, Devise::Models
7
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  class ParameterFilter
3
5
  def initialize(case_insensitive_keys, strip_whitespace_keys)
@@ -16,6 +18,8 @@ module Devise
16
18
 
17
19
  def filtered_hash_by_method_for_given_keys(conditions, method, condition_keys)
18
20
  condition_keys.each do |k|
21
+ next unless conditions.key?(k)
22
+
19
23
  value = conditions[k]
20
24
  conditions[k] = value.send(method) if value.respond_to?(method)
21
25
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Devise
2
4
  # The +ParameterSanitizer+ deals with permitting specific parameters values
3
5
  # for each +Devise+ scope in the application.
@@ -68,12 +70,6 @@ module Devise
68
70
  def sanitize(action)
69
71
  permissions = @permitted[action]
70
72
 
71
- # DEPRECATED: Remove this branch on Devise 4.2.
72
- if respond_to?(action, true)
73
- deprecate_instance_method_sanitization(action)
74
- return cast_to_hash send(action)
75
- end
76
-
77
73
  if permissions.respond_to?(:call)
78
74
  cast_to_hash permissions.call(default_params)
79
75
  elsif permissions.present?
@@ -127,17 +123,6 @@ module Devise
127
123
  end
128
124
  end
129
125
 
130
- # DEPRECATED: Remove this method on Devise 4.2.
131
- def for(action, &block) # :nodoc:
132
- if block_given?
133
- deprecate_for_with_block(action)
134
- permit(action, &block)
135
- else
136
- deprecate_for_without_block(action)
137
- @permitted[action] or unknown_action!(action)
138
- end
139
- end
140
-
141
126
  private
142
127
 
143
128
  # Cast a sanitized +ActionController::Parameters+ to a +HashWithIndifferentAccess+
@@ -150,7 +135,19 @@ module Devise
150
135
  end
151
136
 
152
137
  def default_params
153
- @params.fetch(@resource_name, {})
138
+ if hashable_resource_params?
139
+ @params.fetch(@resource_name)
140
+ else
141
+ empty_params
142
+ end
143
+ end
144
+
145
+ def hashable_resource_params?
146
+ @params[@resource_name].respond_to?(:permit)
147
+ end
148
+
149
+ def empty_params
150
+ ActionController::Parameters.new({})
154
151
  end
155
152
 
156
153
  def permit_keys(parameters, keys)
@@ -172,43 +169,5 @@ module Devise
172
169
  devise_parameter_sanitizer.permit(:#{action}, keys: [:param1, :param2, :param3])
173
170
  MESSAGE
174
171
  end
175
-
176
- def deprecate_for_with_block(action)
177
- ActiveSupport::Deprecation.warn(<<-MESSAGE.strip_heredoc)
178
- [Devise] Changing the sanitized parameters through "#{self.class.name}#for(#{action}) is deprecated and it will be removed from Devise 4.2.
179
- Please use the `permit` method:
180
-
181
- devise_parameter_sanitizer.permit(:#{action}) do |user|
182
- # Your block here.
183
- end
184
- MESSAGE
185
- end
186
-
187
- def deprecate_for_without_block(action)
188
- ActiveSupport::Deprecation.warn(<<-MESSAGE.strip_heredoc)
189
- [Devise] Changing the sanitized parameters through "#{self.class.name}#for(#{action}) is deprecated and it will be removed from Devise 4.2.
190
- Please use the `permit` method to add or remove any key:
191
-
192
- To add any new key, use the `keys` keyword argument:
193
- devise_parameter_sanitizer.permit(:#{action}, keys: [:param1, :param2, :param3])
194
-
195
- To remove any existing key, use the `except` keyword argument:
196
- devise_parameter_sanitizer.permit(:#{action}, except: [:email])
197
- MESSAGE
198
- end
199
-
200
- def deprecate_instance_method_sanitization(action)
201
- ActiveSupport::Deprecation.warn(<<-MESSAGE.strip_heredoc)
202
- [Devise] Parameter sanitization through a "#{self.class.name}##{action}" method is deprecated and it will be removed from Devise 4.2.
203
- Please use the `permit` method on your sanitizer `initialize` method.
204
-
205
- class #{self.class.name} < Devise::ParameterSanitizer
206
- def initialize(*)
207
- super
208
- permit(:#{action}, keys: [:param1, :param2, :param3])
209
- end
210
- end
211
- MESSAGE
212
- end
213
172
  end
214
173
  end
data/lib/devise/rails.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'devise/rails/routes'
2
4
  require 'devise/rails/warden_compat'
3
5
 
@@ -11,7 +13,9 @@ module Devise
11
13
  end
12
14
 
13
15
  # Force routes to be loaded if we are doing any eager load.
14
- config.before_eager_load { |app| app.reload_routes! }
16
+ config.before_eager_load do |app|
17
+ app.reload_routes! if Devise.reload_routes
18
+ end
15
19
 
16
20
  initializer "devise.url_helpers" do
17
21
  Devise.include_helpers(Devise::Controllers)
@@ -30,11 +34,7 @@ module Devise
30
34
  end
31
35
 
32
36
  initializer "devise.secret_key" do |app|
33
- if app.respond_to?(:secrets)
34
- Devise.secret_key ||= app.secrets.secret_key_base
35
- elsif app.config.respond_to?(:secret_key_base)
36
- Devise.secret_key ||= app.config.secret_key_base
37
- end
37
+ Devise.secret_key ||= Devise::SecretKeyFinder.new(app).find
38
38
 
39
39
  Devise.token_generator ||=
40
40
  if secret_key = Devise.secret_key
@@ -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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "active_support/core_ext/object/try"
2
4
  require "active_support/core_ext/hash/slice"
3
5
 
@@ -133,10 +135,10 @@ module ActionDispatch::Routing
133
135
  # * failure_app: a rack app which is invoked whenever there is a failure. Strings representing a given
134
136
  # are also allowed as parameter.
135
137
  #
136
- # * sign_out_via: the HTTP method(s) accepted for the :sign_out action (default: :get),
138
+ # * sign_out_via: the HTTP method(s) accepted for the :sign_out action (default: :delete),
137
139
  # if you wish to restrict this to accept only :post or :delete requests you should do:
138
140
  #
139
- # devise_for :users, sign_out_via: [:post, :delete]
141
+ # devise_for :users, sign_out_via: [:get, :post]
140
142
  #
141
143
  # You need to make sure that your sign_out controls trigger a request with a matching HTTP method.
142
144
  #
@@ -285,7 +287,7 @@ module ActionDispatch::Routing
285
287
  # root to: "admin/dashboard#show", as: :user_root
286
288
  # end
287
289
  #
288
- def authenticate(scope=nil, block=nil)
290
+ def authenticate(scope = nil, block = nil)
289
291
  constraints_for(:authenticate!, scope, block) do
290
292
  yield
291
293
  end
@@ -309,7 +311,7 @@ module ActionDispatch::Routing
309
311
  #
310
312
  # root to: 'landing#show'
311
313
  #
312
- def authenticated(scope=nil, block=nil)
314
+ def authenticated(scope = nil, block = nil)
313
315
  constraints_for(:authenticate?, scope, block) do
314
316
  yield
315
317
  end
@@ -326,7 +328,7 @@ module ActionDispatch::Routing
326
328
  #
327
329
  # root to: 'dashboard#show'
328
330
  #
329
- def unauthenticated(scope=nil)
331
+ def unauthenticated(scope = nil)
330
332
  constraint = lambda do |request|
331
333
  not request.env["warden"].authenticate? scope: scope
332
334
  end
@@ -338,7 +340,7 @@ module ActionDispatch::Routing
338
340
 
339
341
  # Sets the devise scope to be used in the controller. If you have custom routes,
340
342
  # you are required to call this method (also aliased as :as) in order to specify
341
- # to which controller it is targetted.
343
+ # to which controller it is targeted.
342
344
  #
343
345
  # as :user do
344
346
  # get "sign_in", to: "devise/sessions#new"
@@ -472,7 +474,7 @@ ERROR
472
474
  @scope = current_scope
473
475
  end
474
476
 
475
- def constraints_for(method_to_apply, scope=nil, block=nil)
477
+ def constraints_for(method_to_apply, scope = nil, block = nil)
476
478
  constraint = lambda do |request|
477
479
  request.env['warden'].send(method_to_apply, scope: scope) &&
478
480
  (block.nil? || block.call(request.env["warden"].user(scope)))