From edc66d3404a69eae2bd36d2d5135a81e6ecb4744 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Tue, 21 Apr 2026 17:06:10 -0500 Subject: [PATCH] feat: unlock MokoCassiopeia + lock MokoOnyx during migration Co-Authored-By: Claude Opus 4.6 (1M context) --- src/helper/migrate.php | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/helper/migrate.php b/src/helper/migrate.php index 3a50936..b57d956 100644 --- a/src/helper/migrate.php +++ b/src/helper/migrate.php @@ -251,6 +251,36 @@ use Joomla\CMS\Log\Log; $log('Update server redirect failed: ' . $e->getMessage(), Log::WARNING); } + // Unlock MokoCassiopeia (allow uninstall) + lock MokoOnyx (prevent accidental uninstall) + try { + $query = $db->getQuery(true) + ->update('#__extensions') + ->set($db->quoteName('locked') . ' = 0') + ->set($db->quoteName('protected') . ' = 0') + ->where($db->quoteName('element') . ' = ' . $db->quote($oldName)) + ->where($db->quoteName('type') . ' = ' . $db->quote('template')); + $db->setQuery($query)->execute(); + if ($db->getAffectedRows() > 0) { + $log('Unlocked MokoCassiopeia (can be uninstalled).'); + } + } catch (\Throwable $e) { + $log('Failed to unlock MokoCassiopeia: ' . $e->getMessage(), Log::WARNING); + } + + try { + $query = $db->getQuery(true) + ->update('#__extensions') + ->set($db->quoteName('locked') . ' = 1') + ->where($db->quoteName('element') . ' = ' . $db->quote($newName)) + ->where($db->quoteName('type') . ' = ' . $db->quote('template')); + $db->setQuery($query)->execute(); + if ($db->getAffectedRows() > 0) { + $log('Locked MokoOnyx (protected from uninstall).'); + } + } catch (\Throwable $e) { + $log('Failed to lock MokoOnyx: ' . $e->getMessage(), Log::WARNING); + } + // Write marker file @file_put_contents($markerFile, date('Y-m-d H:i:s') . " migrated {$oldName} → {$newName}");