package miniauth import ( "regexp" "git.keks.cloud/kekskurse/miniauth/pkg/userstore" "git.keks.cloud/kekskurse/miniauth/pkg/utils" "github.com/go-passwd/validator" "github.com/rs/zerolog" ) type Miniauth struct { store userstore.Store log zerolog.Logger } func NewMiniauth(us userstore.Store) Miniauth { m := Miniauth{} m.store = us return m } func (m Miniauth) RegisterUser(username string, mail string, password string) error { log := m.log.With().Str("func", "RegisterUser").Str("username", username).Str("mail", mail).Logger() err := m.checkUsernameForRegistration(username) if err != nil { return utils.WrapError(ErrUserHasInvalideChars, err, log) } err = m.checkPasswordForRegistration(password) if err != nil { return utils.WrapError(ErrPasswordNotComplexEnough, err, log) } id, err := m.store.UserWrite(username, password) if err != nil { return utils.WrapError(ErrCantCreateUser, err, log) } log = log.With().Int64("userid", id).Logger() err = m.store.MailAdd(mail, id, true) if err != nil { return utils.WrapError(ErrCantCreateUser, err, log) } return nil } func (m Miniauth) checkPasswordForRegistration(password string) error { passwordValidator := validator.New( validator.MinLength(15, nil), validator.ContainsAtLeast("abcdefghijklmnopqrstuvwxyz", 5, nil), validator.ContainsAtLeast("0123456789", 3, nil), validator.ContainsAtLeast(",;.:-_#+*?=}])[({/&%$ยง!<>|", 3, nil)) err := passwordValidator.Validate(password) return err } func (m Miniauth) checkUsernameForRegistration(username string) error { reg := regexp.MustCompile("^[a-z0-9]{4,25}$") if !reg.MatchString(username) { return ErrUserHasInvalideChars } exists, err := m.store.UserExists(username) if err != nil { return err } if exists { return ErrUsernameIsTaken } return nil }