From 8e421f089341882928279118cb07aa1eae11f951 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 9 Mar 2020 23:28:37 +0000 Subject: [PATCH 1/3] Fix uninstall of installed addons --- src/Core/Addon.php | 92 ++++++++--------------------- src/Model/Nodeinfo.php | 15 +---- src/Module/Admin/Addons/Details.php | 2 - update.php | 21 ++----- 4 files changed, 30 insertions(+), 100 deletions(-) diff --git a/src/Core/Addon.php b/src/Core/Addon.php index be4e94152f..3dd28af44b 100644 --- a/src/Core/Addon.php +++ b/src/Core/Addon.php @@ -112,37 +112,14 @@ class Addon */ public static function loadAddons() { - $installed_addons = []; + $installed_addons = DBA::selectToArray('addon', ['name'], ['installed' => true]); - $r = DBA::select('addon', [], ['installed' => 1]); - if (DBA::isResult($r)) { - $installed_addons = DBA::toArray($r); - } - - $addons = DI::config()->get('system', 'addon'); $addons_arr = []; - - if ($addons) { - $addons_arr = explode(',', str_replace(' ', '', $addons)); + foreach ($installed_addons as $addon) { + $addons_arr[] = $addon['name']; } self::$addons = $addons_arr; - - $installed_arr = []; - - foreach ($installed_addons as $addon) { - if (!self::isEnabled($addon['name'])) { - self::uninstall($addon['name']); - } else { - $installed_arr[] = $addon['name']; - } - } - - foreach (self::$addons as $p) { - if (!in_array($p, $installed_arr)) { - self::install($p); - } - } } /** @@ -168,8 +145,6 @@ class Addon DBA::delete('hook', ['file' => 'addon/' . $addon . '/' . $addon . '.php']); unset(self::$addons[array_search($addon, self::$addons)]); - - Addon::saveEnabledList(); } /** @@ -212,8 +187,6 @@ class Addon self::$addons[] = $addon; } - Addon::saveEnabledList(); - return true; } else { Logger::error("Addon {addon}: {action} failed", ['action' => 'install', 'addon' => $addon]); @@ -226,38 +199,33 @@ class Addon */ public static function reload() { - $addons = DI::config()->get('system', 'addon'); - if (strlen($addons)) { - $r = DBA::select('addon', [], ['installed' => 1]); - if (DBA::isResult($r)) { - $installed = DBA::toArray($r); - } else { - $installed = []; - } + $installed = DBA::selectToArray('addon', [], ['installed' => 1]); - $addon_list = explode(',', $addons); + $addon_list = []; + foreach ($installed as $addon) { + $addon_list[] = $addon['name']; + } - foreach ($addon_list as $addon) { - $addon = Strings::sanitizeFilePathItem(trim($addon)); - $fname = 'addon/' . $addon . '/' . $addon . '.php'; - if (file_exists($fname)) { - $t = @filemtime($fname); - foreach ($installed as $i) { - if (($i['name'] == $addon) && ($i['timestamp'] != $t)) { + foreach ($addon_list as $addon) { + $addon = Strings::sanitizeFilePathItem(trim($addon)); + $fname = 'addon/' . $addon . '/' . $addon . '.php'; + if (file_exists($fname)) { + $t = @filemtime($fname); + foreach ($installed as $i) { + if (($i['name'] == $addon) && ($i['timestamp'] != $t)) { - Logger::notice("Addon {addon}: {action}", ['action' => 'reload', 'addon' => $i['name']]); - @include_once($fname); + Logger::notice("Addon {addon}: {action}", ['action' => 'reload', 'addon' => $i['name']]); + @include_once($fname); - if (function_exists($addon . '_uninstall')) { - $func = $addon . '_uninstall'; - $func(DI::app()); - } - if (function_exists($addon . '_install')) { - $func = $addon . '_install'; - $func(DI::app()); - } - DBA::update('addon', ['timestamp' => $t], ['id' => $i['id']]); + if (function_exists($addon . '_uninstall')) { + $func = $addon . '_uninstall'; + $func(DI::app()); } + if (function_exists($addon . '_install')) { + $func = $addon . '_install'; + $func(DI::app()); + } + DBA::update('addon', ['timestamp' => $t], ['id' => $i['id']]); } } } @@ -357,16 +325,6 @@ class Addon return self::$addons; } - /** - * Saves the current enabled addon list in the system.addon config key - * - * @return boolean - */ - public static function saveEnabledList() - { - return DI::config()->set('system', 'addon', implode(',', self::$addons)); - } - /** * Returns the list of non-hidden enabled addon names * diff --git a/src/Model/Nodeinfo.php b/src/Model/Nodeinfo.php index d396415531..d2e168fa59 100644 --- a/src/Model/Nodeinfo.php +++ b/src/Model/Nodeinfo.php @@ -43,20 +43,7 @@ class Nodeinfo // If the addon 'statistics_json' is enabled then disable it and activate nodeinfo. if (Addon::isEnabled('statistics_json')) { $config->set('system', 'nodeinfo', true); - - $addon = 'statistics_json'; - $addons = $config->get('system', 'addon'); - - if ($addons) { - $addons_arr = explode(',', str_replace(' ', '', $addons)); - - $idx = array_search($addon, $addons_arr); - if ($idx !== false) { - unset($addons_arr[$idx]); - Addon::uninstall($addon); - $config->set('system', 'addon', implode(', ', $addons_arr)); - } - } + Addon::uninstall('statistics_json'); } if (empty($config->get('system', 'nodeinfo'))) { diff --git a/src/Module/Admin/Addons/Details.php b/src/Module/Admin/Addons/Details.php index dba2f061ce..8e0e14f22b 100644 --- a/src/Module/Admin/Addons/Details.php +++ b/src/Module/Admin/Addons/Details.php @@ -84,8 +84,6 @@ class Details extends BaseAdmin info(DI::l10n()->t('Addon %s enabled.', $addon)); } - Addon::saveEnabledList(); - DI::baseUrl()->redirect('admin/addons/' . $addon); } diff --git a/update.php b/update.php index 314b166e72..107368ea0f 100644 --- a/update.php +++ b/update.php @@ -92,23 +92,10 @@ function update_1191() DI::config()->set('system', 'maintenance', 1); if (Addon::isEnabled('forumlist')) { - $addon = 'forumlist'; - $addons = DI::config()->get('system', 'addon'); - $addons_arr = []; - - if ($addons) { - $addons_arr = explode(",", str_replace(" ", "", $addons)); - - $idx = array_search($addon, $addons_arr); - if ($idx !== false) { - unset($addons_arr[$idx]); - //delete forumlist manually from addon and hook table - // since Addon::uninstall() don't work here - q("DELETE FROM `addon` WHERE `name` = 'forumlist' "); - q("DELETE FROM `hook` WHERE `file` = 'addon/forumlist/forumlist.php' "); - DI::config()->set('system', 'addon', implode(", ", $addons_arr)); - } - } + //delete forumlist manually from addon and hook table + // since Addon::uninstall() don't work here + DBA::delete('addon', ['name' => 'forumlist']); + DBA::delete('hook', ['file' => 'addon/forumlist/forumlist.php']); } // select old formlist addon entries From d4480ae4bed21784a6f8205d70db13cd32fa2950 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 10 Mar 2020 13:13:43 +0000 Subject: [PATCH 2/3] Simplified code --- src/Core/Addon.php | 56 +++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 35 deletions(-) diff --git a/src/Core/Addon.php b/src/Core/Addon.php index 3dd28af44b..dd229be287 100644 --- a/src/Core/Addon.php +++ b/src/Core/Addon.php @@ -113,13 +113,7 @@ class Addon public static function loadAddons() { $installed_addons = DBA::selectToArray('addon', ['name'], ['installed' => true]); - - $addons_arr = []; - foreach ($installed_addons as $addon) { - $addons_arr[] = $addon['name']; - } - - self::$addons = $addons_arr; + self::$addons = array_column($installed_addons, 'name'); } /** @@ -199,36 +193,28 @@ class Addon */ public static function reload() { - $installed = DBA::selectToArray('addon', [], ['installed' => 1]); + $addons = DBA::selectToArray('addon', [], ['installed' => true]); - $addon_list = []; - foreach ($installed as $addon) { - $addon_list[] = $addon['name']; - } - - foreach ($addon_list as $addon) { - $addon = Strings::sanitizeFilePathItem(trim($addon)); - $fname = 'addon/' . $addon . '/' . $addon . '.php'; - if (file_exists($fname)) { - $t = @filemtime($fname); - foreach ($installed as $i) { - if (($i['name'] == $addon) && ($i['timestamp'] != $t)) { - - Logger::notice("Addon {addon}: {action}", ['action' => 'reload', 'addon' => $i['name']]); - @include_once($fname); - - if (function_exists($addon . '_uninstall')) { - $func = $addon . '_uninstall'; - $func(DI::app()); - } - if (function_exists($addon . '_install')) { - $func = $addon . '_install'; - $func(DI::app()); - } - DBA::update('addon', ['timestamp' => $t], ['id' => $i['id']]); - } - } + foreach ($addons as $addon) { + $addonname = Strings::sanitizeFilePathItem(trim($addon['name'])); + $fname = 'addon/' . $addonname . '/' . $addonname . '.php'; + $t = @filemtime($fname); + if (!file_exists($fname) || ($addon['timestamp'] == $t)) { + continue; } + + Logger::notice("Addon {addon}: {action}", ['action' => 'reload', 'addon' => $addon['name']]); + @include_once($fname); + + if (function_exists($addonname . '_uninstall')) { + $func = $addonname . '_uninstall'; + $func(DI::app()); + } + if (function_exists($addonname . '_install')) { + $func = $addonname . '_install'; + $func(DI::app()); + } + DBA::update('addon', ['timestamp' => $t], ['id' => $addon['id']]); } } From a0f0558fec963b7e9a17d9d7a288559c73dd5fa4 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 10 Mar 2020 20:00:44 +0000 Subject: [PATCH 3/3] Use the uninstall function --- update.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/update.php b/update.php index 107368ea0f..82b184c9f4 100644 --- a/update.php +++ b/update.php @@ -92,10 +92,7 @@ function update_1191() DI::config()->set('system', 'maintenance', 1); if (Addon::isEnabled('forumlist')) { - //delete forumlist manually from addon and hook table - // since Addon::uninstall() don't work here - DBA::delete('addon', ['name' => 'forumlist']); - DBA::delete('hook', ['file' => 'addon/forumlist/forumlist.php']); + Addon::uninstall('forumlist'); } // select old formlist addon entries