devise 4.4.3 → 4.8.1

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 (227) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +118 -4
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +97 -61
  5. data/app/controllers/devise/passwords_controller.rb +1 -0
  6. data/app/controllers/devise/registrations_controller.rb +26 -8
  7. data/app/controllers/devise_controller.rb +3 -3
  8. data/app/helpers/devise_helper.rb +21 -18
  9. data/app/mailers/devise/mailer.rb +5 -5
  10. data/app/views/devise/confirmations/new.html.erb +1 -1
  11. data/app/views/devise/passwords/edit.html.erb +3 -3
  12. data/app/views/devise/passwords/new.html.erb +1 -1
  13. data/app/views/devise/registrations/edit.html.erb +4 -4
  14. data/app/views/devise/registrations/new.html.erb +3 -3
  15. data/app/views/devise/sessions/new.html.erb +3 -3
  16. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  17. data/app/views/devise/shared/_links.html.erb +8 -8
  18. data/app/views/devise/unlocks/new.html.erb +1 -1
  19. data/config/locales/en.yml +3 -2
  20. data/lib/devise/controllers/helpers.rb +8 -8
  21. data/lib/devise/controllers/sign_in_out.rb +8 -3
  22. data/lib/devise/controllers/url_helpers.rb +1 -1
  23. data/lib/devise/failure_app.rb +25 -5
  24. data/lib/devise/hooks/lockable.rb +2 -5
  25. data/lib/devise/hooks/timeoutable.rb +2 -2
  26. data/lib/devise/mapping.rb +1 -1
  27. data/lib/devise/models/authenticatable.rb +51 -48
  28. data/lib/devise/models/confirmable.rb +18 -3
  29. data/lib/devise/models/database_authenticatable.rb +51 -13
  30. data/lib/devise/models/lockable.rb +12 -4
  31. data/lib/devise/models/omniauthable.rb +2 -2
  32. data/lib/devise/models/recoverable.rb +3 -3
  33. data/lib/devise/models/registerable.rb +2 -0
  34. data/lib/devise/models/rememberable.rb +2 -2
  35. data/lib/devise/models/timeoutable.rb +1 -1
  36. data/lib/devise/models/trackable.rb +9 -2
  37. data/lib/devise/models/validatable.rb +2 -2
  38. data/lib/devise/omniauth.rb +2 -5
  39. data/lib/devise/parameter_filter.rb +2 -0
  40. data/lib/devise/parameter_sanitizer.rb +13 -1
  41. data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
  42. data/lib/devise/rails/routes.rb +6 -6
  43. data/lib/devise/secret_key_finder.rb +2 -0
  44. data/lib/devise/strategies/authenticatable.rb +1 -1
  45. data/lib/devise/strategies/database_authenticatable.rb +6 -1
  46. data/lib/devise/test/controller_helpers.rb +4 -2
  47. data/lib/devise/test/integration_helpers.rb +1 -1
  48. data/lib/devise/version.rb +1 -1
  49. data/lib/devise.rb +14 -6
  50. data/lib/generators/active_record/devise_generator.rb +26 -11
  51. data/lib/generators/devise/controllers_generator.rb +1 -1
  52. data/lib/generators/devise/devise_generator.rb +1 -1
  53. data/lib/generators/devise/install_generator.rb +1 -5
  54. data/lib/generators/devise/orm_helpers.rb +2 -2
  55. data/lib/generators/devise/views_generator.rb +1 -1
  56. data/lib/generators/mongoid/devise_generator.rb +5 -5
  57. data/lib/generators/templates/README +9 -1
  58. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +1 -1
  59. data/lib/generators/templates/devise.rb +34 -6
  60. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +5 -1
  61. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +10 -2
  62. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +4 -1
  63. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +11 -3
  64. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +11 -3
  65. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +7 -2
  66. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +4 -1
  67. metadata +18 -316
  68. data/.gitignore +0 -10
  69. data/.travis.yml +0 -68
  70. data/.yardopts +0 -9
  71. data/CODE_OF_CONDUCT.md +0 -22
  72. data/CONTRIBUTING.md +0 -79
  73. data/Gemfile +0 -39
  74. data/Gemfile.lock +0 -193
  75. data/ISSUE_TEMPLATE.md +0 -19
  76. data/Rakefile +0 -37
  77. data/bin/test +0 -13
  78. data/devise.gemspec +0 -28
  79. data/devise.png +0 -0
  80. data/gemfiles/Gemfile.rails-4.1-stable +0 -32
  81. data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -171
  82. data/gemfiles/Gemfile.rails-4.2-stable +0 -32
  83. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -192
  84. data/gemfiles/Gemfile.rails-5.0-stable +0 -33
  85. data/gemfiles/Gemfile.rails-5.0-stable.lock +0 -192
  86. data/gemfiles/Gemfile.rails-5.2-rc1 +0 -26
  87. data/gemfiles/Gemfile.rails-5.2-rc1.lock +0 -201
  88. data/guides/bug_report_templates/integration_test.rb +0 -106
  89. data/test/controllers/custom_registrations_controller_test.rb +0 -42
  90. data/test/controllers/custom_strategy_test.rb +0 -66
  91. data/test/controllers/helper_methods_test.rb +0 -24
  92. data/test/controllers/helpers_test.rb +0 -318
  93. data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -53
  94. data/test/controllers/internal_helpers_test.rb +0 -129
  95. data/test/controllers/load_hooks_controller_test.rb +0 -21
  96. data/test/controllers/passwords_controller_test.rb +0 -34
  97. data/test/controllers/sessions_controller_test.rb +0 -108
  98. data/test/controllers/url_helpers_test.rb +0 -67
  99. data/test/delegator_test.rb +0 -21
  100. data/test/devise_test.rb +0 -109
  101. data/test/failure_app_test.rb +0 -340
  102. data/test/generators/active_record_generator_test.rb +0 -130
  103. data/test/generators/controllers_generator_test.rb +0 -50
  104. data/test/generators/devise_generator_test.rb +0 -41
  105. data/test/generators/install_generator_test.rb +0 -26
  106. data/test/generators/mongoid_generator_test.rb +0 -25
  107. data/test/generators/views_generator_test.rb +0 -105
  108. data/test/helpers/devise_helper_test.rb +0 -51
  109. data/test/integration/authenticatable_test.rb +0 -706
  110. data/test/integration/confirmable_test.rb +0 -326
  111. data/test/integration/database_authenticatable_test.rb +0 -97
  112. data/test/integration/http_authenticatable_test.rb +0 -114
  113. data/test/integration/lockable_test.rb +0 -242
  114. data/test/integration/mounted_engine_test.rb +0 -38
  115. data/test/integration/omniauthable_test.rb +0 -148
  116. data/test/integration/recoverable_test.rb +0 -349
  117. data/test/integration/registerable_test.rb +0 -365
  118. data/test/integration/rememberable_test.rb +0 -219
  119. data/test/integration/timeoutable_test.rb +0 -186
  120. data/test/integration/trackable_test.rb +0 -99
  121. data/test/mailers/confirmation_instructions_test.rb +0 -117
  122. data/test/mailers/email_changed_test.rb +0 -132
  123. data/test/mailers/mailer_test.rb +0 -20
  124. data/test/mailers/reset_password_instructions_test.rb +0 -98
  125. data/test/mailers/unlock_instructions_test.rb +0 -93
  126. data/test/mapping_test.rb +0 -136
  127. data/test/models/authenticatable_test.rb +0 -25
  128. data/test/models/confirmable_test.rb +0 -549
  129. data/test/models/database_authenticatable_test.rb +0 -283
  130. data/test/models/lockable_test.rb +0 -352
  131. data/test/models/omniauthable_test.rb +0 -9
  132. data/test/models/recoverable_test.rb +0 -263
  133. data/test/models/registerable_test.rb +0 -9
  134. data/test/models/rememberable_test.rb +0 -184
  135. data/test/models/serializable_test.rb +0 -60
  136. data/test/models/timeoutable_test.rb +0 -53
  137. data/test/models/trackable_test.rb +0 -62
  138. data/test/models/validatable_test.rb +0 -121
  139. data/test/models_test.rb +0 -155
  140. data/test/omniauth/config_test.rb +0 -61
  141. data/test/omniauth/url_helpers_test.rb +0 -53
  142. data/test/orm/active_record.rb +0 -24
  143. data/test/orm/mongoid.rb +0 -15
  144. data/test/parameter_sanitizer_test.rb +0 -77
  145. data/test/rails_app/Rakefile +0 -6
  146. data/test/rails_app/app/active_record/admin.rb +0 -8
  147. data/test/rails_app/app/active_record/shim.rb +0 -4
  148. data/test/rails_app/app/active_record/user.rb +0 -20
  149. data/test/rails_app/app/active_record/user_on_engine.rb +0 -9
  150. data/test/rails_app/app/active_record/user_on_main_app.rb +0 -9
  151. data/test/rails_app/app/active_record/user_with_validations.rb +0 -12
  152. data/test/rails_app/app/active_record/user_without_email.rb +0 -10
  153. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -8
  154. data/test/rails_app/app/controllers/admins_controller.rb +0 -8
  155. data/test/rails_app/app/controllers/application_controller.rb +0 -13
  156. data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -32
  157. data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -33
  158. data/test/rails_app/app/controllers/home_controller.rb +0 -31
  159. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -4
  160. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -4
  161. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -16
  162. data/test/rails_app/app/controllers/users_controller.rb +0 -33
  163. data/test/rails_app/app/helpers/application_helper.rb +0 -5
  164. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -5
  165. data/test/rails_app/app/mailers/users/mailer.rb +0 -5
  166. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -6
  167. data/test/rails_app/app/mongoid/admin.rb +0 -31
  168. data/test/rails_app/app/mongoid/shim.rb +0 -25
  169. data/test/rails_app/app/mongoid/user.rb +0 -50
  170. data/test/rails_app/app/mongoid/user_on_engine.rb +0 -41
  171. data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -41
  172. data/test/rails_app/app/mongoid/user_with_validations.rb +0 -37
  173. data/test/rails_app/app/mongoid/user_without_email.rb +0 -35
  174. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  175. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  176. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  177. data/test/rails_app/app/views/home/index.html.erb +0 -1
  178. data/test/rails_app/app/views/home/join.html.erb +0 -1
  179. data/test/rails_app/app/views/home/private.html.erb +0 -1
  180. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  181. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  182. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  183. data/test/rails_app/app/views/users/index.html.erb +0 -1
  184. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  185. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  186. data/test/rails_app/bin/bundle +0 -3
  187. data/test/rails_app/bin/rails +0 -4
  188. data/test/rails_app/bin/rake +0 -4
  189. data/test/rails_app/config/application.rb +0 -48
  190. data/test/rails_app/config/boot.rb +0 -27
  191. data/test/rails_app/config/database.yml +0 -18
  192. data/test/rails_app/config/environment.rb +0 -7
  193. data/test/rails_app/config/environments/development.rb +0 -32
  194. data/test/rails_app/config/environments/production.rb +0 -88
  195. data/test/rails_app/config/environments/test.rb +0 -47
  196. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -9
  197. data/test/rails_app/config/initializers/devise.rb +0 -182
  198. data/test/rails_app/config/initializers/inflections.rb +0 -4
  199. data/test/rails_app/config/initializers/secret_token.rb +0 -5
  200. data/test/rails_app/config/initializers/session_store.rb +0 -3
  201. data/test/rails_app/config/routes.rb +0 -128
  202. data/test/rails_app/config.ru +0 -4
  203. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -77
  204. data/test/rails_app/db/schema.rb +0 -57
  205. data/test/rails_app/lib/shared_admin.rb +0 -23
  206. data/test/rails_app/lib/shared_user.rb +0 -32
  207. data/test/rails_app/lib/shared_user_without_email.rb +0 -28
  208. data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -15
  209. data/test/rails_app/public/404.html +0 -26
  210. data/test/rails_app/public/422.html +0 -26
  211. data/test/rails_app/public/500.html +0 -26
  212. data/test/rails_app/public/favicon.ico +0 -0
  213. data/test/rails_test.rb +0 -11
  214. data/test/routes_test.rb +0 -281
  215. data/test/secret_key_finder_test.rb +0 -97
  216. data/test/support/action_controller/record_identifier.rb +0 -12
  217. data/test/support/assertions.rb +0 -30
  218. data/test/support/helpers.rb +0 -83
  219. data/test/support/http_method_compatibility.rb +0 -53
  220. data/test/support/integration.rb +0 -95
  221. data/test/support/locale/en.yml +0 -8
  222. data/test/support/mongoid.yml +0 -6
  223. data/test/support/webrat/integrations/rails.rb +0 -35
  224. data/test/test/controller_helpers_test.rb +0 -193
  225. data/test/test/integration_helpers_test.rb +0 -34
  226. data/test/test_helper.rb +0 -36
  227. data/test/test_models.rb +0 -35
