]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-63283: IDNA prefix should be case insensitive (GH-17726)
authorZackery Spytz <zspytz@gmail.com>
Fri, 15 Mar 2024 14:38:13 +0000 (07:38 -0700)
committerGitHub <noreply@github.com>
Fri, 15 Mar 2024 14:38:13 +0000 (15:38 +0100)
Any capitalization of "xn--" should be acceptable for the ACE prefix
(see https://tools.ietf.org/html/rfc3490#section-5).

Co-authored-by: Pepijn de Vos <pepijndevos@gmail.com>
Co-authored-by: Erlend E. Aasland <erlend@python.org>
Co-authored-by: Petr Viktorin <encukou@gmail.com>
Lib/encodings/idna.py
Lib/test/test_codecs.py
Misc/NEWS.d/next/Library/2024-03-13-15-45-54.gh-issue-63283.OToJnG.rst [new file with mode: 0644]

index 5396047a7fb0b870d1632df8d5836a4fbe5986cf..d0f70c00f0ab66eeabc1dd45b2dbb393a293756e 100644 (file)
@@ -86,7 +86,7 @@ def ToASCII(label):
         raise UnicodeError("label empty or too long")
 
     # Step 5: Check ACE prefix
-    if label.startswith(sace_prefix):
+    if label[:4].lower() == sace_prefix:
         raise UnicodeError("Label starts with ACE prefix")
 
     # Step 6: Encode with PUNYCODE
@@ -129,7 +129,7 @@ def ToUnicode(label):
         except UnicodeError:
             raise UnicodeError("Invalid character in IDN label")
     # Step 3: Check for ACE prefix
-    if not label.startswith(ace_prefix):
+    if not label[:4].lower() == ace_prefix:
         return str(label, "ascii")
 
     # Step 4: Remove ACE prefix
@@ -202,7 +202,7 @@ class Codec(codecs.Codec):
             # XXX obviously wrong, see #3232
             input = bytes(input)
 
-        if ace_prefix not in input:
+        if ace_prefix not in input.lower():
             # Fast path
             try:
                 return input.decode('ascii'), len(input)
index ff511a625a0194d8fd3af168afb8fe90001992e9..9585f94787714244a5c7a9d043ecf38421d0d494 100644 (file)
@@ -1547,6 +1547,13 @@ class IDNACodecTest(unittest.TestCase):
         self.assertEqual(str(b"python.org.", "idna"), "python.org.")
         self.assertEqual(str(b"xn--pythn-mua.org", "idna"), "pyth\xf6n.org")
         self.assertEqual(str(b"xn--pythn-mua.org.", "idna"), "pyth\xf6n.org.")
+        self.assertEqual(str(b"XN--pythn-mua.org.", "idna"), "pyth\xf6n.org.")
+        self.assertEqual(str(b"xN--pythn-mua.org.", "idna"), "pyth\xf6n.org.")
+        self.assertEqual(str(b"Xn--pythn-mua.org.", "idna"), "pyth\xf6n.org.")
+        self.assertEqual(str(b"bugs.xn--pythn-mua.org.", "idna"),
+                         "bugs.pyth\xf6n.org.")
+        self.assertEqual(str(b"bugs.XN--pythn-mua.org.", "idna"),
+                         "bugs.pyth\xf6n.org.")
 
     def test_builtin_encode(self):
         self.assertEqual("python.org".encode("idna"), b"python.org")
diff --git a/Misc/NEWS.d/next/Library/2024-03-13-15-45-54.gh-issue-63283.OToJnG.rst b/Misc/NEWS.d/next/Library/2024-03-13-15-45-54.gh-issue-63283.OToJnG.rst
new file mode 100644 (file)
index 0000000..bb4c3a4
--- /dev/null
@@ -0,0 +1,2 @@
+In :mod:`encodings.idna`, any capitalization of the the ACE prefix
+(``xn--``) is now acceptable. Patch by Pepijn de Vos and Zackery Spytz.