Skip to content

Commit

Permalink
build: allow icu download to use other hashes besides md5
Browse files Browse the repository at this point in the history
- ICU uses sha512 instead of md5 in some recent releases
- Use hashlib.algorithms_guaranteed to choose the following algorithms:
    sha1 sha224 sha384 sha256 sha512 md5
- No preference as to the priority of the algorithms
- This commit does not change the hash used for ICU.

Fixes: #27369
Reviewed-By: Refael Ackermann <[email protected]>
Reviewed-by: Ujjwal Sharma <[email protected]>
Reviewed-by: Richard Lau <[email protected]>
PR-URL: #27370
  • Loading branch information
srl295 authored and targos committed Apr 27, 2019
1 parent 071300b commit e7026f1
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 10 deletions.
20 changes: 13 additions & 7 deletions configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -1261,7 +1261,8 @@ def glob_to_var(dir_base, dir_sub, patch_dir):

def configure_intl(o):
def icu_download(path):
with open('tools/icu/current_ver.dep') as f:
depFile = 'tools/icu/current_ver.dep';
with open(depFile) as f:
icus = json.load(f)
# download ICU, if needed
if not os.access(options.download_path, os.W_OK):
Expand All @@ -1270,7 +1271,12 @@ def icu_download(path):
attemptdownload = nodedownload.candownload(auto_downloads, "icu")
for icu in icus:
url = icu['url']
md5 = icu['md5']
(expectHash, hashAlgo, allAlgos) = nodedownload.findHash(icu)
if not expectHash:
error('''Could not find a hash to verify ICU download.
%s may be incorrect.
For the entry %s,
Expected one of these keys: %s''' % (depFile, url, ' '.join(allAlgos)))
local = url.split('/')[-1]
targetfile = os.path.join(options.download_path, local)
if not os.path.isfile(targetfile):
Expand All @@ -1279,13 +1285,13 @@ def icu_download(path):
else:
print('Re-using existing %s' % targetfile)
if os.path.isfile(targetfile):
print('Checking file integrity with MD5:\r')
gotmd5 = nodedownload.md5sum(targetfile)
print('MD5: %s %s' % (gotmd5, targetfile))
if (md5 == gotmd5):
print('Checking file integrity with %s:\r' % hashAlgo)
gotHash = nodedownload.checkHash(targetfile, hashAlgo)
print('%s: %s %s' % (hashAlgo, gotHash, targetfile))
if (expectHash == gotHash):
return targetfile
else:
warn('Expected: %s *MISMATCH*' % md5)
warn('Expected: %s *MISMATCH*' % expectHash)
warn('\n ** Corrupted ZIP? Delete %s to retry download.\n' % targetfile)
return None
icu_config = {
Expand Down
16 changes: 13 additions & 3 deletions tools/configure.d/nodedownload.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,19 @@ def retrievefile(url, targetfile):
print(' ** Error occurred while downloading\n <%s>' % url)
raise

def md5sum(targetfile):
"""md5sum a file. Return the hex digest."""
digest = hashlib.md5()
def findHash(dict):
"""Find an available hash type."""
# choose from one of these
availAlgos = hashlib.algorithms_guaranteed
for hashAlgo in availAlgos:
if hashAlgo in dict:
return (dict[hashAlgo], hashAlgo, availAlgos)
# error
return (None, None, availAlgos)

def checkHash(targetfile, hashAlgo):
"""Check a file using hashAlgo. Return the hex digest."""
digest = hashlib.new(hashAlgo)
with open(targetfile, 'rb') as f:
chunk = f.read(1024)
while chunk != "":
Expand Down

0 comments on commit e7026f1

Please sign in to comment.