changeset 1757:2aa7f454204e beta

fixes #298, ldap email addresses created by rhodecode automatically during first login didn't get converted to lower case, which lead to lookup failures and than wrong checks for uniqueness. Fixed that by putting a setter on db model column that will enforce converting to lowercase.
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 06 Dec 2011 01:18:27 +0200
parents 60a00fd76d58
children a87aa385f21c
files rhodecode/model/db.py rhodecode/model/forms.py
diffstat 2 files changed, 17 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/model/db.py	Mon Dec 05 03:31:23 2011 +0200
+++ b/rhodecode/model/db.py	Tue Dec 06 01:18:27 2011 +0200
@@ -265,7 +265,7 @@
     admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
     name = Column("name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
     lastname = Column("lastname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
-    email = Column("email", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
+    _email = Column("email", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
     last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
     ldap_dn = Column("ldap_dn", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
     api_key = Column("api_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
@@ -281,6 +281,14 @@
 
     notifications = relationship('UserNotification',)
 
+    @hybrid_property
+    def email(self):
+        return self._email
+
+    @email.setter
+    def email(self, val):
+        self._email = val.lower() if val else None
+
     @property
     def full_name(self):
         return '%s %s' % (self.name, self.lastname)
@@ -324,8 +332,11 @@
         return q.scalar()
 
     @classmethod
-    def get_by_email(cls, email, cache=False):
-        q = cls.query().filter(cls.email == email)
+    def get_by_email(cls, email, case_insensitive=False, cache=False):
+        if case_insensitive:
+            q = cls.query().filter(cls.email.ilike(email))
+        else:
+            q = cls.query().filter(cls.email == email)
 
         if cache:
             q = q.options(FromCache("sql_cache_short",
--- a/rhodecode/model/forms.py	Mon Dec 05 03:31:23 2011 +0200
+++ b/rhodecode/model/forms.py	Tue Dec 06 01:18:27 2011 +0200
@@ -396,7 +396,7 @@
 class ValidSettings(formencode.validators.FancyValidator):
 
     def to_python(self, value, state):
-        #settings  form can't edit user
+        # settings  form can't edit user
         if value.has_key('user'):
             del['value']['user']
 
@@ -416,7 +416,7 @@
         def to_python(self, value, state):
             value = value.lower()
             if old_data.get('email') != value:
-                user = User.query().filter(User.email == value).scalar()
+                user = User.get_by_email(value, case_insensitive=True)
                 if user:
                     raise formencode.Invalid(
                                     _("This e-mail address is already taken"),
@@ -428,7 +428,7 @@
 class ValidSystemEmail(formencode.validators.FancyValidator):
     def to_python(self, value, state):
         value = value.lower()
-        user = User.query().filter(User.email == value).scalar()
+        user = User.get_by_email(value, case_insensitive=True)
         if  user is None:
             raise formencode.Invalid(_("This e-mail address doesn't exist.") ,
                                      value, state)