https://github.com/python/cpython/commit/d180b507c4929be399395bfd7946948f98ffc4f7
commit: d180b507c4929be399395bfd7946948f98ffc4f7
branch: main
author: Zackery Spytz <[email protected]>
committer: encukou <[email protected]>
date: 2024-03-15T15:38:13+01:00
summary:

gh-63283: IDNA prefix should be case insensitive (GH-17726)


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 <[email protected]>
Co-authored-by: Erlend E. Aasland <[email protected]>
Co-authored-by: Petr Viktorin <[email protected]>

files:
A Misc/NEWS.d/next/Library/2024-03-13-15-45-54.gh-issue-63283.OToJnG.rst
M Lib/encodings/idna.py
M Lib/test/test_codecs.py

diff --git a/Lib/encodings/idna.py b/Lib/encodings/idna.py
index 5396047a7fb0b8..d0f70c00f0ab66 100644
--- a/Lib/encodings/idna.py
+++ b/Lib/encodings/idna.py
@@ -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 @@ def decode(self, input, errors='strict'):
             # 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)
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index ff511a625a0194..9585f947877142 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -1547,6 +1547,13 @@ def test_builtin_decode(self):
         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
index 00000000000000..bb4c3a4a8d741b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-03-13-15-45-54.gh-issue-63283.OToJnG.rst
@@ -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.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to