| 
									
										
										
										
											2021-11-13 16:28:39 +00:00
										 |  |  | ---
 | 
					
						
							| 
									
										
										
										
											2023-11-21 16:33:21 +00:00
										 |  |  |  src/pip/_vendor/certifi/core.py |  105 +++------------------------------------- | 
					
						
							|  |  |  |  tests/unit/test_options.py      |    5 + | 
					
						
							|  |  |  |  2 files changed, 13 insertions(+), 97 deletions(-) | 
					
						
							| 
									
										
										
										
											2021-11-13 16:28:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-21 16:33:21 +00:00
										 |  |  | --- a/src/pip/_vendor/certifi/core.py
 | 
					
						
							|  |  |  | +++ b/src/pip/_vendor/certifi/core.py
 | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  | @@ -3,106 +3,17 @@ certifi.py
 | 
					
						
							| 
									
										
										
										
											2020-10-15 08:14:59 +00:00
										 |  |  |  ~~~~~~~~~~ | 
					
						
							| 
									
										
										
										
											2018-07-24 06:41:54 +00:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2020-10-15 08:14:59 +00:00
										 |  |  |  This module returns the installation location of cacert.pem or its contents. | 
					
						
							|  |  |  | +Patched by openSUSE: return the system bundle
 | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  |  """ | 
					
						
							|  |  |  | -import sys
 | 
					
						
							| 
									
										
										
										
											2020-10-15 08:14:59 +00:00
										 |  |  |   | 
					
						
							|  |  |  | +def read_text(_module=None, _path=None, encoding="ascii"):
 | 
					
						
							|  |  |  | +    with open(where(), "r", encoding=encoding) as data:
 | 
					
						
							|  |  |  | +        return data.read()
 | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  | -if sys.version_info >= (3, 11):
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -    from importlib.resources import as_file, files
 | 
					
						
							|  |  |  | +def where() -> str:
 | 
					
						
							|  |  |  | +    return "/etc/ssl/ca-bundle.pem"
 | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
											  
											
												- update to 21.3.1:
  * Always refuse installing or building projects that have no ``pyproject.toml`` nor
    ``setup.py``. 
  * Tweak running-as-root detection, to check ``os.getuid`` if it exists, on
    Unix-y and non-Linux/non-MacOS machines.
  * When installing projects with a ``pyproject.toml`` in editable mode, and the build
    backend does not support :pep:`660`, prepare metadata using
    ``prepare_metadata_for_build_wheel`` instead of ``setup.py egg_info``. Also, refuse
    installing projects that only have a ``setup.cfg`` and no ``setup.py`` nor
    ``pyproject.toml``. These restore the pre-21.3 behaviour.
  * Restore compatibility of where configuration files are loaded from on MacOS
  * Upgrade pep517 to 0.12.0
  * Improve deprecation warning regarding the copying of source trees when
    installing from a local directory.
  * Suppress location mismatch warnings when pip is invoked from a Python source
    tree, so ``ensurepip`` does not emit warnings on CPython ``make install``.
  * On Python 3.10 or later, the installation scheme backend has been changed to use
    ``sysconfig``. This is to anticipate the deprecation of ``distutils`` in Python
    3.10, and its scheduled removal in 3.12. For compatibility considerations, pip
    installations running on Python 3.9 or lower will continue to use ``distutils``.
  * Remove the ``--build-dir`` option and aliases, one last time.
  * In-tree builds are now the default. ``--use-feature=in-tree-build`` is now
    ignored. ``--use-deprecated=out-of-tree-build`` may be used temporarily to ease
    the transition.
  * Un-deprecate source distribution re-installation behaviour.
  * Replace vendored appdirs with platformdirs.
  * Support `PEP 610 <https://www.python.org/dev/peps/pep-0610/>`_ to detect
    editable installs in ``pip freeze`` and  ``pip list``. The ``pip list`` column output
    has a new ``Editable project location`` column, and the JSON output has a new
    ``editable_project_location`` field.
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-pip?expand=0&rev=92
											
										 
											2021-11-07 18:12:24 +00:00
										 |  |  | -    _CACERT_CTX = None
 | 
					
						
							|  |  |  | -    _CACERT_PATH = None
 | 
					
						
							|  |  |  | -
 | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  | -    def where() -> str:
 | 
					
						
							| 
									
										
										
										
											2020-10-15 08:14:59 +00:00
										 |  |  | -        # This is slightly terrible, but we want to delay extracting the file
 | 
					
						
							|  |  |  | -        # in cases where we're inside of a zipimport situation until someone
 | 
					
						
							|  |  |  | -        # actually calls where(), but we don't want to re-extract the file
 | 
					
						
							|  |  |  | -        # on every call of where(), so we'll do it once then store it in a
 | 
					
						
							|  |  |  | -        # global variable.
 | 
					
						
							|  |  |  | -        global _CACERT_CTX
 | 
					
						
							|  |  |  | -        global _CACERT_PATH
 | 
					
						
							|  |  |  | -        if _CACERT_PATH is None:
 | 
					
						
							|  |  |  | -            # This is slightly janky, the importlib.resources API wants you to
 | 
					
						
							|  |  |  | -            # manage the cleanup of this file, so it doesn't actually return a
 | 
					
						
							|  |  |  | -            # path, it returns a context manager that will give you the path
 | 
					
						
							|  |  |  | -            # when you enter it and will do any cleanup when you leave it. In
 | 
					
						
							|  |  |  | -            # the common case of not needing a temporary file, it will just
 | 
					
						
							|  |  |  | -            # return the file system location and the __exit__() is a no-op.
 | 
					
						
							|  |  |  | -            #
 | 
					
						
							|  |  |  | -            # We also have to hold onto the actual context manager, because
 | 
					
						
							|  |  |  | -            # it will do the cleanup whenever it gets garbage collected, so
 | 
					
						
							|  |  |  | -            # we will also store that at the global level as well.
 | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  | -            _CACERT_CTX = as_file(files("pip._vendor.certifi").joinpath("cacert.pem"))
 | 
					
						
							|  |  |  | -            _CACERT_PATH = str(_CACERT_CTX.__enter__())
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -        return _CACERT_PATH
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -    def contents() -> str:
 | 
					
						
							|  |  |  | -        return files("pip._vendor.certifi").joinpath("cacert.pem").read_text(encoding="ascii")
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -elif sys.version_info >= (3, 7):
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -    from importlib.resources import path as get_path, read_text
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -    _CACERT_CTX = None
 | 
					
						
							|  |  |  | -    _CACERT_PATH = None
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -    def where() -> str:
 | 
					
						
							|  |  |  | -        # This is slightly terrible, but we want to delay extracting the
 | 
					
						
							|  |  |  | -        # file in cases where we're inside of a zipimport situation until
 | 
					
						
							|  |  |  | -        # someone actually calls where(), but we don't want to re-extract
 | 
					
						
							|  |  |  | -        # the file on every call of where(), so we'll do it once then store
 | 
					
						
							|  |  |  | -        # it in a global variable.
 | 
					
						
							|  |  |  | -        global _CACERT_CTX
 | 
					
						
							|  |  |  | -        global _CACERT_PATH
 | 
					
						
							|  |  |  | -        if _CACERT_PATH is None:
 | 
					
						
							|  |  |  | -            # This is slightly janky, the importlib.resources API wants you
 | 
					
						
							|  |  |  | -            # to manage the cleanup of this file, so it doesn't actually
 | 
					
						
							|  |  |  | -            # return a path, it returns a context manager that will give
 | 
					
						
							|  |  |  | -            # you the path when you enter it and will do any cleanup when
 | 
					
						
							|  |  |  | -            # you leave it. In the common case of not needing a temporary
 | 
					
						
							|  |  |  | -            # file, it will just return the file system location and the
 | 
					
						
							|  |  |  | -            # __exit__() is a no-op.
 | 
					
						
							|  |  |  | -            #
 | 
					
						
							|  |  |  | -            # We also have to hold onto the actual context manager, because
 | 
					
						
							|  |  |  | -            # it will do the cleanup whenever it gets garbage collected, so
 | 
					
						
							|  |  |  | -            # we will also store that at the global level as well.
 | 
					
						
							| 
									
										
										
										
											2020-10-15 08:14:59 +00:00
										 |  |  | -            _CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem")
 | 
					
						
							|  |  |  | -            _CACERT_PATH = str(_CACERT_CTX.__enter__())
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -        return _CACERT_PATH
 | 
					
						
							|  |  |  | -
 | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  | -    def contents() -> str:
 | 
					
						
							|  |  |  | -        return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii")
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -else:
 | 
					
						
							|  |  |  | -    import os
 | 
					
						
							|  |  |  | -    import types
 | 
					
						
							|  |  |  | -    from typing import Union
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -    Package = Union[types.ModuleType, str]
 | 
					
						
							|  |  |  | -    Resource = Union[str, "os.PathLike"]
 | 
					
						
							| 
									
										
										
										
											2019-05-11 17:29:32 +00:00
										 |  |  | -
 | 
					
						
							| 
									
										
										
										
											2020-10-15 08:14:59 +00:00
										 |  |  | -    # This fallback will work for Python versions prior to 3.7 that lack the
 | 
					
						
							|  |  |  | -    # importlib.resources module but relies on the existing `where` function
 | 
					
						
							|  |  |  | -    # so won't address issues with environments like PyOxidizer that don't set
 | 
					
						
							|  |  |  | -    # __file__ on modules.
 | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  | -    def read_text(
 | 
					
						
							|  |  |  | -        package: Package,
 | 
					
						
							|  |  |  | -        resource: Resource,
 | 
					
						
							|  |  |  | -        encoding: str = 'utf-8',
 | 
					
						
							|  |  |  | -        errors: str = 'strict'
 | 
					
						
							|  |  |  | -    ) -> str:
 | 
					
						
							|  |  |  | -        with open(where(), encoding=encoding) as data:
 | 
					
						
							| 
									
										
										
										
											2020-10-15 08:14:59 +00:00
										 |  |  | -            return data.read()
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -    # If we don't have importlib.resources, then we will just do the old logic
 | 
					
						
							|  |  |  | -    # of assuming we're on the filesystem and munge the path directly.
 | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  | -    def where() -> str:
 | 
					
						
							| 
									
										
										
										
											2020-10-15 08:14:59 +00:00
										 |  |  | -        f = os.path.dirname(__file__)
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -        return os.path.join(f, "cacert.pem")
 | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  | -
 | 
					
						
							|  |  |  | -    def contents() -> str:
 | 
					
						
							|  |  |  | -        return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii")
 | 
					
						
							|  |  |  | +def contents() -> str:
 | 
					
						
							| 
									
										
										
										
											2020-10-15 08:14:59 +00:00
										 |  |  | +    return read_text(encoding="ascii")
 | 
					
						
							| 
									
										
										
										
											2023-11-21 16:33:21 +00:00
										 |  |  | --- a/tests/unit/test_options.py
 | 
					
						
							|  |  |  | +++ b/tests/unit/test_options.py
 | 
					
						
							| 
									
										
										
										
											2021-11-13 16:28:39 +00:00
										 |  |  | @@ -1,4 +1,5 @@
 | 
					
						
							|  |  |  |  import os | 
					
						
							|  |  |  | +import os.path
 | 
					
						
							|  |  |  |  from contextlib import contextmanager | 
					
						
							|  |  |  |  from optparse import Values | 
					
						
							|  |  |  |  from tempfile import NamedTemporaryFile | 
					
						
							|  |  |  | @@ -11,6 +12,7 @@ from pip._internal.cli.main import main
 | 
					
						
							|  |  |  |  from pip._internal.commands import create_command | 
					
						
							|  |  |  |  from pip._internal.commands.configuration import ConfigurationCommand | 
					
						
							|  |  |  |  from pip._internal.exceptions import PipError | 
					
						
							|  |  |  | +from pip._vendor.certifi import where
 | 
					
						
							|  |  |  |  from tests.lib.options_helpers import AddFakeCommandMixin | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-12-08 04:12:44 +00:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2023-11-21 16:33:21 +00:00
										 |  |  | @@ -618,6 +620,9 @@ class TestOptionsConfigFiles:
 | 
					
						
							| 
									
										
										
										
											2021-11-13 16:28:39 +00:00
										 |  |  |          else: | 
					
						
							|  |  |  |              assert expect == cmd._determine_file(options, need_value=False) | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +    def test_certificates(self):
 | 
					
						
							|  |  |  | +        assert os.path.exists(where())
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  class TestOptionsExpandUser(AddFakeCommandMixin): | 
					
						
							|  |  |  |      def test_cache_dir(self) -> None: |