From 9c77160653e9ac87d051fe8a4eeffbaf7fd7307b Mon Sep 17 00:00:00 2001 From: Jirka Kremser Date: Tue, 7 Sep 2021 16:49:28 +0200 Subject: [PATCH] Issue #154: validation regexp + parsing the env var value correctly (prepared for ipv6) Signed-off-by: Jirka Kremser --- controllers/depresolver/depresolver_config.go | 45 +++++++++++++------ .../depresolver/depresolver_validator.go | 5 ++- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/controllers/depresolver/depresolver_config.go b/controllers/depresolver/depresolver_config.go index 84fee58b6a..f9088476d2 100644 --- a/controllers/depresolver/depresolver_config.go +++ b/controllers/depresolver/depresolver_config.go @@ -19,6 +19,7 @@ package depresolver import ( "fmt" + "net" "strconv" "strings" @@ -127,15 +128,10 @@ func (dr *DependencyResolver) validateConfig(config *Config, recognizedDNSTypes return err } } - // todo: this - // err = field(EdgeDNSServersKey, config.EdgeDNSServers).isNotEmpty().matchRegexps(hostNameRegex, ipAddressRegex).err - // if err != nil { - // return err - // } - // err = field(EdgeDNSServerPortKey, config.EdgeDNSServerPort).isHigherThanZero().err - // if err != nil { - // return err - // } + err = field(EdgeDNSServersKey, config.EdgeDNSServers).isNotEmpty().matchRegexps(hostNamesWithPortsRegex, ipAddressRegex).err + if err != nil { + return err + } err = field(EdgeDNSZoneKey, config.EdgeDNSZone).isNotEmpty().matchRegexp(hostNameRegex).err if err != nil { return err @@ -226,13 +222,34 @@ func parseMetricsAddr(metricsAddr string) (host string, port int, err error) { func parseEdgeDNSServers(serverList string) []utils.DNSServer { var r []utils.DNSServer chunks := strings.Split(serverList, ",") - // foreach chunk + var host, portStr string + var err error for _, chunk := range chunks { - // if it contains colon - // chunk + switch strings.Count(chunk, ":") { + case 0: //ipv4 or domain + host = chunk + portStr = "53" + case 1: //ipv4 or domain + host, portStr, err = net.SplitHostPort(host) + if err != nil { + portStr = "53" + } + default: //ipv6 + if net.ParseIP(chunk).To16() != nil { + host = chunk + } else { + host = chunk[:strings.LastIndex(chunk, ":")] + portStr = chunk[strings.LastIndex(chunk, ":")+1:] + } + } + var port int + port, err = strconv.Atoi(portStr) + if err != nil || port < 1 { + port = 53 + } r = append(r, utils.DNSServer{ - Host: chunk, - Port: 53, + Host: host, + Port: port, }) } return r diff --git a/controllers/depresolver/depresolver_validator.go b/controllers/depresolver/depresolver_validator.go index f8e4f4dec2..3ab21461ca 100644 --- a/controllers/depresolver/depresolver_validator.go +++ b/controllers/depresolver/depresolver_validator.go @@ -26,8 +26,11 @@ import ( const ( // hostNameRegex allows cloud region formats; e.g. af-south-1 geoTagRegex = "^[a-zA-Z\\-\\d]*$" - // hostNameRegex is valid as per RFC 1123 that allows hostname segments could start with a digit + + // hostNameRegex is valid as per RFC 1123 that allows hostname segments could start with a digit hostNameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$" + // hostnames are valid as per the previous regexp, it may also contain :123 port and multiple comma-separated entries are supported + hostNamesWithPortsRegex = "^((([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])(:\\d{1,5})?,?)+[^,]$" // ipAddressRegex matches valid IPv4 addresses ipAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" // versionNumberRegex matches version in formats 0.1.2, v0.1.2, v0.1.2-alpha