@@ -135,10 +135,10 @@ module ActionDispatch::Routing
135
135
  # * failure_app: a rack app which is invoked whenever there is a failure. Strings representing a given
136
136
  # are also allowed as parameter.
137
137
  #
138
- # * 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),
139
139
  # if you wish to restrict this to accept only :post or :delete requests you should do:
140
140
  #
141
- # devise_for :users, sign_out_via: [:post, :delete]
141
+ # devise_for :users, sign_out_via: [:get, :post]
142
142
  #
143
143
  # You need to make sure that your sign_out controls trigger a request with a matching HTTP method.
144
144
  #
@@ -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)))
@@ -13,6 +13,8 @@ module Devise
13
13
  @application.secrets.secret_key_base
14
14
  elsif @application.config.respond_to?(:secret_key_base) && key_exists?(@application.config)
15
15
  @application.config.secret_key_base
16
+ elsif @application.respond_to?(:secret_key_base) && key_exists?(@application)
17
+ @application.secret_key_base
16
18
  end
17
19
  end
18
20
 
@@ -28,7 +28,7 @@ module Devise
28
28
  private
29
29
 
30
30
  # Receives a resource and check if it is valid by calling valid_for_authentication?
31
- # An optional block that will be triggered while validating can be optionally
31
+ # A block that will be triggered while validating can be optionally
32
32
  # given as parameter. Check Devise::Models::Authenticatable.valid_for_authentication?
