From b1b21e79d8051b4bb2eea7ad5fc86887ab3d6e1f Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Sat, 23 May 2026 22:22:55 +0000 Subject: [PATCH 01/10] chore: sync updates.xml 02.01.42 from main [skip ci] --- updates.xml | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 4 deletions(-) diff --git a/updates.xml b/updates.xml index 1c72c3b..616e884 100644 --- a/updates.xml +++ b/updates.xml @@ -1,7 +1,7 @@ @@ -10,15 +10,87 @@ System - MokoWaaS update mokowaas plugin - 02.01.41-dev + 02.01.42-dev site system development https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/development - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/development/plg_system_mokowaas-02.01.41-dev.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/development/plg_system_mokowaas-02.01.42-dev.zip - 145f2ebaf62b74e439284d371926ae251866c6fbdb24d1fc5a0b90ac174a4ae8 + 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 + + Moko Consulting + https://mokoconsulting.tech + + + System - MokoWaaS + System - MokoWaaS update + mokowaas + plugin + 02.01.42-alpha + site + system + alpha + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/alpha + + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/alpha/plg_system_mokowaas-02.01.42-alpha.zip + + 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 + + Moko Consulting + https://mokoconsulting.tech + + + System - MokoWaaS + System - MokoWaaS update + mokowaas + plugin + 02.01.42-beta + site + system + beta + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/beta + + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/beta/plg_system_mokowaas-02.01.42-beta.zip + + 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 + + Moko Consulting + https://mokoconsulting.tech + + + System - MokoWaaS + System - MokoWaaS update + mokowaas + plugin + 02.01.42-rc + site + system + rc + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/rc + + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/rc/plg_system_mokowaas-02.01.42-rc.zip + + 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 + + Moko Consulting + https://mokoconsulting.tech + + + System - MokoWaaS + System - MokoWaaS update + mokowaas + plugin + 02.01.42 + site + system + stable + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/stable + + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/stable/plg_system_mokowaas-02.01.42.zip + + 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 Moko Consulting https://mokoconsulting.tech From d2700f96fe1895c2d62fdb9f7471eee502c3b4b5 Mon Sep 17 00:00:00 2001 From: Jonathan Miller <1+jmiller@noreply.git.mokoconsulting.tech> Date: Sat, 23 May 2026 22:25:01 +0000 Subject: [PATCH 02/10] chore: stable 02.01.42 [skip ci] From 03e0b6d13b686d22d076df1b17a1ec46dd5dc45c Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 23 May 2026 17:29:52 -0500 Subject: [PATCH 03/10] fix: accept any 200 status from heartbeat (registered/updated/ok) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The receiver returns 'updated' when re-registering an existing site, but the code only accepted 'registered', causing false 'HTTP 200 — Unknown' warnings. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/Extension/MokoWaaS.php | 8 +++++--- src/script.php | 7 ++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Extension/MokoWaaS.php b/src/Extension/MokoWaaS.php index 3ec8e85..628bf69 100644 --- a/src/Extension/MokoWaaS.php +++ b/src/Extension/MokoWaaS.php @@ -2650,16 +2650,18 @@ class MokoWaaS extends CMSPlugin $app->enqueueMessage('Grafana heartbeat failed (' . $siteUrl . '): ' . $error, 'warning'); Log::add('Heartbeat failed: ' . $error, Log::WARNING, 'mokowaas'); } - elseif ($code === 200 && ($body['status'] ?? '') === 'registered') + elseif ($code === 200) { + $status = $body['status'] ?? 'ok'; $app->enqueueMessage( - 'Grafana heartbeat: ' . $siteUrl . ' registered (' . ($body['ds_uid'] ?? '') . ')', + 'Grafana heartbeat: ' . $siteUrl . ' ' . $status . ' (' . ($body['ds_uid'] ?? '') . ')', 'message' ); } else { - $msg = sprintf('Grafana heartbeat failed (%s): HTTP %d', $siteUrl, $code); + $msg = sprintf('Grafana heartbeat failed (%s): HTTP %d — %s', + $siteUrl, $code, $body['error'] ?? $body['message'] ?? 'Unknown'); $app->enqueueMessage($msg, 'warning'); Log::add($msg, Log::WARNING, 'mokowaas'); } diff --git a/src/script.php b/src/script.php index d18f6de..bd4cd4a 100644 --- a/src/script.php +++ b/src/script.php @@ -829,17 +829,18 @@ class plgSystemMokoWaaSInstallerScript implements InstallerScriptInterface $app->enqueueMessage('Grafana heartbeat failed: ' . $error, 'warning'); Log::add('Heartbeat failed: ' . $error, Log::WARNING, 'mokowaas'); } - elseif ($code === 200 && ($body['status'] ?? '') === 'registered') + elseif ($code === 200) { + $status = $body['status'] ?? 'ok'; $app->enqueueMessage( - 'Grafana heartbeat: site registered (' . ($body['ds_uid'] ?? '') . ')', + 'Grafana heartbeat: ' . $status . ' (' . ($body['ds_uid'] ?? '') . ')', 'message' ); } else { $msg = sprintf('Grafana heartbeat failed: HTTP %d — %s', - $code, $body['error'] ?? 'Unknown'); + $code, $body['error'] ?? $body['message'] ?? 'Unknown'); $app->enqueueMessage($msg, 'warning'); Log::add($msg, Log::WARNING, 'mokowaas'); } From b32d91c4461652b4dc7f06ce1f1a31a305c0000c Mon Sep 17 00:00:00 2001 From: "gitea-actions[bot]" Date: Sat, 23 May 2026 22:58:02 +0000 Subject: [PATCH 04/10] chore(version): bump to 02.01.42 [skip ci] --- README.md | 2 +- src/mokowaas.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6c2b1d9..ca91c96 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ DEFGROUP: Joomla.Plugin INGROUP: MokoWaaS REPO: https://github.com/mokoconsulting-tech/mokowaas - VERSION: 02.01.41 + VERSION: 02.01.42 PATH: /README.md BRIEF: Rebranding plugin for MokoWaaS platform NOTE: Internal WaaS identity abstraction layer diff --git a/src/mokowaas.xml b/src/mokowaas.xml index 75b610c..0e00fa9 100644 --- a/src/mokowaas.xml +++ b/src/mokowaas.xml @@ -30,7 +30,7 @@ GNU General Public License version 3 or later; see LICENSE.md hello@mokoconsulting.tech https://mokoconsulting.tech - 02.01.41 + 02.01.42 This plugin rebrands the Joomla system interface with MokoWaaS identity. It applies language overrides and ensures consistent branding across the platform. Moko\Plugin\System\MokoWaaS script.php From 14e94518ba73843d7a53d278df30c684351f380f Mon Sep 17 00:00:00 2001 From: "gitea-actions[bot]" Date: Sat, 23 May 2026 22:58:03 +0000 Subject: [PATCH 05/10] chore: update development channel 02.01.42 [skip ci] --- updates.xml | 76 ++--------------------------------------------------- 1 file changed, 2 insertions(+), 74 deletions(-) diff --git a/updates.xml b/updates.xml index 616e884..badadc4 100644 --- a/updates.xml +++ b/updates.xml @@ -1,7 +1,7 @@ @@ -18,79 +18,7 @@ https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/development/plg_system_mokowaas-02.01.42-dev.zip - 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 - - Moko Consulting - https://mokoconsulting.tech - - - System - MokoWaaS - System - MokoWaaS update - mokowaas - plugin - 02.01.42-alpha - site - system - alpha - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/alpha - - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/alpha/plg_system_mokowaas-02.01.42-alpha.zip - - 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 - - Moko Consulting - https://mokoconsulting.tech - - - System - MokoWaaS - System - MokoWaaS update - mokowaas - plugin - 02.01.42-beta - site - system - beta - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/beta - - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/beta/plg_system_mokowaas-02.01.42-beta.zip - - 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 - - Moko Consulting - https://mokoconsulting.tech - - - System - MokoWaaS - System - MokoWaaS update - mokowaas - plugin - 02.01.42-rc - site - system - rc - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/rc - - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/rc/plg_system_mokowaas-02.01.42-rc.zip - - 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 - - Moko Consulting - https://mokoconsulting.tech - - - System - MokoWaaS - System - MokoWaaS update - mokowaas - plugin - 02.01.42 - site - system - stable - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/stable - - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/stable/plg_system_mokowaas-02.01.42.zip - - 10810b2c938d35d0b867e64b49b4a02bcbbc6160d13298433612152563dcf936 + 9020dfaa00d682a18a2c1ea02e6d8052ce92ac63d3dd7c95b0c118569bc8c18d Moko Consulting https://mokoconsulting.tech From a92c1ce772dfecf4df42aeb20bd894be2c413d5a Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 23 May 2026 18:10:11 -0500 Subject: [PATCH 06/10] feat: site aliases tab with per-alias offline, robots, and backend redirect Move site aliases from a comma-separated text field in Diagnostics to its own tab using Joomla's subform repeatable-table layout. Each alias entry now supports: domain, offline toggle with custom message, robots meta directive, and backend redirect to primary domain. Frontend stays on the alias domain while admin requests can be redirected to the primary. Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) --- src/Extension/MokoWaaS.php | 175 ++++++++++++++++++++- src/forms/alias_entry.xml | 55 +++++++ src/language/en-GB/plg_system_mokowaas.ini | 17 +- src/language/en-US/plg_system_mokowaas.ini | 17 +- src/mokowaas.xml | 24 ++- 5 files changed, 269 insertions(+), 19 deletions(-) create mode 100644 src/forms/alias_entry.xml diff --git a/src/Extension/MokoWaaS.php b/src/Extension/MokoWaaS.php index 628bf69..9be7366 100644 --- a/src/Extension/MokoWaaS.php +++ b/src/Extension/MokoWaaS.php @@ -96,6 +96,9 @@ class MokoWaaS extends CMSPlugin // Security: HTTPS redirect (runs for all clients) $this->enforceHttps(); + // Site alias handling: offline page and backend redirect + $this->handleSiteAlias(); + // MokoWaaS API endpoints (run before routing) $mokoAction = $this->app->input->get('mokowaas', ''); @@ -880,14 +883,20 @@ class MokoWaaS extends CMSPlugin */ public function onBeforeCompileHead() { - if (!$this->app->isClient('administrator')) + $doc = $this->app->getDocument(); + + if ($doc->getType() !== 'html') { return; } - $doc = $this->app->getDocument(); + // Inject robots meta tag for alias domains (frontend only) + if ($this->app->isClient('site')) + { + $this->injectAliasRobots($doc); + } - if ($doc->getType() !== 'html') + if (!$this->app->isClient('administrator')) { return; } @@ -2559,6 +2568,142 @@ class MokoWaaS extends CMSPlugin } } + // ------------------------------------------------------------------ + // Site Alias handling + // ------------------------------------------------------------------ + + /** + * Get the alias configuration for the current request domain, if any. + * + * @return object|null Alias entry object or null if not an alias domain + * + * @since 02.01.43 + */ + protected function getCurrentAlias() + { + $currentHost = $_SERVER['HTTP_HOST'] ?? ''; + $primaryHost = parse_url(Uri::root(), PHP_URL_HOST); + + if (empty($currentHost) || strcasecmp($currentHost, $primaryHost) === 0) + { + return null; + } + + $aliases = $this->params->get('site_aliases', ''); + + if (empty($aliases)) + { + return null; + } + + // Subform returns JSON string or array + if (is_string($aliases)) + { + $aliases = json_decode($aliases, false); + } + + if (!is_array($aliases)) + { + return null; + } + + foreach ($aliases as $alias) + { + $alias = (object) $alias; + + if (isset($alias->domain) && strcasecmp(trim($alias->domain), $currentHost) === 0) + { + return $alias; + } + } + + return null; + } + + /** + * Handle site alias logic: offline page and backend redirect. + * + * Runs early in onAfterInitialise before routing occurs. + * + * @return void + * + * @since 02.01.43 + */ + protected function handleSiteAlias() + { + $alias = $this->getCurrentAlias(); + + if ($alias === null) + { + return; + } + + // Backend redirect: send admin requests to the primary domain + if (!empty($alias->redirect_backend) && $alias->redirect_backend === '1' + && $this->app->isClient('administrator')) + { + $primaryUrl = rtrim(Uri::root(), '/') . '/administrator' . Uri::getInstance()->toString(['path', 'query']); + $adminPath = str_replace(Uri::root() . 'administrator', '', Uri::getInstance()->toString(['path', 'query'])); + $primaryUrl = rtrim(Uri::root(), '/') . '/administrator' . $adminPath; + + $this->app->redirect($primaryUrl, 301); + } + + // Offline: show maintenance page for frontend requests + if (!empty($alias->offline) && $alias->offline === '1' + && $this->app->isClient('site')) + { + // Allow health API to still respond + if ($this->app->input->get('mokowaas', '') !== '') + { + return; + } + + $message = $alias->offline_message ?? 'This site is currently offline for maintenance.'; + $brandName = $this->params->get('brand_name', 'MokoWaaS'); + + header('HTTP/1.1 503 Service Unavailable'); + header('Retry-After: 3600'); + header('Content-Type: text/html; charset=utf-8'); + echo ''; + echo ''; + echo '' . htmlspecialchars($brandName) . ' - Maintenance'; + echo ''; + echo '
'; + echo '

