devise 4.3.0 → 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 +5 -5
- data/CHANGELOG.md +205 -2
- data/MIT-LICENSE +2 -1
- data/README.md +214 -57
- data/app/controllers/devise/confirmations_controller.rb +3 -0
- data/app/controllers/devise/omniauth_callbacks_controller.rb +3 -1
- data/app/controllers/devise/passwords_controller.rb +5 -2
- data/app/controllers/devise/registrations_controller.rb +32 -12
- data/app/controllers/devise/sessions_controller.rb +4 -2
- data/app/controllers/devise/unlocks_controller.rb +3 -0
- data/app/controllers/devise_controller.rb +6 -3
- data/app/helpers/devise_helper.rb +23 -18
- data/app/mailers/devise/mailer.rb +7 -5
- data/app/views/devise/confirmations/new.html.erb +2 -2
- data/app/views/devise/passwords/edit.html.erb +3 -3
- data/app/views/devise/passwords/new.html.erb +2 -2
- data/app/views/devise/registrations/edit.html.erb +6 -6
- data/app/views/devise/registrations/new.html.erb +4 -4
- data/app/views/devise/sessions/new.html.erb +4 -4
- data/app/views/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/devise/shared/_links.html.erb +8 -8
- data/app/views/devise/unlocks/new.html.erb +2 -2
- data/config/locales/en.yml +3 -2
- data/lib/devise/controllers/helpers.rb +10 -8
- data/lib/devise/controllers/rememberable.rb +2 -0
- data/lib/devise/controllers/responder.rb +35 -0
- data/lib/devise/controllers/scoped_views.rb +2 -0
- data/lib/devise/controllers/sign_in_out.rb +14 -4
- data/lib/devise/controllers/store_location.rb +24 -6
- data/lib/devise/controllers/url_helpers.rb +3 -1
- data/lib/devise/delegator.rb +2 -0
- data/lib/devise/encryptor.rb +2 -0
- data/lib/devise/failure_app.rb +33 -7
- data/lib/devise/hooks/activatable.rb +2 -0
- data/lib/devise/hooks/csrf_cleaner.rb +8 -1
- data/lib/devise/hooks/forgetable.rb +2 -0
- data/lib/devise/hooks/lockable.rb +4 -5
- data/lib/devise/hooks/proxy.rb +2 -0
- data/lib/devise/hooks/rememberable.rb +2 -0
- data/lib/devise/hooks/timeoutable.rb +4 -2
- data/lib/devise/hooks/trackable.rb +2 -0
- data/lib/devise/mailers/helpers.rb +2 -0
- data/lib/devise/mapping.rb +3 -1
- data/lib/devise/models/authenticatable.rb +55 -50
- data/lib/devise/models/confirmable.rb +36 -40
- data/lib/devise/models/database_authenticatable.rb +57 -36
- data/lib/devise/models/lockable.rb +18 -4
- data/lib/devise/models/omniauthable.rb +4 -2
- data/lib/devise/models/recoverable.rb +10 -19
- data/lib/devise/models/registerable.rb +4 -0
- data/lib/devise/models/rememberable.rb +5 -3
- data/lib/devise/models/timeoutable.rb +3 -1
- data/lib/devise/models/trackable.rb +15 -1
- data/lib/devise/models/validatable.rb +7 -10
- data/lib/devise/models.rb +3 -0
- data/lib/devise/modules.rb +2 -0
- data/lib/devise/omniauth/config.rb +2 -0
- data/lib/devise/omniauth/url_helpers.rb +2 -0
- data/lib/devise/omniauth.rb +4 -5
- data/lib/devise/orm/active_record.rb +2 -0
- data/lib/devise/orm/mongoid.rb +2 -0
- data/lib/devise/orm.rb +71 -0
- data/lib/devise/parameter_filter.rb +4 -0
- data/lib/devise/parameter_sanitizer.rb +15 -1
- data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
- data/lib/devise/rails/routes.rb +8 -6
- data/lib/devise/rails/warden_compat.rb +2 -0
- data/lib/devise/rails.rb +3 -5
- data/lib/devise/secret_key_finder.rb +27 -0
- data/lib/devise/strategies/authenticatable.rb +3 -1
- data/lib/devise/strategies/base.rb +2 -0
- data/lib/devise/strategies/database_authenticatable.rb +8 -1
- data/lib/devise/strategies/rememberable.rb +2 -0
- data/lib/devise/test/controller_helpers.rb +6 -1
- data/lib/devise/test/integration_helpers.rb +3 -1
- data/lib/devise/test_helpers.rb +2 -0
- data/lib/devise/time_inflector.rb +2 -0
- data/lib/devise/token_generator.rb +2 -0
- data/lib/devise/version.rb +3 -1
- data/lib/devise.rb +38 -12
- data/lib/generators/active_record/devise_generator.rb +40 -12
- data/lib/generators/active_record/templates/migration.rb +3 -1
- data/lib/generators/active_record/templates/migration_existing.rb +2 -0
- data/lib/generators/devise/controllers_generator.rb +3 -1
- data/lib/generators/devise/devise_generator.rb +5 -3
- data/lib/generators/devise/install_generator.rb +3 -5
- data/lib/generators/devise/orm_helpers.rb +9 -3
- data/lib/generators/devise/views_generator.rb +8 -9
- data/lib/generators/mongoid/devise_generator.rb +7 -5
- data/lib/generators/templates/README +9 -1
- data/lib/generators/templates/controllers/confirmations_controller.rb +2 -0
- data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +3 -1
- data/lib/generators/templates/controllers/passwords_controller.rb +2 -0
- data/lib/generators/templates/controllers/registrations_controller.rb +2 -0
- data/lib/generators/templates/controllers/sessions_controller.rb +2 -0
- data/lib/generators/templates/controllers/unlocks_controller.rb +2 -0
- data/lib/generators/templates/devise.rb +43 -7
- data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +5 -1
- data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +10 -2
- data/lib/generators/templates/simple_form_for/passwords/new.html.erb +4 -1
- data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +12 -4
- data/lib/generators/templates/simple_form_for/registrations/new.html.erb +11 -3
- data/lib/generators/templates/simple_form_for/sessions/new.html.erb +7 -2
- data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +4 -1
- metadata +24 -307
- data/.gitignore +0 -10
- data/.travis.yml +0 -58
- data/.yardopts +0 -9
- data/CODE_OF_CONDUCT.md +0 -22
- data/CONTRIBUTING.md +0 -79
- data/Gemfile +0 -40
- data/Gemfile.lock +0 -194
- data/Rakefile +0 -36
- data/bin/test +0 -13
- data/devise.gemspec +0 -26
- data/devise.png +0 -0
- data/gemfiles/Gemfile.rails-4.1-stable +0 -30
- data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -171
- data/gemfiles/Gemfile.rails-4.2-stable +0 -30
- data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -192
- data/gemfiles/Gemfile.rails-5.0-stable +0 -34
- data/gemfiles/Gemfile.rails-5.0-stable.lock +0 -193
- data/guides/bug_report_templates/integration_test.rb +0 -104
- data/test/controllers/custom_registrations_controller_test.rb +0 -40
- data/test/controllers/custom_strategy_test.rb +0 -64
- data/test/controllers/helper_methods_test.rb +0 -22
- data/test/controllers/helpers_test.rb +0 -316
- data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -51
- data/test/controllers/internal_helpers_test.rb +0 -127
- data/test/controllers/load_hooks_controller_test.rb +0 -19
- data/test/controllers/passwords_controller_test.rb +0 -32
- data/test/controllers/sessions_controller_test.rb +0 -106
- data/test/controllers/url_helpers_test.rb +0 -65
- data/test/delegator_test.rb +0 -19
- data/test/devise_test.rb +0 -107
- data/test/failure_app_test.rb +0 -338
- data/test/generators/active_record_generator_test.rb +0 -83
- data/test/generators/controllers_generator_test.rb +0 -48
- data/test/generators/devise_generator_test.rb +0 -39
- data/test/generators/install_generator_test.rb +0 -24
- data/test/generators/mongoid_generator_test.rb +0 -23
- data/test/generators/views_generator_test.rb +0 -103
- data/test/helpers/devise_helper_test.rb +0 -49
- data/test/integration/authenticatable_test.rb +0 -698
- data/test/integration/confirmable_test.rb +0 -324
- data/test/integration/database_authenticatable_test.rb +0 -95
- data/test/integration/http_authenticatable_test.rb +0 -106
- data/test/integration/lockable_test.rb +0 -240
- data/test/integration/mounted_engine_test.rb +0 -36
- data/test/integration/omniauthable_test.rb +0 -135
- data/test/integration/recoverable_test.rb +0 -347
- data/test/integration/registerable_test.rb +0 -363
- data/test/integration/rememberable_test.rb +0 -217
- data/test/integration/timeoutable_test.rb +0 -184
- data/test/integration/trackable_test.rb +0 -92
- data/test/mailers/confirmation_instructions_test.rb +0 -115
- data/test/mailers/email_changed_test.rb +0 -130
- data/test/mailers/mailer_test.rb +0 -18
- data/test/mailers/reset_password_instructions_test.rb +0 -96
- data/test/mailers/unlock_instructions_test.rb +0 -91
- data/test/mapping_test.rb +0 -134
- data/test/models/authenticatable_test.rb +0 -23
- data/test/models/confirmable_test.rb +0 -536
- data/test/models/database_authenticatable_test.rb +0 -281
- data/test/models/lockable_test.rb +0 -350
- data/test/models/omniauthable_test.rb +0 -7
- data/test/models/recoverable_test.rb +0 -261
- data/test/models/registerable_test.rb +0 -7
- data/test/models/rememberable_test.rb +0 -182
- data/test/models/serializable_test.rb +0 -54
- data/test/models/timeoutable_test.rb +0 -51
- data/test/models/trackable_test.rb +0 -41
- data/test/models/validatable_test.rb +0 -119
- data/test/models_test.rb +0 -153
- data/test/omniauth/config_test.rb +0 -59
- data/test/omniauth/url_helpers_test.rb +0 -51
- data/test/orm/active_record.rb +0 -17
- data/test/orm/mongoid.rb +0 -13
- data/test/parameter_sanitizer_test.rb +0 -75
- data/test/rails_app/Rakefile +0 -6
- data/test/rails_app/app/active_record/admin.rb +0 -6
- data/test/rails_app/app/active_record/shim.rb +0 -2
- data/test/rails_app/app/active_record/user.rb +0 -7
- data/test/rails_app/app/active_record/user_on_engine.rb +0 -7
- data/test/rails_app/app/active_record/user_on_main_app.rb +0 -7
- data/test/rails_app/app/active_record/user_without_email.rb +0 -8
- data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
- data/test/rails_app/app/controllers/admins_controller.rb +0 -6
- data/test/rails_app/app/controllers/application_controller.rb +0 -11
- data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -30
- data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -31
- data/test/rails_app/app/controllers/home_controller.rb +0 -29
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
- data/test/rails_app/app/controllers/users_controller.rb +0 -31
- data/test/rails_app/app/helpers/application_helper.rb +0 -3
- data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -3
- data/test/rails_app/app/mailers/users/mailer.rb +0 -3
- data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -4
- data/test/rails_app/app/mongoid/admin.rb +0 -29
- data/test/rails_app/app/mongoid/shim.rb +0 -23
- data/test/rails_app/app/mongoid/user.rb +0 -39
- data/test/rails_app/app/mongoid/user_on_engine.rb +0 -39
- data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -39
- data/test/rails_app/app/mongoid/user_without_email.rb +0 -33
- data/test/rails_app/app/views/admins/index.html.erb +0 -1
- data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
- data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
- data/test/rails_app/app/views/home/index.html.erb +0 -1
- data/test/rails_app/app/views/home/join.html.erb +0 -1
- data/test/rails_app/app/views/home/private.html.erb +0 -1
- data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
- data/test/rails_app/app/views/layouts/application.html.erb +0 -24
- data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
- data/test/rails_app/app/views/users/index.html.erb +0 -1
- data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
- data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
- data/test/rails_app/bin/bundle +0 -3
- data/test/rails_app/bin/rails +0 -4
- data/test/rails_app/bin/rake +0 -4
- data/test/rails_app/config/application.rb +0 -44
- data/test/rails_app/config/boot.rb +0 -20
- data/test/rails_app/config/database.yml +0 -18
- data/test/rails_app/config/environment.rb +0 -5
- data/test/rails_app/config/environments/development.rb +0 -30
- data/test/rails_app/config/environments/production.rb +0 -86
- data/test/rails_app/config/environments/test.rb +0 -45
- data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
- data/test/rails_app/config/initializers/devise.rb +0 -180
- data/test/rails_app/config/initializers/inflections.rb +0 -2
- data/test/rails_app/config/initializers/secret_token.rb +0 -3
- data/test/rails_app/config/initializers/session_store.rb +0 -1
- data/test/rails_app/config/routes.rb +0 -126
- data/test/rails_app/config.ru +0 -4
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -75
- data/test/rails_app/db/schema.rb +0 -55
- data/test/rails_app/lib/shared_admin.rb +0 -21
- data/test/rails_app/lib/shared_user.rb +0 -30
- data/test/rails_app/lib/shared_user_without_email.rb +0 -26
- data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -13
- data/test/rails_app/public/404.html +0 -26
- data/test/rails_app/public/422.html +0 -26
- data/test/rails_app/public/500.html +0 -26
- data/test/rails_app/public/favicon.ico +0 -0
- data/test/rails_test.rb +0 -9
- data/test/routes_test.rb +0 -279
- data/test/support/action_controller/record_identifier.rb +0 -10
- data/test/support/assertions.rb +0 -28
- data/test/support/helpers.rb +0 -77
- data/test/support/http_method_compatibility.rb +0 -51
- data/test/support/integration.rb +0 -92
- data/test/support/locale/en.yml +0 -8
- data/test/support/mongoid.yml +0 -6
- data/test/support/webrat/integrations/rails.rb +0 -33
- data/test/test/controller_helpers_test.rb +0 -186
- data/test/test/integration_helpers_test.rb +0 -32
- data/test/test_helper.rb +0 -34
- data/test/test_models.rb +0 -33
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Devise::UnlocksController < DeviseController
|
2
4
|
prepend_before_action :require_no_authentication
|
3
5
|
|
@@ -27,6 +29,7 @@ class Devise::UnlocksController < DeviseController
|
|
27
29
|
set_flash_message! :notice, :unlocked
|
28
30
|
respond_with_navigational(resource){ redirect_to after_unlock_path_for(resource) }
|
29
31
|
else
|
32
|
+
# TODO: use `error_status` when the default changes to `:unprocessable_entity`.
|
30
33
|
respond_with_navigational(resource.errors, status: :unprocessable_entity){ render :new }
|
31
34
|
end
|
32
35
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# All Devise controllers are inherited from here.
|
2
4
|
class DeviseController < Devise.parent_controller.constantize
|
3
5
|
include Devise::Controllers::ScopedViews
|
@@ -13,6 +15,7 @@ class DeviseController < Devise.parent_controller.constantize
|
|
13
15
|
end
|
14
16
|
|
15
17
|
prepend_before_action :assert_is_devise_resource!
|
18
|
+
self.responder = Devise.responder
|
16
19
|
respond_to :html if mimes_for_respond_to.empty?
|
17
20
|
|
18
21
|
# Override prefixes to consider the scoped view.
|
@@ -20,7 +23,7 @@ class DeviseController < Devise.parent_controller.constantize
|
|
20
23
|
# Action Controller tests that forces _prefixes to be
|
21
24
|
# loaded before even having a request object.
|
22
25
|
#
|
23
|
-
# This method should be public as it is
|
26
|
+
# This method should be public as it is in ActionPack
|
24
27
|
# itself. Changing its visibility may break other gems.
|
25
28
|
def _prefixes #:nodoc:
|
26
29
|
@_prefixes ||= if self.class.scoped_views? && request && devise_mapping
|
@@ -110,7 +113,7 @@ MESSAGE
|
|
110
113
|
end
|
111
114
|
|
112
115
|
if authenticated && resource = warden.user(resource_name)
|
113
|
-
|
116
|
+
set_flash_message(:alert, 'already_authenticated', scope: 'devise.failure')
|
114
117
|
redirect_to after_sign_in_path_for(resource)
|
115
118
|
end
|
116
119
|
end
|
@@ -182,7 +185,7 @@ MESSAGE
|
|
182
185
|
options[:default] = Array(options[:default]).unshift(kind.to_sym)
|
183
186
|
options[:resource_name] = resource_name
|
184
187
|
options = devise_i18n_options(options)
|
185
|
-
I18n.t("#{options[:resource_name]}.#{kind}", options)
|
188
|
+
I18n.t("#{options[:resource_name]}.#{kind}", **options)
|
186
189
|
end
|
187
190
|
|
188
191
|
# Controllers inheriting DeviseController are advised to override this
|
@@ -1,25 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DeviseHelper
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# copy the views to your application.
|
5
|
-
#
|
6
|
-
# This method is intended to stay simple and it is unlikely that we are going to change
|
7
|
-
# it to add more behavior or options.
|
4
|
+
# Retain this method for backwards compatibility, deprecated in favor of modifying the
|
5
|
+
# devise/shared/error_messages partial.
|
8
6
|
def devise_error_messages!
|
9
|
-
|
7
|
+
ActiveSupport::Deprecation.warn <<-DEPRECATION.strip_heredoc
|
8
|
+
[Devise] `DeviseHelper#devise_error_messages!` is deprecated and will be
|
9
|
+
removed in the next major version.
|
10
|
+
|
11
|
+
Devise now uses a partial under "devise/shared/error_messages" to display
|
12
|
+
error messages by default, and make them easier to customize. Update your
|
13
|
+
views changing calls from:
|
14
|
+
|
15
|
+
<%= devise_error_messages! %>
|
10
16
|
|
11
|
-
|
12
|
-
sentence = I18n.t("errors.messages.not_saved",
|
13
|
-
count: resource.errors.count,
|
14
|
-
resource: resource.class.model_name.human.downcase)
|
17
|
+
to:
|
15
18
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
20
|
+
|
21
|
+
To start customizing how errors are displayed, you can copy the partial
|
22
|
+
from devise to your `app/views` folder. Alternatively, you can run
|
23
|
+
`rails g devise:views` which will copy all of them again to your app.
|
24
|
+
DEPRECATION
|
25
|
+
|
26
|
+
return "" if resource.errors.empty?
|
22
27
|
|
23
|
-
|
28
|
+
render "devise/shared/error_messages", resource: resource
|
24
29
|
end
|
25
30
|
end
|
@@ -1,27 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
if defined?(ActionMailer)
|
2
4
|
class Devise::Mailer < Devise.parent_mailer.constantize
|
3
5
|
include Devise::Mailers::Helpers
|
4
6
|
|
5
|
-
def confirmation_instructions(record, token, opts={})
|
7
|
+
def confirmation_instructions(record, token, opts = {})
|
6
8
|
@token = token
|
7
9
|
devise_mail(record, :confirmation_instructions, opts)
|
8
10
|
end
|
9
11
|
|
10
|
-
def reset_password_instructions(record, token, opts={})
|
12
|
+
def reset_password_instructions(record, token, opts = {})
|
11
13
|
@token = token
|
12
14
|
devise_mail(record, :reset_password_instructions, opts)
|
13
15
|
end
|
14
16
|
|
15
|
-
def unlock_instructions(record, token, opts={})
|
17
|
+
def unlock_instructions(record, token, opts = {})
|
16
18
|
@token = token
|
17
19
|
devise_mail(record, :unlock_instructions, opts)
|
18
20
|
end
|
19
21
|
|
20
|
-
def email_changed(record, opts={})
|
22
|
+
def email_changed(record, opts = {})
|
21
23
|
devise_mail(record, :email_changed, opts)
|
22
24
|
end
|
23
25
|
|
24
|
-
def password_change(record, opts={})
|
26
|
+
def password_change(record, opts = {})
|
25
27
|
devise_mail(record, :password_change, opts)
|
26
28
|
end
|
27
29
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<h2>Resend confirmation instructions</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
|
6
6
|
<div class="field">
|
7
7
|
<%= f.label :email %><br />
|
8
|
-
<%= f.email_field :email, autofocus: true, value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
|
8
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
|
9
9
|
</div>
|
10
10
|
|
11
11
|
<div class="actions">
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<h2>Change your password</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
<%= f.hidden_field :reset_password_token %>
|
6
6
|
|
7
7
|
<div class="field">
|
@@ -9,12 +9,12 @@
|
|
9
9
|
<% if @minimum_password_length %>
|
10
10
|
<em>(<%= @minimum_password_length %> characters minimum)</em><br />
|
11
11
|
<% end %>
|
12
|
-
<%= f.password_field :password, autofocus: true, autocomplete: "
|
12
|
+
<%= f.password_field :password, autofocus: true, autocomplete: "new-password" %>
|
13
13
|
</div>
|
14
14
|
|
15
15
|
<div class="field">
|
16
16
|
<%= f.label :password_confirmation, "Confirm new password" %><br />
|
17
|
-
<%= f.password_field :password_confirmation, autocomplete: "
|
17
|
+
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
|
18
18
|
</div>
|
19
19
|
|
20
20
|
<div class="actions">
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<h2>Forgot your password?</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
|
6
6
|
<div class="field">
|
7
7
|
<%= f.label :email %><br />
|
8
|
-
<%= f.email_field :email, autofocus: true %>
|
8
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
9
9
|
</div>
|
10
10
|
|
11
11
|
<div class="actions">
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<h2>Edit <%= resource_name.to_s.humanize %></h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
|
6
6
|
<div class="field">
|
7
7
|
<%= f.label :email %><br />
|
8
|
-
<%= f.email_field :email, autofocus: true %>
|
8
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
9
9
|
</div>
|
10
10
|
|
11
11
|
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
<div class="field">
|
16
16
|
<%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
|
17
|
-
<%= f.password_field :password, autocomplete: "
|
17
|
+
<%= f.password_field :password, autocomplete: "new-password" %>
|
18
18
|
<% if @minimum_password_length %>
|
19
19
|
<br />
|
20
20
|
<em><%= @minimum_password_length %> characters minimum</em>
|
@@ -23,12 +23,12 @@
|
|
23
23
|
|
24
24
|
<div class="field">
|
25
25
|
<%= f.label :password_confirmation %><br />
|
26
|
-
<%= f.password_field :password_confirmation, autocomplete: "
|
26
|
+
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
|
27
27
|
</div>
|
28
28
|
|
29
29
|
<div class="field">
|
30
30
|
<%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
|
31
|
-
<%= f.password_field :current_password, autocomplete: "
|
31
|
+
<%= f.password_field :current_password, autocomplete: "current-password" %>
|
32
32
|
</div>
|
33
33
|
|
34
34
|
<div class="actions">
|
@@ -38,6 +38,6 @@
|
|
38
38
|
|
39
39
|
<h3>Cancel my account</h3>
|
40
40
|
|
41
|
-
<
|
41
|
+
<div>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?", turbo_confirm: "Are you sure?" }, method: :delete %></div>
|
42
42
|
|
43
43
|
<%= link_to "Back", :back %>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<h2>Sign up</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
|
6
6
|
<div class="field">
|
7
7
|
<%= f.label :email %><br />
|
8
|
-
<%= f.email_field :email, autofocus: true %>
|
8
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
9
9
|
</div>
|
10
10
|
|
11
11
|
<div class="field">
|
@@ -13,12 +13,12 @@
|
|
13
13
|
<% if @minimum_password_length %>
|
14
14
|
<em>(<%= @minimum_password_length %> characters minimum)</em>
|
15
15
|
<% end %><br />
|
16
|
-
<%= f.password_field :password, autocomplete: "
|
16
|
+
<%= f.password_field :password, autocomplete: "new-password" %>
|
17
17
|
</div>
|
18
18
|
|
19
19
|
<div class="field">
|
20
20
|
<%= f.label :password_confirmation %><br />
|
21
|
-
<%= f.password_field :password_confirmation, autocomplete: "
|
21
|
+
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
|
22
22
|
</div>
|
23
23
|
|
24
24
|
<div class="actions">
|
@@ -3,20 +3,20 @@
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
|
4
4
|
<div class="field">
|
5
5
|
<%= f.label :email %><br />
|
6
|
-
<%= f.email_field :email, autofocus: true %>
|
6
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
7
7
|
</div>
|
8
8
|
|
9
9
|
<div class="field">
|
10
10
|
<%= f.label :password %><br />
|
11
|
-
<%= f.password_field :password, autocomplete: "
|
11
|
+
<%= f.password_field :password, autocomplete: "current-password" %>
|
12
12
|
</div>
|
13
13
|
|
14
|
-
<% if devise_mapping.rememberable?
|
14
|
+
<% if devise_mapping.rememberable? %>
|
15
15
|
<div class="field">
|
16
16
|
<%= f.check_box :remember_me %>
|
17
17
|
<%= f.label :remember_me %>
|
18
18
|
</div>
|
19
|
-
<% end
|
19
|
+
<% end %>
|
20
20
|
|
21
21
|
<div class="actions">
|
22
22
|
<%= f.submit "Log in" %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<% if resource.errors.any? %>
|
2
|
+
<div id="error_explanation" data-turbo-cache="false">
|
3
|
+
<h2>
|
4
|
+
<%= I18n.t("errors.messages.not_saved",
|
5
|
+
count: resource.errors.count,
|
6
|
+
resource: resource.class.model_name.human.downcase)
|
7
|
+
%>
|
8
|
+
</h2>
|
9
|
+
<ul>
|
10
|
+
<% resource.errors.full_messages.each do |message| %>
|
11
|
+
<li><%= message %></li>
|
12
|
+
<% end %>
|
13
|
+
</ul>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
@@ -1,25 +1,25 @@
|
|
1
1
|
<%- if controller_name != 'sessions' %>
|
2
2
|
<%= link_to "Log in", new_session_path(resource_name) %><br />
|
3
|
-
<% end
|
3
|
+
<% end %>
|
4
4
|
|
5
5
|
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
|
6
6
|
<%= link_to "Sign up", new_registration_path(resource_name) %><br />
|
7
|
-
<% end
|
7
|
+
<% end %>
|
8
8
|
|
9
9
|
<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
|
10
10
|
<%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
|
11
|
-
<% end
|
11
|
+
<% end %>
|
12
12
|
|
13
13
|
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
|
14
14
|
<%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
|
15
|
-
<% end
|
15
|
+
<% end %>
|
16
16
|
|
17
17
|
<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
|
18
18
|
<%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
|
19
|
-
<% end
|
19
|
+
<% end %>
|
20
20
|
|
21
21
|
<%- if devise_mapping.omniauthable? %>
|
22
22
|
<%- resource_class.omniauth_providers.each do |provider| %>
|
23
|
-
<%=
|
24
|
-
<% end
|
25
|
-
<% end
|
23
|
+
<%= button_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), data: { turbo: false } %><br />
|
24
|
+
<% end %>
|
25
|
+
<% end %>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<h2>Resend unlock instructions</h2>
|
2
2
|
|
3
3
|
<%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
|
4
|
-
<%=
|
4
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
5
5
|
|
6
6
|
<div class="field">
|
7
7
|
<%= f.label :email %><br />
|
8
|
-
<%= f.email_field :email, autofocus: true %>
|
8
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
|
9
9
|
</div>
|
10
10
|
|
11
11
|
<div class="actions">
|
data/config/locales/en.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Additional translations at https://github.com/
|
1
|
+
# Additional translations at https://github.com/heartcombo/devise/wiki/I18n
|
2
2
|
|
3
3
|
en:
|
4
4
|
devise:
|
@@ -42,8 +42,9 @@ en:
|
|
42
42
|
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
43
43
|
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
44
44
|
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
45
|
-
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the
|
45
|
+
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address."
|
46
46
|
updated: "Your account has been updated successfully."
|
47
|
+
updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again."
|
47
48
|
sessions:
|
48
49
|
signed_in: "Signed in successfully."
|
49
50
|
signed_out: "Signed out successfully."
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Devise
|
2
4
|
module Controllers
|
3
5
|
# Those helpers are convenience methods added to ApplicationController.
|
@@ -34,14 +36,14 @@ module Devise
|
|
34
36
|
# before_action ->{ authenticate_blogger! :admin } # Redirects to the admin login page
|
35
37
|
# current_blogger :user # Preferably returns a User if one is signed in
|
36
38
|
#
|
37
|
-
def devise_group(group_name, opts={})
|
39
|
+
def devise_group(group_name, opts = {})
|
38
40
|
mappings = "[#{ opts[:contains].map { |m| ":#{m}" }.join(',') }]"
|
39
41
|
|
40
42
|
class_eval <<-METHODS, __FILE__, __LINE__ + 1
|
41
|
-
def authenticate_#{group_name}!(
|
43
|
+
def authenticate_#{group_name}!(favorite = nil, opts = {})
|
42
44
|
unless #{group_name}_signed_in?
|
43
45
|
mappings = #{mappings}
|
44
|
-
mappings.unshift mappings.delete(
|
46
|
+
mappings.unshift mappings.delete(favorite.to_sym) if favorite
|
45
47
|
mappings.each do |mapping|
|
46
48
|
opts[:scope] = mapping
|
47
49
|
warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
|
@@ -55,9 +57,9 @@ module Devise
|
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
58
|
-
def current_#{group_name}(
|
60
|
+
def current_#{group_name}(favorite = nil)
|
59
61
|
mappings = #{mappings}
|
60
|
-
mappings.unshift mappings.delete(
|
62
|
+
mappings.unshift mappings.delete(favorite.to_sym) if favorite
|
61
63
|
mappings.each do |mapping|
|
62
64
|
current = warden.authenticate(scope: mapping)
|
63
65
|
return current if current
|
@@ -111,7 +113,7 @@ module Devise
|
|
111
113
|
mapping = mapping.name
|
112
114
|
|
113
115
|
class_eval <<-METHODS, __FILE__, __LINE__ + 1
|
114
|
-
def authenticate_#{mapping}!(opts={})
|
116
|
+
def authenticate_#{mapping}!(opts = {})
|
115
117
|
opts[:scope] = :#{mapping}
|
116
118
|
warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
|
117
119
|
end
|
@@ -250,7 +252,7 @@ module Devise
|
|
250
252
|
# Overwrite Rails' handle unverified request to sign out all scopes,
|
251
253
|
# clear run strategies and remove cached variables.
|
252
254
|
def handle_unverified_request
|
253
|
-
super # call the default
|
255
|
+
super # call the default behavior which resets/nullifies/raises
|
254
256
|
request.env["devise.skip_storage"] = true
|
255
257
|
sign_out_all_scopes(false)
|
256
258
|
end
|
@@ -266,7 +268,7 @@ module Devise
|
|
266
268
|
# Check if flash messages should be emitted. Default is to do it on
|
267
269
|
# navigational formats
|
268
270
|
def is_flashing_format?
|
269
|
-
is_navigational_format?
|
271
|
+
request.respond_to?(:flash) && is_navigational_format?
|
270
272
|
end
|
271
273
|
|
272
274
|
private
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Devise
|
4
|
+
module Controllers
|
5
|
+
# Custom Responder to configure default statuses that only apply to Devise,
|
6
|
+
# and allow to integrate more easily with Hotwire/Turbo.
|
7
|
+
class Responder < ActionController::Responder
|
8
|
+
if respond_to?(:error_status=) && respond_to?(:redirect_status=)
|
9
|
+
self.error_status = :ok
|
10
|
+
self.redirect_status = :found
|
11
|
+
else
|
12
|
+
# TODO: remove this support for older Rails versions, which aren't supported by Turbo
|
13
|
+
# and/or responders. It won't allow configuring a custom response, but it allows Devise
|
14
|
+
# to use these methods and defaults across the implementation more easily.
|
15
|
+
def self.error_status
|
16
|
+
:ok
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.redirect_status
|
20
|
+
:found
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.error_status=(*)
|
24
|
+
warn "[DEVISE] Setting the error status on the Devise responder has no effect with this " \
|
25
|
+
"version of `responders`, please make sure you're using a newer version. Check the changelog for more info."
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.redirect_status=(*)
|
29
|
+
warn "[DEVISE] Setting the redirect status on the Devise responder has no effect with this " \
|
30
|
+
"version of `responders`, please make sure you're using a newer version. Check the changelog for more info."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,11 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Devise
|
2
4
|
module Controllers
|
3
5
|
# Provide sign in and sign out functionality.
|
4
6
|
# Included by default in all controllers.
|
5
7
|
module SignInOut
|
6
8
|
# Return true if the given scope is signed in session. If no scope given, return
|
7
|
-
# true if any scope is signed in.
|
8
|
-
|
9
|
+
# true if any scope is signed in. This will run authentication hooks, which may
|
10
|
+
# cause exceptions to be thrown from this method; if you simply want to check
|
11
|
+
# if a scope has already previously been authenticated without running
|
12
|
+
# authentication hooks, you can directly call `warden.authenticated?(scope: scope)`
|
13
|
+
def signed_in?(scope = nil)
|
9
14
|
[scope || Devise.mappings.keys].flatten.any? do |_scope|
|
10
15
|
warden.authenticate?(scope: _scope)
|
11
16
|
end
|
@@ -14,6 +19,9 @@ module Devise
|
|
14
19
|
# Sign in a user that already was authenticated. This helper is useful for logging
|
15
20
|
# users in after sign up. All options given to sign_in is passed forward
|
16
21
|
# to the set_user method in warden.
|
22
|
+
# If you are using a custom warden strategy and the timeoutable module, you have to
|
23
|
+
# set `env["devise.skip_timeout"] = true` in the request to use this method, like we do
|
24
|
+
# in the sessions controller: https://github.com/heartcombo/devise/blob/main/app/controllers/devise/sessions_controller.rb#L7
|
17
25
|
#
|
18
26
|
# Examples:
|
19
27
|
#
|
@@ -69,7 +77,7 @@ module Devise
|
|
69
77
|
# sign_out :user # sign_out(scope)
|
70
78
|
# sign_out @user # sign_out(resource)
|
71
79
|
#
|
72
|
-
def sign_out(resource_or_scope=nil)
|
80
|
+
def sign_out(resource_or_scope = nil)
|
73
81
|
return sign_out_all_scopes unless resource_or_scope
|
74
82
|
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
75
83
|
user = warden.user(scope: scope, run_callbacks: false) # If there is no user
|
@@ -84,7 +92,7 @@ module Devise
|
|
84
92
|
# Sign out all active users or scopes. This helper is useful for signing out all roles
|
85
93
|
# in one click. This signs out ALL scopes in warden. Returns true if there was at least one logout
|
86
94
|
# and false if there was no user logged in on all scopes.
|
87
|
-
def sign_out_all_scopes(lock=true)
|
95
|
+
def sign_out_all_scopes(lock = true)
|
88
96
|
users = Devise.mappings.keys.map { |s| warden.user(scope: s, run_callbacks: false) }
|
89
97
|
|
90
98
|
warden.logout
|
@@ -98,10 +106,12 @@ module Devise
|
|
98
106
|
private
|
99
107
|
|
100
108
|
def expire_data_after_sign_in!
|
109
|
+
# TODO: remove once Rails 5.2+ and forward are only supported.
|
101
110
|
# session.keys will return an empty array if the session is not yet loaded.
|
102
111
|
# This is a bug in both Rack and Rails.
|
103
112
|
# A call to #empty? forces the session to be loaded.
|
104
113
|
session.empty?
|
114
|
+
|
105
115
|
session.keys.grep(/^devise\./).each { |k| session.delete(k) }
|
106
116
|
end
|
107
117
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "uri"
|
2
4
|
|
3
5
|
module Devise
|
@@ -33,12 +35,9 @@ module Devise
|
|
33
35
|
#
|
34
36
|
def store_location_for(resource_or_scope, location)
|
35
37
|
session_key = stored_location_key_for(resource_or_scope)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
path = [path, uri.fragment].compact.join('#')
|
40
|
-
session[session_key] = path
|
41
|
-
end
|
38
|
+
|
39
|
+
path = extract_path_from_location(location)
|
40
|
+
session[session_key] = path if path
|
42
41
|
end
|
43
42
|
|
44
43
|
private
|
@@ -53,6 +52,25 @@ module Devise
|
|
53
52
|
scope = Devise::Mapping.find_scope!(resource_or_scope)
|
54
53
|
"#{scope}_return_to"
|
55
54
|
end
|
55
|
+
|
56
|
+
def extract_path_from_location(location)
|
57
|
+
uri = parse_uri(location)
|
58
|
+
|
59
|
+
if uri
|
60
|
+
path = remove_domain_from_uri(uri)
|
61
|
+
path = add_fragment_back_to_path(uri, path)
|
62
|
+
|
63
|
+
path
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def remove_domain_from_uri(uri)
|
68
|
+
[uri.path.sub(/\A\/+/, '/'), uri.query].compact.join('?')
|
69
|
+
end
|
70
|
+
|
71
|
+
def add_fragment_back_to_path(uri, path)
|
72
|
+
[path, uri.fragment].compact.join('#')
|
73
|
+
end
|
56
74
|
end
|
57
75
|
end
|
58
76
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Devise
|
2
4
|
module Controllers
|
3
5
|
# Create url helpers to be used with resource/scope configuration. Acts as
|
@@ -32,7 +34,7 @@ module Devise
|
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
35
|
-
def self.generate_helpers!(routes=nil)
|
37
|
+
def self.generate_helpers!(routes = nil)
|
36
38
|
routes ||= begin
|
37
39
|
mappings = Devise.mappings.values.map(&:used_helpers).flatten.uniq
|
38
40
|
Devise::URL_HELPERS.slice(*mappings)
|
data/lib/devise/delegator.rb
CHANGED