Due to compability with older versions, only IDNA domains should be
checked
Patch attached.
-- 
Martin^2 Basti
>From fd329148639ce5b5707f37d1b450597f3ca4bcb7 Mon Sep 17 00:00:00 2001
From: Martin Basti <mba...@redhat.com>
Date: Wed, 18 Jun 2014 15:58:17 +0200
Subject: [PATCH] Check normalization only for IDNA domains

Backward compability with older IPA versions which allow to use uppper
case. Only IDNA domains will be checked.
---
 ipalib/parameters.py                    | 24 ++++++++++++++----------
 ipatests/test_xmlrpc/test_dns_plugin.py |  4 ++--
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/ipalib/parameters.py b/ipalib/parameters.py
index 1dff13cc1371c26208cacd8a7cbaf44634622e4a..ffd20fddae4257c51297f0221231aa2cadad9d58 100644
--- a/ipalib/parameters.py
+++ b/ipalib/parameters.py
@@ -1961,16 +1961,20 @@ class DNSNameParam(Param):
                 error = _('DNS label cannot be longer than 63 characters')
             except dns.exception.SyntaxError:
                 error = _('invalid domain name')
-
-            #compare if IDN normalized and original domain match
-            #there is N:1 mapping between unicode and IDNA names
-            #user should use normalized names to avoid mistakes
-            normalized_domain_name = encodings.idna.nameprep(value)
-            if value != normalized_domain_name:
-                error = _("domain name '%(domain)s' and normalized domain name"
-                          " '%(normalized)s' do not match. Please use only"
-                          " normalized domains") % {'domain': value,
-                          'normalized': normalized_domain_name}
+            else:
+                if domain_name.is_idn() or u'\xdf' in value:
+                    #compare if IDN normalized and original domain match
+                    #there is N:1 mapping between unicode and IDNA names
+                    #user should use normalized names to avoid mistakes
+                    # u'\xdf' is special case, german 'eszett' character, which
+                    # is mapped to 'ss'
+                    normalized_domain_name = encodings.idna.nameprep(value)
+                    if value != normalized_domain_name:
+                        error = _("domain name '%(domain)s' and normalized "
+                                  "domain name '%(normalized)s' do not match. "
+                                  "Please use only normalized IDNA domains") % {
+                                        'domain': value,
+                                        'normalized': normalized_domain_name}
             if error:
                 raise ConversionError(name=self.get_param_name(), index=index,
                                       error=error)
diff --git a/ipatests/test_xmlrpc/test_dns_plugin.py b/ipatests/test_xmlrpc/test_dns_plugin.py
index dd105990f0da2c7aa88c64d7fdc6b9be7b7f8885..9a09e33ff6296da7c60ea91525ddb2209c56ca2e 100644
--- a/ipatests/test_xmlrpc/test_dns_plugin.py
+++ b/ipatests/test_xmlrpc/test_dns_plugin.py
@@ -2432,11 +2432,11 @@ class test_dns(Declarative):
 
 
         dict(
-            desc='Add A denormalized record to %r in zone %r' % (idnres1, idnzone1),
+            desc='Add A denormalized record in zone %r' % (idnzone1),
             command=('dnsrecord_add', [idnzone1, u'gro\xdf'], {'arecord': u'172.16.0.1'}),
             expected=errors.ConversionError(name='name',
                 error=u'domain name \'gro\xdf\' and normalized domain name \'gross\''
-                + ' do not match. Please use only normalized domains'),
+                + ' do not match. Please use only normalized IDNA domains'),
         ),
 
 
-- 
1.8.3.1

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to