# HG changeset patch # User Marcin Kuzminski # Date 2010-11-23 13:15:45 # Node ID 1377a9d4bdb9fec41723722170963740cf4afb41 # Parent 54684e0714575a39f36aadf1149c92d1ae81161f #78, fixed more reliable case insensitive searches diff --git a/rhodecode/lib/auth.py b/rhodecode/lib/auth.py --- a/rhodecode/lib/auth.py +++ b/rhodecode/lib/auth.py @@ -107,7 +107,9 @@ def authfunc(environ, username, password #since ldap is searching in case insensitive check if this user is still #not in our system username = username.lower() - if user_model.get_by_username(username, cache=False) is not None: + user_obj = user_model.get_by_username(username, cache=False, + case_insensitive=True) + if user_obj is not None: return False from rhodecode.model.settings import SettingsModel diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py --- a/rhodecode/model/forms.py +++ b/rhodecode/model/forms.py @@ -67,7 +67,8 @@ def ValidUsername(edit, old_data): old_un = UserModel().get(old_data.get('user_id')).username if old_un != value or not edit: - if UserModel().get_by_username(value.lower(), cache=False): + if UserModel().get_by_username(value, cache=False, + case_insensitive=True): raise formencode.Invalid(_('This username already exists') , value, state) @@ -183,7 +184,8 @@ def ValidForkType(old_data): def to_python(self, value, state): if old_data['repo_type'] != value: - raise formencode.Invalid(_('Fork have to be the same type as original'), value, state) + raise formencode.Invalid(_('Fork have to be the same type as original'), + value, state) return value return _ValidForkType @@ -220,7 +222,8 @@ class ValidPerms(formencode.validators.F except Exception: msg = self.message('perm_new_user_name', state=State_obj) - raise formencode.Invalid(msg, value, state, error_dict={'perm_new_user_name':msg}) + raise formencode.Invalid(msg, value, state, + error_dict={'perm_new_user_name':msg}) return value class ValidSettings(formencode.validators.FancyValidator): @@ -316,7 +319,8 @@ def UserForm(edit=False, old_data={}): class _UserForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True - username = All(UnicodeString(strip=True, min=1, not_empty=True), ValidUsername(edit, old_data)) + username = All(UnicodeString(strip=True, min=1, not_empty=True), + ValidUsername(edit, old_data)) if edit: new_password = All(UnicodeString(strip=True, min=6, not_empty=False)) admin = StringBoolean(if_missing=False) @@ -335,7 +339,8 @@ def RegisterForm(edit=False, old_data={} class _RegisterForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True - username = All(ValidUsername(edit, old_data), UnicodeString(strip=True, min=1, not_empty=True)) + username = All(ValidUsername(edit, old_data), + UnicodeString(strip=True, min=1, not_empty=True)) password = All(UnicodeString(strip=True, min=6, not_empty=True)) password_confirmation = All(UnicodeString(strip=True, min=6, not_empty=True)) active = StringBoolean(if_missing=False) @@ -358,7 +363,8 @@ def RepoForm(edit=False, old_data={}, su class _RepoForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = False - repo_name = All(UnicodeString(strip=True, min=1, not_empty=True), ValidRepoName(edit, old_data)) + repo_name = All(UnicodeString(strip=True, min=1, not_empty=True), + ValidRepoName(edit, old_data)) description = UnicodeString(strip=True, min=1, not_empty=True) private = StringBoolean(if_missing=False) repo_type = OneOf(supported_backends) @@ -372,7 +378,8 @@ def RepoForkForm(edit=False, old_data={} class _RepoForkForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = False - fork_name = All(UnicodeString(strip=True, min=1, not_empty=True), ValidRepoName(edit, old_data)) + fork_name = All(UnicodeString(strip=True, min=1, not_empty=True), + ValidRepoName(edit, old_data)) description = UnicodeString(strip=True, min=1, not_empty=True) private = StringBoolean(if_missing=False) repo_type = All(ValidForkType(old_data), OneOf(supported_backends)) @@ -382,7 +389,8 @@ def RepoSettingsForm(edit=False, old_dat class _RepoForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = False - repo_name = All(UnicodeString(strip=True, min=1, not_empty=True), ValidRepoName(edit, old_data)) + repo_name = All(UnicodeString(strip=True, min=1, not_empty=True), + ValidRepoName(edit, old_data)) description = UnicodeString(strip=True, min=1, not_empty=True) private = StringBoolean(if_missing=False) diff --git a/rhodecode/model/user.py b/rhodecode/model/user.py --- a/rhodecode/model/user.py +++ b/rhodecode/model/user.py @@ -48,9 +48,13 @@ class UserModel(object): return user.get(user_id) - def get_by_username(self, username, cache=False): - user = self.sa.query(User)\ - .filter(User.username == username) + def get_by_username(self, username, cache=False, case_insensitive=False): + + if case_insensitive: + user = self.sa.query(User).filter(User.username.ilike(username)) + else: + user = self.sa.query(User)\ + .filter(User.username == username) if cache: user = user.options(FromCache("sql_cache_short", "get_user_%s" % username))