Commit Graph

147 Commits

Author SHA1 Message Date
jmiller 7fdfaac7fb Merge branch 'dev' 2026-04-07 16:20:52 -05:00
jmiller f12e55f8b9 feat: auto-install and lock mokocassiopeia template
On install/update, checks if mokocassiopeia template exists. If found,
locks and protects it. If missing, downloads latest release from
GitHub and installs it automatically.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:20:26 -05:00
jmiller dcc1ba9569 release: v02.00.03 — lock plugin in postflight
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:17:28 -05:00
jmiller 5296a39cd5 Merge dev into main — v02.00.03 lock fix
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:16:34 -05:00
jmiller 64defa8a0c ci: version archive branch on every version change 2026-04-07 16:12:00 -05:00
jmiller d9dd6c4051 fix: lock plugin in postflight so it applies on update too
install() only runs on first install. Moved enableAndLockPlugin() to
postflight() which runs on both install and update, ensuring existing
installs get locked when updating.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:11:21 -05:00
jmiller 89fce9e83b ci: auto-dev-issue now creates sub-issues for full workflow 2026-04-07 16:09:39 -05:00
github-actions[bot] 7cb42d7bd7 chore(version): auto-bump patch 02.00.01 → 02.00.02 [skip ci] 2026-04-07 20:59:34 +00:00
jmiller 8dc00800a0 release: v02.00.02 — lock plugin on install
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:57:27 -05:00
jmiller 5222efa2e2 feat: lock plugin on install — cannot be disabled or uninstalled
Sets both locked=1 and protected=1 in #__extensions on install.
Prevents tenants from disabling or uninstalling the plugin through
the Extension Manager.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:56:58 -05:00
github-actions[bot] 6e76b3f235 chore(version): sync badges and headers to 02.00.01 [skip ci] 2026-04-07 20:56:11 +00:00
github-actions[bot] d1e36a05a4 chore(release): build 02.00.01 [skip ci] 2026-04-07 20:56:04 +00:00
jmiller 1b38ce9a07 feat: lock plugin on install — cannot be disabled or uninstalled
Sets both locked=1 and protected=1 in #__extensions on install.
Prevents tenants from disabling or uninstalling the plugin through
the Extension Manager.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:55:38 -05:00
jmiller 687e0ed3c9 Merge dev/02.00.00 into main — release v02.00.01
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:41:36 -05:00
jmiller 54c5c93c12 release: bump version to 02.00.01
First release of v02.00 — patch .00 reserved for development.
Version bumped across all files: manifest, PHP, language, docs,
composer, updates.xml, changelog, README.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:39:16 -05:00
jmiller 38bdc76b89 docs: update changelog, dates, and revision history for v02.00
- Added full v02.00 changelog entry with all features, fixes, changes
- Updated creationDate in manifest to 2026-04-07
- Consolidated revision history entries in config and testing guides
- Removed duplicate/stale date entries

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:29:16 -05:00
jmiller 218a85344d fix: link color default to #0051ad
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:25:14 -05:00
jmiller 09bb2d5753 fix: apply colors via Atum template style params instead of CSS
Atum reads color values from #__template_styles params (hue, link-color,
special-color) and outputs them as inline CSS variables at render time.
Our CSS variable injection was being overridden by Atum's own output.

Now enforceAtumBranding() sets the color params directly in the DB:
- color_primary → hue (hex→HSL converted) + special-color
- color_sidebar → header-color
- color_link → link-color

