diff --git a/lib/devise/param_filter.rb b/lib/devise/param_filter.rb index 759518fa..46b9ddd6 100644 --- a/lib/devise/param_filter.rb +++ b/lib/devise/param_filter.rb @@ -8,16 +8,16 @@ module Devise def filter(conditions) conditions = stringify_params(conditions.dup) - @case_insensitive_keys.each do |k| - value = conditions[k] - next unless value.respond_to?(:downcase) - conditions[k] = value.downcase - end + conditions.merge!(filtered_hash_by_method_for_given_keys(conditions.dup, :downcase, @case_insensitive_keys)) + conditions.merge!(filtered_hash_by_method_for_given_keys(conditions.dup, :strip, @strip_whitespace_keys)) - @strip_whitespace_keys.each do |k| + conditions + end + + def filtered_hash_by_method_for_given_keys(conditions, method, condition_keys) + condition_keys.each do |k| value = conditions[k] - next unless value.respond_to?(:strip) - conditions[k] = value.strip + conditions[k] = value.send(method) if value.respond_to?(method) end conditions diff --git a/test/models/database_authenticatable_test.rb b/test/models/database_authenticatable_test.rb index 1439a51f..01fded85 100644 --- a/test/models/database_authenticatable_test.rb +++ b/test/models/database_authenticatable_test.rb @@ -52,6 +52,18 @@ class DatabaseAuthenticatableTest < ActiveSupport::TestCase assert_equal( { "login" => "foo@bar.com", "bool1" => "true", "bool2" => "false", "fixnum" => "123", "will_be_converted" => "1..10" }, conditions) end + test 'param filter should filter case_insensitive_keys as insensitive' do + conditions = {'insensitive' => 'insensitive_VAL', 'sensitive' => 'sensitive_VAL'} + conditions = Devise::ParamFilter.new(['insensitive'], []).filter(conditions) + assert_equal( {'insensitive' => 'insensitive_val', 'sensitive' => 'sensitive_VAL'}, conditions ) + end + + test 'param filter should filter strip_whitespace_keys stripping whitespaces' do + conditions = {'strip_whitespace' => ' strip_whitespace_val ', 'do_not_strip_whitespace' => ' do_not_strip_whitespace_val '} + conditions = Devise::ParamFilter.new([], ['strip_whitespace']).filter(conditions) + assert_equal( {'strip_whitespace' => 'strip_whitespace_val', 'do_not_strip_whitespace' => ' do_not_strip_whitespace_val '}, conditions ) + end + test 'should respond to password and password confirmation' do user = new_user assert user.respond_to?(:password)