diff --git a/rhodecode/controllers/admin/users.py b/rhodecode/controllers/admin/users.py --- a/rhodecode/controllers/admin/users.py +++ b/rhodecode/controllers/admin/users.py @@ -125,12 +125,15 @@ class UsersController(BaseController): h.flash(_('User updated successfully'), category='success') Session.commit() except formencode.Invalid, errors: + c.user_email_map = UserEmailMap.query()\ + .filter(UserEmailMap.user == c.user).all() + defaults = errors.value e = errors.error_dict or {} perm = Permission.get_by_key('hg.create.repository') - e.update({'create_repo_perm': user_model.has_perm(id, perm)}) + defaults.update({'create_repo_perm': user_model.has_perm(id, perm)}) return htmlfill.render( render('admin/users/user_edit.html'), - defaults=errors.value, + defaults=defaults, errors=e, prefix_error=False, encoding="UTF-8") @@ -231,6 +234,9 @@ class UsersController(BaseController): user_model.add_extra_email(id, email) Session.commit() h.flash(_("Added email %s to user" % email), category='success') + except formencode.Invalid, error: + msg = error.error_dict['email'] + h.flash(msg, category='error') except Exception: log.error(traceback.format_exc()) h.flash(_('An error occurred during email saving'), diff --git a/rhodecode/lib/auth.py b/rhodecode/lib/auth.py --- a/rhodecode/lib/auth.py +++ b/rhodecode/lib/auth.py @@ -38,11 +38,6 @@ from pylons.i18n.translation import _ from rhodecode import __platform__, PLATFORM_WIN, PLATFORM_OTHERS from rhodecode.model.meta import Session -if __platform__ in PLATFORM_WIN: - from hashlib import sha256 -if __platform__ in PLATFORM_OTHERS: - import bcrypt - from rhodecode.lib.utils2 import str2bool, safe_unicode from rhodecode.lib.exceptions import LdapPasswordError, LdapUsernameError from rhodecode.lib.utils import get_repo_slug, get_repos_group_slug @@ -98,8 +93,10 @@ class RhodeCodeCrypto(object): :param password: password to hash """ if __platform__ in PLATFORM_WIN: + from hashlib import sha256 return sha256(str_).hexdigest() elif __platform__ in PLATFORM_OTHERS: + import bcrypt return bcrypt.hashpw(str_, bcrypt.gensalt(10)) else: raise Exception('Unknown or unsupported platform %s' \ @@ -116,8 +113,10 @@ class RhodeCodeCrypto(object): """ if __platform__ in PLATFORM_WIN: + from hashlib import sha256 return sha256(password).hexdigest() == hashed elif __platform__ in PLATFORM_OTHERS: + import bcrypt return bcrypt.hashpw(password, hashed) == hashed else: raise Exception('Unknown or unsupported platform %s' \ diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py --- a/rhodecode/model/forms.py +++ b/rhodecode/model/forms.py @@ -299,3 +299,10 @@ def LdapSettingsForm(tls_reqcert_choices ldap_attr_email = v.UnicodeString(strip=True,) return _LdapSettingsForm + + +def UserExtraEmailForm(): + class _UserExtraEmailForm(formencode.Schema): + email = All(v.UniqSystemEmail(), v.Email) + + return _UserExtraEmailForm \ No newline at end of file diff --git a/rhodecode/model/user.py b/rhodecode/model/user.py --- a/rhodecode/model/user.py +++ b/rhodecode/model/user.py @@ -29,9 +29,11 @@ import traceback from pylons import url from pylons.i18n.translation import _ +from sqlalchemy.exc import DatabaseError +from sqlalchemy.orm import joinedload + from rhodecode.lib.utils2 import safe_unicode, generate_api_key from rhodecode.lib.caching_query import FromCache - from rhodecode.model import BaseModel from rhodecode.model.db import User, UserRepoToPerm, Repository, Permission, \ UserToPerm, UsersGroupRepoToPerm, UsersGroupToPerm, UsersGroupMember, \ @@ -40,9 +42,6 @@ from rhodecode.model.db import User, Use from rhodecode.lib.exceptions import DefaultUserException, \ UserOwnsReposException -from sqlalchemy.exc import DatabaseError - -from sqlalchemy.orm import joinedload log = logging.getLogger(__name__) @@ -593,10 +592,14 @@ class UserModel(BaseModel): :param user: :param email: """ + from rhodecode.model import forms + form = forms.UserExtraEmailForm()() + data = form.to_python(dict(email=email)) user = self._get_user(user) + obj = UserEmailMap() obj.user = user - obj.email = email + obj.email = data['email'] self.sa.add(obj) return obj diff --git a/rhodecode/model/validators.py b/rhodecode/model/validators.py --- a/rhodecode/model/validators.py +++ b/rhodecode/model/validators.py @@ -14,7 +14,6 @@ from formencode.validators import ( from rhodecode.lib.utils import repo_name_slug from rhodecode.model.db import RepoGroup, Repository, UsersGroup, User -from rhodecode.lib.auth import authenticate from rhodecode.lib.exceptions import LdapImportError from rhodecode.config.routing import ADMIN_PREFIX # silence warnings and pylint @@ -241,6 +240,8 @@ def ValidAuth(): } def validate_python(self, value, state): + from rhodecode.lib.auth import authenticate + password = value['password'] username = value['username']