Patch #4732 ยป case-insensitive-login.patch
app/models/user.rb (revision 50) | ||
---|---|---|
96 | 96 |
def self.try_to_login(login, password) |
97 | 97 |
# Make sure no one can sign in with an empty password |
98 | 98 |
return nil if password.to_s.empty? |
99 |
user = find(:first, :conditions => ["login=?", login]) |
|
99 |
# This does a case-insensitive lookup: |
|
100 |
# - Uses the index (avoids table walks) if the user exists (maybe causes table walks on MySQL for non-existant users?) |
|
101 |
# - Does not depend on the database adapter |
|
102 |
# (MySQL will always match on the first, as it does not support function indexes; |
|
103 |
# PostgreSQL will match on first or second, both times with index (standard or the one created by the 20100203232731 migration); |
|
104 |
# SQLite should always be small enough for table walks) |
|
105 |
user = find(:first, :conditions => ["login=?", login]) || find(:first, :conditions => ["LOWER(login)=LOWER(?)", login]) |
|
100 | 106 |
if user |
101 | 107 |
# user is already in local database |
102 | 108 |
return nil if !user.active? |
db/migrate/20100203232731_add_case_insensitive_user_index.rb (revision 50) | ||
---|---|---|
1 |
class AddCaseInsensitiveUserIndex < ActiveRecord::Migration |
|
2 |
def self.up |
|
3 |
# Migrates PostgreSQL databases only |
|
4 |
# MySQL compares case-insensitive by default |
|
5 |
if ActiveRecord::Base.connection.adapter_name =~ /postgresql/i |
|
6 |
execute "CREATE INDEX index_users_on_lower_login ON users (LOWER(login));" |
|
7 |
end |
|
8 |
end |
|
9 | ||
10 |
def self.down |
|
11 |
if ActiveRecord::Base.connection.adapter_name =~ /postgresql/i |
|
12 |
execute "DROP INDEX index_users_on_lower_login;" |
|
13 |
end |
|
14 |
end |
|
15 |
end |