refactor: defer heartbeat and license check to future release

Remove operational fieldset (heartbeat telemetry, license check) from
v02.00.00. These features need a proper backend dashboard before they
are useful. Removed config fields, language strings, onAfterRender
handler, checkLicense(), handleLicenseFailure(), sendHeartbeat(),
getTableCount(), and HttpFactory import.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-04 19:10:55 -05:00
parent d5953603f2
commit d47ae15b34
4 changed files with 0 additions and 269 deletions
-203
View File
@@ -38,7 +38,6 @@ use Joomla\CMS\Router\Route;
use Joomla\CMS\Language\Language;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\User\UserHelper;
use Joomla\Http\HttpFactory;
/**
* MokoWaaS Brand System Plugin
@@ -87,7 +86,6 @@ class MokoWaaS extends CMSPlugin
$this->enforceMasterUser();
$this->enforceLoginSupportUrls();
$this->enforceAdminSessionTimeout();
$this->checkLicense();
$this->enforceUploadRestrictions();
}
@@ -802,22 +800,6 @@ class MokoWaaS extends CMSPlugin
return true;
}
/**
* Send heartbeat telemetry after the page is fully rendered.
*
* @return void
*
* @since 02.00.00
*/
public function onAfterRender()
{
if (!$this->app->isClient('administrator'))
{
return;
}
$this->sendHeartbeat();
}
// ------------------------------------------------------------------
// HTTPS / Session / License (called from onAfterInitialise)
@@ -894,105 +876,6 @@ class MokoWaaS extends CMSPlugin
$session->set('mokowaas.last_activity', $now);
}
/**
* Check license status with remote WaaS dashboard.
*
* @return void
*
* @since 02.00.00
*/
protected function checkLicense()
{
$url = $this->params->get('license_check_url', '');
if (empty($url))
{
return;
}
$interval = (int) $this->params->get('license_check_interval', 24);
$cacheFile = JPATH_CACHE . '/mokowaas_license.json';
// Check if interval has elapsed
if (file_exists($cacheFile))
{
$cache = json_decode(file_get_contents($cacheFile), true);
$lastCheck = $cache['timestamp'] ?? 0;
if ((time() - $lastCheck) < ($interval * 3600))
{
// Use cached result
if (($cache['status'] ?? 'valid') !== 'valid')
{
$this->handleLicenseFailure();
}
return;
}
}
// Time to check
try
{
$http = HttpFactory::getHttp();
$key = $this->params->get('license_key', '');
$checkUrl = $url . '?key=' . urlencode($key)
. '&domain=' . urlencode(Uri::root());
$response = $http->get($checkUrl, [], 3);
$body = json_decode($response->body, true);
$status = ($body['status'] ?? '') === 'valid'
? 'valid' : 'invalid';
file_put_contents($cacheFile, json_encode([
'timestamp' => time(),
'status' => $status,
]));
if ($status !== 'valid')
{
$this->handleLicenseFailure();
}
}
catch (\Exception $e)
{
// Network failure — don't break the site
Log::add(
'License check failed: ' . $e->getMessage(),
Log::WARNING,
'mokowaas'
);
}
}
/**
* Handle a failed or expired license check.
*
* @return void
*
* @since 02.00.00
*/
protected function handleLicenseFailure()
{
$action = $this->params->get('license_action', 'warn');
if ($action === 'lockout' && !$this->isMasterUser())
{
$this->app->enqueueMessage(
'Site license has expired. Contact your administrator.',
'error'
);
$this->app->logout();
$this->app->redirect(Route::_('index.php', false));
return;
}
$this->app->enqueueMessage(
'Site license requires attention. Check Operations settings.',
'warning'
);
}
/**
* Override Joomla upload restrictions at runtime.
@@ -1361,90 +1244,4 @@ class MokoWaaS extends CMSPlugin
$doc->addStyleDeclaration($css);
}
// ------------------------------------------------------------------
// Heartbeat Telemetry (called from onAfterRender)
// ------------------------------------------------------------------
/**
* Send site health data to the WaaS dashboard.
*
* @return void
*
* @since 02.00.00
*/
protected function sendHeartbeat()
{
$url = $this->params->get('heartbeat_url', '');
if (empty($url))
{
return;
}
$interval = (int) $this->params->get('heartbeat_interval', 24);
$cacheFile = JPATH_CACHE . '/mokowaas_heartbeat.txt';
if (file_exists($cacheFile)
&& (time() - filemtime($cacheFile)) < ($interval * 3600))
{
return;
}
try
{
$db = Factory::getDbo();
$data = [
'domain' => Uri::root(),
'joomla_version' => JVERSION,
'php_version' => PHP_VERSION,
'plugin_version' => '02.00.00',
'article_count' => $this->getTableCount('#__content'),
'user_count' => $this->getTableCount('#__users'),
'timestamp' => date('c'),
];
$token = $this->params->get('heartbeat_token', '');
$headers = ['Content-Type' => 'application/json'];
if (!empty($token))
{
$headers['Authorization'] = 'Bearer ' . $token;
}
$http = HttpFactory::getHttp();
$http->post($url, json_encode($data), $headers, 3);
// Update cache timestamp
file_put_contents($cacheFile, date('c'));
}
catch (\Exception $e)
{
Log::add(
'Heartbeat failed: ' . $e->getMessage(),
Log::WARNING,
'mokowaas'
);
}
}
/**
* Get the row count of a database table.
*
* @param string $table Table name with #__ prefix
*
* @return int
*
* @since 02.00.00
*/
protected function getTableCount($table)
{
$db = Factory::getDbo();
$db->setQuery(
$db->getQuery(true)
->select('COUNT(*)')
->from($db->quoteName($table))
);
return (int) $db->loadResult();
}
}
@@ -109,20 +109,3 @@ PLG_SYSTEM_MOKOWAAS_UPLOAD_TYPES_LABEL="Allowed Upload Types"
PLG_SYSTEM_MOKOWAAS_UPLOAD_TYPES_DESC="Comma-separated list of allowed file extensions for media uploads."
PLG_SYSTEM_MOKOWAAS_UPLOAD_SIZE_LABEL="Max Upload Size (MB)"
PLG_SYSTEM_MOKOWAAS_UPLOAD_SIZE_DESC="Maximum file upload size in megabytes."
; ===== Operational fieldset =====
PLG_SYSTEM_MOKOWAAS_FIELDSET_OPS_LABEL="Operations"
PLG_SYSTEM_MOKOWAAS_FIELDSET_OPS_DESC="Heartbeat telemetry, license checking, and WaaS platform integration."
PLG_SYSTEM_MOKOWAAS_HEARTBEAT_URL_LABEL="Heartbeat URL"
PLG_SYSTEM_MOKOWAAS_HEARTBEAT_URL_DESC="URL to POST site health data to your WaaS dashboard. Leave empty to disable."
PLG_SYSTEM_MOKOWAAS_HEARTBEAT_INTERVAL_LABEL="Heartbeat Interval (Hours)"
PLG_SYSTEM_MOKOWAAS_HEARTBEAT_TOKEN_LABEL="Heartbeat Token"
PLG_SYSTEM_MOKOWAAS_LICENSE_URL_LABEL="License Check URL"
PLG_SYSTEM_MOKOWAAS_LICENSE_URL_DESC="URL to verify site license/subscription status. Leave empty to disable."
PLG_SYSTEM_MOKOWAAS_LICENSE_KEY_LABEL="License Key"
PLG_SYSTEM_MOKOWAAS_LICENSE_INTERVAL_LABEL="License Check Interval (Hours)"
PLG_SYSTEM_MOKOWAAS_LICENSE_ACTION_LABEL="License Expiry Action"
PLG_SYSTEM_MOKOWAAS_LICENSE_ACTION_DESC="What to do when the license check fails or expires."
PLG_SYSTEM_MOKOWAAS_LICENSE_WARN="Show Warning"
PLG_SYSTEM_MOKOWAAS_LICENSE_LOCKOUT="Lock Out Non-Master Users"
@@ -109,20 +109,3 @@ PLG_SYSTEM_MOKOWAAS_UPLOAD_TYPES_LABEL="Allowed Upload Types"
PLG_SYSTEM_MOKOWAAS_UPLOAD_TYPES_DESC="Comma-separated list of allowed file extensions for media uploads."
PLG_SYSTEM_MOKOWAAS_UPLOAD_SIZE_LABEL="Max Upload Size (MB)"
PLG_SYSTEM_MOKOWAAS_UPLOAD_SIZE_DESC="Maximum file upload size in megabytes."
; ===== Operational fieldset =====
PLG_SYSTEM_MOKOWAAS_FIELDSET_OPS_LABEL="Operations"
PLG_SYSTEM_MOKOWAAS_FIELDSET_OPS_DESC="Heartbeat telemetry, license checking, and WaaS platform integration."
PLG_SYSTEM_MOKOWAAS_HEARTBEAT_URL_LABEL="Heartbeat URL"
PLG_SYSTEM_MOKOWAAS_HEARTBEAT_URL_DESC="URL to POST site health data to your WaaS dashboard. Leave empty to disable."
PLG_SYSTEM_MOKOWAAS_HEARTBEAT_INTERVAL_LABEL="Heartbeat Interval (Hours)"
PLG_SYSTEM_MOKOWAAS_HEARTBEAT_TOKEN_LABEL="Heartbeat Token"
PLG_SYSTEM_MOKOWAAS_LICENSE_URL_LABEL="License Check URL"
PLG_SYSTEM_MOKOWAAS_LICENSE_URL_DESC="URL to verify site license/subscription status. Leave empty to disable."
PLG_SYSTEM_MOKOWAAS_LICENSE_KEY_LABEL="License Key"
PLG_SYSTEM_MOKOWAAS_LICENSE_INTERVAL_LABEL="License Check Interval (Hours)"
PLG_SYSTEM_MOKOWAAS_LICENSE_ACTION_LABEL="License Expiry Action"
PLG_SYSTEM_MOKOWAAS_LICENSE_ACTION_DESC="What to do when the license check fails or expires."
PLG_SYSTEM_MOKOWAAS_LICENSE_WARN="Show Warning"
PLG_SYSTEM_MOKOWAAS_LICENSE_LOCKOUT="Lock Out Non-Master Users"
-32
View File
@@ -300,38 +300,6 @@
description="PLG_SYSTEM_MOKOWAAS_UPLOAD_SIZE_DESC"
default="10" />
</fieldset>
<fieldset name="operational"
label="PLG_SYSTEM_MOKOWAAS_FIELDSET_OPS_LABEL"
description="PLG_SYSTEM_MOKOWAAS_FIELDSET_OPS_DESC"
>
<field name="heartbeat_url" type="url"
label="PLG_SYSTEM_MOKOWAAS_HEARTBEAT_URL_LABEL"
description="PLG_SYSTEM_MOKOWAAS_HEARTBEAT_URL_DESC"
default="" />
<field name="heartbeat_interval" type="number"
label="PLG_SYSTEM_MOKOWAAS_HEARTBEAT_INTERVAL_LABEL"
default="24" hint="Hours" />
<field name="heartbeat_token" type="text"
label="PLG_SYSTEM_MOKOWAAS_HEARTBEAT_TOKEN_LABEL"
default="" />
<field name="license_check_url" type="url"
label="PLG_SYSTEM_MOKOWAAS_LICENSE_URL_LABEL"
description="PLG_SYSTEM_MOKOWAAS_LICENSE_URL_DESC"
default="" />
<field name="license_key" type="text"
label="PLG_SYSTEM_MOKOWAAS_LICENSE_KEY_LABEL"
default="" />
<field name="license_check_interval" type="number"
label="PLG_SYSTEM_MOKOWAAS_LICENSE_INTERVAL_LABEL"
default="24" hint="Hours" />
<field name="license_action" type="list"
label="PLG_SYSTEM_MOKOWAAS_LICENSE_ACTION_LABEL"
description="PLG_SYSTEM_MOKOWAAS_LICENSE_ACTION_DESC"
default="warn">
<option value="warn">PLG_SYSTEM_MOKOWAAS_LICENSE_WARN</option>
<option value="lockout">PLG_SYSTEM_MOKOWAAS_LICENSE_LOCKOUT</option>
</field>
</fieldset>
</fields>
</config>
</extension>