@@ -11,15 +11,34 @@ import (
1111var regex = regexp .MustCompile (`^[a-z\d](?:[a-z\d]|-[a-z\d]){0,38}$` )
1212var blockList = map [string ]bool {"www" : true , "jprq" : true }
1313
14- func validate (subdomain string ) error {
15- if len (subdomain ) > 38 || len (subdomain ) < 3 {
14+ func sanitize (subdomain string ) string {
15+ sanitized := strings .ToLower (subdomain )
16+ reg := regexp .MustCompile (`[^a-z0-9-]+` )
17+ sanitized = reg .ReplaceAllString (sanitized , "-" )
18+ reg2 := regexp .MustCompile (`-+` )
19+ sanitized = reg2 .ReplaceAllString (sanitized , "-" )
20+ sanitized = strings .Trim (sanitized , "-" )
21+ return sanitized
22+ }
23+
24+ func validate (subdomain * string ) error {
25+ if len (* subdomain ) > 38 || len (* subdomain ) < 3 {
1626 return errors .New ("subdomain length must be between 3 and 42" )
1727 }
18- if blockList [subdomain ] {
28+ if blockList [* subdomain ] {
1929 return errors .New ("subdomain is in deny list" )
2030 }
21- if ! regex .MatchString (subdomain ) {
22- return errors .New ("subdomain must be lowercase & alphanumeric" )
31+ if ! regex .MatchString (* subdomain ) {
32+ * subdomain = sanitize (* subdomain )
33+ if len (* subdomain ) > 38 || len (* subdomain ) < 3 {
34+ return errors .New ("subdomain length must be between 3 and 42" )
35+ }
36+ if blockList [* subdomain ] {
37+ return errors .New ("subdomain is in deny list" )
38+ }
39+ if ! regex .MatchString (* subdomain ) {
40+ return errors .New ("subdomain must be lowercase & alphanumeric" )
41+ }
2342 }
2443 return nil
2544}
0 commit comments