forked from authentricity/authentricity
42 lines
716 B
Go
42 lines
716 B
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
var (
|
|
// Strict Mode RE from https://systemd.io/USER_NAMES/,
|
|
// which seems about as sensible as anything
|
|
usernameRe = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_-]{0,30}$")
|
|
)
|
|
|
|
type NameClass int
|
|
|
|
const (
|
|
nameClassUnknown NameClass = iota
|
|
NameClassUUID
|
|
NameClassUsername
|
|
NameClassEmail
|
|
)
|
|
|
|
func ClassifyName(name string) (NameClass, error) {
|
|
if usernameRe.MatchString(name) {
|
|
return NameClassUsername, nil
|
|
}
|
|
|
|
_, err := uuid.Parse(name)
|
|
if err == nil {
|
|
return NameClassUUID, nil
|
|
}
|
|
|
|
if strings.Contains(name, "@") {
|
|
return NameClassEmail, nil
|
|
}
|
|
|
|
return nameClassUnknown, fmt.Errorf("%w '%s'", ErrInvalidName, name)
|
|
}
|