' . htmlspecialchars($brandName) . '

'; + echo '

' . htmlspecialchars($message) . '

'; + echo '
'; + $this->app->close(); + } + } + + /** + * Inject robots meta tag for alias domains. + * + * @param \Joomla\CMS\Document\HtmlDocument $doc Document object + * + * @return void + * + * @since 02.01.43 + */ + protected function injectAliasRobots($doc) + { + $alias = $this->getCurrentAlias(); + + if ($alias === null) + { + return; + } + + $robots = $alias->robots ?? 'index, follow'; + + if ($robots !== 'index, follow') + { + $doc->setMetaData('robots', $robots); + } + } + // ------------------------------------------------------------------ // Heartbeat (called from onExtensionAfterSave) // ------------------------------------------------------------------ @@ -2591,16 +2736,30 @@ class MokoWaaS extends CMSPlugin // Register primary domain $this->sendHeartbeat($siteUrl, $siteName, $healthToken, $app); - // Register any alias domains + // Register any alias domains (subform format: array of objects with domain key) $aliases = $params->get('site_aliases', ''); if (!empty($aliases)) { - foreach (array_filter(array_map('trim', explode(',', $aliases))) as $alias) + if (is_string($aliases)) { - $aliasUrl = 'https://' . ltrim($alias, 'https://'); - $aliasUrl = rtrim($aliasUrl, '/'); - $this->sendHeartbeat($aliasUrl, $siteName . ' (' . $alias . ')', $healthToken, $app); + $aliases = json_decode($aliases, false); + } + + if (is_array($aliases)) + { + foreach ($aliases as $alias) + { + $alias = (object) $alias; + + if (!empty($alias->domain)) + { + $domain = trim($alias->domain); + $aliasUrl = 'https://' . preg_replace('#^https?://#i', '', $domain); + $aliasUrl = rtrim($aliasUrl, '/'); + $this->sendHeartbeat($aliasUrl, $siteName, $healthToken, $app); + } + } } } } diff --git a/src/forms/alias_entry.xml b/src/forms/alias_entry.xml new file mode 100644 index 0000000..1613b71 --- /dev/null +++ b/src/forms/alias_entry.xml @@ -0,0 +1,55 @@ + +
+ + + + + + + + + + + + + + + + + + diff --git a/src/language/en-GB/plg_system_mokowaas.ini b/src/language/en-GB/plg_system_mokowaas.ini index 348613a..415df26 100644 --- a/src/language/en-GB/plg_system_mokowaas.ini +++ b/src/language/en-GB/plg_system_mokowaas.ini @@ -130,5 +130,18 @@ PLG_SYSTEM_MOKOWAAS_UPLOAD_TYPES_DESC="Comma-separated list of allowed file exte PLG_SYSTEM_MOKOWAAS_UPLOAD_SIZE_LABEL="Max Upload Size (MB)" PLG_SYSTEM_MOKOWAAS_UPLOAD_SIZE_DESC="Maximum file upload size in megabytes." -PLG_SYSTEM_MOKOWAAS_SITE_ALIASES_LABEL="Site Aliases" -PLG_SYSTEM_MOKOWAAS_SITE_ALIASES_DESC="Comma-separated list of additional domains this site is accessible on (e.g. www.example.com,alias.example.com). Each alias gets its own Grafana datasource for health monitoring." +; ===== Site Aliases fieldset ===== +PLG_SYSTEM_MOKOWAAS_FIELDSET_ALIASES_LABEL="Site Aliases" +PLG_SYSTEM_MOKOWAAS_FIELDSET_ALIASES_DESC="Configure additional domains that mirror this site. Each alias can have its own offline status, robots directive, and backend redirect behavior." +PLG_SYSTEM_MOKOWAAS_SITE_ALIASES_LABEL="Domain Aliases" +PLG_SYSTEM_MOKOWAAS_SITE_ALIASES_DESC="Add domain aliases that serve as mirrors of this site. Each alias gets its own Grafana monitoring datasource." +PLG_SYSTEM_MOKOWAAS_ALIAS_DOMAIN_LABEL="Domain" +PLG_SYSTEM_MOKOWAAS_ALIAS_DOMAIN_DESC="The alias domain name (e.g. www.example.com). Do not include https:// prefix." +PLG_SYSTEM_MOKOWAAS_ALIAS_OFFLINE_LABEL="Offline" +PLG_SYSTEM_MOKOWAAS_ALIAS_OFFLINE_DESC="Show an offline maintenance page when visitors access the site through this alias domain." +PLG_SYSTEM_MOKOWAAS_ALIAS_OFFLINE_MSG_LABEL="Offline Message" +PLG_SYSTEM_MOKOWAAS_ALIAS_OFFLINE_MSG_DESC="Custom message to display when this alias is set to offline." +PLG_SYSTEM_MOKOWAAS_ALIAS_ROBOTS_LABEL="Robots" +PLG_SYSTEM_MOKOWAAS_ALIAS_ROBOTS_DESC="Meta robots directive for this alias domain. Use 'noindex, nofollow' to prevent search engines from indexing the alias." +PLG_SYSTEM_MOKOWAAS_ALIAS_REDIRECT_BACKEND_LABEL="Redirect Backend" +PLG_SYSTEM_MOKOWAAS_ALIAS_REDIRECT_BACKEND_DESC="Redirect admin panel requests on this alias to the primary domain. Frontend stays on the alias domain." diff --git a/src/language/en-US/plg_system_mokowaas.ini b/src/language/en-US/plg_system_mokowaas.ini index 28eafa4..62cfa64 100644 --- a/src/language/en-US/plg_system_mokowaas.ini +++ b/src/language/en-US/plg_system_mokowaas.ini @@ -130,5 +130,18 @@ PLG_SYSTEM_MOKOWAAS_UPLOAD_TYPES_DESC="Comma-separated list of allowed file exte PLG_SYSTEM_MOKOWAAS_UPLOAD_SIZE_LABEL="Max Upload Size (MB)" PLG_SYSTEM_MOKOWAAS_UPLOAD_SIZE_DESC="Maximum file upload size in megabytes." -PLG_SYSTEM_MOKOWAAS_SITE_ALIASES_LABEL="Site Aliases" -PLG_SYSTEM_MOKOWAAS_SITE_ALIASES_DESC="Comma-separated list of additional domains this site is accessible on (e.g. www.example.com,alias.example.com). Each alias gets its own Grafana datasource for health monitoring." +; ===== Site Aliases fieldset ===== +PLG_SYSTEM_MOKOWAAS_FIELDSET_ALIASES_LABEL="Site Aliases" +PLG_SYSTEM_MOKOWAAS_FIELDSET_ALIASES_DESC="Configure additional domains that mirror this site. Each alias can have its own offline status, robots directive, and backend redirect behavior." +PLG_SYSTEM_MOKOWAAS_SITE_ALIASES_LABEL="Domain Aliases" +PLG_SYSTEM_MOKOWAAS_SITE_ALIASES_DESC="Add domain aliases that serve as mirrors of this site. Each alias gets its own Grafana monitoring datasource." +PLG_SYSTEM_MOKOWAAS_ALIAS_DOMAIN_LABEL="Domain" +PLG_SYSTEM_MOKOWAAS_ALIAS_DOMAIN_DESC="The alias domain name (e.g. www.example.com). Do not include https:// prefix." +PLG_SYSTEM_MOKOWAAS_ALIAS_OFFLINE_LABEL="Offline" +PLG_SYSTEM_MOKOWAAS_ALIAS_OFFLINE_DESC="Show an offline maintenance page when visitors access the site through this alias domain." +PLG_SYSTEM_MOKOWAAS_ALIAS_OFFLINE_MSG_LABEL="Offline Message" +PLG_SYSTEM_MOKOWAAS_ALIAS_OFFLINE_MSG_DESC="Custom message to display when this alias is set to offline." +PLG_SYSTEM_MOKOWAAS_ALIAS_ROBOTS_LABEL="Robots" +PLG_SYSTEM_MOKOWAAS_ALIAS_ROBOTS_DESC="Meta robots directive for this alias domain. Use 'noindex, nofollow' to prevent search engines from indexing the alias." +PLG_SYSTEM_MOKOWAAS_ALIAS_REDIRECT_BACKEND_LABEL="Redirect Backend" +PLG_SYSTEM_MOKOWAAS_ALIAS_REDIRECT_BACKEND_DESC="Redirect admin panel requests on this alias to the primary domain. Frontend stays on the alias domain." diff --git a/src/mokowaas.xml b/src/mokowaas.xml index 0e00fa9..325629e 100644 --- a/src/mokowaas.xml +++ b/src/mokowaas.xml @@ -44,6 +44,7 @@ script.php Extension Field + forms payload services language @@ -268,6 +269,22 @@ description="PLG_SYSTEM_MOKOWAAS_HIDDEN_MENUS_DESC" rows="5" filter="raw" /> +
+ +
-
Date: Sat, 23 May 2026 23:12:30 +0000 Subject: [PATCH 07/10] chore(version): bump to 02.01.43 [skip ci] --- README.md | 2 +- src/mokowaas.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ca91c96..1eab0c6 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ DEFGROUP: Joomla.Plugin INGROUP: MokoWaaS REPO: https://github.com/mokoconsulting-tech/mokowaas - VERSION: 02.01.42 + VERSION: 02.01.43 PATH: /README.md BRIEF: Rebranding plugin for MokoWaaS platform NOTE: Internal WaaS identity abstraction layer diff --git a/src/mokowaas.xml b/src/mokowaas.xml index 325629e..fe19a47 100644 --- a/src/mokowaas.xml +++ b/src/mokowaas.xml @@ -30,7 +30,7 @@ GNU General Public License version 3 or later; see LICENSE.md hello@mokoconsulting.tech https://mokoconsulting.tech - 02.01.42 + 02.01.43 This plugin rebrands the Joomla system interface with MokoWaaS identity. It applies language overrides and ensures consistent branding across the platform. Moko\Plugin\System\MokoWaaS script.php From 478eb262b9a22f4a2f381d79c1791678415b4cc5 Mon Sep 17 00:00:00 2001 From: "gitea-actions[bot]" Date: Sat, 23 May 2026 23:12:31 +0000 Subject: [PATCH 08/10] chore: update development channel 02.01.43 [skip ci] --- updates.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/updates.xml b/updates.xml index badadc4..bce2c2d 100644 --- a/updates.xml +++ b/updates.xml @@ -1,7 +1,7 @@ @@ -10,15 +10,15 @@ System - MokoWaaS update mokowaas plugin - 02.01.42-dev + 02.01.43-dev site system development https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/tag/development - https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/development/plg_system_mokowaas-02.01.42-dev.zip + https://git.mokoconsulting.tech/MokoConsulting/MokoWaaS/releases/download/development/plg_system_mokowaas-02.01.43-dev.zip - 9020dfaa00d682a18a2c1ea02e6d8052ce92ac63d3dd7c95b0c118569bc8c18d + 1f5c758274e9fa559df225f6ff8134e2b30b06bbfde1289667aaa2c0f0a07500 Moko Consulting https://mokoconsulting.tech From 5360c641e979df8514a2867e53b5ce4478d2ded9 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 23 May 2026 18:33:10 -0500 Subject: [PATCH 09/10] chore: update CHANGELOG and README for 02.01.43 release Authored-by: Moko Consulting Co-Authored-By: Claude Opus 4.6 (1M context) --- CHANGELOG.md | 24 ++++++++++++++++++++++++ README.md | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a836f7a..b81d82b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - License/subscription check - System email template branding (DB approach) +## [02.01.43] - 2026-05-23 + +### Added +- Site Aliases tab with Joomla subform repeatable-table UI +- Per-alias offline toggle with custom maintenance message (503 response) +- Per-alias robots meta directive (index/noindex/follow/nofollow/none) +- Per-alias backend redirect (admin panel redirects to primary domain) +- 6 MokoWaaS API endpoints: health, install, update, cache, backup, info +- Remote plugin install via `/?mokowaas=install` endpoint +- Remote update trigger via `/?mokowaas=update` endpoint +- Remote cache clear via `/?mokowaas=cache` endpoint (site + admin + opcache) +- Remote Akeeba Backup trigger via `/?mokowaas=backup` endpoint +- Compact site info via `/?mokowaas=info` endpoint + +### Changed +- Site aliases moved from comma-separated text field to structured subform +- Each alias now stores domain, offline, offline_message, robots, redirect_backend +- Heartbeat provisioning updated for subform alias format +- Grafana datasource names use domain-only (removed "MokoWaaS - " prefix) + +### Fixed +- Heartbeat receiver accepts any 200 status (registered/updated/ok) +- script.php uses heartbeat receiver instead of Grafana API (fixes 403 RBAC) + ## [02.01.37] - 2026-05-23 ### Added diff --git a/README.md b/README.md index 1eab0c6..f400e11 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ # MokoWaaS Plugin -[![Version](https://img.shields.io/badge/version-02.01.18-blue.svg?logo=v&logoColor=white)](https://github.com/mokoconsulting-tech/MokoWaaS/releases/tag/v02) +[![Version](https://img.shields.io/badge/version-02.01.43-blue.svg?logo=v&logoColor=white)](https://github.com/mokoconsulting-tech/MokoWaaS/releases/tag/v02) [![License](https://img.shields.io/badge/license-GPL--3.0--or--later-green.svg?logo=gnu&logoColor=white)](LICENSE) [![Joomla](https://img.shields.io/badge/Joomla-5.x%20%7C%206.x-red.svg?logo=joomla&logoColor=white)](https://www.joomla.org) [![PHP](https://img.shields.io/badge/PHP-8.1%2B-777BB4.svg?logo=php&logoColor=white)](https://www.php.net) From cc907a5aa2393121f20f5d8066cb222f65101d95 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sat, 23 May 2026 18:34:57 -0500 Subject: [PATCH 10/10] fix(heartbeat): only send heartbeat for primary domain, not aliases Alias domains were creating separate Grafana datasources with unique UIDs, causing provisioning failures (duplicate UID) when Grafana restarts. Only the primary domain should be registered. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/Extension/MokoWaaS.php | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/src/Extension/MokoWaaS.php b/src/Extension/MokoWaaS.php index 9be7366..9766490 100644 --- a/src/Extension/MokoWaaS.php +++ b/src/Extension/MokoWaaS.php @@ -2711,8 +2711,9 @@ class MokoWaaS extends CMSPlugin /** * Send heartbeat to the MokoWaaS monitoring receiver. * - * Registers this site (and any aliases) with the Grafana provisioning system. + * Registers this site's primary domain with the Grafana provisioning system. * The receiver writes a datasource YAML file and restarts Grafana. + * Alias domains are not registered to avoid duplicate datasource UIDs. * * @param \Joomla\Registry\Registry $params Plugin params * @param \Joomla\CMS\Application\CMSApplication $app Application @@ -2733,35 +2734,8 @@ class MokoWaaS extends CMSPlugin $siteUrl = rtrim(Uri::root(), '/'); $siteName = Factory::getConfig()->get('sitename', 'Joomla'); - // Register primary domain + // Register primary domain only — aliases should not get separate datasources $this->sendHeartbeat($siteUrl, $siteName, $healthToken, $app); - - // Register any alias domains (subform format: array of objects with domain key) - $aliases = $params->get('site_aliases', ''); - - if (!empty($aliases)) - { - if (is_string($aliases)) - { - $aliases = json_decode($aliases, false); - } - - if (is_array($aliases)) - { - foreach ($aliases as $alias) - { - $alias = (object) $alias; - - if (!empty($alias->domain)) - { - $domain = trim($alias->domain); - $aliasUrl = 'https://' . preg_replace('#^https?://#i', '', $domain); - $aliasUrl = rtrim($aliasUrl, '/'); - $this->sendHeartbeat($aliasUrl, $siteName, $healthToken, $app); - } - } - } - } } /**