# Changelog ## [Unreleased] ### Added - plg_system_mokosuite_dbip — IP geolocation plugin using DB-IP MMDB databases (CDN auto-download, local file mode, bundled MaxMind reader) - Admin sidebar menu restructure — each Moko component gets its own collapsible section, com_mokosuitehq pinned first - rc-revert workflow for release candidate rollbacks - Ntfy push notifications for ticket events and security alerts (#205) — configurable server/topic/token - Canned responses admin UI with edit modal, category filter, drag-and-drop reorder (#138) - Ticket categories drag-and-drop reorder (#139) - File attachments on tickets and replies (#141) — upload/download/delete with type and size validation - Satisfaction ratings on resolved tickets (#140) — 1-5 star widget with optional feedback - Helpdesk REST API (#142) — GET/POST/PATCH tickets, POST replies, filters, pagination - Component config options UI (#149) — general, notification (email + ntfy), helpdesk settings - Automation rule visual builder (#137) — condition/action dropdowns, edit existing, reorder, XSS-safe DOM - Admin login and failed login security notifications (#147) - Automation engine with Joomla event triggers (#151) — user_login, user_register, content_save, extension_install, behavior modes (append/always_new/skip_if_open), create_ticket action - RSA-signed heartbeat authentication — private key in monitor plugin manifest, public key on MokoSuiteHQ - Monitor plugin base_url set via manifest (hidden from admin UI), propagated via update server - Send Heartbeat button on health token field for manual heartbeat testing - Font Awesome 7 loaded in admin backend — picks up MokoOnyx Kit code if present, falls back to bundled FA7 Free or FA6 CDN - MokoWaaS → MokoSuite database table migration in install script (create new, copy data, drop old) - MokoWaaS → MokoSuite extension param migration — copies params from all old mokowaas plugins/modules/component, then removes old entries and filesystem remnants - Ticket contact linking — optional FK to Joomla contact records with display in list and detail views - Multi-assignee tickets — junction table supports multiple users and user groups per ticket - Customizable ticket statuses — admin-configurable lookup table replaces hardcoded ENUM (title, color, is_closed flag) - Customizable ticket priorities — admin-configurable lookup table with weight and color - Joomla custom fields integration for tickets (context: com_mokosuite.ticket) with field groups assignable per category - MokoWaaS/MokoWaaSHQ migration bridge repos with updates.xml redirecting existing installs to MokoSuite/HQ - Pre-release workflow triggers on push to dev/alpha/beta/rc branches (deployed to all 11 repos) ### Removed - PerfectPublisher webservices plugin (no longer needed) ### Fixed - Download key lost on update: cleanupStaleUpdateSites used old /raw/branch/main/ URL format, deleting the manifest-registered update site that held the key ## [02.35.00] - 2026-06-06 ### Added - Core plugin stripped to heartbeat-only config (~5,500 lines removed) - Extension catalog (catalog.xml) with update server discovery (#186) - Download key preservation across Joomla updates (#187) - Remote login endpoint for MokoSuiteHQ auto-login - Provision reset API for new client setup (hits, versions, tokens) - Setup required banner after provision reset - Support verification PIN (MOKO-XXXX-XXXX) - mod_mokosuite_categories — auto-category tree menu (#184) - Cache/temp split button in status bar - Dashboard version tiles for component and modules - Monitor plugin sends full health payload to MokoSuiteHQ - Firewall: block_frontend_superuser, own trusted_ip_entry.xml - DevTools: reset download keys toggle ### Changed - Renamed src/ to source/ (#188) - Service classes relocated to owning plugins - API controller execute() signatures fixed (#183) - Joomla 5/6 event compatibility in DevTools and Monitor - Dead placeholder resolver removed from install script ### Fixed - Firewall subform paths after core cleanup - Missing Security Headers language strings ## [02.34.00] - 2026-06-04 ### Added - Database Tools view — table status, optimize, repair, session purge (#127) - Cache Cleanup view — directory size reporting and one-click cleanup (#128) - mod_mokosuite_cache — one-click cache cleaner button in admin status bar (replaces Regular Labs Cache Cleaner) - mod_mokosuite_menu — collapsible admin sidebar menu using native MetisMenu classes (like Community Builder) - SSL certificate expiry monitoring in cpanel module (#148) - MokoSuite-specific update badge (blue) separate from other updates in cpanel module - migrateUpdateServerUrls() — rewrites all Moko extension update server URLs to clean /updates.xml on install/update - fixMenuIcons() — sets menu_icon params on submenu items (Joomla only renders img on level 1) - setupCacheModule() — registers cache cleaner module in status bar position on install - Component config.xml for Joomla Options modal (#149) - preflight() ALTER for #__extensions.element default (MySQL strict mode fix) - Retire MokoJoomTOS, MokoATS-Automation, MokoDPCalendarAPI, MokoGalleryCalendar on install - MokoJoomTOS settings auto-migrate to mokosuite_offline before removal - dev-release and pre-release workflows with changelog extraction into release notes - RC pre-release consolidates dev patches into clean minor version bump ### Changed - Move security hardening methods (protectPlugin, ensureProtectedFlag, isOurExtension) from core plugin to firewall plugin (#155) - Admin menu module uses native Joomla MetisMenu CSS classes - Helpdesk icon changed to fa-handshake-angle, .htaccess to fa-solid fa-file-code - clearCache purges all cache files recursively (replaces Regular Labs Cache Cleaner behavior) - License key warning moved from every-page onAfterRoute to package postflight only - Update server URL changed to dynamic MokoGitea feed - Component manifest adds `` for global language dir deployment - Privacy and WAF Log added to component manifest submenu - MokoOnyx template removed from package manifest (separate repo/release) ### Removed - Static updates.xml — MokoGitea generates update feed dynamically from releases - update-server.yml workflow — replaced by pre-release.yml ### Fixed - Tickets list showing raw `Unassigned` HTML instead of italic text - Cache cleaner CSRF failure — token now sent as POST FormData - Admin menu icons missing for Helpdesk and .htaccess Maker - Firewall install error "Field 'element' doesn't have a default value" (MySQL strict mode) ## [02.32] - 2026-06-02 ### Added - Admin control panel dashboard in com_mokosuite with site info bar, feature plugin grid, and quick actions - Feature plugin architecture — MokoSuite features split into toggleable plugins managed from the dashboard - plg_system_mokosuite_firewall — HTTPS enforcement, trusted IPs, session timeout, upload restrictions, password policy - plg_system_mokosuite_tenant — Installer, sysinfo, config, template, and menu restrictions for non-master users - plg_system_mokosuite_devtools — Dev mode, hit counter reset, content version cleanup - plg_system_mokosuite_monitor — Grafana heartbeat integration and health monitoring - MokoSuiteHelper utility class for shared master-user detection across feature plugins - AJAX plugin toggle — enable/disable feature plugins directly from the dashboard - Clear cache quick action on dashboard - Static updates.xml for update server (licensing system deferred) - Automatic param migration from core plugin to feature plugins on upgrade ### Changed - com_mokosuite upgraded from API-only to full admin component with dashboard views - Package manifest updated with 4 new feature plugin entries (10 extensions total) - Update server URL changed to static raw file endpoint - Core plugin slimmed — security, tenant, devtools, and monitor features extracted to dedicated plugins ### Removed - License key validation (licensing system not ready — will return in future release) - Dynamic MokoGitea update feed dependency (replaced with static updates.xml) ## [02.31] - 2026-06-01 ### Added - License key support via Joomla's native Update Sites download key system (dlid) - Update server URL migrated from static XML to MokoGitea's dynamic update feed endpoint - Legacy static update site URLs auto-migrated to dynamic endpoint on install/update - Persistent admin warning when no license key is configured in Update Sites - Daily heartbeat validation of license key against MokoGitea — warns if key is invalid or expired - Stale/duplicate update site cleanup on install/update (removes old static URL entries and orphaned records) - Content sync rewritten — bulk MokoSuite API endpoints (syncclear + syncpush) replace per-item Joomla API calls - Sync task per-instance config: target URL, health token, content type checkboxes (articles, categories, menus, modules) - Bulk sync completes in under 5 seconds (clear + push in 2-3 HTTP requests) - Asset table and nested set tree repair after sync push on target site - Enhanced dev mode: disables caching, enables Joomla + MokoOnyx debug, suppresses hit recording, shows offline on primary domain - Dev mode off: clears content versions, resets hits, disables debug, takes site online - Hardcoded dev alias (dev.{primary_domain}) with noindex/nofollow — bypasses offline mode for development - Primary domain auto-detected on first config save ### Changed - Branding, master user, support URL, and admin colors are now hardcoded (no longer configurable) - Master user enforcement is always active (toggle removed) - Diagnostics + maintenance merged into default config tab - Emergency access moved to Security tab - Content sync configuration moved from system plugin to individual scheduled task instances ### Removed - Static `updates.xml` — update feed is now generated dynamically by MokoGitea from git releases - Basic branding config tab (brand name, company name, support URL) - Visual branding config tab (colors, icon, custom CSS) - Suite Access config tab (master user toggle, master email) - Content Sync config tab (targets now in scheduled tasks) - Site Aliases config tab (hardcoded to dev.{primary_domain}) - File sync (images/, files/, media/) — sync is API/DB content only ## [02.29] - 2026-05-31 ### Added - `allow_extension_updates` param — separate update rights from installer restrictions; tenants can update extensions by default even when the installer is restricted - Hardcoded master usernames — multiple privileged users supported with identical access ### Fixed - Emergency access IP whitelist: empty `allowed_ips` now permits all IPs (was blocking everyone) - Emergency access reads `allowed_ips` from plugin params instead of global config - `plg_task_mokosuitesync` — Joomla Scheduled Task plugin for automatic content sync to remote sites - Community Builder tables added to demo reset safe table list - API endpoint `POST /api/index.php/v1/mokosuite/install` — install extensions from a remote ZIP URL - Demo Mode with configurable warning banner on frontend when enabled - Demo banner countdown now shows weeks/days/months for longer intervals instead of raw hours - `DemoResetService` — baseline snapshot and restore for DB tables + media files - API endpoints `POST /?mokosuite=reset` and `POST /?mokosuite=snapshot` (query-string) - REST endpoints `POST /api/v1/mokosuite/reset` and `GET/POST /api/v1/mokosuite/snapshot` - `plg_task_mokosuitedemo` — Joomla Scheduled Task plugin for automatic demo site reset - Admin toggles: Take Snapshot Now and Restore Baseline Now in plugin config - Content Sync: one-way push of articles, categories, menus, and modules to remote MokoSuite sites - Content Sync: API endpoints `POST /?mokosuite=sync` (sender) and `POST /?mokosuite=sync-receive` (receiver) - Content Sync: REST endpoints `POST /api/v1/mokosuite/sync` and `POST /api/v1/mokosuite/sync-receive` - Content Sync: configurable sync targets with URL + API token in plugin settings - Package installer: protect all MokoSuite extensions (not just system plugin) and ensure update server stays enabled - Package installer: clean up legacy `mokosuitebrand` extension entries and files on install/update - API endpoint `GET /?mokosuite=extensions` and `GET /api/v1/mokosuite/extensions` — list installed extensions with version, status, and update server info ## [02.20] --- 2026-05-28