33
33
  # for more information.
34
34
  #
@@ -16,8 +16,13 @@ module Devise
16
16
  success!(resource)
17
17
  end
18
18
 
19
+ # In paranoid mode, hash the password even when a resource doesn't exist for the given authentication key.
20
+ # This is necessary to prevent enumeration attacks - e.g. the request is faster when a resource doesn't
21
+ # exist in the database if the password hashing algorithm is not called.
19
22
  mapping.to.new.password = password if !hashed && Devise.paranoid
20
- fail(:not_found_in_database) unless resource
23
+ unless resource
24
+ Devise.paranoid ? fail(:invalid) : fail(:not_found_in_database)
25
+ end
21
26
  end
22
27
  end
23
28
  end
@@ -37,6 +37,8 @@ module Devise
37
37
  @response
38
38
  end
39
39
 
40
+ ruby2_keywords(:process) if respond_to?(:ruby2_keywords, true)
41
+
40
42
  # We need to set up the environment variables and the response in the controller.
41
43
  def setup_controller_for_warden #:nodoc:
42
44
  @request.env['action_controller.instance'] = @controller
@@ -139,9 +141,9 @@ module Devise
139
141
 
140
142
  status, headers, response = Devise.warden_config[:failure_app].call(env).to_a
141
143
  @controller.response.headers.merge!(headers)
