diff options
Diffstat (limited to 'internal/db')
-rw-r--r-- | internal/db/org.go | 16 | ||||
-rw-r--r-- | internal/db/user.go | 45 | ||||
-rw-r--r-- | internal/db/user_mail.go | 3 | ||||
-rw-r--r-- | internal/db/users.go | 32 | ||||
-rw-r--r-- | internal/db/users_test.go | 13 |
5 files changed, 57 insertions, 52 deletions
diff --git a/internal/db/org.go b/internal/db/org.go index 1232c7ce..9685e567 100644 --- a/internal/db/org.go +++ b/internal/db/org.go @@ -5,6 +5,7 @@ package db import ( + "context" "errors" "fmt" "os" @@ -104,18 +105,19 @@ func CreateOrganization(org, owner *User) (err error) { return err } - isExist, err := IsUserExist(0, org.Name) - if err != nil { - return err - } else if isExist { - return ErrUserAlreadyExist{args: errutil.Args{"name": org.Name}} + if Users.IsUsernameUsed(context.TODO(), org.Name) { + return ErrUserAlreadyExist{ + args: errutil.Args{ + "name": org.Name, + }, + } } org.LowerName = strings.ToLower(org.Name) - if org.Rands, err = GetUserSalt(); err != nil { + if org.Rands, err = userutil.RandomSalt(); err != nil { return err } - if org.Salt, err = GetUserSalt(); err != nil { + if org.Salt, err = userutil.RandomSalt(); err != nil { return err } org.UseCustomAvatar = true diff --git a/internal/db/user.go b/internal/db/user.go index a5e4d65c..4e5e4c1f 100644 --- a/internal/db/user.go +++ b/internal/db/user.go @@ -24,7 +24,6 @@ import ( "gogs.io/gogs/internal/conf" "gogs.io/gogs/internal/db/errors" "gogs.io/gogs/internal/errutil" - "gogs.io/gogs/internal/strutil" "gogs.io/gogs/internal/tool" "gogs.io/gogs/internal/userutil" ) @@ -55,36 +54,11 @@ func (u *User) AfterSet(colName string, _ xorm.Cell) { // Deprecated: Use OrgsUsers.CountByUser instead. // -// TODO(unknwon): Delete me once no more call sites. +// TODO(unknwon): Delete me once no more call sites in this file. func (u *User) getOrganizationCount(e Engine) (int64, error) { return e.Where("uid=?", u.ID).Count(new(OrgUser)) } -// IsUserExist checks if given user name exist, -// the user name should be noncased unique. -// If uid is presented, then check will rule out that one, -// it is used when update a user name in settings page. -func IsUserExist(uid int64, name string) (bool, error) { - if name == "" { - return false, nil - } - return x.Where("id != ?", uid).Get(&User{LowerName: strings.ToLower(name)}) -} - -// GetUserSalt returns a random user salt token. -func GetUserSalt() (string, error) { - return strutil.RandomChars(10) -} - -// NewGhostUser creates and returns a fake user for someone who has deleted his/her account. -func NewGhostUser() *User { - return &User{ - ID: -1, - Name: "Ghost", - LowerName: "ghost", - } -} - var ( reservedUsernames = []string{"-", "explore", "create", "assets", "css", "img", "js", "less", "plugins", "debug", "raw", "install", "api", "avatar", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."} reservedUserPatterns = []string{"*.keys"} @@ -148,21 +122,19 @@ func isUsernameAllowed(name string) error { } // CreateUser creates record of a new user. +// // Deprecated: Use Users.Create instead. func CreateUser(u *User) (err error) { if err = isUsernameAllowed(u.Name); err != nil { return err } - isExist, err := IsUserExist(0, u.Name) - if err != nil { - return err - } else if isExist { + if Users.IsUsernameUsed(context.TODO(), u.Name) { return ErrUserAlreadyExist{args: errutil.Args{"name": u.Name}} } u.Email = strings.ToLower(u.Email) - isExist, err = IsEmailUsed(u.Email) + isExist, err := IsEmailUsed(u.Email) if err != nil { return err } else if isExist { @@ -172,10 +144,10 @@ func CreateUser(u *User) (err error) { u.LowerName = strings.ToLower(u.Name) u.AvatarEmail = u.Email u.Avatar = tool.HashEmail(u.AvatarEmail) - if u.Rands, err = GetUserSalt(); err != nil { + if u.Rands, err = userutil.RandomSalt(); err != nil { return err } - if u.Salt, err = GetUserSalt(); err != nil { + if u.Salt, err = userutil.RandomSalt(); err != nil { return err } u.Password = userutil.EncodePassword(u.Password, u.Salt) @@ -273,10 +245,7 @@ func ChangeUserName(u *User, newUserName string) (err error) { return err } - isExist, err := IsUserExist(0, newUserName) - if err != nil { - return err - } else if isExist { + if Users.IsUsernameUsed(context.TODO(), newUserName) { return ErrUserAlreadyExist{args: errutil.Args{"name": newUserName}} } diff --git a/internal/db/user_mail.go b/internal/db/user_mail.go index ea6c1a73..122f19bc 100644 --- a/internal/db/user_mail.go +++ b/internal/db/user_mail.go @@ -10,6 +10,7 @@ import ( "gogs.io/gogs/internal/db/errors" "gogs.io/gogs/internal/errutil" + "gogs.io/gogs/internal/userutil" ) // EmailAddresses is the list of all email addresses of a user. Can contain the @@ -122,7 +123,7 @@ func (email *EmailAddress) Activate() error { if err != nil { return err } - if user.Rands, err = GetUserSalt(); err != nil { + if user.Rands, err = userutil.RandomSalt(); err != nil { return err } diff --git a/internal/db/users.go b/internal/db/users.go index 146a65a4..f87dc28d 100644 --- a/internal/db/users.go +++ b/internal/db/users.go @@ -62,6 +62,8 @@ type UsersStore interface { GetByUsername(ctx context.Context, username string) (*User, error) // HasForkedRepository returns true if the user has forked given repository. HasForkedRepository(ctx context.Context, userID, repoID int64) bool + // IsUsernameUsed returns true if the given username has been used. + IsUsernameUsed(ctx context.Context, username string) bool // ListFollowers returns a list of users that are following the given user. // Results are paginated by given page and page size, and sorted by the time of // follow in descending order. @@ -231,11 +233,8 @@ func (db *users) Create(ctx context.Context, username, email string, opts Create return nil, err } - _, err = db.GetByUsername(ctx, username) - if err == nil { + if db.IsUsernameUsed(ctx, username) { return nil, ErrUserAlreadyExist{args: errutil.Args{"name": username}} - } else if !IsErrUserNotExist(err) { - return nil, err } _, err = db.GetByEmail(ctx, email) @@ -262,11 +261,11 @@ func (db *users) Create(ctx context.Context, username, email string, opts Create AvatarEmail: email, } - user.Rands, err = GetUserSalt() + user.Rands, err = userutil.RandomSalt() if err != nil { return nil, err } - user.Salt, err = GetUserSalt() + user.Salt, err = userutil.RandomSalt() if err != nil { return nil, err } @@ -371,6 +370,17 @@ func (db *users) HasForkedRepository(ctx context.Context, userID, repoID int64) return count > 0 } +func (db *users) IsUsernameUsed(ctx context.Context, username string) bool { + if username == "" { + return false + } + return db.WithContext(ctx). + Select("id"). + Where("lower_name = ?", strings.ToLower(username)). + First(&User{}). + Error != gorm.ErrRecordNotFound +} + func (db *users) ListFollowers(ctx context.Context, userID int64, page, pageSize int) ([]*User, error) { /* Equivalent SQL for PostgreSQL: @@ -569,6 +579,16 @@ func (u *User) DisplayName() string { return u.Name } +// NewGhostUser creates and returns a fake user for people who has deleted their +// accounts. +func NewGhostUser() *User { + return &User{ + ID: -1, + Name: "Ghost", + LowerName: "ghost", + } +} + // HomeURLPath returns the URL path to the user or organization home page. // // TODO(unknwon): This is also used in templates, which should be fixed by diff --git a/internal/db/users_test.go b/internal/db/users_test.go index 6d71ad5a..9c940f6b 100644 --- a/internal/db/users_test.go +++ b/internal/db/users_test.go @@ -93,6 +93,7 @@ func TestUsers(t *testing.T) { {"GetByID", usersGetByID}, {"GetByUsername", usersGetByUsername}, {"HasForkedRepository", usersHasForkedRepository}, + {"IsUsernameUsed", usersIsUsernameUsed}, {"ListFollowers", usersListFollowers}, {"ListFollowings", usersListFollowings}, {"UseCustomAvatar", usersUseCustomAvatar}, @@ -390,6 +391,18 @@ func usersHasForkedRepository(t *testing.T, db *users) { assert.True(t, has) } +func usersIsUsernameUsed(t *testing.T, db *users) { + ctx := context.Background() + + alice, err := db.Create(ctx, "alice", "alice@example.com", CreateUserOptions{}) + require.NoError(t, err) + + got := db.IsUsernameUsed(ctx, alice.Name) + assert.True(t, got) + got = db.IsUsernameUsed(ctx, "bob") + assert.False(t, got) +} + func usersListFollowers(t *testing.T, db *users) { ctx := context.Background() |