From 16bfe983c23c76d11eda81555e7a4598b3f29ce5 Mon Sep 17 00:00:00 2001
From: Giteabot <teabot@gitea.io>
Date: Fri, 31 Mar 2023 12:53:25 -0400
Subject: [PATCH] Fix 500 error if there is a name conflict when edit
 authentication source (#23832) (#23852)

Backport #23832 by @yp05327

Co-authored-by: yp05327 <576951401@qq.com>
---
 models/auth/source.go      | 9 ++++++++-
 routers/web/admin/auths.go | 6 ++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/models/auth/source.go b/models/auth/source.go
index bade2fecf0..0a904b7772 100644
--- a/models/auth/source.go
+++ b/models/auth/source.go
@@ -317,7 +317,14 @@ func UpdateSource(source *Source) error {
 		}
 	}
 
-	_, err := db.GetEngine(db.DefaultContext).ID(source.ID).AllCols().Update(source)
+	has, err := db.GetEngine(db.DefaultContext).Where("name=? AND id!=?", source.Name, source.ID).Exist(new(Source))
+	if err != nil {
+		return err
+	} else if has {
+		return ErrSourceAlreadyExist{source.Name}
+	}
+
+	_, err = db.GetEngine(db.DefaultContext).ID(source.ID).AllCols().Update(source)
 	if err != nil {
 		return err
 	}
diff --git a/routers/web/admin/auths.go b/routers/web/admin/auths.go
index d2953f753d..6ebd23b7bb 100644
--- a/routers/web/admin/auths.go
+++ b/routers/web/admin/auths.go
@@ -426,9 +426,11 @@ func EditAuthSourcePost(ctx *context.Context) {
 	source.IsActive = form.IsActive
 	source.IsSyncEnabled = form.IsSyncEnabled
 	source.Cfg = config
-	// FIXME: if the name conflicts, it will result in 500: Error 1062: Duplicate entry 'aa' for key 'login_source.UQE_login_source_name'
 	if err := auth.UpdateSource(source); err != nil {
-		if oauth2.IsErrOpenIDConnectInitialize(err) {
+		if auth.IsErrSourceAlreadyExist(err) {
+			ctx.Data["Err_Name"] = true
+			ctx.RenderWithErr(ctx.Tr("admin.auths.login_source_exist", err.(auth.ErrSourceAlreadyExist).Name), tplAuthEdit, form)
+		} else if oauth2.IsErrOpenIDConnectInitialize(err) {
 			ctx.Flash.Error(err.Error(), true)
 			ctx.Data["Err_DiscoveryURL"] = true
 			ctx.HTML(http.StatusOK, tplAuthEdit)