142
- @controller.response.content_type = headers["Content-Type"] unless Rails.version.start_with?('5')
144
+ @controller.response.content_type = headers["Content-Type"] unless Rails::VERSION::MAJOR >= 5
143
145
  @controller.status = status
144
- @controller.response.body = response.body
146
+ @controller.response_body = response.body
145
147
  nil # causes process return @response
146
148
  end
147
149
 
@@ -28,7 +28,7 @@ module Devise
28
28
  end
29
29
  end
30
30
 
31
- # Signs in a specific resource, mimicking a successfull sign in
31
+ # Signs in a specific resource, mimicking a successful sign in
32
32
  # operation through +Devise::SessionsController#create+.
33
33
  #
34
34
  # * +resource+ - The resource that should be authenticated
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Devise
4
- VERSION = "4.4.3".freeze
4
+ VERSION = "4.8.1".freeze
5
5
  end
data/lib/devise.rb CHANGED
@@ -71,7 +71,7 @@ module Devise
71
71
 
72
72
  # The number of times to hash the password.
73
73
  mattr_accessor :stretches
74
- @@stretches = 11
74
+ @@stretches = 12
75
75
 
76
76
  # The default key used when authenticating over http auth.
77
77
  mattr_accessor :http_authentication_key
@@ -293,9 +293,9 @@ module Devise
293
293
  mattr_accessor :token_generator
294
294
  @@token_generator = nil
295
295
 