Added hexToHsl() helper for the conversion. Install script also sets
default Moko theme colors at install time.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:22:26 -05:00
jmiller 62ccec104d fix: auto-complete emergency login after verify file deletion
After the verify file is created, credentials are stored as a session
flag. On every subsequent page load (including just a refresh),
handleEmergencyAccess checks if the flag is set and the verify file
has been deleted. If so, it completes the login automatically — the
user only needs to delete the file and refresh, no re-entering
credentials.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:15:49 -05:00
jmiller 82b27222ee fix: create session directly for emergency access login
app->login() triggers auth plugins again which reject the request
without a real password. Instead, load the User object, set it in the
session directly, and update lastvisitDate. This fully bypasses the
authentication dispatcher while establishing a valid admin session.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:14:39 -05:00
jmiller 2ade6dc0c1 fix: move emergency access from onUserAuthenticate to onAfterInitialise
Joomla's authentication system uses an isolated dispatcher that only
loads authentication-group plugins. System plugins never receive
onUserAuthenticate events. Replaced with handleEmergencyAccess() that
intercepts the login POST in onAfterInitialise, validates credentials,
and calls \$app->login() directly to bypass the auth dispatcher.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:10:24 -05:00
jmiller b3eec41aec fix: default max upload size to 100MB
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:05:21 -05:00
jmiller 9a0de228ea feat: auto-enable plugin on first install
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:00:47 -05:00
jmiller c443699280 feat: register action log config for proper display formatting
Add #__action_log_config entry so MokoWaaS emergency access events
display with proper type title and text prefix in System > Action Logs.
Both #__action_logs_extensions and #__action_log_config are cleaned up
on uninstall.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:58:15 -05:00
jmiller f0579f8fe7 ci: auto-assign on issue/PR create + 12hr schedule 2026-04-07 14:44:55 -05:00
jmiller b1f4c41310 feat: action log registration, Moko theme defaults, security defaults
- Register plg_system_mokowaas in #__action_logs_extensions on install
  so emergency access events appear as filterable in Action Logs UI
- Unregister on uninstall
- Set Moko brand colors as defaults: navy #1a2744, dark #0f1b2d,
  accent green #2ecc71
- Force HTTPS default: Yes (was No)
- Admin session timeout default: 60 minutes (was 0/disabled)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:40:30 -05:00
jmiller acdf274cc9 ci: add auto-assign workflow (every 15min) 2026-04-07 14:39:26 -05:00
jmiller f74808484d ci: sync workflows from main
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:33:10 -05:00
jmiller ddce5600b6 ci: sync workflows from MokoStandards v04.05 (checkout v6, secret scan fix)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:33:03 -05:00
jmiller af21439f9d fix: master account display name set to Webmaster
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:18:21 -05:00
jmiller 36e884f2a6 docs: full rewrite of configuration and testing guides
Configuration guide:
- Added sections 5-9: WaaS Access (IP display, action logs, email
  notification), Maintenance, Visual Branding (Atum params, shipped
  media), Tenant Restrictions, Security Hardening
- Updated troubleshooting and validation checklist

Testing guide:
- Updated suite 2.12: action log entries for all attempt types, email
  notification, IP whitelist display, empty=blocked behavior
- Updated suite 2.15: Atum param enforcement, shipped assets, favicon
  SVG/ICO/PNG, asset replacement test
- Removed suite 2.18 (operations — deferred)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:10:34 -05:00
jmiller f72275da40 feat: show current IP whitelist in plugin config screen
Custom AllowedIpsField reads mokowaas_allowed_ips from configuration.php
and displays:
- Number of IPs configured (or "Not configured" badge)
- List of allowed IPs with "your IP" badge on match
- Current visitor IP address
- Instructions for changing the setting

Replaces the static note field with a dynamic form field.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:03:32 -05:00
jmiller af043c1375 feat: log all emergency access attempts with email notification
Every emergency access attempt is now logged to both the mokowaas log
file and Joomla Action Logs with a specific result code:
- blocked_ip: unauthorized IP address
- wrong_password: correct username, wrong DB password
- verify_file_created: first attempt, verification file written
- pending_file_delete: waiting for file deletion
- success: access granted

On successful login, a notification email is sent to the master email
address with site name, username, IP, and timestamp.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:57:28 -05:00
jmiller b7f336f50d feat: log emergency access to Joomla action logs
Emergency access events now write to #__action_logs in addition to
the mokowaas log file. Visible in System > Action Logs with username
and IP address.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:54:28 -05:00
jmiller cdd13cb352 fix: require IP whitelist for emergency access, update master email
- Empty mokowaas_allowed_ips now BLOCKS emergency access instead of
  allowing all IPs. An explicit whitelist is required.
- Default master email changed to webmaster@mokoconsulting.tech

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:53:06 -05:00
github-actions[bot] b269e15618 chore(version): auto-bump patch 01.04.04 → 01.04.05 [skip ci] 2026-04-07 18:41:47 +00:00
jmiller da0c28bc33 fix(deps): update enterprise constraint dev-version/04.02.00 → dev-version/04.05 2026-04-07 13:40:59 -05:00
jmiller 9a9533fc0d fix: align workflow version headers with plugin version 02.00.00
The version consistency checker expects all VERSION: headers to match
the project version. Workflow files had 04.05.00 (MokoStandards
release version) which caused drift detection failures.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:25:40 -05:00
jmiller be38ab4ad8 feat: Atum template branding with shipped media assets
Replace CSS-based logo injection with proper Atum template param
enforcement. The plugin now sets logoBrandLarge, logoBrandSmall,
loginLogo, and favicon via #__template_styles params — both at
install time and enforced at runtime.

