From 9fdda9008534c53e399adc36fe1a880bbe41ce56 Mon Sep 17 00:00:00 2001
From: zeripath <art27@cantab.net>
Date: Wed, 2 Jun 2021 13:03:59 +0100
Subject: [PATCH] Fix case change in ownernames (#16045)

If you change the case of a username the change needs to be propagated to their
repositories.

Signed-off-by: Andrew Thornton <art27@cantab.net>
---
 models/repo.go                  | 20 ++++++++++++++++++++
 routers/org/setting.go          |  9 +++++++++
 routers/user/setting/profile.go |  8 +++++++-
 3 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/models/repo.go b/models/repo.go
index daa94c0d50..58a393ae70 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -1350,6 +1350,26 @@ func UpdateRepository(repo *Repository, visibilityChanged bool) (err error) {
 	return sess.Commit()
 }
 
+// UpdateRepositoryOwnerNames updates repository owner_names (this should only be used when the ownerName has changed case)
+func UpdateRepositoryOwnerNames(ownerID int64, ownerName string) error {
+	if ownerID == 0 {
+		return nil
+	}
+	sess := x.NewSession()
+	defer sess.Close()
+	if err := sess.Begin(); err != nil {
+		return err
+	}
+
+	if _, err := sess.Where("owner_id = ?", ownerID).Cols("owner_name").Update(&Repository{
+		OwnerName: ownerName,
+	}); err != nil {
+		return err
+	}
+
+	return sess.Commit()
+}
+
 // UpdateRepositoryUpdatedTime updates a repository's updated time
 func UpdateRepositoryUpdatedTime(repoID int64, updateTime time.Time) error {
 	_, err := x.Exec("UPDATE repository SET updated_unix = ? WHERE id = ?", updateTime.Unix(), repoID)
diff --git a/routers/org/setting.go b/routers/org/setting.go
index e7995fe8fa..0e28a93ace 100644
--- a/routers/org/setting.go
+++ b/routers/org/setting.go
@@ -52,6 +52,7 @@ func SettingsPost(ctx *context.Context) {
 	}
 
 	org := ctx.Org.Organization
+	nameChanged := org.Name != form.Name
 
 	// Check if organization name has been changed.
 	if org.LowerName != strings.ToLower(form.Name) {
@@ -75,7 +76,9 @@ func SettingsPost(ctx *context.Context) {
 		// reset ctx.org.OrgLink with new name
 		ctx.Org.OrgLink = setting.AppSubURL + "/org/" + form.Name
 		log.Trace("Organization name changed: %s -> %s", org.Name, form.Name)
+		nameChanged = false
 	}
+
 	// In case it's just a case change.
 	org.Name = form.Name
 	org.LowerName = strings.ToLower(form.Name)
@@ -105,11 +108,17 @@ func SettingsPost(ctx *context.Context) {
 			return
 		}
 		for _, repo := range org.Repos {
+			repo.OwnerName = org.Name
 			if err := models.UpdateRepository(repo, true); err != nil {
 				ctx.ServerError("UpdateRepository", err)
 				return
 			}
 		}
+	} else if nameChanged {
+		if err := models.UpdateRepositoryOwnerNames(org.ID, org.Name); err != nil {
+			ctx.ServerError("UpdateRepository", err)
+			return
+		}
 	}
 
 	log.Trace("Organization setting updated: %s", org.Name)
diff --git a/routers/user/setting/profile.go b/routers/user/setting/profile.go
index 0bc2b4ee36..8cde81f295 100644
--- a/routers/user/setting/profile.go
+++ b/routers/user/setting/profile.go
@@ -68,8 +68,13 @@ func HandleUsernameChange(ctx *context.Context, user *models.User, newName strin
 			}
 			return err
 		}
-		log.Trace("User name changed: %s -> %s", user.Name, newName)
+	} else {
+		if err := models.UpdateRepositoryOwnerNames(user.ID, newName); err != nil {
+			ctx.ServerError("UpdateRepository", err)
+			return err
+		}
 	}
+	log.Trace("User name changed: %s -> %s", user.Name, newName)
 	return nil
 }
 
@@ -85,6 +90,7 @@ func ProfilePost(ctx *context.Context) {
 	}
 
 	if len(form.Name) != 0 && ctx.User.Name != form.Name {
+		log.Debug("Changing name for %s to %s", ctx.User.Name, form.Name)
 		if err := HandleUsernameChange(ctx, ctx.User, form.Name); err != nil {
 			ctx.Redirect(setting.AppSubURL + "/user/settings")
 			return