296
- def self.rails51? # :nodoc:
297
- Rails.gem_version >= Gem::Version.new("5.1.x")
298
- end
296
+ # When set to false, changing a password does not automatically sign in a user
297
+ mattr_accessor :sign_in_after_change_password
298
+ @@sign_in_after_change_password = true
299
299
 
300
300
  def self.activerecord51? # :nodoc:
301
301
  defined?(ActiveRecord) && ActiveRecord.gem_version >= Gem::Version.new("5.1.x")
@@ -313,12 +313,20 @@ module Devise
313
313
  end
314
314
 
315
315
  def get
316
- ActiveSupport::Dependencies.constantize(@name)
316
+ # TODO: Remove AS::Dependencies usage when dropping support to Rails < 7.
317
+ if ActiveSupport::Dependencies.respond_to?(:constantize)
318
+ ActiveSupport::Dependencies.constantize(@name)
319
+ else
320
+ @name.constantize
321
+ end
317
322
  end
318
323
  end
319
324
 
320
325
  def self.ref(arg)
321
- ActiveSupport::Dependencies.reference(arg)
326
+ # TODO: Remove AS::Dependencies usage when dropping support to Rails < 7.
327
+ if ActiveSupport::Dependencies.respond_to?(:reference)
328
+ ActiveSupport::Dependencies.reference(arg)
329
+ end
322
330
  Getter.new(arg)
323
331
  end
324
332
 
@@ -54,11 +54,11 @@ module ActiveRecord
54
54
  t.datetime :remember_created_at
55
55
 
56
56
  ## Trackable
57
- t.integer :sign_in_count, default: 0, null: false
58
- t.datetime :current_sign_in_at
59
- t.datetime :last_sign_in_at
60
- t.#{ip_column} :current_sign_in_ip
61
- t.#{ip_column} :last_sign_in_ip
57
+ # t.integer :sign_in_count, default: 0, null: false
58
+ # t.datetime :current_sign_in_at
59
+ # t.datetime :last_sign_in_at
60
+ # t.#{ip_column} :current_sign_in_ip
61
+ # t.#{ip_column} :last_sign_in_ip
62
62
 
63
63
  ## Confirmable
64
64
  # t.string :confirmation_token
@@ -82,23 +82,38 @@ RUBY
82
82
  postgresql?
83
83
  end
84
84
 
85
- def rails5?
86
- Rails.version.start_with? '5'
85
+ def rails5_and_up?
86
+ Rails::VERSION::MAJOR >= 5
87
+ end
88
+
89
+ def rails61_and_up?
90
+ Rails::VERSION::MAJOR > 6 || (Rails::VERSION::MAJOR == 6 && Rails::VERSION::MINOR >= 1)
87
91
  end
88
92
 
89
93
  def postgresql?
90
- config = ActiveRecord::Base.configurations[Rails.env]
91
- config && config['adapter'] == 'postgresql'
94
+ ar_config && ar_config['adapter'] == 'postgresql'
95
+ end
96
+
97
+ def ar_config
98
+ if ActiveRecord::Base.configurations.respond_to?(:configs_for)
99
+ if rails61_and_up?
100
+ ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: "primary").configuration_hash
101
+ else
102
+ ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, spec_name: "primary").config
103
+ end
104
+ else
105
+ ActiveRecord::Base.configurations[Rails.env]
106
+ end
92
107
  end
93
108
 
94
109
  def migration_version
95
- if rails5?
110
+ if rails5_and_up?
96
111
  "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
97
112
  end
98
113
  end
99
114
 
100
115
  def primary_key_type
101
- primary_key_string if rails5?
116
+ primary_key_string if rails5_and_up?
102
117
  end
103
118
 
104
119
  def primary_key_string
@@ -18,7 +18,7 @@ module Devise
18
18
 
19
19
  This will create a controller class at app/controllers/users/sessions_controller.rb like this:
20
20
 
21
- class Users::ConfirmationsController < Devise::ConfirmationsController
21
+ class Users::SessionsController < Devise::SessionsController
22
22
  content...
23
23
  end
24
24
  DESC
@@ -13,7 +13,7 @@ module Devise
13
13
  desc "Generates a model with the given NAME (if one does not exist) with devise " \
14
14
  "configuration plus a migration file and devise routes."
15
15
 
16
- hook_for :orm
16
+ hook_for :orm, required: true
17
17
 
18
18
  class_option :routes, desc: "Generate routes", type: :boolean, default: true
19
19
 
