2016-06-27 13:28:10 +00:00
|
|
|
<?php
|
2020-07-24 08:18:18 +00:00
|
|
|
// Update extension, https://github.com/datenstrom/yellow-extensions/tree/master/source/update
|
2016-06-27 13:28:10 +00:00
|
|
|
|
2018-08-10 22:23:50 +00:00
|
|
|
class YellowUpdate {
|
2020-11-04 15:07:51 +00:00
|
|
|
const VERSION = "0.8.42";
|
2018-10-09 12:49:48 +00:00
|
|
|
const PRIORITY = "2";
|
2020-07-24 08:18:18 +00:00
|
|
|
public $yellow; // access to API
|
|
|
|
public $updates; // number of updates
|
2018-08-10 22:23:50 +00:00
|
|
|
|
|
|
|
// Handle initialisation
|
|
|
|
public function onLoad($yellow) {
|
|
|
|
$this->yellow = $yellow;
|
2019-02-23 14:04:34 +00:00
|
|
|
$this->yellow->system->setDefault("updateExtensionUrl", "https://github.com/datenstrom/yellow-extensions");
|
2019-02-25 20:50:19 +00:00
|
|
|
$this->yellow->system->setDefault("updateExtensionFile", "extension.ini");
|
2020-08-08 15:40:16 +00:00
|
|
|
$this->yellow->system->setDefault("updateCurrentFile", "update-current.ini");
|
|
|
|
$this->yellow->system->setDefault("updateLatestFile", "update-latest.ini");
|
2020-10-27 10:51:01 +00:00
|
|
|
$this->yellow->system->setDefault("updateDailyTimestamp", "0");
|
|
|
|
$this->yellow->system->setDefault("updateWeeklyTimestamp", "0");
|
|
|
|
$this->yellow->system->setDefault("updateMonthlyTimestamp", "0");
|
2019-03-16 07:59:37 +00:00
|
|
|
$this->yellow->system->setDefault("updateNotification", "none");
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
|
|
|
|
2019-03-16 07:59:37 +00:00
|
|
|
// Handle request
|
|
|
|
public function onRequest($scheme, $address, $base, $location, $fileName) {
|
|
|
|
$statusCode = 0;
|
|
|
|
if ($this->yellow->lookup->isContentFile($fileName) && $this->isExtensionPending()) {
|
|
|
|
$statusCode = $this->processRequestPending($scheme, $address, $base, $location, $fileName);
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle command
|
2020-06-25 14:46:44 +00:00
|
|
|
public function onCommand($command, $text) {
|
2019-03-16 07:59:37 +00:00
|
|
|
$statusCode = 0;
|
|
|
|
if ($this->isExtensionPending()) $statusCode = $this->processCommandPending();
|
|
|
|
if ($statusCode==0) {
|
|
|
|
switch ($command) {
|
2020-07-07 16:29:20 +00:00
|
|
|
case "about": $statusCode = $this->processCommandAbout($command, $text); break;
|
2020-06-25 14:46:44 +00:00
|
|
|
case "install": $statusCode = $this->processCommandInstall($command, $text); break;
|
|
|
|
case "uninstall": $statusCode = $this->processCommandUninstall($command, $text); break;
|
|
|
|
case "update": $statusCode = $this->processCommandUpdate($command, $text); break;
|
2019-03-16 07:59:37 +00:00
|
|
|
default: $statusCode = 0; break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle command help
|
|
|
|
public function onCommandHelp() {
|
2020-07-07 16:29:20 +00:00
|
|
|
$help = "about\n";
|
|
|
|
$help .= "install [extension]\n";
|
2019-03-16 07:59:37 +00:00
|
|
|
$help .= "uninstall [extension]\n";
|
|
|
|
$help .= "update [extension]\n";
|
|
|
|
return $help;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle update
|
|
|
|
public function onUpdate($action) {
|
2020-10-27 10:51:01 +00:00
|
|
|
if ($action=="ready") {
|
2020-10-27 15:32:34 +00:00
|
|
|
$this->convertSystemSettings();
|
2020-10-27 10:51:01 +00:00
|
|
|
if ($this->yellow->system->get("updateNotification")!="none") {
|
|
|
|
foreach (explode(",", $this->yellow->system->get("updateNotification")) as $token) {
|
|
|
|
list($extension, $action) = $this->yellow->toolbox->getTextList($token, "/", 2);
|
|
|
|
if ($this->yellow->extension->isExisting($extension) && ($action!="ready" && $action!="uninstall")) {
|
|
|
|
$value = $this->yellow->extension->data[$extension];
|
|
|
|
if (method_exists($value["object"], "onUpdate")) $value["object"]->onUpdate($action);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$fileName = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("coreSystemFile");
|
|
|
|
if (!$this->yellow->system->save($fileName, array("updateNotification" => "none"))) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$fileName'!");
|
|
|
|
}
|
|
|
|
$this->updateSystemSettings();
|
|
|
|
$this->updateLanguageSettings();
|
|
|
|
}
|
|
|
|
if ($this->yellow->system->get("updateDailyTimestamp") <= time()) {
|
|
|
|
foreach ($this->yellow->extension->data as $key=>$value) {
|
|
|
|
if (method_exists($value["object"], "onUpdate")) $value["object"]->onUpdate("daily");
|
|
|
|
}
|
|
|
|
$this->updateTimestampSettings("updateDailyTimestamp");
|
|
|
|
}
|
|
|
|
if ($this->yellow->system->get("updateWeeklyTimestamp") <= time()) {
|
|
|
|
foreach ($this->yellow->extension->data as $key=>$value) {
|
|
|
|
if (method_exists($value["object"], "onUpdate")) $value["object"]->onUpdate("weekly");
|
|
|
|
}
|
|
|
|
$this->updateTimestampSettings("updateWeeklyTimestamp");
|
|
|
|
}
|
|
|
|
if ($this->yellow->system->get("updateMonthlyTimestamp") <= time()) {
|
|
|
|
foreach ($this->yellow->extension->data as $key=>$value) {
|
|
|
|
if (method_exists($value["object"], "onUpdate")) $value["object"]->onUpdate("monthly");
|
|
|
|
}
|
|
|
|
$this->updateTimestampSettings("updateMonthlyTimestamp");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($action=="clean") {
|
|
|
|
$statusCode = 200;
|
|
|
|
$path = $this->yellow->system->get("coreExtensionDirectory");
|
|
|
|
$regex = "/^.*\\".$this->yellow->system->get("coreDownloadExtension")."$/";
|
|
|
|
foreach ($this->yellow->toolbox->getDirectoryEntries($path, $regex, false, false) as $entry) {
|
|
|
|
if (!$this->yellow->toolbox->deleteFile($entry)) $statusCode = 500;
|
|
|
|
}
|
|
|
|
if ($statusCode==500) $this->yellow->log("error", "Can't delete files in directory '$path'!\n");
|
|
|
|
}
|
2020-10-27 15:32:34 +00:00
|
|
|
if ($action=="update") { // TODO: remove later, convert layout files
|
2020-08-16 10:20:21 +00:00
|
|
|
$path = $this->yellow->system->get("coreLayoutDirectory");
|
|
|
|
foreach ($this->yellow->toolbox->getDirectoryEntriesRecursive($path, "/^.*\.html$/", true, false) as $entry) {
|
2020-08-17 09:45:11 +00:00
|
|
|
$key = str_replace("pages", "", $this->yellow->lookup->normaliseName(basename($entry), true, true));
|
2020-08-16 10:20:21 +00:00
|
|
|
$fileData = $fileDataNew = $this->yellow->toolbox->readFile($entry);
|
2020-08-17 09:45:11 +00:00
|
|
|
$fileDataNew = str_replace("yellow->page->getPages()", "yellow->page->getPages(\"$key\")", $fileDataNew);
|
2020-10-22 11:33:29 +00:00
|
|
|
$fileDataNew = str_replace("\$page = \$this->yellow->content->shared(\"header\")", "\$page = null", $fileDataNew);
|
|
|
|
$fileDataNew = str_replace("\$page = \$this->yellow->content->shared(\"footer\")", "\$page = null", $fileDataNew);
|
|
|
|
$fileDataNew = str_replace("\$page = \$this->yellow->content->shared(\"sidebar\")", "\$page = null", $fileDataNew);
|
|
|
|
$fileDataNew = str_replace("\$this->yellow->content->shared(\"sidebar\")", "\$this->yellow->page->isPage(\"sidebar\")", $fileDataNew);
|
2020-08-16 10:20:21 +00:00
|
|
|
$fileDataNew = str_replace("php if (\$page = null)", "php /* Remove this line */ if (\$page = null)", $fileDataNew);
|
|
|
|
if ($fileData!=$fileDataNew && !$this->yellow->toolbox->createFile($entry, $fileDataNew)) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$entry'!");
|
2020-06-26 11:49:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-11-04 15:07:51 +00:00
|
|
|
if ($action=="update") { // TODO: remove later, create settings files when missing
|
|
|
|
$fileNameCurrent = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("updateCurrentFile");
|
|
|
|
$fileNameLatest = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("updateLatestFile");
|
|
|
|
if (!is_file($fileNameCurrent) || !is_file($fileNameLatest)) {
|
|
|
|
$url = $this->yellow->system->get("updateExtensionUrl")."/raw/master/".$this->yellow->system->get("updateLatestFile");
|
|
|
|
list($statusCode, $fileData) = $this->getExtensionFile($url);
|
|
|
|
if ($statusCode==200) {
|
|
|
|
$fileDataCurrent = $fileDataLatest = $fileData;
|
|
|
|
$settings = $this->yellow->toolbox->getTextSettings($fileDataCurrent, "extension");
|
|
|
|
foreach ($settings as $key=>$value) {
|
|
|
|
if ($this->yellow->extension->isExisting($key)) {
|
|
|
|
$settingsNew = new YellowArray();
|
|
|
|
$settingsNew["extension"] = ucfirst($key);
|
|
|
|
$settingsNew["version"] = $this->yellow->extension->data[$key]["version"];
|
|
|
|
$fileDataCurrent = $this->yellow->toolbox->setTextSettings($fileDataCurrent, "extension", $key, $settingsNew);
|
|
|
|
} else {
|
|
|
|
$fileDataCurrent = $this->yellow->toolbox->unsetTextSettings($fileDataCurrent, "extension", $key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(!is_file($fileNameCurrent) && !$this->yellow->toolbox->createFile($fileNameCurrent, $fileDataCurrent)) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$fileNameCurrent'!");
|
|
|
|
}
|
|
|
|
if(!is_file($fileNameLatest) && !$this->yellow->toolbox->createFile($fileNameLatest, $fileDataLatest)) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$fileNameLatest'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-07-26 14:51:07 +00:00
|
|
|
}
|
|
|
|
|
2020-10-27 15:32:34 +00:00
|
|
|
// Convert system settings
|
|
|
|
public function convertSystemSettings() {
|
|
|
|
if (is_dir("system/settings/")) { // TODO: remove later, convert settings files
|
|
|
|
$fileNameSource = "system/settings/system.ini";
|
|
|
|
$fileNameDestination = "system/extensions/yellow-system.ini";
|
|
|
|
if (is_file($fileNameSource)) {
|
|
|
|
$fileData = $fileDataNew = $this->yellow->toolbox->readFile($fileNameSource);
|
|
|
|
$fileDataNew = str_replace("user.ini", "yellow-user.ini", $fileDataNew);
|
|
|
|
$fileDataNew = str_replace("language.ini", "yellow-language.ini", $fileDataNew);
|
|
|
|
if (!$this->yellow->toolbox->createFile($fileNameDestination, $fileDataNew)) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$fileNameDestination'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$fileNameSource = "system/settings/user.ini";
|
|
|
|
$fileNameDestination = "system/extensions/yellow-user.ini";
|
|
|
|
if (is_file($fileNameSource) && !$this->yellow->toolbox->copyFile($fileNameSource, $fileNameDestination)) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$fileNameDestination'!");
|
|
|
|
}
|
|
|
|
$fileNameSource = "system/settings/language.ini";
|
|
|
|
$fileNameDestination = "system/extensions/yellow-language.ini";
|
|
|
|
if (is_file($fileNameSource) && !$this->yellow->toolbox->copyFile($fileNameSource, $fileNameDestination)) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$fileNameDestination'!");
|
|
|
|
}
|
|
|
|
if (!$this->yellow->toolbox->deleteDirectory("system/settings/", $this->yellow->system->get("coreTrashDirectory"))) {
|
|
|
|
$this->yellow->log("error", "Can't delete directory 'system/settings/'!");
|
|
|
|
} else {
|
|
|
|
$this->yellow->log("info", "Convert settings files");
|
|
|
|
}
|
2020-10-28 09:20:05 +00:00
|
|
|
$this->yellow->system->load("system/extensions/yellow-system.ini");
|
|
|
|
$this->yellow->page->error(503, "Flux capacitor is charging to 1.21 gigawatt, please reload page!");
|
2020-10-27 15:32:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-26 14:51:07 +00:00
|
|
|
// Update system settings after update notification
|
|
|
|
public function updateSystemSettings() {
|
2020-10-27 10:51:01 +00:00
|
|
|
$fileName = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("coreSystemFile");
|
2020-07-26 14:51:07 +00:00
|
|
|
$fileData = $this->yellow->toolbox->readFile($fileName);
|
|
|
|
$fileDataStart = $fileDataSettings = $fileDataComments = "";
|
2020-08-11 18:12:05 +00:00
|
|
|
$settings = new YellowArray();
|
2020-07-26 14:51:07 +00:00
|
|
|
$settings->exchangeArray($this->yellow->system->settingsDefaults->getArrayCopy());
|
|
|
|
foreach ($this->yellow->toolbox->getTextLines($fileData) as $line) {
|
|
|
|
preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
|
|
|
|
if (empty($fileDataStart) && preg_match("/^\#/", $line)) {
|
|
|
|
$fileDataStart = $line;
|
|
|
|
} elseif (!empty($matches[1]) && isset($settings[$matches[1]])) {
|
|
|
|
$settings[$matches[1]] = $matches[2];
|
|
|
|
} elseif (!empty($matches[1]) && substru($matches[1], 0, 1)!="#") {
|
|
|
|
$fileDataComments .= "# $line";
|
|
|
|
} elseif (!empty($matches[1])) {
|
|
|
|
$fileDataComments .= $line;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
unset($settings["coreSystemFile"]);
|
|
|
|
foreach ($settings as $key=>$value) {
|
|
|
|
$fileDataSettings .= ucfirst($key).(strempty($value) ? ":\n" : ": $value\n");
|
|
|
|
}
|
|
|
|
if (!empty($fileDataStart)) $fileDataStart .= "\n";
|
|
|
|
if (!empty($fileDataComments)) $fileDataSettings .= "\n";
|
|
|
|
$fileDataNew = $fileDataStart.$fileDataSettings.$fileDataComments;
|
|
|
|
if ($fileData!=$fileDataNew && !$this->yellow->toolbox->createFile($fileName, $fileDataNew)) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$fileName'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update language settings after update notification
|
|
|
|
public function updateLanguageSettings() {
|
2020-10-27 10:51:01 +00:00
|
|
|
$fileName = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("coreLanguageFile");
|
2020-07-26 14:51:07 +00:00
|
|
|
$fileData = $this->yellow->toolbox->readFile($fileName);
|
|
|
|
$fileDataStart = $fileDataSettings = $language = "";
|
2020-08-11 18:12:05 +00:00
|
|
|
$settings = new YellowArray();
|
2020-07-26 14:51:07 +00:00
|
|
|
foreach ($this->yellow->toolbox->getTextLines($fileData) as $line) {
|
|
|
|
preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
|
|
|
|
if (empty($fileDataStart) && preg_match("/^\#/", $line)) {
|
|
|
|
$fileDataStart = $line;
|
|
|
|
} elseif (!empty($matches[1]) && !empty($matches[2])) {
|
|
|
|
if (lcfirst($matches[1])=="language" && !strempty($matches[2])) {
|
|
|
|
if (!empty($settings)) {
|
|
|
|
if (!empty($fileDataSettings)) $fileDataSettings .= "\n";
|
|
|
|
foreach ($settings as $key=>$value) {
|
|
|
|
$fileDataSettings .= (strposu($key, "/") ? $key : ucfirst($key)).": $value\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$language = $matches[2];
|
2020-08-11 18:12:05 +00:00
|
|
|
$settings = new YellowArray();
|
2020-07-26 14:51:07 +00:00
|
|
|
$settings["language"] = $language;
|
|
|
|
foreach ($this->yellow->language->settingsDefaults as $key=>$value) {
|
|
|
|
if ($this->yellow->language->isText($key, $language)) {
|
|
|
|
$settings[$key] = $this->yellow->language->getText($key, $language);
|
|
|
|
}
|
|
|
|
}
|
2019-03-16 07:59:37 +00:00
|
|
|
}
|
2020-07-26 14:51:07 +00:00
|
|
|
if (!empty($language)) {
|
|
|
|
$settings[$matches[1]] = $matches[2];
|
2019-06-04 20:39:27 +00:00
|
|
|
}
|
2018-09-06 14:23:19 +00:00
|
|
|
}
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
2020-07-26 14:51:07 +00:00
|
|
|
if (!empty($fileDataStart)) $fileDataStart .= "\n";
|
|
|
|
if (!empty($fileDataSettings)) $fileDataSettings .= "\n";
|
|
|
|
foreach ($settings as $key=>$value) {
|
|
|
|
$fileDataSettings .= (strposu($key, "/") ? $key : ucfirst($key)).": $value\n";
|
|
|
|
}
|
|
|
|
$fileDataNew = $fileDataStart.$fileDataSettings;
|
|
|
|
if ($fileData!=$fileDataNew && !$this->yellow->toolbox->createFile($fileName, $fileDataNew)) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$fileName'!");
|
|
|
|
}
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
2020-10-27 10:51:01 +00:00
|
|
|
|
2020-11-04 15:07:51 +00:00
|
|
|
// Update extension settings
|
|
|
|
public function updateExtensionSettings($extension, $settings, $action) {
|
|
|
|
$statusCode = 200;
|
|
|
|
$fileName = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("updateCurrentFile");
|
|
|
|
$fileData = $this->yellow->toolbox->readFile($fileName);
|
|
|
|
if ($action=="install" || $action=="update") {
|
|
|
|
$settingsCurrent = $this->yellow->toolbox->getTextSettings($fileData, "extension");
|
|
|
|
if (!$settingsCurrent->isExisting($extension)) $settingsCurrent[$extension] = new YellowArray();
|
|
|
|
foreach($settings as $key=>$value) $settingsCurrent[$extension][$key] = $value;
|
|
|
|
$settingsCurrent->uksort("strnatcasecmp");
|
|
|
|
$fileDataNew = "";
|
|
|
|
foreach ($this->yellow->toolbox->getTextLines($fileData) as $line) {
|
|
|
|
if (preg_match("/^\#/", $line)) $fileDataNew = $line;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
foreach ($settingsCurrent as $extension=>$block) {
|
|
|
|
if (!empty($fileDataNew)) $fileDataNew .= "\n";
|
|
|
|
foreach ($block as $key=>$value) {
|
|
|
|
$fileDataNew .= (strposu($key, "/") ? $key : ucfirst($key)).": $value\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$fileDataNew = $this->yellow->toolbox->unsetTextSettings($fileData, "extension", $extension);
|
|
|
|
}
|
|
|
|
if ($fileData!=$fileDataNew && !$this->yellow->toolbox->createFile($fileName, $fileDataNew)) {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error(500, "Can't write file '$fileName'!");
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
|
|
|
|
2020-10-27 15:32:34 +00:00
|
|
|
// Update timestamp settings in regular intervals
|
2020-10-27 10:51:01 +00:00
|
|
|
public function updateTimestampSettings($key) {
|
|
|
|
$timestamp = $timeOffset = 0;
|
|
|
|
foreach(str_split($this->yellow->system->get("sitename")) as $char) {
|
|
|
|
$timeOffset = ($timeOffset+ord($char)) % 60;
|
|
|
|
}
|
|
|
|
if ($key=="updateDailyTimestamp") {
|
|
|
|
$timestamp = mktime(0, 0, 0) + 60*60*24 + $timeOffset;
|
|
|
|
} elseif ($key=="updateWeeklyTimestamp") {
|
|
|
|
$timestamp = mktime(0, 0, 0, date("n"), date("j")-date("N")+1) + 60*60*24*7 + $timeOffset;
|
|
|
|
} elseif ($key=="updateMonthlyTimestamp") {
|
|
|
|
$timestamp = mktime(0, 0, 0, date("n")+1, 1) + $timeOffset;
|
|
|
|
}
|
|
|
|
$fileName = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("coreSystemFile");
|
|
|
|
if (!$this->yellow->system->save($fileName, array($key => $timestamp))) {
|
|
|
|
$this->yellow->log("error", "Can't write file '$fileName'!");
|
|
|
|
}
|
|
|
|
}
|
2018-08-10 22:23:50 +00:00
|
|
|
|
2020-07-07 16:29:20 +00:00
|
|
|
// Process command to show website version and updates
|
|
|
|
public function processCommandAbout($command, $text) {
|
2020-08-06 18:03:57 +00:00
|
|
|
echo "Datenstrom Yellow ".YellowCore::RELEASE."\n";
|
2020-08-11 18:12:05 +00:00
|
|
|
list($statusCode, $settingsCurrent) = $this->getExtensionSettings(false);
|
|
|
|
list($statusCode, $settingsLatest) = $this->getExtensionSettings(true);
|
|
|
|
foreach ($settingsCurrent as $key=>$value) {
|
|
|
|
$versionCurrent = $versionLatest = $settingsCurrent[$key]->get("version");
|
|
|
|
if ($settingsLatest->isExisting($key)) $versionLatest = $settingsLatest[$key]->get("version");
|
|
|
|
if (strnatcasecmp($versionCurrent, $versionLatest)<0) {
|
|
|
|
echo ucfirst($key)." $versionCurrent - Update available\n";
|
2020-07-07 16:29:20 +00:00
|
|
|
} else {
|
2020-08-11 18:12:05 +00:00
|
|
|
echo ucfirst($key)." $versionCurrent\n";
|
2020-07-07 16:29:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($statusCode!=200) echo "ERROR checking updates: ".$this->yellow->page->get("pageError")."\n";
|
|
|
|
return $statusCode;
|
|
|
|
}
|
|
|
|
|
2019-02-23 14:04:34 +00:00
|
|
|
// Process command to install extensions
|
2020-06-25 14:46:44 +00:00
|
|
|
public function processCommandInstall($command, $text) {
|
2020-08-11 18:12:05 +00:00
|
|
|
$extensions = $this->getExtensionsFromText($text);
|
2019-02-23 14:04:34 +00:00
|
|
|
if (!empty($extensions)) {
|
2018-09-04 08:42:35 +00:00
|
|
|
$this->updates = 0;
|
2020-08-11 18:12:05 +00:00
|
|
|
list($statusCode, $settings) = $this->getExtensionInstallInformation($extensions);
|
|
|
|
if ($statusCode==200) $statusCode = $this->downloadExtensions($settings);
|
2019-03-16 07:59:37 +00:00
|
|
|
if ($statusCode==200) $statusCode = $this->updateExtensions("install");
|
2018-09-04 08:42:35 +00:00
|
|
|
if ($statusCode>=400) echo "ERROR installing files: ".$this->yellow->page->get("pageError")."\n";
|
|
|
|
echo "Yellow $command: Website ".($statusCode!=200 ? "not " : "")."updated";
|
2019-02-23 14:04:34 +00:00
|
|
|
echo ", $this->updates extension".($this->updates!=1 ? "s" : "")." installed\n";
|
2018-09-04 08:42:35 +00:00
|
|
|
} else {
|
2019-02-23 14:04:34 +00:00
|
|
|
$statusCode = $this->showExtensions();
|
2018-09-04 08:42:35 +00:00
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
|
|
|
|
2019-02-23 14:04:34 +00:00
|
|
|
// Process command to uninstall extensions
|
2020-06-25 14:46:44 +00:00
|
|
|
public function processCommandUninstall($command, $text) {
|
2020-08-11 18:12:05 +00:00
|
|
|
$extensions = $this->getExtensionsFromText($text);
|
2019-02-23 14:04:34 +00:00
|
|
|
if (!empty($extensions)) {
|
2018-09-04 08:42:35 +00:00
|
|
|
$this->updates = 0;
|
2020-08-11 18:12:05 +00:00
|
|
|
list($statusCode, $settings) = $this->getExtensionUninstallInformation($extensions, "core, update");
|
|
|
|
if ($statusCode==200) $statusCode = $this->removeExtensions($settings);
|
2018-09-04 08:42:35 +00:00
|
|
|
if ($statusCode>=400) echo "ERROR uninstalling files: ".$this->yellow->page->get("pageError")."\n";
|
|
|
|
echo "Yellow $command: Website ".($statusCode!=200 ? "not " : "")."updated";
|
2019-02-23 14:04:34 +00:00
|
|
|
echo ", $this->updates extension".($this->updates!=1 ? "s" : "")." uninstalled\n";
|
2018-09-04 08:42:35 +00:00
|
|
|
} else {
|
2019-02-23 14:04:34 +00:00
|
|
|
$statusCode = $this->showExtensions();
|
2018-09-04 08:42:35 +00:00
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
2020-08-06 18:03:57 +00:00
|
|
|
|
2018-09-06 14:23:19 +00:00
|
|
|
// Process command to update website
|
2020-06-25 14:46:44 +00:00
|
|
|
public function processCommandUpdate($command, $text) {
|
2020-08-11 18:12:05 +00:00
|
|
|
$extensions = $this->getExtensionsFromText($text);
|
|
|
|
list($statusCode, $settings) = $this->getExtensionUpdateInformation($extensions);
|
|
|
|
if ($statusCode!=200 || !empty($settings)) {
|
2018-09-04 08:42:35 +00:00
|
|
|
$this->updates = 0;
|
2020-08-11 18:12:05 +00:00
|
|
|
if ($statusCode==200) $statusCode = $this->downloadExtensions($settings);
|
2020-08-06 18:03:57 +00:00
|
|
|
if ($statusCode==200) $statusCode = $this->updateExtensions("update");
|
2018-09-04 08:42:35 +00:00
|
|
|
if ($statusCode>=400) echo "ERROR updating files: ".$this->yellow->page->get("pageError")."\n";
|
|
|
|
echo "Yellow $command: Website ".($statusCode!=200 ? "not " : "")."updated";
|
|
|
|
echo ", $this->updates update".($this->updates!=1 ? "s" : "")." installed\n";
|
2018-08-10 22:23:50 +00:00
|
|
|
} else {
|
2018-09-04 08:42:35 +00:00
|
|
|
echo "Your website is up to date\n";
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
2018-09-07 16:20:02 +00:00
|
|
|
|
2019-03-16 07:59:37 +00:00
|
|
|
// Process command to install pending extension
|
2018-09-07 16:20:02 +00:00
|
|
|
public function processCommandPending() {
|
2019-03-16 07:59:37 +00:00
|
|
|
$statusCode = $this->updateExtensions("install");
|
2018-09-07 16:20:02 +00:00
|
|
|
if ($statusCode!=200) echo "ERROR updating files: ".$this->yellow->page->get("pageError")."\n";
|
|
|
|
echo "Your website has ".($statusCode!=200 ? "not " : "")."been updated: Please run command again\n";
|
|
|
|
return $statusCode;
|
|
|
|
}
|
|
|
|
|
2019-03-16 07:59:37 +00:00
|
|
|
// Process request to install pending extension
|
2018-09-07 16:20:02 +00:00
|
|
|
public function processRequestPending($scheme, $address, $base, $location, $fileName) {
|
2019-03-16 07:59:37 +00:00
|
|
|
$statusCode = $this->updateExtensions("install");
|
2018-09-07 16:20:02 +00:00
|
|
|
if ($statusCode==200) {
|
|
|
|
$location = $this->yellow->lookup->normaliseUrl($scheme, $address, $base, $location);
|
|
|
|
$statusCode = $this->yellow->sendStatus(303, $location);
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
|
2019-03-16 07:59:37 +00:00
|
|
|
// Process update notification
|
|
|
|
public function processUpdateNotification($extension, $action) {
|
|
|
|
$statusCode = 200;
|
2020-07-26 14:51:07 +00:00
|
|
|
if ($this->yellow->extension->isExisting($extension) && $action=="uninstall") {
|
|
|
|
$value = $this->yellow->extension->data[$extension];
|
2020-08-06 18:03:57 +00:00
|
|
|
if (method_exists($value["object"], "onUpdate")) $value["object"]->onUpdate($action);
|
2019-03-16 07:59:37 +00:00
|
|
|
}
|
|
|
|
$updateNotification = $this->yellow->system->get("updateNotification");
|
|
|
|
if ($updateNotification=="none") $updateNotification = "";
|
|
|
|
if (!empty($updateNotification)) $updateNotification .= ",";
|
|
|
|
$updateNotification .= "$extension/$action";
|
2020-10-27 10:51:01 +00:00
|
|
|
$fileName = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("coreSystemFile");
|
2019-03-16 07:59:37 +00:00
|
|
|
if (!$this->yellow->system->save($fileName, array("updateNotification" => $updateNotification))) {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error(500, "Can't write file '$fileName'!");
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
|
|
|
|
2019-02-23 14:04:34 +00:00
|
|
|
// Show extensions
|
|
|
|
public function showExtensions() {
|
2020-08-11 18:12:05 +00:00
|
|
|
list($statusCode, $settingsLatest) = $this->getExtensionSettings(true);
|
|
|
|
foreach ($settingsLatest as $key=>$value) {
|
|
|
|
$text = $description = $value->get("description");
|
|
|
|
if ($value->isExisting("developer")) $text = "$description Developed by ".$value["developer"].".";
|
|
|
|
if ($value->isExisting("translator")) $text = "$description Translated by ".$value["translator"].".";
|
|
|
|
if ($value->isExisting("designer")) $text = "$description Designed by ".$value["designer"].".";
|
2020-06-28 17:16:07 +00:00
|
|
|
echo ucfirst($key).": $text\n";
|
2018-09-04 08:42:35 +00:00
|
|
|
}
|
2019-02-23 14:04:34 +00:00
|
|
|
if ($statusCode!=200) echo "ERROR checking extensions: ".$this->yellow->page->get("pageError")."\n";
|
2018-09-04 08:42:35 +00:00
|
|
|
return $statusCode;
|
|
|
|
}
|
|
|
|
|
2019-02-23 14:04:34 +00:00
|
|
|
// Download extensions
|
2020-08-11 18:12:05 +00:00
|
|
|
public function downloadExtensions($settings) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$statusCode = 200;
|
2020-06-25 14:46:44 +00:00
|
|
|
$path = $this->yellow->system->get("coreExtensionDirectory");
|
2019-12-15 16:22:07 +00:00
|
|
|
$fileExtension = $this->yellow->system->get("coreDownloadExtension");
|
2020-08-11 18:12:05 +00:00
|
|
|
foreach ($settings as $key=>$value) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$fileName = $path.$this->yellow->lookup->normaliseName($key, true, false, true).".zip";
|
2020-08-11 18:12:05 +00:00
|
|
|
list($statusCode, $fileData) = $this->getExtensionFile($value->get("downloadUrl"));
|
2018-08-10 22:23:50 +00:00
|
|
|
if (empty($fileData) || !$this->yellow->toolbox->createFile($fileName.$fileExtension, $fileData)) {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't write file '$fileName'!");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($statusCode==200) {
|
2020-08-11 18:12:05 +00:00
|
|
|
foreach ($settings as $key=>$value) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$fileName = $path.$this->yellow->lookup->normaliseName($key, true, false, true).".zip";
|
|
|
|
if (!$this->yellow->toolbox->renameFile($fileName.$fileExtension, $fileName)) {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't write file '$fileName'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
2016-07-10 18:44:02 +00:00
|
|
|
|
2019-02-23 14:04:34 +00:00
|
|
|
// Update extensions
|
2020-08-06 18:03:57 +00:00
|
|
|
public function updateExtensions($action) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$statusCode = 200;
|
|
|
|
if (function_exists("opcache_reset")) opcache_reset();
|
2020-06-25 14:46:44 +00:00
|
|
|
$path = $this->yellow->system->get("coreExtensionDirectory");
|
2018-08-10 22:23:50 +00:00
|
|
|
foreach ($this->yellow->toolbox->getDirectoryEntries($path, "/^.*\.zip$/", true, false) as $entry) {
|
2020-08-06 18:03:57 +00:00
|
|
|
$statusCode = max($statusCode, $this->updateExtensionArchive($entry, $action));
|
2018-08-10 22:23:50 +00:00
|
|
|
if (!$this->yellow->toolbox->deleteFile($entry)) {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't delete file '$entry'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
2017-01-03 13:11:44 +00:00
|
|
|
|
2019-02-23 14:04:34 +00:00
|
|
|
// Update extension from archive
|
2020-08-06 18:03:57 +00:00
|
|
|
public function updateExtensionArchive($path, $action) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$statusCode = 200;
|
|
|
|
$zip = new ZipArchive();
|
|
|
|
if ($zip->open($path)===true) {
|
2019-02-23 14:04:34 +00:00
|
|
|
if (defined("DEBUG") && DEBUG>=2) echo "YellowUpdate::updateExtensionArchive file:$path<br/>\n";
|
2020-08-11 18:12:05 +00:00
|
|
|
$pathBase = "";
|
2018-08-10 22:23:50 +00:00
|
|
|
if (preg_match("#^(.*\/).*?$#", $zip->getNameIndex(0), $matches)) $pathBase = $matches[1];
|
2019-02-25 20:50:19 +00:00
|
|
|
$fileData = $zip->getFromName($pathBase.$this->yellow->system->get("updateExtensionFile"));
|
2020-08-11 18:12:05 +00:00
|
|
|
$settings = $this->yellow->toolbox->getTextSettings($fileData, "");
|
2020-10-30 10:03:19 +00:00
|
|
|
list($extension, $version, $newModified, $oldModified) = $this->getExtensionInformation($settings, $path);
|
2020-08-11 18:12:05 +00:00
|
|
|
if (!empty($extension) && !empty($version)) {
|
|
|
|
$statusCode = $this->updateExtensionSettings($extension, $settings, $action);
|
|
|
|
if ($statusCode==200) {
|
2020-10-30 10:03:19 +00:00
|
|
|
$languages = $this->getExtensionArchiveLanguages($zip, $pathBase);
|
2020-08-11 18:12:05 +00:00
|
|
|
foreach ($this->getExtensionFileNames($settings) as $fileName) {
|
|
|
|
list($entry, $flags) = $this->yellow->toolbox->getTextList($settings[$fileName], ",", 2);
|
|
|
|
if (!$this->yellow->lookup->isContentFile($fileName)) {
|
|
|
|
$fileData = $zip->getFromName($pathBase.$entry);
|
|
|
|
$lastModified = $this->yellow->toolbox->getFileModified($fileName);
|
|
|
|
$statusCode = $this->updateExtensionFile($fileName, $fileData,
|
|
|
|
$newModified, $oldModified, $lastModified, $flags, $extension);
|
|
|
|
} else {
|
|
|
|
foreach ($this->getExtensionContentRootPages() as $page) {
|
|
|
|
list($fileNameSource, $fileNameDestination) = $this->getExtensionContentFileNames(
|
|
|
|
$fileName, $pathBase, $entry, $flags, $languages, $page);
|
|
|
|
$fileData = $zip->getFromName($fileNameSource);
|
|
|
|
$lastModified = $this->yellow->toolbox->getFileModified($fileNameDestination);
|
|
|
|
$statusCode = $this->updateExtensionFile($fileNameDestination, $fileData,
|
|
|
|
$newModified, $oldModified, $lastModified, $flags, $extension);
|
|
|
|
}
|
2020-06-21 17:08:40 +00:00
|
|
|
}
|
|
|
|
if ($statusCode!=200) break;
|
2019-12-19 12:07:02 +00:00
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
$statusCode = max($statusCode, $this->processUpdateNotification($extension, $action));
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
$this->yellow->log($statusCode==200 ? "info" : "error", ucfirst($action)." extension '".ucfirst($extension)." $version'");
|
|
|
|
++$this->updates;
|
2020-11-04 15:07:51 +00:00
|
|
|
} else {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error(500, "Can't detect file '$path'!");
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
|
|
|
$zip->close();
|
|
|
|
} else {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error(500, "Can't open file '$path'!");
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
|
|
|
|
2019-02-23 14:04:34 +00:00
|
|
|
// Update extension from file
|
2020-08-11 18:12:05 +00:00
|
|
|
public function updateExtensionFile($fileName, $fileData, $newModified, $oldModified, $lastModified, $flags, $extension) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$statusCode = 200;
|
|
|
|
$fileName = $this->yellow->toolbox->normaliseTokens($fileName);
|
2020-08-11 18:12:05 +00:00
|
|
|
if ($this->yellow->lookup->isValidFile($fileName)) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$create = $update = $delete = false;
|
|
|
|
if (preg_match("/create/i", $flags) && !is_file($fileName) && !empty($fileData)) $create = true;
|
|
|
|
if (preg_match("/update/i", $flags) && is_file($fileName) && !empty($fileData)) $update = true;
|
|
|
|
if (preg_match("/delete/i", $flags) && is_file($fileName)) $delete = true;
|
2020-07-26 14:51:07 +00:00
|
|
|
if (preg_match("/optional/i", $flags) && $this->yellow->extension->isExisting($extension)) $create = $update = $delete = false;
|
2020-08-11 18:12:05 +00:00
|
|
|
if (preg_match("/careful/i", $flags) && is_file($fileName) && $lastModified!=$oldModified) $update = false;
|
2018-08-10 22:23:50 +00:00
|
|
|
if ($create) {
|
|
|
|
if (!$this->yellow->toolbox->createFile($fileName, $fileData, true) ||
|
2020-08-11 18:12:05 +00:00
|
|
|
!$this->yellow->toolbox->modifyFile($fileName, $newModified)) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't write file '$fileName'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($update) {
|
2020-06-25 14:46:44 +00:00
|
|
|
if (!$this->yellow->toolbox->deleteFile($fileName, $this->yellow->system->get("coreTrashDirectory")) ||
|
2018-08-10 22:23:50 +00:00
|
|
|
!$this->yellow->toolbox->createFile($fileName, $fileData) ||
|
2020-08-11 18:12:05 +00:00
|
|
|
!$this->yellow->toolbox->modifyFile($fileName, $newModified)) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't write file '$fileName'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($delete) {
|
2020-06-25 14:46:44 +00:00
|
|
|
if (!$this->yellow->toolbox->deleteFile($fileName, $this->yellow->system->get("coreTrashDirectory"))) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't delete file '$fileName'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (defined("DEBUG") && DEBUG>=2) {
|
|
|
|
$debug = "action:".($create ? "create" : "").($update ? "update" : "").($delete ? "delete" : "");
|
|
|
|
if (!$create && !$update && !$delete) $debug = "action:none";
|
2019-02-23 14:04:34 +00:00
|
|
|
echo "YellowUpdate::updateExtensionFile file:$fileName $debug<br/>\n";
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
2019-12-19 12:07:02 +00:00
|
|
|
|
2020-08-11 18:12:05 +00:00
|
|
|
// Remove extensions
|
|
|
|
public function removeExtensions($settings) {
|
|
|
|
$statusCode = 200;
|
|
|
|
if (function_exists("opcache_reset")) opcache_reset();
|
|
|
|
foreach ($settings as $extension=>$block) {
|
|
|
|
$statusCode = max($statusCode, $this->removeExtensionArchive($extension, $block, "uninstall"));
|
2019-12-19 12:07:02 +00:00
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
return $statusCode;
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
2019-12-19 12:07:02 +00:00
|
|
|
|
2020-08-11 18:12:05 +00:00
|
|
|
// Remove extension archive
|
|
|
|
public function removeExtensionArchive($extension, $settings, $action) {
|
2018-09-04 08:42:35 +00:00
|
|
|
$statusCode = 200;
|
2020-08-11 18:12:05 +00:00
|
|
|
$fileNames = $this->getExtensionFileNames($settings, true);
|
|
|
|
if (count($fileNames)) {
|
|
|
|
$statusCode = max($statusCode, $this->processUpdateNotification($extension, $action));
|
|
|
|
foreach ($fileNames as $fileName) {
|
|
|
|
$statusCode = max($statusCode, $this->removeExtensionFile($fileName));
|
2018-09-04 08:42:35 +00:00
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
if ($statusCode==200) $statusCode = $this->updateExtensionSettings($extension, $settings, $action);
|
|
|
|
$version = $settings->get("version");
|
|
|
|
$this->yellow->log($statusCode==200 ? "info" : "error", ucfirst($action)." extension '".ucfirst($extension)." $version'");
|
2018-09-04 08:42:35 +00:00
|
|
|
++$this->updates;
|
2020-08-11 18:12:05 +00:00
|
|
|
} else {
|
|
|
|
$statusCode = 500;
|
2020-08-12 13:00:09 +00:00
|
|
|
$this->yellow->page->error(500, "Please delete extension '$extension' manually!");
|
2018-09-04 08:42:35 +00:00
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
|
|
|
|
// Remove extension file
|
|
|
|
public function removeExtensionFile($fileName) {
|
2018-09-04 08:42:35 +00:00
|
|
|
$statusCode = 200;
|
|
|
|
$fileName = $this->yellow->toolbox->normaliseTokens($fileName);
|
2020-08-11 18:12:05 +00:00
|
|
|
if ($this->yellow->lookup->isValidFile($fileName) && is_file($fileName)) {
|
2020-06-25 14:46:44 +00:00
|
|
|
if (!$this->yellow->toolbox->deleteFile($fileName, $this->yellow->system->get("coreTrashDirectory"))) {
|
2018-09-04 08:42:35 +00:00
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't delete file '$fileName'!");
|
|
|
|
}
|
|
|
|
if (defined("DEBUG") && DEBUG>=2) {
|
2020-08-11 18:12:05 +00:00
|
|
|
echo "YellowUpdate::removeExtensionFile file:$fileName action:delete<br/>\n";
|
2018-09-04 08:42:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return $statusCode;
|
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
|
|
|
|
// Return extensions from text, space separated
|
|
|
|
public function getExtensionsFromText($text) {
|
|
|
|
return array_unique(array_filter($this->yellow->toolbox->getTextArguments($text), "strlen"));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return extension install information
|
|
|
|
public function getExtensionInstallInformation($extensions) {
|
|
|
|
$settings = array();
|
|
|
|
list($statusCodeCurrent, $settingsCurrent) = $this->getExtensionSettings(false);
|
|
|
|
list($statusCodeLatest, $settingsLatest) = $this->getExtensionSettings(true);
|
|
|
|
$statusCode = max($statusCodeCurrent, $statusCodeLatest);
|
|
|
|
foreach ($extensions as $extension) {
|
|
|
|
$found = false;
|
|
|
|
foreach ($settingsLatest as $key=>$value) {
|
|
|
|
if (strtoloweru($key)==strtoloweru($extension)) {
|
|
|
|
if (!$settingsCurrent->isExisting($key)) $settings[$key] = $settingsLatest[$key];
|
|
|
|
$found = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!$found) {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't find extension '$extension'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return array($statusCode, $settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return extension uninstall information
|
|
|
|
public function getExtensionUninstallInformation($extensions, $extensionsProtected) {
|
|
|
|
$settings = array();
|
|
|
|
list($statusCode, $settingsCurrent) = $this->getExtensionSettings(false);
|
|
|
|
foreach ($extensions as $extension) {
|
|
|
|
$found = false;
|
|
|
|
foreach ($settingsCurrent as $key=>$value) {
|
|
|
|
if (strtoloweru($key)==strtoloweru($extension)) {
|
|
|
|
$settings[$key] = $settingsCurrent[$key];
|
|
|
|
$found = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!$found) {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't find extension '$extension'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$protected = preg_split("/\s*,\s*/", $extensionsProtected);
|
|
|
|
foreach ($settings as $key=>$value) {
|
|
|
|
if (in_array($key, $protected)) unset($settings[$key]);
|
|
|
|
}
|
|
|
|
return array($statusCode, $settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return extension update information
|
|
|
|
public function getExtensionUpdateInformation($extensions) {
|
|
|
|
$settings = array();
|
|
|
|
list($statusCodeCurrent, $settingsCurrent) = $this->getExtensionSettings(false);
|
|
|
|
list($statusCodeLatest, $settingsLatest) = $this->getExtensionSettings(true);
|
|
|
|
$statusCode = max($statusCodeCurrent, $statusCodeLatest);
|
|
|
|
if (empty($extensions)) {
|
|
|
|
foreach ($settingsCurrent as $key=>$value) {
|
|
|
|
if ($settingsLatest->isExisting($key)) {
|
|
|
|
$versionCurrent = $settingsCurrent[$key]->get("version");
|
|
|
|
$versionLatest = $settingsLatest[$key]->get("version");
|
|
|
|
if (strnatcasecmp($versionCurrent, $versionLatest)<0) {
|
|
|
|
$settings[$key] = $settingsLatest[$key];
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2020-08-11 18:12:05 +00:00
|
|
|
foreach ($extensions as $extension) {
|
|
|
|
$found = false;
|
|
|
|
foreach ($settingsCurrent as $key=>$value) {
|
|
|
|
if (strtoloweru($key)==strtoloweru($extension) && $settingsLatest->isExisting($key)) {
|
2020-11-04 15:07:51 +00:00
|
|
|
$versionCurrent = $settingsCurrent[$key]->get("version");
|
|
|
|
$versionLatest = $settingsLatest[$key]->get("version");
|
|
|
|
if (strnatcasecmp($versionCurrent, $versionLatest)<0) {
|
|
|
|
$settings[$key] = $settingsLatest[$key];
|
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
$found = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!$found) {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't find extension '$extension'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($statusCode==200) {
|
|
|
|
foreach ($settings as $key=>$value) {
|
|
|
|
echo ucfirst($key)." ".$value->get("version")."\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return array($statusCode, $settings);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return extension settings
|
|
|
|
public function getExtensionSettings($latest) {
|
|
|
|
$statusCode = 200;
|
|
|
|
$settings = array();
|
|
|
|
if (!$latest) {
|
|
|
|
$fileNameCurrent = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("updateCurrentFile");
|
|
|
|
$fileData = $this->yellow->toolbox->readFile($fileNameCurrent);
|
|
|
|
$settings = $this->yellow->toolbox->getTextSettings($fileData, "extension");
|
2020-08-12 13:00:09 +00:00
|
|
|
foreach ($settings as $key=>$value) {
|
|
|
|
if (!$this->yellow->extension->isExisting($key)) unset($settings[$key]);
|
|
|
|
}
|
2020-07-26 14:51:07 +00:00
|
|
|
foreach ($this->yellow->extension->data as $key=>$value) {
|
2020-08-11 18:12:05 +00:00
|
|
|
if (!$settings->isExisting($key)) $settings[$key] = new YellowArray();
|
|
|
|
$settings[$key]["extension"] = ucfirst($key);
|
|
|
|
$settings[$key]["version"] = $value["version"];
|
2020-07-26 14:51:07 +00:00
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
} else {
|
|
|
|
$fileNameLatest = $this->yellow->system->get("coreExtensionDirectory").$this->yellow->system->get("updateLatestFile");
|
|
|
|
$expire = $this->yellow->toolbox->getFileModified($fileNameLatest) + 60*10;
|
|
|
|
if ($expire<=time()) {
|
|
|
|
$url = $this->yellow->system->get("updateExtensionUrl")."/raw/master/".$this->yellow->system->get("updateLatestFile");
|
|
|
|
list($statusCode, $fileData) = $this->getExtensionFile($url);
|
|
|
|
if ($statusCode==200 && !$this->yellow->toolbox->createFile($fileNameLatest, $fileData)) {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't write file '$fileNameLatest'!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$fileData = $this->yellow->toolbox->readFile($fileNameLatest);
|
|
|
|
$settings = $this->yellow->toolbox->getTextSettings($fileData, "extension");
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
$settings->uksort("strnatcasecmp");
|
|
|
|
return array($statusCode, $settings);
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
|
|
|
|
// Return extension archive languages
|
|
|
|
public function getExtensionArchiveLanguages($zip, $pathBase) {
|
|
|
|
$languages = array();
|
|
|
|
for ($index=0; $index<$zip->numFiles; ++$index) {
|
|
|
|
$entry = substru($zip->getNameIndex($index), strlenu($pathBase));
|
|
|
|
if (preg_match("#^(.*)\/.*?$#", $entry, $matches)) {
|
|
|
|
array_push($languages, $matches[1]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return array_unique($languages);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return extension information
|
2020-10-30 10:03:19 +00:00
|
|
|
public function getExtensionInformation($settings, $path) {
|
2020-08-11 18:12:05 +00:00
|
|
|
$extension = lcfirst($settings->get("extension"));
|
|
|
|
$version = $settings->get("version");
|
|
|
|
$newModified = strtotime($settings->get("published"));
|
|
|
|
$oldModified = 0;
|
2020-10-30 10:03:19 +00:00
|
|
|
$invalid = false;
|
2020-08-11 18:12:05 +00:00
|
|
|
foreach ($settings as $key=>$value) {
|
2020-10-30 10:03:19 +00:00
|
|
|
if (strposu($key, "/")) {
|
|
|
|
if (!$this->yellow->lookup->isValidFile($key)) $invalid = true;
|
|
|
|
list($entry, $flags) = $this->yellow->toolbox->getTextList($value, ",", 2);
|
|
|
|
if (strposu($entry, ".")===false) $invalid = true;
|
|
|
|
if ($oldModified==0 && is_file($key)) $oldModified = filemtime($key);
|
2020-08-11 18:12:05 +00:00
|
|
|
}
|
|
|
|
}
|
2020-11-04 15:07:51 +00:00
|
|
|
if ($invalid) $extension = $version = "";
|
2020-08-11 18:12:05 +00:00
|
|
|
return array($extension, $version, $newModified, $oldModified);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return extension file names
|
|
|
|
public function getExtensionFileNames($settings, $reverse = false) {
|
|
|
|
$fileNames = array();
|
|
|
|
foreach ($settings as $key=>$value) {
|
|
|
|
if (strposu($key, "/")) array_push($fileNames, $key);
|
|
|
|
}
|
|
|
|
if ($reverse) $fileNames = array_reverse($fileNames);
|
|
|
|
return $fileNames;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return extension root pages for content files
|
|
|
|
public function getExtensionContentRootPages() {
|
|
|
|
$rootPages = array();
|
|
|
|
foreach ($this->yellow->content->scanLocation("") as $page) {
|
|
|
|
if ($page->isAvailable() && $page->isVisible()) array_push($rootPages, $page);
|
|
|
|
}
|
|
|
|
return $rootPages;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return extension files names for content files
|
|
|
|
public function getExtensionContentFileNames($fileName, $pathBase, $entry, $flags, $languages, $page) {
|
|
|
|
if (preg_match("/multi-language/i", $flags)) {
|
|
|
|
$languageFound = "";
|
|
|
|
$languagesWanted = array($page->get("language"), "en");
|
|
|
|
foreach ($languagesWanted as $language) {
|
|
|
|
if (in_array($language, $languages)) {
|
|
|
|
$languageFound = $language;
|
|
|
|
break;
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
$pathLanguage = $languageFound ? "$languageFound/" : "";
|
|
|
|
$fileNameSource = $pathBase.$pathLanguage.$entry;
|
|
|
|
} else {
|
|
|
|
$fileNameSource = $pathBase.$entry;
|
|
|
|
}
|
|
|
|
if ($this->yellow->system->get("coreMultiLanguageMode")) {
|
|
|
|
$contentDirectoryLength = strlenu($this->yellow->system->get("coreContentDirectory"));
|
|
|
|
$fileNameDestination = $page->fileName.substru($fileName, $contentDirectoryLength);
|
|
|
|
} else {
|
|
|
|
$fileNameDestination = $fileName;
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
return array($fileNameSource, $fileNameDestination);
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
2020-08-11 18:12:05 +00:00
|
|
|
|
2019-02-23 14:04:34 +00:00
|
|
|
// Return extension file
|
|
|
|
public function getExtensionFile($url) {
|
2018-08-10 22:23:50 +00:00
|
|
|
$urlRequest = $url;
|
|
|
|
if (preg_match("#^https://github.com/(.+)/raw/(.+)$#", $url, $matches)) $urlRequest = "https://raw.githubusercontent.com/".$matches[1]."/".$matches[2];
|
|
|
|
$curlHandle = curl_init();
|
|
|
|
curl_setopt($curlHandle, CURLOPT_URL, $urlRequest);
|
2020-08-06 18:03:57 +00:00
|
|
|
curl_setopt($curlHandle, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; YellowUpdate/".YellowUpdate::VERSION."; SoftwareUpdater)");
|
2018-08-10 22:23:50 +00:00
|
|
|
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
|
|
|
|
curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, 30);
|
|
|
|
$rawData = curl_exec($curlHandle);
|
|
|
|
$statusCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);
|
2020-06-21 17:08:40 +00:00
|
|
|
$fileData = "";
|
2018-08-10 22:23:50 +00:00
|
|
|
curl_close($curlHandle);
|
|
|
|
if ($statusCode==200) {
|
|
|
|
$fileData = $rawData;
|
|
|
|
} elseif ($statusCode==0) {
|
|
|
|
$statusCode = 500;
|
|
|
|
list($scheme, $address) = $this->yellow->lookup->getUrlInformation($url);
|
|
|
|
$this->yellow->page->error($statusCode, "Can't connect to server '$scheme://$address'!");
|
|
|
|
} else {
|
|
|
|
$statusCode = 500;
|
|
|
|
$this->yellow->page->error($statusCode, "Can't download file '$url'!");
|
|
|
|
}
|
2019-02-23 14:04:34 +00:00
|
|
|
if (defined("DEBUG") && DEBUG>=2) echo "YellowUpdate::getExtensionFile status:$statusCode url:$url<br/>\n";
|
2018-08-10 22:23:50 +00:00
|
|
|
return array($statusCode, $fileData);
|
|
|
|
}
|
2017-01-03 13:11:44 +00:00
|
|
|
|
2019-02-23 14:04:34 +00:00
|
|
|
// Check if extension pending
|
|
|
|
public function isExtensionPending() {
|
2020-06-25 14:46:44 +00:00
|
|
|
$path = $this->yellow->system->get("coreExtensionDirectory");
|
2019-02-23 14:04:34 +00:00
|
|
|
return count($this->yellow->toolbox->getDirectoryEntries($path, "/^.*\.zip$/", false, false))>0;
|
2018-08-10 22:23:50 +00:00
|
|
|
}
|
2016-06-27 13:28:10 +00:00
|
|
|
}
|