aboutsummaryrefslogtreecommitdiff
path: root/internal/db
diff options
context:
space:
mode:
Diffstat (limited to 'internal/db')
-rw-r--r--internal/db/org.go16
-rw-r--r--internal/db/user.go45
-rw-r--r--internal/db/user_mail.go3
-rw-r--r--internal/db/users.go32
-rw-r--r--internal/db/users_test.go13
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()