@@ -11,7 +11,7 @@ module Devise
11
11
  source_root File.expand_path("../../templates", __FILE__)
12
12
 
13
13
  desc "Creates a Devise initializer and copy locale files to your application."
14
- class_option :orm
14
+ class_option :orm, required: true
15
15
 
16
16
  def copy_initializer
17
17
  unless options[:orm]
@@ -37,10 +37,6 @@ module Devise
37
37
  def show_readme
38
38
  readme "README" if behavior == :invoke
39
39
  end
40
-
41
- def rails_4?
42
- Rails::VERSION::MAJOR == 4
43
- end
44
40
  end
45
41
  end
46
42
  end
@@ -6,9 +6,9 @@ module Devise
6
6
  def model_contents
7
7
  buffer = <<-CONTENT
8
8
  # Include default devise modules. Others available are:
9
- # :confirmable, :lockable, :timeoutable and :omniauthable
9
+ # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
10
10
  devise :database_authenticatable, :registerable,
11
- :recoverable, :rememberable, :trackable, :validatable
11
+ :recoverable, :rememberable, :validatable
12
12
 
13
13
  CONTENT
14
14
  buffer
@@ -42,7 +42,7 @@ module Devise
42
42
  def view_directory(name, _target_path = nil)
43
43
  directory name.to_s, _target_path || "#{target_path}/#{name}" do |content|
44
44
  if scope
45
- content.gsub "devise/shared/links", "#{plural_scope}/shared/links"
45
+ content.gsub("devise/shared", "#{plural_scope}/shared")
46
46
  else
47
47
  content
48
48
  end
@@ -34,11 +34,11 @@ module Mongoid
34
34
  field :remember_created_at, type: Time
35
35
 
36
36
  ## Trackable
37
- field :sign_in_count, type: Integer, default: 0
38
- field :current_sign_in_at, type: Time
39
- field :last_sign_in_at, type: Time
40
- field :current_sign_in_ip, type: String
41
- field :last_sign_in_ip, type: String
37
+ # field :sign_in_count, type: Integer, default: 0
38
+ # field :current_sign_in_at, type: Time
39
+ # field :last_sign_in_at, type: Time
40
+ # field :current_sign_in_ip, type: String
41
+ # field :last_sign_in_ip, type: String
42
42
 
43
43
  ## Confirmable
44
44
  # field :confirmation_token, type: String
@@ -1,6 +1,6 @@
1
1
  ===============================================================================
2
2
 
3
- Some setup you must do manually if you haven't yet:
3
+ Depending on your application's configuration some manual setup may be required:
4
4
 
5
5
  1. Ensure you have defined default url options in your environments files. Here
6
6
  is an example of default_url_options appropriate for a development environment
@@ -10,10 +10,14 @@ Some setup you must do manually if you haven't yet:
10
10
 
11
11
  In production, :host should be set to the actual host of your application.
12
12
 
13
+ * Required for all applications. *
14
+
13
15
  2. Ensure you have defined root_url to *something* in your config/routes.rb.
14
16
  For example:
15
17
 
16
18
  root to: "home#index"
19
+
20
+ * Not required for API-only Applications *
17
21
 
18
22
  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
19
23
  For example:
@@ -21,8 +25,12 @@ Some setup you must do manually if you haven't yet:
21
25
  <p class="notice"><%= notice %></p>
22
26
  <p class="alert"><%= alert %></p>
23
27
 
28
+ * Not required for API-only Applications *
29
+
24
30
  4. You can copy Devise views (for customization) to your app by running:
25
31
 
26
32
  rails g devise:views
33
+
34
+ * Not required *
27
35
 
28
36
  ===============================================================================
@@ -9,7 +9,7 @@ class <%= @scope_prefix %>OmniauthCallbacksController < Devise::OmniauthCallback
9
9
  # end
10
10
 
11
11
  # More info at:
12
- # https://github.com/plataformatec/devise#omniauth
12
+ # https://github.com/heartcombo/devise#omniauth
13
13
 
14
14
  # GET|POST /resource/auth/twitter
15
15
  # def passthru
@@ -1,5 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Assuming you have not yet modified this file, each configuration option below
4
+ # is set to its default value. Note that some are commented out while others
5
+ # are not: uncommented lines are intended to protect your configuration from
6
+ # breaking changes in upgrades (i.e., in the event that future versions of
7
+ # Devise change the default values for those options).
8
+ #
3
9
  # Use this hook to configure devise mailer, warden hooks and so forth.
