mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-30 19:08:37 +00:00 
			
		
		
		
	Only validate changed columns when update user (#24867)
Fix #23211 Replace #23496
This commit is contained in:
		| @@ -621,7 +621,7 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// validate data | 	// validate data | ||||||
| 	if err := validateUser(u); err != nil { | 	if err := ValidateUser(u); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -767,19 +767,26 @@ func checkDupEmail(ctx context.Context, u *User) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // validateUser check if user is valid to insert / update into database | // ValidateUser check if user is valid to insert / update into database | ||||||
| func validateUser(u *User) error { | 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() { | 		if !setting.Service.AllowedUserVisibilityModesSlice.IsAllowedVisibility(u.Visibility) && !u.IsOrganization() { | ||||||
| 			return fmt.Errorf("visibility Mode not allowed: %s", u.Visibility.String()) | 			return fmt.Errorf("visibility Mode not allowed: %s", u.Visibility.String()) | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if len(cols) == 0 || util.SliceContainsString(cols, "email", true) { | ||||||
| 		u.Email = strings.ToLower(u.Email) | 		u.Email = strings.ToLower(u.Email) | ||||||
| 	return ValidateEmail(u.Email) | 		if err := ValidateEmail(u.Email); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // UpdateUser updates user's information. | // UpdateUser updates user's information. | ||||||
| func UpdateUser(ctx context.Context, u *User, changePrimaryEmail bool, cols ...string) error { | func UpdateUser(ctx context.Context, u *User, changePrimaryEmail bool, cols ...string) error { | ||||||
| 	err := validateUser(u) | 	err := ValidateUser(u, cols...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| @@ -845,7 +852,7 @@ func UpdateUser(ctx context.Context, u *User, changePrimaryEmail bool, cols ...s | |||||||
|  |  | ||||||
| // UpdateUserCols update user according special columns | // UpdateUserCols update user according special columns | ||||||
| func UpdateUserCols(ctx context.Context, u *User, cols ...string) error { | 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 | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -526,3 +526,21 @@ func TestIsUserVisibleToViewer(t *testing.T) { | |||||||
| 	test(user31, user33, true) | 	test(user31, user33, true) | ||||||
| 	test(user31, nil, false) | 	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)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user