diff --git a/app/models/user.rb b/app/models/user.rb index bec279eb2..4bb8c6856 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -546,11 +546,17 @@ class User < Principal def self.find_by_login(login) login = Redmine::CodesetUtil.replace_invalid_utf8(login.to_s) if login.present? + users = where(:login => login) # First look for an exact match - user = where(:login => login).detect {|u| u.login == login} + user = users.detect {|u| u.login == login} unless user # Fail over to case-insensitive if none was found - user = find_by("LOWER(login) = ?", login.downcase) + if Redmine::Database.mysql? || Redmine::Database.sqlserver? + # MySQL and SQLServer are case-insensitive by default, we can search in the existing results + user = users.detect {|u| u.login.casecmp?(login)} + else + user = find_by("LOWER(login) = ?", login.downcase) + end end user end diff --git a/lib/redmine/database.rb b/lib/redmine/database.rb index 13c92b8a4..7c95d5da3 100644 --- a/lib/redmine/database.rb +++ b/lib/redmine/database.rb @@ -65,6 +65,10 @@ module Redmine mysql? ? ActiveRecord::Base.connection.select_value("SELECT VERSION()") : nil end + def sqlserver? + /sqlserver/i.match?(ActiveRecord::Base.connection.adapter_name) + end + # Returns a SQL statement for case/accent (if possible) insensitive match def like(left, right, options={}) neg = (options[:match] == false ? 'NOT ' : '')