@@ -271,7 +271,10 @@ public function downloadPythonBinary(
271271 }
272272 $ file_name = $ filename . '.gz ' ;
273273 $ save_file_loc = $ dir . $ file_name ;
274- if (!file_exists ($ dir . $ filename ) || $ update ) {
274+ $ shouldDownloadBinary = $ this ->compareBinaryHash (
275+ $ url , $ dir . $ filename , $ binariesFolder , $ filename
276+ );
277+ if (!file_exists ($ dir . $ filename ) || ($ update && $ shouldDownloadBinary )) {
275278 $ cURL = curl_init ($ url );
276279 $ fp = fopen ($ save_file_loc , 'wb ' );
277280 if ($ fp ) {
@@ -305,6 +308,88 @@ public function downloadPythonBinary(
305308 }
306309 }
307310
311+ /**
312+ * @param string $binaryPath
313+ * @param array $binariesFolder,
314+ * @param string $filanem
315+ *
316+ * @return bool
317+ */
318+ public function compareBinaryHash (
319+ string $ url ,
320+ string $ binaryPath ,
321+ array $ binariesFolder ,
322+ string $ filename
323+ ) {
324+ if (file_exists ($ binaryPath )) {
325+ // get current binary hash (from .sha256 file or directly from existing binary)
326+ if (file_exists ($ binaryPath . '.sha256 ' )) {
327+ $ currentBinaryHash = file_get_contents (
328+ $ binaryPath . '.sha256 ' , false , null , 0 , 64
329+ );
330+ } else {
331+ $ binaryData = file_get_contents ($ binaryPath );
332+ $ currentBinaryHash = hash ('sha256 ' , $ binaryData );
333+ }
334+ // download new binary sha256 hash from attached file to release
335+ copy ($ binaryPath . '.sha256 ' , $ binaryPath . '.sha256.old ' );
336+ $ newBinaryHash = $ this ->downloadBinaryHash (
337+ str_replace ('.gz ' , '.sha256 ' , $ url ), $ binariesFolder , $ filename
338+ );
339+ // should update binary if hashes not equial
340+ if ($ newBinaryHash ['success ' ]) {
341+ return $ currentBinaryHash != $ newBinaryHash ['binaryHash ' ];
342+ } else {
343+ // revert back old hash file
344+ copy ($ binaryPath . '.sha256.old ' , $ binaryPath . '.sha256 ' );
345+ unlink ($ binaryPath . '.sha256.old ' );
346+ }
347+ }
348+ return false ;
349+ }
350+
351+ /**
352+ * Perform cURL download binary's sha256 sum file
353+ *
354+ * @param string $url url to the binary hashsum file
355+ * @param array $binariesFolder appdata binaries folder
356+ * @param string $filename downloaded checksum filename
357+ *
358+ * @return array
359+ */
360+ public function downloadBinaryHash (
361+ string $ url ,
362+ array $ binariesFolder ,
363+ string $ filename
364+ ): array {
365+ if (isset ($ binariesFolder ['success ' ]) && $ binariesFolder ['success ' ]) {
366+ $ dir = $ binariesFolder ['path ' ] . '/ ' ;
367+ } else {
368+ return $ binariesFolder ; // Return getAppDataFolder result
369+ }
370+ $ file_name = $ filename . '.sha256 ' ;
371+ $ save_file_loc = $ dir . $ file_name ;
372+ $ cURL = curl_init ($ url );
373+ $ fp = fopen ($ save_file_loc , 'w ' );
374+ if ($ fp ) {
375+ curl_setopt_array ($ cURL , [
376+ CURLOPT_RETURNTRANSFER => true ,
377+ CURLOPT_FILE => $ fp ,
378+ CURLOPT_FOLLOWLOCATION => true ,
379+ CURLOPT_RANGE => 64 ,
380+ ]);
381+ $ binaryHash = curl_exec ($ cURL );
382+ curl_close ($ cURL );
383+ fclose ($ fp );
384+ return [
385+ 'success ' => true ,
386+ 'binaryHash ' => $ binaryHash ,
387+ 'binaryHashFilePath ' => $ save_file_loc ,
388+ ];
389+ }
390+ return ['success ' => false ];
391+ }
392+
308393 /**
309394 * Ungzip target file
310395 *
0 commit comments