SILENT KILLERPanel

Current Path: > > lib > python3.8 > site-packages > pip > _internal > > utils


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //lib/python3.8/site-packages/pip/_internal//utils

NameTypeSizeLast ModifiedActions
__pycache__ Directory - -
__init__.py File 0 bytes October 17 2023 18:30:24.
appdirs.py File 9766 bytes October 17 2023 18:30:24.
compat.py File 9565 bytes October 17 2023 18:30:24.
deprecation.py File 3318 bytes October 17 2023 18:30:24.
encoding.py File 1320 bytes October 17 2023 18:30:24.
filesystem.py File 3334 bytes October 17 2023 18:30:24.
filetypes.py File 571 bytes October 17 2023 18:30:24.
glibc.py File 4397 bytes October 17 2023 18:30:24.
hashes.py File 4020 bytes October 17 2023 18:30:24.
inject_securetransport.py File 810 bytes October 17 2023 18:30:24.
logging.py File 13033 bytes October 17 2023 18:30:24.
marker_files.py File 823 bytes October 17 2023 18:30:24.
misc.py File 25579 bytes October 17 2023 18:30:24.
models.py File 1148 bytes October 17 2023 18:30:24.
packaging.py File 3035 bytes October 17 2023 18:30:24.
setuptools_build.py File 1631 bytes October 17 2023 18:30:24.
subprocess.py File 9911 bytes October 17 2023 18:30:24.
temp_dir.py File 5521 bytes October 17 2023 18:30:24.
typing.py File 1125 bytes October 17 2023 18:30:24.
ui.py File 13906 bytes October 17 2023 18:30:24.
unpacking.py File 9682 bytes October 17 2023 18:30:24.
urls.py File 1481 bytes October 17 2023 18:30:24.
virtualenv.py File 891 bytes October 17 2023 18:30:24.

Reading File: //lib/python3.8/site-packages/pip/_internal//utils/hashes.py

# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False

from __future__ import absolute_import

import hashlib

from pip._vendor.six import iteritems, iterkeys, itervalues

from pip._internal.exceptions import (
    HashMismatch,
    HashMissing,
    InstallationError,
)
from pip._internal.utils.misc import read_chunks
from pip._internal.utils.typing import MYPY_CHECK_RUNNING

if MYPY_CHECK_RUNNING:
    from typing import (
        Dict, List, BinaryIO, NoReturn, Iterator
    )
    from pip._vendor.six import PY3
    if PY3:
        from hashlib import _Hash
    else:
        from hashlib import _hash as _Hash


# The recommended hash algo of the moment. Change this whenever the state of
# the art changes; it won't hurt backward compatibility.
FAVORITE_HASH = 'sha256'


# Names of hashlib algorithms allowed by the --hash option and ``pip hash``
# Currently, those are the ones at least as collision-resistant as sha256.
STRONG_HASHES = ['sha256', 'sha384', 'sha512']


class Hashes(object):
    """A wrapper that builds multiple hashes at once and checks them against
    known-good values

    """
    def __init__(self, hashes=None):
        # type: (Dict[str, List[str]]) -> None
        """
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        """
        self._allowed = {} if hashes is None else hashes

    @property
    def digest_count(self):
        # type: () -> int
        return sum(len(digests) for digests in self._allowed.values())

    def is_hash_allowed(
        self,
        hash_name,   # type: str
        hex_digest,  # type: str
    ):
        """Return whether the given hex digest is allowed."""
        return hex_digest in self._allowed.get(hash_name, [])

    def check_against_chunks(self, chunks):
        # type: (Iterator[bytes]) -> None
        """Check good hashes against ones built from iterable of chunks of
        data.

        Raise HashMismatch if none match.

        """
        gots = {}
        for hash_name in iterkeys(self._allowed):
            try:
                gots[hash_name] = hashlib.new(hash_name)
            except (ValueError, TypeError):
                raise InstallationError('Unknown hash name: %s' % hash_name)

        for chunk in chunks:
            for hash in itervalues(gots):
                hash.update(chunk)

        for hash_name, got in iteritems(gots):
            if got.hexdigest() in self._allowed[hash_name]:
                return
        self._raise(gots)

    def _raise(self, gots):
        # type: (Dict[str, _Hash]) -> NoReturn
        raise HashMismatch(self._allowed, gots)

    def check_against_file(self, file):
        # type: (BinaryIO) -> None
        """Check good hashes against a file-like object

        Raise HashMismatch if none match.

        """
        return self.check_against_chunks(read_chunks(file))

    def check_against_path(self, path):
        # type: (str) -> None
        with open(path, 'rb') as file:
            return self.check_against_file(file)

    def __nonzero__(self):
        # type: () -> bool
        """Return whether I know any known-good hashes."""
        return bool(self._allowed)

    def __bool__(self):
        # type: () -> bool
        return self.__nonzero__()


class MissingHashes(Hashes):
    """A workalike for Hashes used when we're missing a hash for a requirement

    It computes the actual hash of the requirement and raises a HashMissing
    exception showing it to the user.

    """
    def __init__(self):
        # type: () -> None
        """Don't offer the ``hashes`` kwarg."""
        # Pass our favorite hash in to generate a "gotten hash". With the
        # empty list, it will never match, so an error will always raise.
        super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []})

    def _raise(self, gots):
        # type: (Dict[str, _Hash]) -> NoReturn
        raise HashMissing(gots[FAVORITE_HASH].hexdigest())

SILENT KILLER Tool