Skip to content

Commit 7c3b9d1

Browse files
authored
Merge pull request #1593 from namark/hash-checks-in-python-build-scripts
Added hash checks for downloaded items in python build scripts.
2 parents 5dbf534 + 056dfb9 commit 7c3b9d1

File tree

4 files changed

+23
-10
lines changed

4 files changed

+23
-10
lines changed

hifi_qt.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,10 @@ def __init__(self, args):
134134

135135
if 'Windows' == system:
136136
self.qtUrl = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_WIN_URLS').split(";")
137+
self.qtSha512 = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_WIN_SHA512')
137138
elif 'Darwin' == system:
138139
self.qtUrl = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_MAC_URLS').split(";")
140+
self.qtSha512 = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_MAC_SHA512')
139141
elif 'Linux' == system:
140142
import distro
141143
cpu_architecture = platform.machine()
@@ -149,6 +151,7 @@ def __init__(self, args):
149151
if distro.id() == 'ubuntu' or distro.id() == 'linuxmint':
150152
if (distro.id() == 'ubuntu' and u_major == 18) or distro.id() == 'linuxmint' and u_major == 19:
151153
self.qtUrl = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_LINUX_URLS').split(";")
154+
self.qtSha512 = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_LINUX_SHA512')
152155
elif (distro.id() == 'ubuntu' and u_major > 18) or (distro.id() == 'linuxmint' and u_major > 19):
153156
self.__no_qt_package_error()
154157
else:
@@ -166,6 +169,7 @@ def __init__(self, args):
166169

167170
if u_major == 18:
168171
self.qtUrl = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_UBUNTU_AARCH64_URLS').split(";")
172+
self.qtSha512 = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_UBUNTU_AARCH64_SHA512')
169173
elif u_major > 19:
170174
self.__no_qt_package_error()
171175
else:
@@ -179,6 +183,7 @@ def __init__(self, args):
179183

180184
if u_major == 10:
181185
self.qtUrl = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_DEBIAN_AARCH64_URLS').split(";")
186+
self.qtSha512 = hifi_utils.readEnviromentVariableFromFile(self.args.build_root, 'EXTERNAL_QT_DEBIAN_AARCH64_SHA512')
182187
elif u_major > 10:
183188
self.__no_qt_package_error()
184189
else:
@@ -213,7 +218,7 @@ def writeConfig(self):
213218
def installQt(self):
214219
if not os.path.isdir(self.fullPath):
215220
print("Fetching Qt from {} to {}".format(self.qtUrl, self.path))
216-
hifi_utils.downloadAndExtract(self.qtUrl, self.path)
221+
hifi_utils.downloadAndExtract(self.qtUrl, self.path, self.qtSha512)
217222
else:
218223
print ('Qt has already been downloaded')
219224

hifi_utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ def executeSubprocess(processArgs, folder=None, env=None):
8080
os.chdir(restoreDir)
8181

8282

83-
def hashFile(file, hasher = hashlib.sha512()):
83+
def hashFile(file, hasherType = hashlib.sha512):
84+
hasher = hasherType()
8485
with open(file, "rb") as f:
8586
for chunk in iter(lambda: f.read(4096), b""):
8687
hasher.update(chunk)
@@ -99,7 +100,7 @@ def hashFolder(folder):
99100
filenames = recursiveFileList(folder)
100101
return hashFiles(filenames)
101102

102-
def downloadFile(urls, hash=None, hasher=hashlib.sha512(), retries=3):
103+
def downloadFile(urls, hash=None, hasher=hashlib.sha512, retries=3):
103104
for url in urls:
104105
for i in range(retries):
105106
tempFileName = None
@@ -125,14 +126,15 @@ def downloadFile(urls, hash=None, hasher=hashlib.sha512(), retries=3):
125126
# Verify the hash
126127
if hash is not None and hash != downloadHash:
127128
print("Try {}: Downloaded file {} hash {} does not match expected hash {} for url {}".format(i + 1, tempFileName, downloadHash, hash, url))
129+
print("File stats: ", os.stat(tempFileName))
128130
os.remove(tempFileName)
129131
continue
130132
return tempFileName
131133

132134
raise RuntimeError("Failed to download file from any of {}".format(urls))
133135

134136

135-
def downloadAndExtract(urls, destPath, hash=None, hasher=hashlib.sha512()):
137+
def downloadAndExtract(urls, destPath, hash=None, hasher=hashlib.sha512):
136138
tempFileName = downloadFile(urls, hash, hasher)
137139
try:
138140
with zipfile.ZipFile(tempFileName) as zip:

