| """Stuff that differs in different Python versions and platform |
| distributions.""" |
| |
| import logging |
| import os |
| import sys |
| |
| __all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"] |
| |
| |
| logger = logging.getLogger(__name__) |
| |
| |
| def has_tls() -> bool: |
| try: |
| import _ssl # noqa: F401 # ignore unused |
| |
| return True |
| except ImportError: |
| pass |
| |
| from pip._vendor.urllib3.util import IS_PYOPENSSL |
| |
| return IS_PYOPENSSL |
| |
| |
| def get_path_uid(path: str) -> int: |
| """ |
| Return path's uid. |
| |
| Does not follow symlinks: |
| https://github.com/pypa/pip/pull/935#discussion_r5307003 |
| |
| Placed this function in compat due to differences on AIX and |
| Jython, that should eventually go away. |
| |
| :raises OSError: When path is a symlink or can't be read. |
| """ |
| if hasattr(os, "O_NOFOLLOW"): |
| fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) |
| file_uid = os.fstat(fd).st_uid |
| os.close(fd) |
| else: # AIX and Jython |
| # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW |
| if not os.path.islink(path): |
| # older versions of Jython don't have `os.fstat` |
| file_uid = os.stat(path).st_uid |
| else: |
| # raise OSError for parity with os.O_NOFOLLOW above |
| raise OSError(f"{path} is a symlink; Will not return uid for symlinks") |
| return file_uid |
| |
| |
| # packages in the stdlib that may have installation metadata, but should not be |
| # considered 'installed'. this theoretically could be determined based on |
| # dist.location (py27:`sysconfig.get_paths()['stdlib']`, |
| # py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may |
| # make this ineffective, so hard-coding |
| stdlib_pkgs = {"python", "wsgiref", "argparse"} |
| |
| |
| # windows detection, covers cpython and ironpython |
| WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt") |