]> granicus.if.org Git - python/commitdiff
don't allow unicode into type_map on Windows (closes #21652)
authorBenjamin Peterson <benjamin@python.org>
Sun, 29 Jun 2014 19:58:16 +0000 (12:58 -0700)
committerBenjamin Peterson <benjamin@python.org>
Sun, 29 Jun 2014 19:58:16 +0000 (12:58 -0700)
Patch from Vladimir Iofik.

Lib/mimetypes.py
Lib/test/test_mimetypes.py
Misc/NEWS

index 7f28b896515942f53c0d91080a6bd5361496c7dc..ec8fd995ee97511a3e77ba968dfd6ce4ede21a5d 100644 (file)
@@ -247,23 +247,26 @@ class MimeTypes:
                     break
                 i += 1
 
+        default_encoding = sys.getdefaultencoding()
         with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr:
             for subkeyname in enum_types(hkcr):
-                # Only check file extensions, not all possible classes
-                if not subkeyname.startswith("."):
-                    continue
-
-                with _winreg.OpenKey(hkcr, subkeyname) as subkey:
-                    # If there is no "Content Type" value, or if it is not
-                    # a simple string, simply skip
-                    try:
+                try:
+                    with _winreg.OpenKey(hkcr, subkeyname) as subkey:
+                        # Only check file extensions
+                        if not subkeyname.startswith("."):
+                            continue
+                        # raises EnvironmentError if no 'Content Type' value
                         mimetype, datatype = _winreg.QueryValueEx(
                             subkey, 'Content Type')
-                    except EnvironmentError:
-                        continue
-                    if datatype != _winreg.REG_SZ:
-                        continue
-                    self.add_type(mimetype, subkeyname, strict)
+                        if datatype != _winreg.REG_SZ:
+                            continue
+                        try:
+                            mimetype = mimetype.encode(default_encoding)
+                        except UnicodeEncodeError:
+                            continue
+                        self.add_type(mimetype, subkeyname, strict)
+                except EnvironmentError:
+                    continue
 
 def guess_type(url, strict=True):
     """Guess the type of a file based on its URL.
index d5a8a3102390b552492deb1cd7be5836ce98db55..8de42588f60411f057e133839219086ad441707e 100644 (file)
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
 import mimetypes
 import StringIO
 import unittest
@@ -95,10 +97,10 @@ class Win32MimeTypesTestCase(unittest.TestCase):
             def __getattr__(self, name):
                 if name == 'EnumKey':
                     return lambda key, i: _winreg.EnumKey(key, i) + "\xa3"
-                elif name == "OpenKey":
+                elif name == 'OpenKey':
                     return lambda key, name: _winreg.OpenKey(key, name.rstrip("\xa3"))
                 elif name == 'QueryValueEx':
-                    return lambda subkey, label: (label + "\xa3", _winreg.REG_SZ)
+                    return lambda subkey, label: (u'текст/простой' , _winreg.REG_SZ)
                 return getattr(_winreg, name)
 
         mimetypes._winreg = MockWinreg()
@@ -115,7 +117,7 @@ class Win32MimeTypesTestCase(unittest.TestCase):
         class MockWinreg(object):
             def __getattr__(self, name):
                 if name == 'QueryValueEx':
-                    return lambda subkey, label: (label + "\xa3", _winreg.REG_SZ)
+                    return lambda subkey, label: (u'текст/простой', _winreg.REG_SZ)
                 return getattr(_winreg, name)
 
         mimetypes._winreg = MockWinreg()
@@ -126,6 +128,22 @@ class Win32MimeTypesTestCase(unittest.TestCase):
         finally:
             mimetypes._winreg = _winreg
 
+    def test_type_map_values(self):
+        import _winreg
+
+        class MockWinreg(object):
+            def __getattr__(self, name):
+                if name == 'QueryValueEx':
+                    return lambda subkey, label: (u'text/plain', _winreg.REG_SZ)
+                return getattr(_winreg, name)
+
+        mimetypes._winreg = MockWinreg()
+        try:
+            mimetypes.init()
+            self.assertTrue(isinstance(mimetypes.types_map.values()[0], str))
+        finally:
+            mimetypes._winreg = _winreg
+
 def test_main():
     test_support.run_unittest(MimeTypesTestCase,
         Win32MimeTypesTestCase
index 4f86a51fcf2e6c85adf31b64014f04a20bca4517..982bf30760158d7bb65c181167a3eee18e318503 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -35,6 +35,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #21652: Prevent mimetypes.type_map from containing unicode keys on
+  Windows.
+
 - Issue #21729: Used the "with" statement in the dbm.dumb module to ensure
   files closing.