hifi_vcpkg.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,27 +94,33 @@ def __init__(self, args):
9494
self.exe = os.path.join(self.path, 'vcpkg.exe')
9595
self.bootstrapCmds = [ os.path.join(self.path, 'bootstrap-vcpkg.bat'), '-disableMetrics' ]
9696
self.vcpkgUrl = self.readVar('EXTERNAL_VCPKG_WIN_CLIENT_URLS').split(';')
97+
self.vcpkgSha512 = self.readVar('EXTERNAL_VCPKG_WIN_CLIENT_SHA512')
9798
self.hostTriplet = 'x64-windows'
9899
if usePrebuilt:
99100
self.prebuiltArchive = self.readVar('EXTERNAL_VCPKG_WIN_URLS').split(';')
101+
self.prebuiltArchiveSha512 = self.readVar('EXTERNAL_VCPKG_WIN_SHA512')
100102
elif 'Darwin' == system:
101103
self.exe = os.path.join(self.path, 'vcpkg')
102104
self.bootstrapCmds = [ os.path.join(self.path, 'bootstrap-vcpkg.sh'), '--allowAppleClang', '-disableMetrics' ]
103105
self.vcpkgUrl = self.readVar('EXTERNAL_VCPKG_MAC_CLIENT_URLS').split(';')
106+
self.vcpkgSha512 = self.readVar('EXTERNAL_VCPKG_MAC_CLIENT_SHA512')
104107
self.hostTriplet = 'x64-osx'
105108
# Potential fix for a vcpkg build issue on OSX (see https://github.com/microsoft/vcpkg/issues/9029)
106109
self.bootstrapEnv['CXXFLAGS'] = '-D_CTERMID_H_'
107110
if usePrebuilt:
108111
self.prebuiltArchive = self.readVar('EXTERNAL_VCPKG_MAC_URLS').split(';')
112+
self.prebuiltArchiveSha512 = self.readVar('EXTERNAL_VCPKG_MAC_SHA512')
109113
elif 'Linux' == system and 'aarch64' == machine:
110114
self.exe = os.path.join(self.path, 'vcpkg')
111115
self.bootstrapCmds = [ os.path.join(self.path, 'bootstrap-vcpkg.sh'), '-disableMetrics' ]
112116
self.vcpkgUrl = self.readVar('EXTERNAL_VCPKG_LINUX_AARCH64_URLS').split(';')
117+
self.vcpkgSha512 = self.readVar('EXTERNAL_VCPKG_LINUX_AARCH64_SHA512')
113118
self.hostTriplet = 'arm64-linux'
114119
else:
115120
self.exe = os.path.join(self.path, 'vcpkg')
116121
self.bootstrapCmds = [ os.path.join(self.path, 'bootstrap-vcpkg.sh'), '-disableMetrics' ]
117122
self.vcpkgUrl = self.readVar('EXTERNAL_VCPKG_LINUX_CLIENT_URLS').split(';')
123+
self.vcpkgSha512 = self.readVar('EXTERNAL_VCPKG_LINUX_CLIENT_SHA512')
118124
self.hostTriplet = 'x64-linux'
119125

120126
if self.args.android:
@@ -202,7 +208,7 @@ def bootstrap(self):
202208
hifi_utils.executeSubprocess(self.bootstrapCmds, folder=self.path, env=self.bootstrapEnv)
203209
else:
204210
print("Fetching vcpkg from {} to {}".format(self.vcpkgUrl, self.path))
205-
hifi_utils.downloadAndExtract(self.vcpkgUrl, self.path)
211+
hifi_utils.downloadAndExtract(self.vcpkgUrl, self.path, self.vcpkgSha512)
206212

207213
print("Replacing port files")
208214
portsPath = os.path.join(self.path, 'ports')
@@ -237,7 +243,7 @@ def setupDependencies(self, qt=None):
237243
if self.prebuiltArchive:
238244
if not os.path.isfile(self.prebuildTagFile):
239245
print('Extracting ' + self.prebuiltArchive + ' to ' + self.path)
240-
hifi_utils.downloadAndExtract(self.prebuiltArchive, self.path)
246+
hifi_utils.downloadAndExtract(self.prebuiltArchive, self.path, self.prebuiltArchiveSha512)
241247
self.writePrebuildTag()
242248
return
243249

@@ -283,9 +289,8 @@ def setupAndroidDependencies(self):
283289
dest = os.path.join(self.path, 'installed')
284290
url = self.readVar('EXTERNAL_VCPKG_ANDROID_URLS').split(';')
285291
# FIXME I don't know why the hash check frequently fails here. If you examine the file later it has the right hash
286-
#hash = self.readVar(('EXTERNAL_VCPKG_ANDROID_SHA512')
287-
#hifi_utils.downloadAndExtract(url, dest, hash)
288-
hifi_utils.downloadAndExtract(url, dest)
292+
hash = self.readVar('EXTERNAL_VCPKG_ANDROID_SHA512')
293+
hifi_utils.downloadAndExtract(url, dest, hash)
289294

290295
print("Installing additional android archives")
291296
androidPackages = hifi_android.getPlatformPackages()

prebuild.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ def main():
100100

101101
args = parse_args()
102102
nsis_urls = hifi_utils.readEnviromentVariableFromFile(args.build_root, 'EXTERNAL_NSIS_HIFI_PLUGINS_URLS').split(';')
103+
nsis_sha512 = hifi_utils.readEnviromentVariableFromFile(args.build_root, 'EXTERNAL_NSIS_HIFI_PLUGINS_SHA512')
103104

104105
if args.ci_build:
105106
logging.basicConfig(datefmt='%H:%M:%S', format='%(asctime)s %(guid)s %(message)s', level=logging.INFO)
@@ -111,7 +112,7 @@ def main():
111112
if 'Windows' == system and 'CI_BUILD' in os.environ and os.environ["CI_BUILD"] == "Github":
112113
logger.info("Downloading NSIS")
113114
with timer('NSIS'):
114-
hifi_utils.downloadAndExtract(nsis_urls, "C:/Program Files (x86)")
115+
hifi_utils.downloadAndExtract(nsis_urls, "C:/Program Files (x86)", nsis_sha512)
115116

116117
qtInstallPath = None
117118
# If not android, install our Qt build

0 commit comments

Comments
 (0)