4
10
  # Many of these configuration options can be set straight in your model.
5
11
  Devise.setup do |config|
@@ -9,7 +15,7 @@ Devise.setup do |config|
9
15
  # Devise will use the `secret_key_base` as its `secret_key`
10
16
  # by default. You can change it below and use your own secret key.
11
17
  # config.secret_key = '<%= SecureRandom.hex(64) %>'
12
-
18
+
13
19
  # ==> Controller configuration
14
20
  # Configure the parent class to the devise controllers.
15
21
  # config.parent_controller = 'DeviseController'
@@ -68,7 +74,10 @@ Devise.setup do |config|
68
74
  # Tell if authentication through HTTP Auth is enabled. False by default.
69
75
  # It can be set to an array that will enable http authentication only for the
70
76
  # given strategies, for example, `config.http_authenticatable = [:database]` will
71
- # enable it only for database authentication. The supported strategies are:
77
+ # enable it only for database authentication.
78
+ # For API-only applications to support authentication "out-of-the-box", you will likely want to
79
+ # enable this with :database unless you are using a custom strategy.
80
+ # The supported strategies are:
72
81
  # :database = Support basic authentication with authentication key + password
73
82
  # config.http_authenticatable = false
74
83
 
@@ -103,15 +112,18 @@ Devise.setup do |config|
103
112
  # config.reload_routes = true
104
113
 
105
114
  # ==> Configuration for :database_authenticatable
106
- # For bcrypt, this is the cost for hashing the password and defaults to 11. If
115
+ # For bcrypt, this is the cost for hashing the password and defaults to 12. If
107
116
  # using other algorithms, it sets how many times you want the password to be hashed.
117
+ # The number of stretches used for generating the hashed password are stored
118
+ # with the hashed password. This allows you to change the stretches without
119
+ # invalidating existing passwords.
108
120
  #
109
121
  # Limiting the stretches to just one in testing will increase the performance of
110
122
  # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use
111
123
  # a value less than 10 in other environments. Note that, for bcrypt (the default
112
124
  # algorithm), the cost increases exponentially with the number of stretches (e.g.
113
125
  # a value of 20 is already extremely slow: approx. 60 seconds for 1 calculation).
114
- config.stretches = Rails.env.test? ? 1 : 11
126
+ config.stretches = Rails.env.test? ? 1 : 12
115
127
 
116
128
  # Set up a pepper to generate the hashed password.
117
129
  # config.pepper = '<%= SecureRandom.hex(64) %>'
@@ -126,8 +138,11 @@ Devise.setup do |config|
126
138
  # A period that the user is allowed to access the website even without
127
139
  # confirming their account. For instance, if set to 2.days, the user will be
128
140
  # able to access the website for two days without confirming their account,
129
- # access will be blocked just in the third day. Default is 0.days, meaning
130
- # the user cannot access the website without confirming their account.
141
+ # access will be blocked just in the third day.
142
+ # You can also set it to nil, which will allow the user to access the website
143
+ # without confirming their account.
144
+ # Default is 0.days, meaning the user cannot access the website without
145
+ # confirming their account.
131
146
  # config.allow_unconfirmed_access_for = 2.days
132
147
 
133
148
  # A period that the user is allowed to confirm their account before their
@@ -280,4 +295,17 @@ Devise.setup do |config|
280
295
  # When using OmniAuth, Devise cannot automatically set OmniAuth path,
281
296
  # so you need to do it manually. For the users scope, it would be:
282
297
  # config.omniauth_path_prefix = '/my_engine/users/auth'
298
+
299
+ # ==> Turbolinks configuration
300
+ # If your app is using Turbolinks, Turbolinks::Controller needs to be included to make redirection work correctly:
301
+ #
302
+ # ActiveSupport.on_load(:devise_failure_app) do
303
+ # include Turbolinks::Controller
304
+ # end
305
+
306
+ # ==> Configuration for :registerable
307
+
308
+ # When set to false, does not sign a user in automatically after their password is
309
+ # changed. Defaults to true, so a user is signed in automatically after changing a password.
310
+ # config.sign_in_after_change_password = true
283
311
  end
@@ -5,7 +5,11 @@
5
5
  <%= f.full_error :confirmation_token %>
6
6
 
7
7
  <div class="form-inputs">
