From 7894bcfcdc99feddacbc83df7eb96e38e9fc8470 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 25 Feb 2022 15:50:37 +0100 Subject: [PATCH] Add validation for DNS server config --- resolver/config.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/resolver/config.go b/resolver/config.go index 069ce0dd..a69c9419 100644 --- a/resolver/config.go +++ b/resolver/config.go @@ -1,6 +1,7 @@ package resolver import ( + "errors" "fmt" "strings" @@ -109,6 +110,7 @@ The format is: "protocol://ip:port?parameter=value¶meter=value" ReleaseLevel: config.ReleaseLevelStable, DefaultValue: defaultNameServers, ValidationRegex: fmt.Sprintf("^(%s|%s|%s)://.*", ServerTypeDoT, ServerTypeDNS, ServerTypeTCP), + ValidationFunc: validateNameservers, Annotations: config.Annotations{ config.DisplayHintAnnotation: config.DisplayHintOrdered, config.DisplayOrderAnnotation: cfgOptionNameServersOrder, @@ -265,6 +267,22 @@ The format is: "protocol://ip:port?parameter=value¶meter=value" return nil } +func validateNameservers(value interface{}) error { + list, ok := value.([]string) + if !ok { + return errors.New("invalid type") + } + + for i, entry := range list { + _, _, err := createResolver(entry, ServerSourceConfigured) + if err != nil { + return fmt.Errorf("failed to parse DNS server \"%s\" (#%d): %w", entry, i+1, err) + } + } + + return nil +} + func formatScopeList(list []string) string { formatted := make([]string, 0, len(list)) for _, domain := range list {