46 lines
997 B
Go
46 lines
997 B
Go
package auth
|
|
|
|
import (
|
|
"errors"
|
|
"regexp"
|
|
"unicode/utf8"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
var (
|
|
ErrPasswordTooShort = errors.New("password must be at least 8 characters")
|
|
ErrInvalidEmail = errors.New("invalid email")
|
|
ErrInvalidUsername = errors.New("username must be 3-64 characters: letters, digits, underscore")
|
|
)
|
|
|
|
var (
|
|
emailRegex = regexp.MustCompile(`^[^\s@]+@[^\s@]+\.[^\s@]+$`)
|
|
usernameRegex = regexp.MustCompile(`^[a-zA-Z0-9_]{3,64}$`)
|
|
)
|
|
|
|
func HashPassword(password string) (string, error) {
|
|
if utf8.RuneCountInString(password) < 8 {
|
|
return "", ErrPasswordTooShort
|
|
}
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(hash), nil
|
|
}
|
|
|
|
func ValidateEmail(email string) error {
|
|
if !emailRegex.MatchString(email) {
|
|
return ErrInvalidEmail
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ValidateUsername(username string) error {
|
|
if !usernameRegex.MatchString(username) {
|
|
return ErrInvalidUsername
|
|
}
|
|
return nil
|
|
}
|