From 533880860069ca95fba44732721fef3434e1ec99 Mon Sep 17 00:00:00 2001
From: Unknwon <joe2010xtmf@163.com>
Date: Sun, 30 Nov 2014 18:29:16 -0500
Subject: [PATCH] fix #676

---
 models/user.go         |  9 ++++++++-
 routers/admin/users.go | 12 +++++++++---
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/models/user.go b/models/user.go
index 61a43ba9b..5c6101e62 100644
--- a/models/user.go
+++ b/models/user.go
@@ -417,6 +417,13 @@ func ChangeUserName(u *User, newUserName string) (err error) {
 
 // UpdateUser updates user's information.
 func UpdateUser(u *User) error {
+	has, err := x.Where("id != ?", u.Id).And("email = ?", u.Email).Get(new(User))
+	if err != nil {
+		return err
+	} else if has {
+		return ErrEmailAlreadyUsed
+	}
+
 	u.LowerName = strings.ToLower(u.Name)
 
 	if len(u.Location) > 255 {
@@ -429,7 +436,7 @@ func UpdateUser(u *User) error {
 		u.Description = u.Description[:255]
 	}
 
-	_, err := x.Id(u.Id).AllCols().Update(u)
+	_, err = x.Id(u.Id).AllCols().Update(u)
 	return err
 }
 
diff --git a/routers/admin/users.go b/routers/admin/users.go
index 0a1056f3b..2bbf13b92 100644
--- a/routers/admin/users.go
+++ b/routers/admin/users.go
@@ -192,13 +192,19 @@ func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) {
 	u.IsActive = form.Active
 	u.IsAdmin = form.Admin
 	u.AllowGitHook = form.AllowGitHook
+
+	ctx.Data["User"] = u
+
 	if err := models.UpdateUser(u); err != nil {
-		ctx.Handle(500, "UpdateUser", err)
+		if err == models.ErrEmailAlreadyUsed {
+			ctx.Data["Err_Email"] = true
+			ctx.RenderWithErr(ctx.Tr("form.email_been_used"), USER_EDIT, &form)
+		} else {
+			ctx.Handle(500, "UpdateUser", err)
+		}
 		return
 	}
 	log.Trace("Account profile updated by admin(%s): %s", ctx.User.Name, u.Name)
-
-	ctx.Data["User"] = u
 	ctx.Flash.Success(ctx.Tr("admin.users.update_profile_success"))
 	ctx.Redirect(setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid"))
 }