2021-09-17 16:55:24 -05:00
|
|
|
package prompt
|
2020-07-28 23:04:14 -04:00
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"strconv"
|
2020-08-11 18:15:06 -05:00
|
|
|
"strings"
|
2020-07-28 23:04:14 -04:00
|
|
|
"unicode"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// Constants for passwords.
|
|
|
|
minPasswordLength = 8
|
|
|
|
)
|
|
|
|
|
2020-10-22 13:02:30 -05:00
|
|
|
var (
|
|
|
|
errIncorrectPhrase = errors.New("input does not match wanted phrase")
|
2021-10-25 13:17:47 -05:00
|
|
|
errPasswordWeak = errors.New("password must have at least 8 characters")
|
2020-10-22 13:02:30 -05:00
|
|
|
)
|
2020-09-24 13:00:44 +02:00
|
|
|
|
2020-07-28 23:04:14 -04:00
|
|
|
// NotEmpty is a validation function to make sure the input given isn't empty and is valid unicode.
|
|
|
|
func NotEmpty(input string) error {
|
|
|
|
if input == "" {
|
|
|
|
return errors.New("input cannot be empty")
|
|
|
|
}
|
|
|
|
if !IsValidUnicode(input) {
|
|
|
|
return errors.New("not valid unicode")
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ValidateNumber makes sure the entered text is a valid number.
|
|
|
|
func ValidateNumber(input string) error {
|
|
|
|
_, err := strconv.Atoi(input)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// ValidateConfirmation makes sure the entered text is the user confirming.
|
|
|
|
func ValidateConfirmation(input string) error {
|
|
|
|
if input != "Y" && input != "y" {
|
|
|
|
return errors.New("please confirm the above text")
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-08-11 18:15:06 -05:00
|
|
|
// ValidateYesOrNo ensures the user input either Y, y or N, n.
|
|
|
|
func ValidateYesOrNo(input string) error {
|
|
|
|
lowercase := strings.ToLower(input)
|
|
|
|
if lowercase != "y" && lowercase != "n" {
|
|
|
|
return errors.New("please enter y or n")
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-07-28 23:04:14 -04:00
|
|
|
// IsValidUnicode checks if an input string is a valid unicode string comprised of only
|
|
|
|
// letters, numbers, punctuation, or symbols.
|
|
|
|
func IsValidUnicode(input string) bool {
|
|
|
|
for _, char := range input {
|
|
|
|
if !(unicode.IsLetter(char) ||
|
|
|
|
unicode.IsNumber(char) ||
|
|
|
|
unicode.IsPunct(char) ||
|
2020-07-31 14:50:44 -05:00
|
|
|
unicode.IsSymbol(char) ||
|
|
|
|
unicode.IsSpace(char)) {
|
2020-07-28 23:04:14 -04:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
// ValidatePasswordInput validates a strong password input for new accounts,
|
|
|
|
// including a min length, at least 1 number and at least
|
|
|
|
// 1 special character.
|
|
|
|
func ValidatePasswordInput(input string) error {
|
2021-10-25 13:17:47 -05:00
|
|
|
if len(input) < minPasswordLength {
|
2020-11-30 19:55:30 -06:00
|
|
|
return errPasswordWeak
|
2020-07-28 23:04:14 -04:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
2020-09-24 13:00:44 +02:00
|
|
|
|
2023-10-18 09:00:25 -05:00
|
|
|
// ValidatePhrase checks whether the user input is equal to the wanted phrase(s).
|
|
|
|
func ValidatePhrase(input string, wantedPhrases ...string) error {
|
|
|
|
for _, wantedPhrase := range wantedPhrases {
|
|
|
|
if strings.EqualFold(strings.TrimSpace(input), wantedPhrase) {
|
|
|
|
return nil
|
|
|
|
}
|
2020-09-24 13:00:44 +02:00
|
|
|
}
|
2023-10-18 09:00:25 -05:00
|
|
|
return errIncorrectPhrase
|
2020-09-24 13:00:44 +02:00
|
|
|
}
|