Skip to content

Commit

Permalink
build: add hashes to the external binary downloader
Browse files Browse the repository at this point in the history
  • Loading branch information
MarshallOfSound committed Nov 29, 2019
1 parent 2129751 commit a00558c
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 13 deletions.
24 changes: 16 additions & 8 deletions script/external-binaries.json
Expand Up @@ -4,37 +4,45 @@
"binaries": [
{
"url": "Mantle.zip",
"platform": "darwin"
"platform": "darwin",
"sha": "f9865e115c03871b45d3a2d8734220cb147a02dace46c92f766ca5d3059281dd"
},
{
"url": "ReactiveCocoa.zip",
"platform": "darwin"
"platform": "darwin",
"sha": "8ae85cd226fa4076472bfdfcda4745b5c7edf31fbe695868068eeaf62e7fa962"
},
{
"url": "Squirrel.zip",
"platform": "darwin"
"platform": "darwin",
"sha": "e516fd5c24c0ad267fd854848b04be0552be977aa846fa7f3c65ef4618699511"
},
{
"url": "directxsdk-ia32.zip",
"platform": "win32",
"targetArch": "ia32"
"targetArch": "ia32",
"sha": "f777bd5ab524bf39c3bfc68ac2b3f95ff2136c92328cf63e857f399e849db037"
},
{
"url": "directxsdk-x64.zip",
"platform": "win32",
"targetArch": "x64"
"targetArch": "x64",
"sha": "46c1f8afb9180516013c39e8d73182a7f15f0ea89c61dc94f92605b4734d447b"
},
{
"url": "sccache-darwin-x64.zip",
"platform": "darwin"
"platform": "darwin",
"sha": "3bfe114b49a15e4f15e2e3a9ee6699f1acdb89446badbaa4144869c72a7690ca"
},
{
"url": "sccache-linux-x64.zip",
"platform": "linux"
"platform": "linux",
"sha": "dd379b494122f9e85bdae3597b02c67b0a46192f20f4f16cae3f1258a57b39dd"
},
{
"url": "sccache-win32-x64.zip",
"platform": "win32"
"platform": "win32",
"sha": "b6a20fd1c2026f3792e7286bc768a7ebc261847b76449b49f55455e1f841fecd"
}
]
}
27 changes: 22 additions & 5 deletions script/update-external-binaries.py
Expand Up @@ -2,6 +2,7 @@

import argparse
import errno
import hashlib
import json
import os

Expand All @@ -17,6 +18,7 @@ def parse_args():

parser.add_argument('--base-url', required=False,
help="Base URL for all downloads")
parser.add_argument('--force', action='store_true', default=False, required=False)

return parser.parse_args()

Expand All @@ -37,7 +39,7 @@ def main():
output_dir = os.path.join(SOURCE_ROOT, 'external_binaries')
version_file = os.path.join(output_dir, '.version')

if (is_updated(version_file, version)):
if (is_updated(version_file, version) and not args.force):
return

rm_rf(output_dir)
Expand All @@ -47,7 +49,7 @@ def main():
if not binary_should_be_downloaded(binary):
continue

temp_path = download_binary(base_url, version, binary['url'])
temp_path = download_binary(base_url, version, binary['url'], binary['sha'])

# We assume that all binaries are in zip archives.
extract_zip(temp_path, output_dir)
Expand Down Expand Up @@ -82,16 +84,31 @@ def binary_should_be_downloaded(binary):
return True


def download_binary(base_url, version, binary_url):
def sha256(file_path):
hash_256 = hashlib.sha256()
with open(file_path, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_256.update(chunk)
return hash_256.hexdigest()


def download_binary(base_url, version, binary_url, sha):
full_url = '{0}/{1}/{2}'.format(base_url, version, binary_url)
temp_path = download_to_temp_dir(full_url, filename=binary_url)
temp_path = download_to_temp_dir(full_url, filename=binary_url, sha=sha)
return temp_path


def download_to_temp_dir(url, filename):
def validate_sha(file_path, sha):
downloaded_sha = sha256(file_path)
if downloaded_sha != sha:
raise Exception("SHA for external binary file {} does not match expected '{}' != '{}'".format(file_path, downloaded_sha, sha))


def download_to_temp_dir(url, filename, sha):
download_dir = tempdir(prefix='electron-')
file_path = os.path.join(download_dir, filename)
download(text='Download ' + filename, url=url, path=file_path)
validate_sha(file_path, sha)
return file_path


Expand Down

0 comments on commit a00558c

Please sign in to comment.