]> mj.ucw.cz Git - pynsc.git/commitdiff
Handle dots in SOA rname properly
authorMartin Mares <mj@ucw.cz>
Wed, 7 Aug 2024 20:36:35 +0000 (22:36 +0200)
committerMartin Mares <mj@ucw.cz>
Wed, 7 Aug 2024 20:36:35 +0000 (22:36 +0200)
TODO
nsconfig/core.py
nsconfig/util.py

diff --git a/TODO b/TODO
index a45f602bbc8f6fe77191c32777b37cae6b178d3d..7dd0fbf84083c6af7e57372744a893db12e4c23f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,4 +1,3 @@
-- E-mail addresses with dots in SOA
 - DNSSEC
 - Logging
 - More records
index b10b53f94740c0fd71421fd2f047d177ff0e8291..6f69737b81779deb538e7fa27c55a395247a4db8 100644 (file)
@@ -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,
index 0faf10c6ced2722f933474a2e701f477e651745a..27449cbadcd504ce100fef064f16754c58cd28be 100644 (file)
@@ -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())