Media assets shipped with plugin:
- logo.png → sidebar brand (expanded) + login page logo
- favicon_256.png → sidebar brand (collapsed)
- favicon.svg → modern browser favicon (SVG preferred)
- favicon.ico → legacy browser fallback
- favicon_256.png → Apple/Android touch icon

Removed per-config media upload fields (admin_logo, login_logo,
custom_favicon) — images are now fixed in the plugin media folder.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:17:34 -05:00
jmiller 241fe08c63 Create favicon.svg 2026-04-07 13:15:53 -05:00
jmiller cf4c1571b2 Create favicon.ico 2026-04-07 13:14:50 -05:00
jmiller f32bd945d7 Images 2026-04-07 13:10:58 -05:00
jmiller cd0dc658c0 feat: restore login support URL enforcement
The mokoconsulting.tech/support, /kb, and /news pages exist. Restore
runtime enforcement in MokoWaaS.php and install-time write in
script.php.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 13:05:20 -05:00
jmiller 0b52d50e8a refactor: defer login support URL enforcement to future release
Remove enforceLoginSupportUrls() from runtime and
updateLoginSupportUrls() from install script. Both write hardcoded
mokoconsulting.tech/support, /kb, /news URLs to mod_loginsupport
module params — these pages don't exist yet.

Login support TEXT overrides (MOD_LOGINSUPPORT_FORUM etc.) are kept
since they work locally without an endpoint. The underlying hrefs
will still point to joomla.org until the endpoints are built and
URL enforcement is restored.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 20:49:12 -05:00
jmiller d47ae15b34 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>
2026-04-04 19:10:55 -05:00
jmiller d5953603f2 docs: add test suites 2.15-2.18 for visual, restrictions, security, ops
- Suite 2.15: Visual branding (10 test cases)
- Suite 2.16: Tenant restrictions (10 test cases)
- Suite 2.17: Security hardening (10 test cases)
- Suite 2.18: Operations (8 test cases)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 19:01:03 -05:00
jmiller 2c171deadf feat: visual branding, tenant restrictions, security, operations
Visual Branding:
- Custom admin logo, login logo, and favicon via media fields
- Admin color scheme via CSS custom properties (primary, sidebar,
  header, link colors)
- Custom CSS textarea injection

Tenant Restrictions:
- Block non-master users from: Extension Installer, System Info,
  Global Configuration, Template code editor
- Hide admin menu items (auto-hides restricted components)
- Disable install-from-URL for all users (safety net)
- onPreprocessMenuItems filters admin menu dynamically

Security Hardening:
- Force HTTPS redirect (supports reverse proxy)
- Configurable admin session idle timeout
- Password policy: min length, uppercase, number, special char
- Upload type and size restrictions via runtime config override

Operations:
- Heartbeat telemetry: POSTs site health to WaaS dashboard URL
- License check: validates subscription via remote URL with
  warn/lockout actions and interval caching
- Joomla Update left to Joomla's built-in ACL (super users only)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 18:36:10 -05:00
jmiller c363c6077d docs: add test suite 2.14 for maintenance actions
Suite 2.14a: Reset All Hits (5 test cases)
Suite 2.14b: Delete All Versions (7 test cases)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 15:53:47 -05:00
jmiller fdae5f2dec feat: add maintenance actions to reset hits and delete versions
New Maintenance fieldset in plugin config with two one-shot actions:
- Reset All Hits: zeros out #__content.hits across the site
- Delete All Versions: purges all #__history records

Actions execute on save via onExtensionAfterSave, then auto-reset
the toggle to No. Both actions are logged to mokowaas category.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 15:52:05 -05:00
jmiller 5ddb9b04a3 docs: add test suites for master user, emergency access, non-overwrite
- Suite 2.11: WaaS master user enforcement (create/delete/block/group)
- Suite 2.12: Emergency access two-factor flow (DB password + file)
- Suite 2.13: Override install respects existing user overrides
- Updated Suite 2.9: added RegularLabs Position fix, Powered by links,
  login URL verification, and NOT-overriding checklist for HEADING keys

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 15:07:22 -05:00