Skip to content

Commit 4406b1d

Browse files
authored
Added binary sha256 hash check. Added admin screenshots (#36)
* Added admin settings screenshots * Added binary sha256 hash check * php-cs fix
1 parent 5094ab1 commit 4406b1d

File tree

3 files changed

+86
-1
lines changed

3 files changed

+86
-1
lines changed

lib/Service/UtilsService.php

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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
*
165 KB
Loading
146 KB
Loading

0 commit comments

Comments
 (0)