403b09
From 57b757807a53400b8addb19d323f5691122c3ebb Mon Sep 17 00:00:00 2001
403b09
From: Martin Basti <mbasti@redhat.com>
403b09
Date: Thu, 21 Jul 2016 13:18:34 +0200
403b09
Subject: [PATCH] Host-del: fix behavior of --updatedns and PTR records
403b09
403b09
* target for ptr record must be absolute domain name
403b09
* zone is detected using DNS system instead of random splitting of
403b09
hostname
403b09
403b09
https://fedorahosted.org/freeipa/ticket/6060
403b09
403b09
Reviewed-By: Petr Spacek <pspacek@redhat.com>
403b09
---
403b09
 ipaserver/plugins/host.py | 26 +++++++++++++++-----------
403b09
 1 file changed, 15 insertions(+), 11 deletions(-)
403b09
403b09
diff --git a/ipaserver/plugins/host.py b/ipaserver/plugins/host.py
403b09
index f342b05c87b936ab7b99009cfb0f6d3acde4ef93..413dcf15e0423170d8334902b9dcf8fb5aa14de6 100644
403b09
--- a/ipaserver/plugins/host.py
403b09
+++ b/ipaserver/plugins/host.py
403b09
@@ -18,6 +18,9 @@
403b09
 # You should have received a copy of the GNU General Public License
403b09
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
403b09
 
403b09
+from __future__ import absolute_import
403b09
+
403b09
+import dns.resolver
403b09
 import string
403b09
 
403b09
 import six
403b09
@@ -134,7 +137,7 @@ register = Registry()
403b09
 host_pwd_chars = string.digits + string.ascii_letters + '_,.@+-='
403b09
 
403b09
 
403b09
-def remove_ptr_rec(ipaddr, host, domain):
403b09
+def remove_ptr_rec(ipaddr, fqdn):
403b09
     """
403b09
     Remove PTR record of IP address (ipaddr)
403b09
     :return: True if PTR record was removed, False if record was not found
403b09
@@ -143,13 +146,12 @@ def remove_ptr_rec(ipaddr, host, domain):
403b09
     try:
403b09
         revzone, revname = get_reverse_zone(ipaddr)
403b09
 
403b09
-        # in case domain is in FQDN form with a trailing dot, we needn't add
403b09
-        # another one, in case it has no trailing dot, dnsrecord-del will
403b09
-        # normalize the entry
403b09
-        delkw = {'ptrrecord': "%s.%s" % (host, domain)}
403b09
+        # assume that target in PTR record is absolute name (otherwise it is
403b09
+        # non-standard configuration)
403b09
+        delkw = {'ptrrecord': u"%s" % fqdn.make_absolute()}
403b09
 
403b09
         api.Command['dnsrecord_del'](revzone, revname, **delkw)
403b09
-    except errors.NotFound:
403b09
+    except (errors.NotFound, errors.AttrValueNotFound):
403b09
         api.log.debug('PTR record of ipaddr %s not found', ipaddr)
403b09
         return False
403b09
 
403b09
@@ -794,13 +796,15 @@ class host_del(LDAPDelete):
403b09
 
403b09
         if updatedns:
403b09
             # Remove A, AAAA, SSHFP and PTR records of the host
403b09
-            parts = fqdn.split('.')
403b09
-            domain = unicode('.'.join(parts[1:]))
403b09
+            fqdn_dnsname = DNSName(fqdn).make_absolute()
403b09
+            zone = DNSName(dns.resolver.zone_for_name(fqdn_dnsname))
403b09
+            relative_hostname = fqdn_dnsname.relativize(zone)
403b09
+
403b09
             # Get all resources for this host
403b09
             rec_removed = False
403b09
             try:
403b09
                 record = api.Command['dnsrecord_show'](
403b09
-                    domain, parts[0])['result']
403b09
+                    zone, relative_hostname)['result']
403b09
             except errors.NotFound:
403b09
                 pass
403b09
             else:
403b09
@@ -808,13 +812,13 @@ class host_del(LDAPDelete):
403b09
                 for attr in ('arecord', 'aaaarecord'):
403b09
                     for val in record.get(attr, []):
403b09
                         rec_removed = (
403b09
-                            remove_ptr_rec(val, parts[0], domain) or
403b09
+                            remove_ptr_rec(val, fqdn_dnsname) or
403b09
                             rec_removed
403b09
                         )
403b09
                 try:
403b09
                     # remove all A, AAAA, SSHFP records of the host
403b09
                     api.Command['dnsrecord_mod'](
403b09
-                        domain,
403b09
+                        zone,
403b09
                         record['idnsname'][0],
403b09
                         arecord=[],
403b09
                         aaaarecord=[],
403b09
-- 
403b09
2.7.4
403b09