8
- <%= f.input :email, required: true, autofocus: true %>
8
+ <%= f.input :email,
9
+ required: true,
10
+ autofocus: true,
11
+ value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email),
12
+ input_html: { autocomplete: "email" } %>
9
13
  </div>
10
14
 
11
15
  <div class="form-actions">
@@ -7,8 +7,16 @@
7
7
  <%= f.full_error :reset_password_token %>
8
8
 
9
9
  <div class="form-inputs">
10
- <%= f.input :password, label: "New password", required: true, autofocus: true, hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length) %>
11
- <%= f.input :password_confirmation, label: "Confirm your new password", required: true %>
10
+ <%= f.input :password,
11
+ label: "New password",
12
+ required: true,
13
+ autofocus: true,
14
+ hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length),
15
+ input_html: { autocomplete: "new-password" } %>
16
+ <%= f.input :password_confirmation,
17
+ label: "Confirm your new password",
18
+ required: true,
19
+ input_html: { autocomplete: "new-password" } %>
12
20
  </div>
13
21
 
14
22
  <div class="form-actions">
@@ -4,7 +4,10 @@
4
4
  <%= f.error_notification %>
5
5
 
6
6
  <div class="form-inputs">
7
- <%= f.input :email, required: true, autofocus: true %>
7
+ <%= f.input :email,
8
+ required: true,
9
+ autofocus: true,
10
+ input_html: { autocomplete: "email" } %>
8
11
  </div>
9
12
 
10
13
  <div class="form-actions">
@@ -10,9 +10,17 @@
10
10
  <p>Currently waiting confirmation for: <%= resource.unconfirmed_email %></p>
11
11
  <% end %>
12
12
 
13
- <%= f.input :password, autocomplete: "off", hint: "leave it blank if you don't want to change it", required: false %>
14
- <%= f.input :password_confirmation, required: false %>
15
- <%= f.input :current_password, hint: "we need your current password to confirm your changes", required: true %>
13
+ <%= f.input :password,
14
+ hint: "leave it blank if you don't want to change it",
15
+ required: false,
16
+ input_html: { autocomplete: "new-password" } %>
17
+ <%= f.input :password_confirmation,
18
+ required: false,
19
+ input_html: { autocomplete: "new-password" } %>
20
+ <%= f.input :current_password,
21
+ hint: "we need your current password to confirm your changes",
22
+ required: true,
23
+ input_html: { autocomplete: "current-password" } %>
16
24
  </div>
17
25
 
18
26
  <div class="form-actions">
@@ -4,9 +4,17 @@
4
4
  <%= f.error_notification %>
5
5
 
6
6
  <div class="form-inputs">
7
- <%= f.input :email, required: true, autofocus: true %>
8
- <%= f.input :password, required: true, hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length) %>
9
- <%= f.input :password_confirmation, required: true %>
7
+ <%= f.input :email,
8
+ required: true,
9
+ autofocus: true,
10
+ input_html: { autocomplete: "email" }%>
11
+ <%= f.input :password,
12
+ required: true,
13
+ hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length),
14
+ input_html: { autocomplete: "new-password" } %>
15
+ <%= f.input :password_confirmation,
16
+ required: true,
17
+ input_html: { autocomplete: "new-password" } %>
10
18
  </div>
11
19
 
12
20
  <div class="form-actions">
@@ -2,8 +2,13 @@
2
2
 
3
3
  <%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
4
4
  <div class="form-inputs">
5
- <%= f.input :email, required: false, autofocus: true %>
6
- <%= f.input :password, required: false %>
5
+ <%= f.input :email,
6
+ required: false,
7
+ autofocus: true,
8
+ input_html: { autocomplete: "email" } %>
9
+ <%= f.input :password,
10
+ required: false,
11
+ input_html: { autocomplete: "current-password" } %>
7
12
  <%= f.input :remember_me, as: :boolean if devise_mapping.rememberable? %>
8
13
  </div>
9
14
 
@@ -5,7 +5,10 @@
5
5
  <%= f.full_error :unlock_token %>
6
6
 
7
7
  <div class="form-inputs">
8
- <%= f.input :email, required: true, autofocus: true %>
8
+ <%= f.input :email,
9
+ required: true,
10
+ autofocus: true,
11
+ input_html: { autocomplete: "email" } %>
9
12
  </div>
10
13
 
11
14
  <div class="form-actions">