Nathanwoodburn.github.io/libraries/Updater.php

235 lines
8.9 KiB
PHP
Raw Normal View History

2021-08-30 15:06:36 +10:00
<?php
ini_set('max_execution_time', 60);
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);
if (!class_exists('Astra_updater')) {
class Astra_updater
{
protected $paths = array();
protected $errors = array();
protected $server_version;
protected $update_file_name;
protected $updated = FALSE;
public function __construct($server_version = "")
{
$this->server_version = $server_version;
$this->paths['local_path'] = dirname(dirname(__FILE__)) . '/updates/';
echo_debug("Local path: " . $this->paths['local_path']);
}
public function is_update()
{
if (1 == 1 || version_compare($this->server_version, CZ_ASTRA_CLIENT_VERSION) > 0) {
$this->update_file_name = 'astra-' . trim($this->server_version) . '.zip';
echo_debug("Needs to be updated: " . $this->update_file_name);
return TRUE;
} else {
echo_debug("Update not required as:");
echo_debug(array("Server Version" => $this->server_version, "Client Version" => CZ_ASTRA_CLIENT_VERSION));
$this->add_error('update_not_required', 'Update not required. Latest version as per server is ' . $this->server_version . ' and client version is ' . CZ_ASTRA_CLIENT_VERSION);
return FALSE;
}
}
public function get_errors()
{
return $this->errors;
}
public function add_error($error_code, $error_message)
{
$this->errors[$error_code] = $error_message;
return true;
}
protected function is_valid_zip()
{
$zip = new ZipArchive;
$res = $zip->open($this->paths['local_path'] . $this->update_file_name, ZipArchive::CHECKCONS);
if ($res !== TRUE) {
switch ($res) {
case ZipArchive::ER_NOZIP :
echo_debug("Not a ZIP");
$this->add_error('zip_nozip', "The update zip is invalid");
$ret = FALSE;
/* Not a zip archive */
case ZipArchive::ER_INCONS :
echo_debug("Consistency check failed");
$this->add_error('zip_incons', "Failed to download update zip");
$ret = FALSE;
/* die('consistency check failed'); */
case ZipArchive::ER_CRC :
echo_debug("Error with CRC");
$this->add_error('zip_crc', "Update zip CRC failed");
$ret = FALSE;
default :
echo_debug("Checksum Failed");
$this->add_error('zip_checksum', "Update zip checksum failed");
$ret = FALSE;
}
if ($ret) {
$zip->close();
}
return $ret;
} else {
echo_debug("Update file is a valid ZIP");
return TRUE;
}
}
public function download_file()
{
$download_filename = $this->paths['local_path'] . $this->update_file_name;
if (file_exists($download_filename) && filesize($download_filename) < 5) {
unlink($download_filename);
}
if (!is_file($download_filename)) {
/* Download the File */
require_once(ASTRAPATH . 'libraries/Crypto.php');
$dataArray['client_key'] = CZ_CLIENT_KEY;
$dataArray['api'] = "download_package";
$str = serialize($dataArray);
$crypto = new Astra_crypto();
$encrypted_data = $crypto->encrypt($str, CZ_SECRET_KEY);
if (!is_dir($this->paths['local_path'])) {
echo_debug("Making updates directory");
mkdir($this->paths['local_path']);
}
if (is_writable(dirname($this->paths['local_path'] . $this->update_file_name))) {
$dlHandler = fopen($this->paths['local_path'] . $this->update_file_name, 'w');
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, "encRequest=" . $encrypted_data . "&access_code=" . CZ_ACCESS_KEY);
curl_setopt($ch, CURLOPT_URL, CZ_API_URL);
curl_setopt($ch, CURLOPT_FILE, $dlHandler);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-type: application/x-www-form-urlencoded',
));
$result = curl_exec($ch);
curl_close($ch);
fclose($dlHandler);
if ($this->is_valid_zip()) {
return TRUE;
} else {
/*
unlink($this->paths['local_path'] . $this->update_file_name);
echo_debug("Deleted ZIP file since it was not a valid.");
*
*/
return FALSE;
}
} else {
$this->add_error('update_folder_not_writable', 'Please ensure the following path is writable: ' . dirname($this->paths['local_path'] . $this->update_file_name));
return false;
}
} else {
echo_debug("Unable to write the file since the file probably exists");
return TRUE;
}
}
protected function migration()
{
if (file_exists(ASTRAPATH . 'upgrade.php')) {
echo_debug("Upgrade file exists and will be executed");
$output = shell_exec('php ' . ASTRAPATH . 'upgrade.php');
echo_debug($output);
unlink(ASTRAPATH . 'upgrade.php');
echo_debug("Upgrade file deleted");
return TRUE;
}
if (!strpos(__FILE__, 'xampp')) {
} else {
echo_debug("We are in local");
$fp = dirname(dirname(dirname(__FILE__))) . '/astra/' . 'upgrade.php';
echo_debug($fp);
if (file_exists($fp)) {
echo_debug("Upgrade file exists and will be executed");
$output = shell_exec('php ' . $fp);
echo_debug($output);
unlink($fp);
echo_debug("Upgrade file deleted");
return TRUE;
}
}
echo_debug('Upgrade file does not exist');
return TRUE;
}
public function update($platform = 'php')
{
$zip = new ZipArchive;
if ($zip->open($this->paths['local_path'] . $this->update_file_name) === TRUE) {
if ($platform == 'php') {
$extract_to = dirname(ASTRAPATH);
} else {
$extract_to = dirname(dirname(ASTRAPATH));
}
echo_debug("Will extract Update to: " . $extract_to);
$extracted = $zip->extractTo($extract_to);
$zip->close();
$this->migration();
if ($extracted) {
echo_debug("ZIP successfully extracted");
return TRUE;
} else {
$this->add_error('zip_extract_error', 'Failed to extract the update file');
echo_debug("ZIP extraction not successful");
return FALSE;
}
}
$this->add_error('zip_open_error', 'Failed to open the update file');
echo_debug("Unable to open Update ZIP File");
return FALSE;
}
public function delete()
{
if (file_exists($this->paths['local_path'] . $this->update_file_name)) {
if (unlink($this->paths['local_path'] . $this->update_file_name)) {
echo_debug("Just deleted: " . $this->paths['local_path'] . $this->update_file_name);
return TRUE;
} else {
echo_debug("File Exists but unable to delete: " . $this->paths['local_path'] . $this->update_file_name);
return FALSE;
}
} else {
$this->add_error('zip_delete_error', 'Failed to delete update file: ' . $this->paths['local_path'] . $this->update_file_name);
echo_debug("Unable to delete: " . $this->paths['local_path'] . $this->update_file_name);
}
}
}
}