diff --git a/src/script.php b/src/script.php index 94e90b32..481deb61 100644 --- a/src/script.php +++ b/src/script.php @@ -34,8 +34,9 @@ class Pkg_MokowaasInstallerScript */ public function postflight($type, $parent) { - // Remove legacy extensions from before the package rewrite + // Remove legacy and retired extensions $this->cleanupLegacyExtensions(); + $this->removeRetiredExtensions(); $this->enablePlugin('system', 'mokowaas'); $this->enablePlugin('system', 'mokowaas_firewall'); @@ -125,6 +126,84 @@ class Pkg_MokowaasInstallerScript } } + /** + * Remove extensions that have been retired and merged into core. + * + * plg_system_mokowaas_monitor was merged into the core plugin in 02.32.00. + * Health monitoring is now built into plg_system_mokowaas directly. + * + * @return void + * + * @since 02.32.00 + */ + private function removeRetiredExtensions(): void + { + $retired = [ + ['type' => 'plugin', 'folder' => 'system', 'element' => 'mokowaas_monitor'], + ]; + + try + { + $db = Factory::getDbo(); + + foreach ($retired as $ext) + { + // Check if installed + $query = $db->getQuery(true) + ->select($db->quoteName('extension_id')) + ->from($db->quoteName('#__extensions')) + ->where($db->quoteName('type') . ' = ' . $db->quote($ext['type'])) + ->where($db->quoteName('folder') . ' = ' . $db->quote($ext['folder'])) + ->where($db->quoteName('element') . ' = ' . $db->quote($ext['element'])); + $db->setQuery($query); + $extId = (int) $db->loadResult(); + + if (!$extId) + { + continue; + } + + // Unprotect so Joomla allows removal + $db->setQuery( + $db->getQuery(true) + ->update($db->quoteName('#__extensions')) + ->set($db->quoteName('protected') . ' = 0') + ->where($db->quoteName('extension_id') . ' = ' . $extId) + )->execute(); + + // Remove extension record + $db->setQuery( + $db->getQuery(true) + ->delete($db->quoteName('#__extensions')) + ->where($db->quoteName('extension_id') . ' = ' . $extId) + )->execute(); + + // Remove files + $dir = JPATH_PLUGINS . '/' . $ext['folder'] . '/' . $ext['element']; + + if (is_dir($dir)) + { + $this->rmdirRecursive($dir); + } + + Factory::getApplication()->enqueueMessage( + sprintf('Removed retired extension: %s/%s', $ext['folder'], $ext['element']), + 'message' + ); + + Log::add( + sprintf('Removed retired extension %s/%s (ID %d)', $ext['folder'], $ext['element'], $extId), + Log::INFO, + 'mokowaas' + ); + } + } + catch (\Throwable $e) + { + Log::add('Retired extension cleanup error: ' . $e->getMessage(), Log::WARNING, 'mokowaas'); + } + } + /** * Recursively remove a directory. *