-
Notifications
You must be signed in to change notification settings - Fork 151
/
validator.go
77 lines (57 loc) · 1.91 KB
/
validator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package validator
import (
"regexp"
"unicode"
"github.com/Masterminds/semver/v3"
"github.com/go-playground/validator/v10"
"github.com/google/uuid"
"github.com/hatchet-dev/hatchet/pkg/client/types"
)
var NameRegex = regexp.MustCompile("^[a-zA-Z0-9\\.\\-_]+$") //nolint:gosimple
var CronRegex = regexp.MustCompile(`(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)|((((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*) ?){5,7})`) //nolint:gosimple
func newValidator() *validator.Validate {
validate := validator.New()
_ = validate.RegisterValidation("hatchetName", func(fl validator.FieldLevel) bool {
return NameRegex.MatchString(fl.Field().String())
})
_ = validate.RegisterValidation("password", func(fl validator.FieldLevel) bool {
return passwordValidation(fl.Field().String())
})
_ = validate.RegisterValidation("uuid", func(fl validator.FieldLevel) bool {
return IsValidUUID(fl.Field().String())
})
_ = validate.RegisterValidation("cron", func(fl validator.FieldLevel) bool {
return CronRegex.MatchString(fl.Field().String())
})
_ = validate.RegisterValidation("actionId", func(fl validator.FieldLevel) bool {
action, err := types.ParseActionID(fl.Field().String())
if err != nil {
return false
}
return action.Service != "" && action.Verb != ""
})
_ = validate.RegisterValidation("semver", func(fl validator.FieldLevel) bool {
_, err := semver.NewVersion(fl.Field().String())
return err == nil
})
return validate
}
func passwordValidation(pw string) bool {
pwLen := len(pw)
var hasNumber, hasUpper, hasLower bool
for _, char := range pw {
switch {
case unicode.IsNumber(char):
hasNumber = true
case unicode.IsUpper(char):
hasUpper = true
case unicode.IsLower(char):
hasLower = true
}
}
return hasNumber && hasUpper && hasLower && pwLen >= 8 && pwLen <= 32
}
func IsValidUUID(u string) bool {
_, err := uuid.Parse(u)
return err == nil
}