/usr/lib/python2.7/site-packages/pip/utils
NameSizeModeActions
appdirs.py88110644editdlrm
appdirs.pyc86070644editdlrm
appdirs.pyo86070644editdlrm
build.py13120644editdlrm
build.pyc17190644editdlrm
build.pyo17190644editdlrm
deprecation.py22320644editdlrm
deprecation.pyc23170644editdlrm
deprecation.pyo23170644editdlrm
encoding.py9710644editdlrm
encoding.pyc12820644editdlrm
encoding.pyo12820644editdlrm
filesystem.py8990644editdlrm
filesystem.pyc7800644editdlrm
filesystem.pyo7800644editdlrm
glibc.py29390644editdlrm
glibc.pyc18260644editdlrm
glibc.pyo18260644editdlrm
hashes.py28660644editdlrm
hashes.pyc39610644editdlrm
hashes.pyo39610644editdlrm
logging.py33270644editdlrm
logging.pyc48420644editdlrm
logging.pyo48420644editdlrm
outdated.py59890644editdlrm
outdated.pyc56800644editdlrm
outdated.pyo56800644editdlrm
packaging.py20800644editdlrm
packaging.pyc24610644editdlrm
packaging.pyo24610644editdlrm
setuptools_build.py2780644editdlrm
setuptools_build.pyc3470644editdlrm
setuptools_build.pyo3470644editdlrm
ui.py115970644editdlrm
ui.pyc116830644editdlrm
ui.pyo116130644editdlrm
__init__.py271870644editdlrm
__init__.pyc277250644editdlrm
__init__.pyo276660644editdlrm
Edit: /usr/lib/python2.7/site-packages/pip/utils/hashes.py (2866B)
from __future__ import absolute_import import hashlib from pip.exceptions import HashMismatch, HashMissing, InstallationError from pip.utils import read_chunks from pip._vendor.six import iteritems, iterkeys, itervalues # 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): """ :param hashes: A dict of algorithm names pointing to lists of allowed hex digests """ self._allowed = {} if hashes is None else hashes def check_against_chunks(self, chunks): """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): raise HashMismatch(self._allowed, gots) def check_against_file(self, file): """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): with open(path, 'rb') as file: return self.check_against_file(file) def __nonzero__(self): """Return whether I know any known-good hashes.""" return bool(self._allowed) def __bool__(self): 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): """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): raise HashMissing(gots[FAVORITE_HASH].hexdigest())