From 37165c8a5c2eb7583817a1ea846ce40451e359aa Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Wed, 7 Aug 2024 22:36:35 +0200 Subject: [PATCH] Handle dots in SOA rname properly --- TODO | 1 - nsconfig/core.py | 4 ++-- nsconfig/util.py | 7 +++++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/TODO b/TODO index a45f602..7dd0fbf 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,3 @@ -- E-mail addresses with dots in SOA - DNSSEC - Logging - More records diff --git a/nsconfig/core.py b/nsconfig/core.py index b10b53f..6f69737 100644 --- a/nsconfig/core.py +++ b/nsconfig/core.py @@ -29,7 +29,7 @@ import socket import sys from typing import Optional, Dict, List, Self, DefaultDict, TextIO, Tuple, TYPE_CHECKING -from nsconfig.util import flatten_list, parse_address, parse_network, parse_name, parse_duration +from nsconfig.util import flatten_list, parse_address, parse_network, parse_name, parse_duration, parse_rname from nsconfig.util import IPAddress, IPNetwork, IPAddr, NameParseMode @@ -289,7 +289,7 @@ class NscZonePrimary(NscZone): soa = dns.rdtypes.ANY.SOA.SOA( RdataClass.IN, RdataType.SOA, mname=conf.origin_server, - rname=conf.admin_email.replace('@', '.'), # FIXME: names with dots + rname=parse_rname(conf.admin_email), serial=self.state.serial, refresh=conf.refresh, retry=conf.retry, diff --git a/nsconfig/util.py b/nsconfig/util.py index 0faf10c..27449cb 100644 --- a/nsconfig/util.py +++ b/nsconfig/util.py @@ -70,6 +70,13 @@ def parse_name(name: str, mode: NameParseMode = NameParseMode.relative, origin: ... +def parse_rname(name: str) -> Name: + # Responsible person in SOA record, expressed as an e-mail address + parts = name.split('@') + assert len(parts) == 2 + return dns.name.from_text(parts[0].replace('.', '\\.') + '.' + parts[1]) + + def parse_duration(delta: timedelta | int) -> int: if isinstance(delta, timedelta): return int(delta.total_seconds()) -- 2.39.2