64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
"""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")
 |