chore: check if username exists
All checks were successful
ci/woodpecker/push/test Pipeline was successful
ci/woodpecker/push/playwright Pipeline was successful
ci/woodpecker/push/deplyoment Pipeline was successful

This commit is contained in:
kekskurse 2025-03-13 20:38:30 +01:00
parent b12aa48066
commit 3a0f0ced51
5 changed files with 52 additions and 2 deletions

View file

@ -3,6 +3,6 @@ package miniauth
import "errors" import "errors"
var ( var (
ErrUSernameInvalide = errors.New("username not valide")
ErrUserHasInvalideChars = errors.New("username has invalide chars") ErrUserHasInvalideChars = errors.New("username has invalide chars")
ErrUsernameIsTaken = errors.New("username already takebn")
) )

View file

@ -34,5 +34,15 @@ func (m Miniauth) checkUsernameForRegistration(username string) error {
if !reg.MatchString(username) { if !reg.MatchString(username) {
return ErrUserHasInvalideChars return ErrUserHasInvalideChars
} }
exists, err := m.store.UserExists(username)
if err != nil {
return err
}
if exists {
return ErrUsernameIsTaken
}
return nil return nil
} }

View file

@ -38,9 +38,16 @@ func TestInvalideUsernames(t *testing.T) {
username: "kekskurse", username: "kekskurse",
exptErr: nil, exptErr: nil,
}, },
{
name: "username already taken",
username: "testuser",
exptErr: ErrUsernameIsTaken,
},
} }
ma := getMiniAuth(t) ma := getMiniAuth(t)
_, err := ma.store.UserWrite("testuser", "testpassword")
assert.Nil(t, err, "[setup] should be abel to write user without error")
for _, tt := range tts { for _, tt := range tts {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
err := ma.checkUsernameForRegistration(tt.username) err := ma.checkUsernameForRegistration(tt.username)

View file

@ -7,7 +7,7 @@ import (
func (s Store) UserWrite(username, password string) (int64, error) { func (s Store) UserWrite(username, password string) (int64, error) {
query := "INSERT INTO users (username, password) VALUES (?, ?);" query := "INSERT INTO users (username, password) VALUES (?, ?);"
log := s.log.With().Str("query", query).Str("username", username).Logger() log := s.log.With().Str("func", "UserWrite").Str("query", query).Str("username", username).Logger()
pwHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) pwHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil { if err != nil {
@ -25,3 +25,20 @@ func (s Store) UserWrite(username, password string) (int64, error) {
} }
return id, nil return id, nil
} }
func (s Store) UserExists(username string) (bool, error) {
query := "SELECT COUNT(*) FROM users WHERE username = ?"
log := s.log.With().Str("func", "UserExists").Str("query", query).Str("username", username).Logger()
var count int
err := s.db.QueryRow(query, username).Scan(&count)
if err != nil {
return true, utils.WrapError(ErrCantExecuteQuery, err, log)
}
if count == 0 {
return false, nil
}
return true, nil
}

View file

@ -68,3 +68,19 @@ func TestWriteUser(t *testing.T) {
assert.NotEqual(t, "kekskurse", pw2) assert.NotEqual(t, "kekskurse", pw2)
assert.NotEqual(t, pw1, pw2, "passwords should not be equal") assert.NotEqual(t, pw1, pw2, "passwords should not be equal")
} }
func TestUserExists(t *testing.T) {
store, err := NewDummyStore()
assert.Nil(t, err, "[setup] should get dummy store without error")
exists, err := store.UserExists("kekskurse")
assert.Nil(t, err)
assert.False(t, exists)
_, err = store.UserWrite("kekskurse", "kekskurse")
assert.Nil(t, err, "[setup] should be abel to create user")
exists, err = store.UserExists("kekskurse")
assert.Nil(t, err)
assert.True(t, exists)
}