From 3fb990ac9bc4b71c262d97c153452e8d9a225a24 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Mon, 14 Mar 2016 17:19:22 -0700 Subject: [PATCH 1/3] fixes #2661 --- letsencrypt/le_util.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/letsencrypt/le_util.py b/letsencrypt/le_util.py index c8a9d24c2..a92ce6e89 100644 --- a/letsencrypt/le_util.py +++ b/letsencrypt/le_util.py @@ -6,6 +6,7 @@ import logging import os import platform import re +import six import socket import stat import subprocess @@ -310,10 +311,13 @@ def enforce_domain_sanity(domain): # Unicode try: domain = domain.encode('ascii').lower() - except UnicodeDecodeError: - raise errors.ConfigurationError( - "Internationalized domain names are not presently supported: {0}" - .format(domain)) + except UnicodeError: + error_fmt = ("Internationalized domain names " + "are not presently supported: {0}") + if isinstance(domain, six.text_type): + raise errors.ConfigurationError(unicode(error_fmt).format(domain)) + else: + raise errors.ConfigurationError(error_fmt.format(domain)) # Remove trailing dot domain = domain[:-1] if domain.endswith('.') else domain From 1ff4f4c9ddeac41d38b3f145dd0138771d64573e Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Mon, 14 Mar 2016 17:43:33 -0700 Subject: [PATCH 2/3] add tests for unicode {en,de}coding error --- letsencrypt/tests/le_util_test.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/letsencrypt/tests/le_util_test.py b/letsencrypt/tests/le_util_test.py index 191b70801..0f9464c6f 100644 --- a/letsencrypt/tests/le_util_test.py +++ b/letsencrypt/tests/le_util_test.py @@ -323,5 +323,21 @@ class AddDeprecatedArgumentTest(unittest.TestCase): self.assertTrue("--old-option" not in stdout.getvalue()) +class EnforceDomainSanityTest(unittest.TestCase): + """Test enforce_domain_sanity.""" + + def _call(self, domain): + from letsencrypt.le_util import enforce_domain_sanity + return enforce_domain_sanity(domain) + + def test_nonascii_str(self): + self.assertRaises(errors.ConfigurationError, self._call, + u"eichh\u00f6rnchen.example.com".encode("utf-8")) + + def test_nonascii_unicode(self): + self.assertRaises(errors.ConfigurationError, self._call, + u"eichh\u00f6rnchen.example.com") + + if __name__ == "__main__": unittest.main() # pragma: no cover From f354607104e6ffcad6ffde09c7adbf2bfbd41227 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Mon, 14 Mar 2016 18:02:28 -0700 Subject: [PATCH 3/3] logic flip --- letsencrypt/le_util.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/letsencrypt/le_util.py b/letsencrypt/le_util.py index a92ce6e89..cb1c61074 100644 --- a/letsencrypt/le_util.py +++ b/letsencrypt/le_util.py @@ -312,12 +312,12 @@ def enforce_domain_sanity(domain): try: domain = domain.encode('ascii').lower() except UnicodeError: - error_fmt = ("Internationalized domain names " - "are not presently supported: {0}") + error_fmt = (u"Internationalized domain names " + "are not presently supported: {0}") if isinstance(domain, six.text_type): - raise errors.ConfigurationError(unicode(error_fmt).format(domain)) - else: raise errors.ConfigurationError(error_fmt.format(domain)) + else: + raise errors.ConfigurationError(str(error_fmt).format(domain)) # Remove trailing dot domain = domain[:-1] if domain.endswith('.') else domain