diff --git a/tests/unit/forklift/test_legacy.py b/tests/unit/forklift/test_legacy.py index 688fa995ef35..ed93026db84a 100644 --- a/tests/unit/forklift/test_legacy.py +++ b/tests/unit/forklift/test_legacy.py @@ -882,6 +882,11 @@ def test_fails_with_invalid_names(self, pyramid_config, db_request, name): "main", "future", "al", "uU", "test", "encodings.utf_8_sig", "distutils.command.build_clib", + "xmlrpc", "xmlrpc.server", + "xml.etree", "xml.etree.ElementTree", + "xml.parsers", "xml.parsers.expat", + "xml.parsers.expat.errors", + "encodings.idna", "encodings", "CGIHTTPServer", "cgihttpserver"]) def test_fails_with_stdlib_names(self, pyramid_config, db_request, name): pyramid_config.testing_securitypolicy(userid=1) diff --git a/warehouse/forklift/legacy.py b/warehouse/forklift/legacy.py index 092a3acd2ef7..cb0d71eff75f 100644 --- a/warehouse/forklift/legacy.py +++ b/warehouse/forklift/legacy.py @@ -52,10 +52,19 @@ PATH_HASHER = "blake2_256" + +def namespace_stdlib_list(module_list): + for module_name in module_list: + parts = module_name.split('.') + for i, part in enumerate(parts): + yield '.'.join(parts[:i + 1]) + + STDLIB_PROHIBITTED = { packaging.utils.canonicalize_name(s.rstrip('-_.').lstrip('-_.')) - for s in chain.from_iterable(stdlib_list.stdlib_list(version) - for version in stdlib_list.short_versions) + for s in chain.from_iterable( + namespace_stdlib_list(stdlib_list.stdlib_list(version)) + for version in stdlib_list.short_versions) } # Wheel platform checking