Skip to content

Commit 0aca341

Browse files
authored
Merge pull request #266 from otabekswe/master
fix: sanitize subdomain first
2 parents f637d15 + c9ab7b0 commit 0aca341

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

server/jprq.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (j *Jprq) serveEventConn(conn net.Conn) error {
121121
if request.Subdomain == "" {
122122
request.Subdomain = user.Login
123123
}
124-
if err := validate(request.Subdomain); err != nil {
124+
if err := validate(&request.Subdomain); err != nil {
125125
return events.WriteError(conn, "invalid subdomain %s: %s", request.Subdomain, err.Error())
126126
}
127127
hostname := fmt.Sprintf("%s.%s", request.Subdomain, j.config.DomainName)

server/utils.go

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,34 @@ import (
1111
var regex = regexp.MustCompile(`^[a-z\d](?:[a-z\d]|-[a-z\d]){0,38}$`)
1212
var 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

Comments
 (0)