diff --git a/administrator/components/com_joomlaupdate/joomlaupdate.xml b/administrator/components/com_joomlaupdate/joomlaupdate.xml index 6c57c2fbb43ef..1a793bac57c43 100644 --- a/administrator/components/com_joomlaupdate/joomlaupdate.xml +++ b/administrator/components/com_joomlaupdate/joomlaupdate.xml @@ -2,13 +2,14 @@ com_joomlaupdate Joomla! Project - 2021-08 + 2024-06 (C) 2012 Open Source Matters, Inc. GNU General Public License version 2 or later; see LICENSE.txt admin@joomla.org www.joomla.org - 4.0.3 + 5.1.2 COM_JOOMLAUPDATE_XML_DESCRIPTION + script.php Joomla\Component\Joomlaupdate js diff --git a/administrator/components/com_joomlaupdate/script.php b/administrator/components/com_joomlaupdate/script.php new file mode 100644 index 0000000000000..f21941ec56e62 --- /dev/null +++ b/administrator/components/com_joomlaupdate/script.php @@ -0,0 +1,126 @@ + + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +use Joomla\CMS\Application\AdministratorApplication; +use Joomla\CMS\Component\ComponentHelper; +use Joomla\CMS\Installer\InstallerAdapter; +use Joomla\CMS\Installer\InstallerScriptInterface; +use Joomla\CMS\Language\Text; +use Joomla\Database\DatabaseInterface; +use Joomla\DI\Container; +use Joomla\DI\ServiceProviderInterface; + +// phpcs:disable PSR1.Files.SideEffects +\defined('_JEXEC') or die; +// phpcs:enable PSR1.Files.SideEffects + +/** + * Joomla Update Component installer script. + * + * @since __DEPLOY_VERSION__ + * + * @deprecated 5.1.2 will be removed in 6.0 + */ +return new class () implements ServiceProviderInterface { + public function register(Container $container) + { + $container->set( + InstallerScriptInterface::class, + new class ( + $container->get(AdministratorApplication::class), + $container->get(DatabaseInterface::class) + ) implements InstallerScriptInterface { + private AdministratorApplication $app; + private DatabaseInterface $db; + + public function __construct(AdministratorApplication $app, DatabaseInterface $db) + { + $this->app = $app; + $this->db = $db; + } + + public function install(InstallerAdapter $parent): bool + { + return true; + } + + public function update(InstallerAdapter $parent): bool + { + $parent->loadLanguage(JPATH_ADMINISTRATOR . '/languages'); + + // Reset update source from "next" to "default" + try { + $dbChanged = $this->resetUpdateSource(); + } catch (\Throwable $e) { + $this->app->enqueueMessage(Text::_('COM_JOOMLAUPDATE_SCRIPT_CHANGE_UPDATE_SOURCE_FAILED'), 'warning'); + + $dbChanged = false; + } + + // Show message if update source changed + if ($dbChanged) { + $this->app->enqueueMessage(Text::_('COM_JOOMLAUPDATE_SCRIPT_CHANGE_UPDATE_SOURCE_OK'), 'notice'); + } + + return true; + } + + public function uninstall(InstallerAdapter $parent): bool + { + return true; + } + + public function preflight(string $type, InstallerAdapter $parent): bool + { + return true; + } + + public function postflight(string $type, InstallerAdapter $parent): bool + { + return true; + } + + /** + * Reset update source from "next" to "default" + * + * @return boolean true if update source is reset, false if not + * + * @since __DEPLOY_VERSION__ + * @throws \RuntimeException + */ + private function resetUpdateSource() + { + // Get current update source + $params = ComponentHelper::getParams('com_joomlaupdate'); + + // Do nothing if not "next" + if ($params->get('updatesource', 'default') !== 'next') { + return false; + } + + $params->set('updatesource', 'default'); + + $params = $params->toString(); + $query = $this->db->getQuery(true) + ->update($this->db->quoteName('#__extensions')) + ->set($this->db->quoteName('params') . ' = :params') + ->where($this->db->quoteName('type') . ' = ' . $this->db->quote('component')) + ->where($this->db->quoteName('element') . ' = ' . $this->db->quote('com_joomlaupdate')) + ->bind(':params', $params); + + $this->db->setQuery($query); + $this->db->execute(); + + return true; + } + } + ); + } +}; diff --git a/administrator/components/com_joomlaupdate/src/Controller/DisplayController.php b/administrator/components/com_joomlaupdate/src/Controller/DisplayController.php index b03b7d6dc31eb..dba5f257ae347 100644 --- a/administrator/components/com_joomlaupdate/src/Controller/DisplayController.php +++ b/administrator/components/com_joomlaupdate/src/Controller/DisplayController.php @@ -71,6 +71,7 @@ public function display($cachable = false, $urlparams = false) $state = $model->getState(); $state->set('update_finished_with_error', $this->app->getUserState('com_joomlaupdate.update_finished_with_error')); $state->set('update_errors', (array) $this->app->getUserState('com_joomlaupdate.update_errors', [])); + $state->set('update_channel_reset', $this->app->getUserState('com_joomlaupdate.update_channel_reset')); $state->set('installer_message', $this->app->getUserState('com_joomlaupdate.installer_message')); $state->set('log_file', $this->app->get('log_path') . '/joomla_update.php'); } diff --git a/administrator/components/com_joomlaupdate/src/Controller/UpdateController.php b/administrator/components/com_joomlaupdate/src/Controller/UpdateController.php index 727f4edd9e9c3..c04fc78ce17c2 100644 --- a/administrator/components/com_joomlaupdate/src/Controller/UpdateController.php +++ b/administrator/components/com_joomlaupdate/src/Controller/UpdateController.php @@ -156,6 +156,15 @@ public function finalise() $model->collectError('finaliseUpgrade', $e); } + try { + $updateSourceChanged = $model->resetUpdateSource(); + } catch (\Throwable $e) { + $model->collectError('resetUpdateSource', $e); + $updateSourceChanged = null; + } + + $this->app->setUserState('com_joomlaupdate.update_channel_reset', $updateSourceChanged); + // Check for update errors if ($model->getErrors()) { // The errors already should be logged at this point diff --git a/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php b/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php index b28ed81f2c716..17a657d18f204 100644 --- a/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php +++ b/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php @@ -2027,4 +2027,39 @@ private function checkManifestXML(string $manifest, $packageName) throw new \RuntimeException(Text::sprintf('COM_JOOMLAUPDATE_VIEW_UPLOAD_ERROR_DOWNGRADE', $packageName, $versionPackage, $currentVersion), 500); } } + + /** + * Reset update source from "next" to "default" + * + * @return boolean true if update source is reset, false if not + * + * @since __DEPLOY_VERSION__ + * @throws \RuntimeException + */ + public function resetUpdateSource() + { + // Get current update source + $params = ComponentHelper::getParams('com_joomlaupdate'); + + // Do nothing if not "next" + if ($params->get('updatesource', 'default') !== 'next') { + return false; + } + + $params->set('updatesource', 'default'); + + $params = $params->toString(); + $db = $this->getDatabase(); + $query = $db->getQuery(true) + ->update($db->quoteName('#__extensions')) + ->set($db->quoteName('params') . ' = :params') + ->where($db->quoteName('type') . ' = ' . $db->quote('component')) + ->where($db->quoteName('element') . ' = ' . $db->quote('com_joomlaupdate')) + ->bind(':params', $params); + + $db->setQuery($query); + $db->execute(); + + return true; + } } diff --git a/administrator/components/com_joomlaupdate/tmpl/joomlaupdate/complete.php b/administrator/components/com_joomlaupdate/tmpl/joomlaupdate/complete.php index 53b17ccf0fc6c..444e51d12bb07 100644 --- a/administrator/components/com_joomlaupdate/tmpl/joomlaupdate/complete.php +++ b/administrator/components/com_joomlaupdate/tmpl/joomlaupdate/complete.php @@ -19,6 +19,7 @@ $hadErrors = $this->state->get('update_finished_with_error'); $errors = $this->state->get('update_errors'); +$channelReset = $this->state->get('update_channel_reset'); $logFile = $this->state->get('log_file'); $installerMsg = $this->state->get('installer_message'); $forumLink = 'https://forum.joomla.org/'; @@ -27,6 +28,17 @@

