Skip to content

Commit

Permalink
Only validate changed columns when update user (go-gitea#24867) (go-g…
Browse files Browse the repository at this point in the history
…itea#24903)

Backport go-gitea#24867 by @lunny

Fix go-gitea#23211
Replace go-gitea#23496

---------

Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
  • Loading branch information
GiteaBot and lunny authored May 24, 2023
1 parent d19d5bc commit 275abd6
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 9 deletions.
25 changes: 16 additions & 9 deletions models/user/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,7 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e
}

// validate data
if err := validateUser(u); err != nil {
if err := ValidateUser(u); err != nil {
return err
}

Expand Down Expand Up @@ -803,19 +803,26 @@ func checkDupEmail(ctx context.Context, u *User) error {
return nil
}

// validateUser check if user is valid to insert / update into database
func validateUser(u *User) error {
if !setting.Service.AllowedUserVisibilityModesSlice.IsAllowedVisibility(u.Visibility) && !u.IsOrganization() {
return fmt.Errorf("visibility Mode not allowed: %s", u.Visibility.String())
// ValidateUser check if user is valid to insert / update into database
func ValidateUser(u *User, cols ...string) error {
if len(cols) == 0 || util.SliceContainsString(cols, "visibility", true) {
if !setting.Service.AllowedUserVisibilityModesSlice.IsAllowedVisibility(u.Visibility) && !u.IsOrganization() {
return fmt.Errorf("visibility Mode not allowed: %s", u.Visibility.String())
}
}

u.Email = strings.ToLower(u.Email)
return ValidateEmail(u.Email)
if len(cols) == 0 || util.SliceContainsString(cols, "email", true) {
u.Email = strings.ToLower(u.Email)
if err := ValidateEmail(u.Email); err != nil {
return err
}
}
return nil
}

// UpdateUser updates user's information.
func UpdateUser(ctx context.Context, u *User, changePrimaryEmail bool, cols ...string) error {
err := validateUser(u)
err := ValidateUser(u, cols...)
if err != nil {
return err
}
Expand Down Expand Up @@ -881,7 +888,7 @@ func UpdateUser(ctx context.Context, u *User, changePrimaryEmail bool, cols ...s

// UpdateUserCols update user according special columns
func UpdateUserCols(ctx context.Context, u *User, cols ...string) error {
if err := validateUser(u); err != nil {
if err := ValidateUser(u, cols...); err != nil {
return err
}

Expand Down
19 changes: 19 additions & 0 deletions models/user/user_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package user_test

import (
"context"
"fmt"
"math/rand"
"strings"
"testing"
Expand Down Expand Up @@ -524,3 +525,21 @@ func TestIsUserVisibleToViewer(t *testing.T) {
test(user31, user33, true)
test(user31, nil, false)
}

func Test_ValidateUser(t *testing.T) {
oldSetting := setting.Service.AllowedUserVisibilityModesSlice
defer func() {
setting.Service.AllowedUserVisibilityModesSlice = oldSetting
}()
setting.Service.AllowedUserVisibilityModesSlice = []bool{true, false, true}
kases := map[*user_model.User]bool{
{ID: 1, Visibility: structs.VisibleTypePublic}: true,
{ID: 2, Visibility: structs.VisibleTypeLimited}: false,
{ID: 2, Visibility: structs.VisibleTypeLimited, Email: "invalid"}: false,
{ID: 2, Visibility: structs.VisibleTypePrivate, Email: "valid@valid.com"}: true,
}
for kase, expected := range kases {
err := user_model.ValidateUser(kase)
assert.EqualValues(t, expected, err == nil, fmt.Sprintf("case: %+v", kase))
}
}

0 comments on commit 275abd6

Please sign in to comment.