Skip to content

Commit

Permalink
Humanize invalid login error message and downsize authentication keys
Browse files Browse the repository at this point in the history
  • Loading branch information
baarkerlounger committed Feb 28, 2022
1 parent 451ff6d commit b9e9767
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 13 deletions.
7 changes: 5 additions & 2 deletions lib/devise/failure_app.rb
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,14 @@ def i18n_message(default = nil)
options[:scope] = "devise.failure"
options[:default] = [message]
auth_keys = scope_class.authentication_keys
keys = (auth_keys.respond_to?(:keys) ? auth_keys.keys : auth_keys).map { |key| scope_class.human_attribute_name(key) }
keys = (auth_keys.respond_to?(:keys) ? auth_keys.keys : auth_keys).map { |key| scope_class.human_attribute_name(key).downcase }
options[:authentication_keys] = keys.join(I18n.translate(:"support.array.words_connector"))
options = i18n_options(options)

I18n.t(:"#{scope}.#{message}", **options)
translated_message = I18n.t(:"#{scope}.#{message}", **options)
# only call `#humanize` when the message is `:invalid` to ensure the original format
# of other messages - like `:does_not_exist` - is kept.
message == :invalid ? translated_message.humanize : translated_message
else
message.to_s
end
Expand Down
20 changes: 15 additions & 5 deletions test/failure_app_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -184,17 +184,27 @@ def call_failure(env_params = {})

test 'uses the proxy failure message as symbol' do
call_failure('warden' => OpenStruct.new(message: :invalid))
assert_equal 'Invalid Email or password.', @request.flash[:alert]
assert_equal 'Invalid email or password.', @request.flash[:alert]
assert_equal 'http://test.host/users/sign_in', @response.second["Location"]
end

test 'supports authentication_keys as a Hash for the flash message' do
swap Devise, authentication_keys: { email: true, login: true } do
call_failure('warden' => OpenStruct.new(message: :invalid))
assert_equal 'Invalid Email, Login or password.', @request.flash[:alert]
assert_equal 'Invalid email, Login or password.', @request.flash[:alert]
end
end

test 'downcases authentication_keys for the flash message' do
call_failure('warden' => OpenStruct.new(message: :invalid))
assert_equal 'Invalid email or password.', @request.flash[:alert]
end

test 'humanizes the flash message' do
call_failure('warden' => OpenStruct.new(message: :invalid))
assert_equal @request.flash[:alert], @request.flash[:alert].humanize
end

test 'uses custom i18n options' do
call_failure('warden' => OpenStruct.new(message: :does_not_exist), app: FailureWithI18nOptions)
assert_equal 'User Steve does not exist', @request.flash[:alert]
Expand Down Expand Up @@ -277,7 +287,7 @@ def call_failure(env_params = {})

test 'uses the failure message as response body' do
call_failure('formats' => Mime[:xml], 'warden' => OpenStruct.new(message: :invalid))
assert_match '<error>Invalid Email or password.</error>', @response.third.body
assert_match '<error>Invalid email or password.</error>', @response.third.body
end

context 'on ajax call' do
Expand Down Expand Up @@ -326,7 +336,7 @@ def call_failure(env_params = {})
}
call_failure(env)
assert_includes @response.third.body, '<h2>Log in</h2>'
assert_includes @response.third.body, 'Invalid Email or password.'
assert_includes @response.third.body, 'Invalid email or password.'
end

test 'calls the original controller if not confirmed email' do
Expand Down Expand Up @@ -361,7 +371,7 @@ def call_failure(env_params = {})
}
call_failure(env)
assert_includes @response.third.body, '<h2>Log in</h2>'
assert_includes @response.third.body, 'Invalid Email or password.'
assert_includes @response.third.body, 'Invalid email or password.'
assert_equal '/sample', @request.env["SCRIPT_NAME"]
assert_equal '/users/sign_in', @request.env["PATH_INFO"]
end
Expand Down
4 changes: 2 additions & 2 deletions test/integration/authenticatable_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,7 @@ class AuthenticationKeysTest < Devise::IntegrationTest
test 'missing authentication keys cause authentication to abort' do
swap Devise, authentication_keys: [:subdomain] do
sign_in_as_user
assert_contain "Invalid Subdomain or password."
assert_contain "Invalid subdomain or password."
refute warden.authenticated?(:user)
end
end
Expand Down Expand Up @@ -585,7 +585,7 @@ class AuthenticationRequestKeysTest < Devise::IntegrationTest

swap Devise, request_keys: [:subdomain] do
sign_in_as_user
assert_contain "Invalid Email or password."
assert_contain "Invalid email or password."
refute warden.authenticated?(:user)
end
end
Expand Down
2 changes: 1 addition & 1 deletion test/integration/confirmable_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ def resend_confirmation
fill_in 'password', with: 'invalid'
end

assert_contain 'Invalid Email or password'
assert_contain 'Invalid email or password'
refute warden.authenticated?(:user)
end
end
Expand Down
4 changes: 2 additions & 2 deletions test/integration/database_authenticatable_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ class DatabaseAuthenticationTest < Devise::IntegrationTest
fill_in 'password', with: 'abcdef'
end

assert_contain 'Invalid Email or password'
assert_contain 'Invalid email or password'
refute warden.authenticated?(:admin)
end

Expand All @@ -82,7 +82,7 @@ class DatabaseAuthenticationTest < Devise::IntegrationTest
end

assert_not_contain 'Not found in database'
assert_contain 'Invalid Email or password.'
assert_contain 'Invalid email or password.'
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion test/integration/http_authenticatable_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class HttpAuthenticationTest < Devise::IntegrationTest
sign_in_as_new_user_with_http("unknown")
assert_equal 401, status
assert_equal "application/json; charset=utf-8", headers["Content-Type"]
assert_match '"error":"Invalid Email or password."', response.body
assert_match '"error":"Invalid email or password."', response.body
end

test 'returns a custom response with www-authenticate and chosen realm' do
Expand Down

0 comments on commit b9e9767

Please sign in to comment.