From e415e701cd74e58f7ed05c6b6e300b2fb9537a48 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Tue, 23 Jun 2026 11:49:21 -0500 Subject: [PATCH] fix: resolve [site_name] and other placeholders in checkDir AJAX BackupDirectory::resolve() only handles [HOME] and [DEFAULT_DIR]. The checkDir AJAX endpoint now uses PlaceholderResolver to also resolve [site_name], [host], [profile_id], [date], etc. before checking if the directory exists. This makes the "Resolves to" display accurate for all placeholder types. --- .../src/Controller/AjaxController.php | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/source/packages/com_mokosuitebackup/src/Controller/AjaxController.php b/source/packages/com_mokosuitebackup/src/Controller/AjaxController.php index 71f33ae..2868376 100644 --- a/source/packages/com_mokosuitebackup/src/Controller/AjaxController.php +++ b/source/packages/com_mokosuitebackup/src/Controller/AjaxController.php @@ -15,8 +15,10 @@ namespace Joomla\Component\MokoSuiteBackup\Administrator\Controller; defined('_JEXEC') or die; +use Joomla\CMS\Factory; use Joomla\CMS\MVC\Controller\BaseController; use Joomla\CMS\Session\Session; +use Joomla\Component\MokoSuiteBackup\Administrator\Engine\PlaceholderResolver; use Joomla\Component\MokoSuiteBackup\Administrator\Engine\SteppedBackupEngine; use Joomla\Component\MokoSuiteBackup\Administrator\Engine\SteppedRestoreEngine; use Joomla\Component\MokoSuiteBackup\Administrator\Utility\BackupDirectory; @@ -283,7 +285,32 @@ class AjaxController extends BaseController return; } - $resolved = BackupDirectory::resolve($rawPath); + /* Resolve all placeholders — both directory ([HOME], [DEFAULT_DIR]) + and name-level ([site_name], [host], [profile_id], etc.) */ + $profileId = $this->input->getInt('profile_id', 0); + + if ($profileId > 0) { + $db = Factory::getDbo(); + $query = $db->getQuery(true) + ->select('*') + ->from($db->quoteName('#__mokosuitebackup_profiles')) + ->where($db->quoteName('id') . ' = ' . $profileId); + $db->setQuery($query); + $profile = $db->loadObject(); + } + + if (empty($profile)) { + /* No profile context — create a minimal dummy for PlaceholderResolver */ + $profile = (object) [ + 'id' => 1, + 'title' => 'default', + 'backup_type' => 'full', + ]; + } + + $resolver = new PlaceholderResolver($profile); + $withNamePlaceholders = $resolver->resolve($rawPath); + $resolved = BackupDirectory::resolve($withNamePlaceholders); if (BackupDirectory::hasPlaceholders($resolved)) { $this->sendJson([