fix: IDNA awareness in the zone finder (#5705)

Signed-off-by: Hiroki Hanada <hiroki-hanada@cybozu.co.jp>
This commit is contained in:
Hiroki Hanada 2025-08-02 04:27:38 +09:00 committed by GitHub
parent 468fb66758
commit 498bb87623
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 12 additions and 5 deletions

View File

@ -20,7 +20,8 @@ import (
"strings"
log "github.com/sirupsen/logrus"
"golang.org/x/net/idna"
"sigs.k8s.io/external-dns/internal/idna"
)
type ZoneIDName map[string]string
@ -48,7 +49,7 @@ func (z ZoneIDName) FindZone(hostname string) (string, string) {
if strings.Contains(label, "_") {
continue
}
convertedLabel, err := idna.Lookup.ToUnicode(label)
convertedLabel, err := idna.Profile.ToUnicode(label)
if err != nil {
log.Warnf("Failed to convert label %q of hostname %q to its Unicode form: %v", label, hostname, err)
convertedLabel = label

View File

@ -34,6 +34,7 @@ func TestZoneIDName(t *testing.T) {
z.Add("123123", "_metadata.example.com")
z.Add("1231231", "_foo._metadata.example.com")
z.Add("456456", "_metadata.エイミー.みんな")
z.Add("123412", "*.example.com")
assert.Equal(t, ZoneIDName{
"123456": "qux.baz",
@ -42,6 +43,7 @@ func TestZoneIDName(t *testing.T) {
"123123": "_metadata.example.com",
"1231231": "_foo._metadata.example.com",
"456456": "_metadata.エイミー.みんな",
"123412": "*.example.com",
}, z)
// simple entry in a domain
@ -83,8 +85,12 @@ func TestZoneIDName(t *testing.T) {
assert.Equal(t, "_foo._metadata.example.com", zoneName)
assert.Equal(t, "1231231", zoneID)
hook := testutils.LogsUnderTestWithLogLevel(log.WarnLevel, t)
_, _ = z.FindZone("???")
zoneID, zoneName = z.FindZone("*.example.com")
assert.Equal(t, "*.example.com", zoneName)
assert.Equal(t, "123412", zoneID)
testutils.TestHelperLogContains("Failed to convert label \"???\" of hostname \"???\" to its Unicode form: idna: disallowed rune U+003F", hook, t)
hook := testutils.LogsUnderTestWithLogLevel(log.WarnLevel, t)
_, _ = z.FindZone("xn--not-a-valid-punycode")
testutils.TestHelperLogContains("Failed to convert label \"xn--not-a-valid-punycode\" of hostname \"xn--not-a-valid-punycode\" to its Unicode form: idna: invalid label", hook, t)
}