diff options
Diffstat (limited to 'setuptools/package_index.py')
-rwxr-xr-x | setuptools/package_index.py | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/setuptools/package_index.py b/setuptools/package_index.py index 61a66c6d..e29a142c 100755 --- a/setuptools/package_index.py +++ b/setuptools/package_index.py @@ -11,11 +11,8 @@ from setuptools.compat import (urllib2, httplib, StringIO, HTTPError, url2pathname, name2codepoint, unichr, urljoin) from setuptools.compat import filterfalse -try: - from hashlib import md5 -except ImportError: - from md5 import md5 from fnmatch import translate +from setuptools.py24compat import hashlib from setuptools.py24compat import wraps from setuptools.py27compat import get_all_headers @@ -28,6 +25,7 @@ PYPI_MD5 = re.compile( ) URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):',re.I).match EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() +_HASH_RE = re.compile(r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)') __all__ = [ 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', @@ -387,15 +385,19 @@ class PackageIndex(Environment): - def check_md5(self, cs, info, filename, tfp): - if re.match('md5=[0-9a-f]{32}$', info): - self.debug("Validating md5 checksum for %s", filename) - if cs.hexdigest() != info[4:]: + def check_hash(self, cs, info, filename, tfp): + match = _HASH_RE.search(info) + if match: + hash_name = match.group(1) + hash_data = match.group(2) + self.debug("Validating %s checksum for %s", hash_name, filename) + if cs.hexdigest() != hash_data: tfp.close() os.unlink(filename) raise DistutilsError( - "MD5 validation failed for "+os.path.basename(filename)+ - "; possible download problem?" + "%s validation failed for %s; " + "possible download problem?" % ( + hash_name, os.path.basename(filename)) ) def add_find_links(self, urls): @@ -598,16 +600,19 @@ class PackageIndex(Environment): def _download_to(self, url, filename): self.info("Downloading %s", url) # Download the file - fp, tfp, info = None, None, None + fp, tfp, cs, info = None, None, None, None try: if '#' in url: url, info = url.split('#', 1) + hmatch = _HASH_RE.search(info) + hash_name = hmatch.group(1) + hash_data = hmatch.group(2) + cs = hashlib.new(hash_name) fp = self.open_url(url) if isinstance(fp, HTTPError): raise DistutilsError( "Can't download %s: %s %s" % (url, fp.code,fp.msg) ) - cs = md5() headers = fp.info() blocknum = 0 bs = self.dl_blocksize @@ -621,13 +626,14 @@ class PackageIndex(Environment): while True: block = fp.read(bs) if block: - cs.update(block) + if cs is not None: + cs.update(block) tfp.write(block) blocknum += 1 self.reporthook(url, filename, blocknum, bs, size) else: break - if info: self.check_md5(cs, info, filename, tfp) + if info: self.check_hash(cs, info, filename, tfp) return headers finally: if fp: fp.close() |