diff --git a/models/user/user.go b/models/user/user.go index 0e87d7b7b9..8a39eca634 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -1051,13 +1051,13 @@ func GetPossibleUserByIDs(ctx context.Context, ids []int64) ([]*User, error) { return users, nil } -// GetUserByName returns user by given name. -func GetUserByName(ctx context.Context, name string) (*User, error) { - if len(name) == 0 { - return nil, ErrUserNotExist{Name: name} +func getUserByNameWithTypes(ctx context.Context, name string, types ...UserType) (*User, error) { + u := &User{} + sess := db.GetEngine(ctx).Where(builder.Eq{"lower_name": strings.ToLower(name)}) + if len(types) > 0 { + sess.In("`type`", types) } - u := &User{LowerName: strings.ToLower(name), Type: UserTypeIndividual} - has, err := db.GetEngine(ctx).Get(u) + has, err := sess.Get(u) if err != nil { return nil, err } else if !has { @@ -1066,6 +1066,15 @@ func GetUserByName(ctx context.Context, name string) (*User, error) { return u, nil } +// GetUserByName returns the user object by given name, any user type. +func GetUserByName(ctx context.Context, name string) (*User, error) { + return getUserByNameWithTypes(ctx, name) +} + +func GetIndividualUserByName(ctx context.Context, name string) (*User, error) { + return getUserByNameWithTypes(ctx, name, UserTypeIndividual) +} + // GetUserEmailsByNames returns a list of e-mails corresponds to names of users // that have their email notifications set to enabled or onmention. func GetUserEmailsByNames(ctx context.Context, names []string) []string { @@ -1108,19 +1117,6 @@ func GetMailableUsersByIDs(ctx context.Context, ids []int64, isMention bool) ([] Find(&ous) } -// GetUserNameByID returns username for the id -func GetUserNameByID(ctx context.Context, id int64) (string, error) { - var name string - has, err := db.GetEngine(ctx).Table("user").Where("id = ?", id).Cols("name").Get(&name) - if err != nil { - return "", err - } - if has { - return name, nil - } - return "", nil -} - // GetUserIDsByNames returns a slice of ids corresponds to names. func GetUserIDsByNames(ctx context.Context, names []string, ignoreNonExistent bool) ([]int64, error) { ids := make([]int64, 0, len(names)) @@ -1321,13 +1317,14 @@ func GetUserByEmail(ctx context.Context, email string) (*User, error) { if id != 0 { return GetUserByID(ctx, id) } - return GetUserByName(ctx, name) + return GetIndividualUserByName(ctx, name) } return nil, ErrUserNotExist{Name: email} } func GetIndividualUser(ctx context.Context, user *User) (bool, error) { + // FIXME: the design is wrong, empty User fields won't apply, this function should be removed in the future has, err := db.GetEngine(ctx).Get(user) if has && user.Type != UserTypeIndividual { has = false @@ -1492,27 +1489,3 @@ func DisabledFeaturesWithLoginType(user *User) *container.Set[string] { } return &setting.Admin.UserDisabledFeatures } - -// GetUserOrOrgIDByName returns the id for a user or an org by name -func GetUserOrOrgIDByName(ctx context.Context, name string) (int64, error) { - var id int64 - has, err := db.GetEngine(ctx).Table("user").Where("name = ?", name).Cols("id").Get(&id) - if err != nil { - return 0, err - } else if !has { - return 0, fmt.Errorf("user or org with name %s: %w", name, util.ErrNotExist) - } - return id, nil -} - -// GetUserOrOrgByName returns the user or org by name -func GetUserOrOrgByName(ctx context.Context, name string) (*User, error) { - var u User - has, err := db.GetEngine(ctx).Where("lower_name = ?", strings.ToLower(name)).Get(&u) - if err != nil { - return nil, err - } else if !has { - return nil, ErrUserNotExist{Name: name} - } - return &u, nil -} diff --git a/routers/common/compare.go b/routers/common/compare.go index 7e917c4df8..8b1e1715d2 100644 --- a/routers/common/compare.go +++ b/routers/common/compare.go @@ -129,7 +129,7 @@ func GetHeadOwnerAndRepo(ctx context.Context, baseRepo *repo_model.Repository, c if compareReq.HeadOwner == baseRepo.Owner.Name { headOwner = baseRepo.Owner } else { - headOwner, err = user_model.GetUserOrOrgByName(ctx, compareReq.HeadOwner) + headOwner, err = user_model.GetUserByName(ctx, compareReq.HeadOwner) if err != nil { return nil, nil, err } diff --git a/routers/web/repo/setting/actions.go b/routers/web/repo/setting/actions.go index 2237828d61..27b16b42d9 100644 --- a/routers/web/repo/setting/actions.go +++ b/routers/web/repo/setting/actions.go @@ -6,7 +6,6 @@ package setting import ( "errors" "net/http" - "strings" "code.gitea.io/gitea/models/actions" repo_model "code.gitea.io/gitea/models/repo" @@ -94,15 +93,12 @@ func ActionsUnitPost(ctx *context.Context) { } func AddCollaborativeOwner(ctx *context.Context) { - name := strings.ToLower(ctx.FormString("collaborative_owner")) - - ownerID, err := user_model.GetUserOrOrgIDByName(ctx, name) + collUser, err := user_model.GetUserByName(ctx, ctx.FormString("collaborative_owner")) if err != nil { if errors.Is(err, util.ErrNotExist) { - ctx.Flash.Error(ctx.Tr("form.user_not_exist")) - ctx.JSONErrorNotFound() + ctx.JSONError(ctx.Tr("form.user_not_exist")) } else { - ctx.ServerError("GetUserOrOrgIDByName", err) + ctx.ServerError("GetUserByName", err) } return } @@ -113,7 +109,7 @@ func AddCollaborativeOwner(ctx *context.Context) { return } actionsCfg := actionsUnit.ActionsConfig() - actionsCfg.AddCollaborativeOwner(ownerID) + actionsCfg.AddCollaborativeOwner(collUser.ID) if err := repo_model.UpdateRepoUnitConfig(ctx, actionsUnit); err != nil { ctx.ServerError("UpdateRepoUnitConfig", err) return diff --git a/services/migrations/gitea_uploader.go b/services/migrations/gitea_uploader.go index fac382582b..e8501684d4 100644 --- a/services/migrations/gitea_uploader.go +++ b/services/migrations/gitea_uploader.go @@ -6,6 +6,7 @@ package migrations import ( "context" + "errors" "fmt" "io" "strconv" @@ -989,12 +990,15 @@ func (g *GiteaLocalUploader) remapUser(ctx context.Context, source user_model.Ex func (g *GiteaLocalUploader) remapLocalUser(ctx context.Context, source user_model.ExternalUserMigrated) (int64, error) { userid, ok := g.userMap[source.GetExternalID()] if !ok { - name, err := user_model.GetUserNameByID(ctx, source.GetExternalID()) - if err != nil { + user, err := user_model.GetUserByID(ctx, source.GetExternalID()) + if errors.Is(err, util.ErrNotExist) { + g.userMap[source.GetExternalID()] = userid + return 0, nil + } else if err != nil { return 0, err } - // let's not reuse an ID when the user was deleted or has a different user name - if name != source.GetExternalName() { + // let's not reuse an ID when the user was deleted or has a different username + if !util.AsciiEqualFold(user.Name, source.GetExternalName()) { userid = 0 } else { userid = source.GetExternalID()