Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 17 additions & 44 deletions models/user/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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)
}
Comment thread
wxiaoguang marked this conversation as resolved.

// 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 {
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}
2 changes: 1 addition & 1 deletion routers/common/compare.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
12 changes: 4 additions & 8 deletions routers/web/repo/setting/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"))
Comment thread
wxiaoguang marked this conversation as resolved.
} else {
ctx.ServerError("GetUserOrOrgIDByName", err)
ctx.ServerError("GetUserByName", err)
}
return
}
Expand All @@ -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
Expand Down
12 changes: 8 additions & 4 deletions services/migrations/gitea_uploader.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package migrations

import (
"context"
"errors"
"fmt"
"io"
"strconv"
Expand Down Expand Up @@ -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()
Expand Down