-
Notifications
You must be signed in to change notification settings - Fork 126
/
validator.go
94 lines (70 loc) · 2.32 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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package validator
import (
"encoding/json"
"regexp"
"time"
"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
})
_ = validate.RegisterValidation("json", func(fl validator.FieldLevel) bool {
return isValidJSON(fl.Field().String())
})
_ = validate.RegisterValidation("duration", func(fl validator.FieldLevel) bool {
_, err := time.ParseDuration(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
}
func isValidJSON(s string) bool {
var js map[string]interface{}
return json.Unmarshal([]byte(s), &js) == nil
}