+ +
+ + +
+ +
+ + +
+
diff --git a/administrator/language/en-GB/com_joomlaupdate.ini b/administrator/language/en-GB/com_joomlaupdate.ini index 5902c52891851..497cf98b92df6 100644 --- a/administrator/language/en-GB/com_joomlaupdate.ini +++ b/administrator/language/en-GB/com_joomlaupdate.ini @@ -69,6 +69,8 @@ COM_JOOMLAUPDATE_SELF_EMPTYSTATE_CONTENT="You must update this component first b COM_JOOMLAUPDATE_SELF_EMPTYSTATE_TITLE="A new version of the Joomla Update Component is available" COM_JOOMLAUPDATE_SYSTEM_CHECK="System Check" COM_JOOMLAUPDATE_TOOLBAR_CHECK="Check for Updates" +COM_JOOMLAUPDATE_UPDATE_CHANGE_UPDATE_SOURCE_FAILED="Failed to reset the update channel from \"%1$s\" to \"%2$s\". Please change it in the Joomla Update Component's options so you don't miss future updates." +COM_JOOMLAUPDATE_UPDATE_CHANGE_UPDATE_SOURCE_OK="The update channel has been reset from \"%1$s\" to \"%2$s\"." COM_JOOMLAUPDATE_UPDATE_CHECK="Update Check" COM_JOOMLAUPDATE_UPDATE_CONFIRM_BACKUP="I'm aware that a backup before any update is highly recommended." COM_JOOMLAUPDATE_UPDATE_EMPTYSTATE_TITLE="Update your site to \"Joomla! %s\"" diff --git a/administrator/language/en-GB/com_joomlaupdate.sys.ini b/administrator/language/en-GB/com_joomlaupdate.sys.ini index 42b51de9d9608..62a0864341003 100644 --- a/administrator/language/en-GB/com_joomlaupdate.sys.ini +++ b/administrator/language/en-GB/com_joomlaupdate.sys.ini @@ -8,3 +8,7 @@ COM_JOOMLAUPDATE_DEFAULT_VIEW_DEFAULT_DESC="Check for Joomla! updates and update COM_JOOMLAUPDATE_DEFAULT_VIEW_DEFAULT_TITLE="View Joomla! Updates" COM_JOOMLAUPDATE_JOOMLAUPDATE_VIEW_DISPLAY_BADGE="Display Badge" COM_JOOMLAUPDATE_XML_DESCRIPTION="One-click update to the latest Joomla release." + +; The following two strings are deprecated and will be removed with 6.0. +COM_JOOMLAUPDATE_SCRIPT_CHANGE_UPDATE_SOURCE_FAILED="Failed to reset the update channel from \"Joomla Next\" to \"Default\". Please change it in the Joomla Update Component's options so you don't miss future updates." +COM_JOOMLAUPDATE_SCRIPT_CHANGE_UPDATE_SOURCE_OK="The update channel has been reset from \"Joomla Next\" to \"Default\"."