From 4dc12c677c568ce5cacdf0637c8a31e2ffa461ba Mon Sep 17 00:00:00 2001 From: Stavros Date: Sat, 22 Aug 2026 19:59:53 +0300 Subject: [PATCH] fix: allow for undescores and leading hyphens in domain validator (#1088) --- pkg/validators/domain_validator.go | 10 +++++++++- pkg/validators/domain_validator_test.go | 16 +++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/pkg/validators/domain_validator.go b/pkg/validators/domain_validator.go index d41d82b3..612c52ae 100644 --- a/pkg/validators/domain_validator.go +++ b/pkg/validators/domain_validator.go @@ -119,7 +119,15 @@ func (v *DomainValidator) getHostname(hostname string) (string, error) { if net.ParseIP(hostname) != nil { return "", fmt.Errorf("ip addresses are not supported") } - hostname, err := idna.Lookup.ToASCII(hostname) + i := idna.New( + idna.MapForLookup(), + idna.Transitional(false), + idna.BidiRule(), + idna.StrictDomainName(false), + idna.CheckHyphens(false), + idna.CheckJoiners(false), + ) + hostname, err := i.ToASCII(hostname) if err != nil { return "", fmt.Errorf("failed to convert hostname to ascii: %w", err) } diff --git a/pkg/validators/domain_validator_test.go b/pkg/validators/domain_validator_test.go index aa7587f1..0b3b81e1 100644 --- a/pkg/validators/domain_validator_test.go +++ b/pkg/validators/domain_validator_test.go @@ -50,6 +50,16 @@ func TestDomainValidator_SafeHostname(t *testing.T) { input: "https://example.com", expected: "example.com", }, + { + description: "Domain with underscores should pass", + input: "https://my_domain.com", + expected: "my_domain.com", + }, + { + description: "Domain with leading hyphen should pass", + input: "https://-my-domain.com", + expected: "-my-domain.com", + }, { description: "Domain without scheme should parse if scheme is disabled", input: "example.com", @@ -108,7 +118,7 @@ func TestDomainValidator_SafeHostname(t *testing.T) { }, { description: "Invalid IDNA domain should fail", - input: "ab--cd.example.com", + input: "xn--r-kva.example.com", errorFunc: func(t *testing.T, e error) { assert.ErrorContains(t, e, "invalid label") }, @@ -196,7 +206,7 @@ func TestDomainValidator_Validate(t *testing.T) { }, { description: "Failure to format expected domain should fail", - expected: "ab--cd.example.com", + expected: "xn--r-kva.example.com", actual: "example.com", errorFunc: func(t *testing.T, e error) { assert.ErrorContains(t, e, "idna: invalid label") @@ -205,7 +215,7 @@ func TestDomainValidator_Validate(t *testing.T) { { description: "Failure to format check domain should fail", expected: "example.com", - actual: "ab--cd.example.com", + actual: "xn--r-kva.example.com", errorFunc: func(t *testing.T, e error) { assert.ErrorContains(t, e, "idna: invalid label") },