From 3c6fa7f5fbec371290f5c8b70632571dde0c66a6 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 4 Mar 2024 17:50:31 +0800 Subject: [PATCH 1/3] Fix 500 when deleting account with incorrect password or unsupported login type --- modules/base/type.go | 10 ++++++++++ options/locale/locale_en-US.ini | 4 +++- routers/web/user/setting/account.go | 19 +++++++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 modules/base/type.go diff --git a/modules/base/type.go b/modules/base/type.go new file mode 100644 index 0000000000000..521ee8363ccf3 --- /dev/null +++ b/modules/base/type.go @@ -0,0 +1,10 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package base + +// IsError checks if an error is a T error. +func IsError[T any](err error) bool { + _, ok := err.(T) + return ok +} diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 255fed28ad1e0..69ddbf14a57b4 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -583,6 +583,8 @@ enterred_invalid_repo_name = The repository name you entered is incorrect. enterred_invalid_org_name = The organization name you entered is incorrect. enterred_invalid_owner_name = The new owner name is not valid. enterred_invalid_password = The password you entered is incorrect. +unset_password = The login user has not set the password. +unsupported_login_type = The login type is not supported to delete account. user_not_exist = The user does not exist. team_not_exist = The team does not exist. last_org_owner = You cannot remove the last user from the 'owners' team. There must be at least one owner for an organization. @@ -654,7 +656,7 @@ block.note.title = Optional note: block.note.info = The note is not visible to the blocked user. block.note.edit = Edit note block.list = Blocked users -block.list.none = You have not blocked any users. +block.list.none = You have not blocked any users. [settings] profile = Profile diff --git a/routers/web/user/setting/account.go b/routers/web/user/setting/account.go index abb5873e98ada..7f98e549fdd08 100644 --- a/routers/web/user/setting/account.go +++ b/routers/web/user/setting/account.go @@ -19,6 +19,8 @@ import ( "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/auth" + "code.gitea.io/gitea/services/auth/source/db" + "code.gitea.io/gitea/services/auth/source/smtp" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/forms" "code.gitea.io/gitea/services/mailer" @@ -242,11 +244,24 @@ func DeleteAccount(ctx *context.Context) { ctx.Data["PageIsSettingsAccount"] = true if _, _, err := auth.UserSignIn(ctx, ctx.Doer.Name, ctx.FormString("password")); err != nil { - if user_model.IsErrUserNotExist(err) { + switch { + case user_model.IsErrUserNotExist(err): + loadAccountData(ctx) + + ctx.RenderWithErr(ctx.Tr("form.user_not_exist"), tplSettingsAccount, nil) + case err == smtp.ErrUnsupportedLoginType: + loadAccountData(ctx) + + ctx.RenderWithErr(ctx.Tr("form.unsupported_login_type"), tplSettingsAccount, nil) + case base.IsError[db.ErrUserPasswordNotSet](err): + loadAccountData(ctx) + + ctx.RenderWithErr(ctx.Tr("form.unset_password"), tplSettingsAccount, nil) + case base.IsError[db.ErrUserPasswordInvalid](err): loadAccountData(ctx) ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_password"), tplSettingsAccount, nil) - } else { + default: ctx.ServerError("UserSignIn", err) } return From 5a34c87c7afdddd35e4f8fa643088ac12457267e Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 4 Mar 2024 18:34:50 +0800 Subject: [PATCH 2/3] Follow maintainers' suggestions --- modules/base/type.go | 10 ---------- routers/web/user/setting/account.go | 4 ++-- 2 files changed, 2 insertions(+), 12 deletions(-) delete mode 100644 modules/base/type.go diff --git a/modules/base/type.go b/modules/base/type.go deleted file mode 100644 index 521ee8363ccf3..0000000000000 --- a/modules/base/type.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2024 The Gitea Authors. All rights reserved. -// SPDX-License-Identifier: MIT - -package base - -// IsError checks if an error is a T error. -func IsError[T any](err error) bool { - _, ok := err.(T) - return ok -} diff --git a/routers/web/user/setting/account.go b/routers/web/user/setting/account.go index 7f98e549fdd08..af9a176bc9c80 100644 --- a/routers/web/user/setting/account.go +++ b/routers/web/user/setting/account.go @@ -253,11 +253,11 @@ func DeleteAccount(ctx *context.Context) { loadAccountData(ctx) ctx.RenderWithErr(ctx.Tr("form.unsupported_login_type"), tplSettingsAccount, nil) - case base.IsError[db.ErrUserPasswordNotSet](err): + case errors.As(err, &db.ErrUserPasswordNotSet{}): loadAccountData(ctx) ctx.RenderWithErr(ctx.Tr("form.unset_password"), tplSettingsAccount, nil) - case base.IsError[db.ErrUserPasswordInvalid](err): + case errors.As(err, &db.ErrUserPasswordInvalid{}): loadAccountData(ctx) ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_password"), tplSettingsAccount, nil) From 681ae6aa42813917296dedebfc8777dd939f4025 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 8 Mar 2024 11:58:42 +0800 Subject: [PATCH 3/3] Update routers/web/user/setting/account.go Co-authored-by: Jason Song --- routers/web/user/setting/account.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/web/user/setting/account.go b/routers/web/user/setting/account.go index af9a176bc9c80..d69bda6663e16 100644 --- a/routers/web/user/setting/account.go +++ b/routers/web/user/setting/account.go @@ -249,7 +249,7 @@ func DeleteAccount(ctx *context.Context) { loadAccountData(ctx) ctx.RenderWithErr(ctx.Tr("form.user_not_exist"), tplSettingsAccount, nil) - case err == smtp.ErrUnsupportedLoginType: + case errors.Is(err, smtp.ErrUnsupportedLoginType): loadAccountData(ctx) ctx.RenderWithErr(ctx.Tr("form.unsupported_login_type"), tplSettingsAccount, nil)