diff --git a/management/server/http/handlers/routes/routes_handler.go b/management/server/http/handlers/routes/routes_handler.go index 112d43c08..dcd566393 100644 --- a/management/server/http/handlers/routes/routes_handler.go +++ b/management/server/http/handlers/routes/routes_handler.go @@ -94,7 +94,7 @@ func (h *handler) createRoute(w http.ResponseWriter, r *http.Request) { var networkType route.NetworkType var newPrefix netip.Prefix if req.Domains != nil { - d, err := domain.ValidateFQDNs(*req.Domains) + d, err := domain.ValidateDomains(*req.Domains) if err != nil { util.WriteError(r.Context(), status.Errorf(status.InvalidArgument, "invalid domains: %v", err), w) return diff --git a/shared/management/domain/validate.go b/shared/management/domain/validate.go index 7100eeb4c..bd907852a 100644 --- a/shared/management/domain/validate.go +++ b/shared/management/domain/validate.go @@ -67,6 +67,27 @@ func ValidateFQDNs(fqdns []string) (List, error) { return domainList, nil } +// ValidateDomains checks if each domain in the list is valid and returns a punycode-encoded DomainList. +func ValidateDomains(domains []string) (List, error) { + if len(domains) == 0 { + return nil, fmt.Errorf("domains list is empty") + } + if len(domains) > maxFQDN { + return nil, fmt.Errorf("domains list exceeds maximum allowed domains: %d", maxFQDN) + } + + var domainList List + + for _, d := range domains { + validDomain, err := ToValidDomain(d, true, true) + if err != nil { + return nil, fmt.Errorf("invalid domain %s: %w", d, err) + } + domainList = append(domainList, validDomain) + } + return domainList, nil +} + // ValidateFQDNsList checks if each domain in the list is valid func ValidateFQDNsList(fqdns []string) error { if len(fqdns) == 0 {