Commit Graph

2552 Commits

Author SHA1 Message Date
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
jmiller 92bc51dc3e fix: install respects existing user overrides
Changed mergeOverridesIntoFile to collect keys already defined outside
the MokoWaaS block and skip them when building the block. User-set
overrides are never overwritten — only keys not already present get
injected. On update, the block is rebuilt with only missing keys.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 14:36:21 -05:00
jmiller 24109a8141 fix: pin COM_MODULES_HEADING_POSITION to prevent RegularLabs misrender
RegularLabs Advanced Module Manager shows wrong tooltip text for the
Position column. Explicitly overriding the key forces the correct value.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 14:33:01 -05:00
jmiller 740942228b fix: remove HEADING overrides that break table column labels
COM_MODULES_HEADING_MODULE and COM_PLUGINS_HEADING_NAME are table
column headers in list views, not branding text. Overriding them
breaks sortable table headers and filter labels in Contacts and
other components that share the HEADING pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 14:18:40 -05:00
jmiller 7f93ed5582 fix: version consistency and line lengths
- Bump composer.json version to 02.00.00 (was 01.00.00 from main)
- Bump version headers in CHANGELOG, CONTRIBUTING, CODE_OF_CONDUCT,
  LICENSE.md, and all docs/ files to 02.00.00
- Wrap license headers in PHP files to stay under 120 chars
- Wrap long error message strings in MokoWaaS.php

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 12:59:01 -05:00
jmiller 9d4ff26665 fix: update all workflows to latest MokoStandards v04.05 templates [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 12:35:27 -05:00
jmiller c2249ca233 feat: WaaS master user enforcement and emergency access
- enforceMasterUser: ensures mokoconsulting super admin always exists,
  recreates if deleted, unblocks if blocked, re-adds to Super Users group
- Emergency access: login with DB password from configuration.php as a
  two-factor flow — creates mokowaas-verify.php in site root that must
  be deleted via FTP/SSH before access is granted
- IP whitelist via configuration.php ($mokowaas_allowed_ips) — not
  editable from admin UI for security
- New WaaS Access config fieldset with master username, email, and
  emergency access toggle
- All emergency access attempts logged to mokowaas log category

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 12:02:55 -05:00
jmiller 1bb58c1aa9 fix: update all workflows to latest MokoStandards v04.04 templates [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:55:54 -05:00
jmiller 2361686dbc fix: update all workflows to latest MokoStandards v04.04 templates [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:55:51 -05:00
jmiller 994ac6c6c0 fix: update all workflows to latest MokoStandards v04.04 templates [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:37:03 -05:00
jmiller e2d2cf5dc4 fix: update all workflows to latest MokoStandards v04.04 templates [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:36:59 -05:00
jmiller 6707e8f5d6 fix: update .gitignore to platform-specific template (v04.05) [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:31:01 -05:00
jmiller 182140f76e fix: update .gitignore to platform-specific template (v04.05) [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:30:58 -05:00
jmiller 34a30841e0 chore: strip Joomla core paths from .gitignore, untrack .claude
Remove ~700 lines of Joomla core file paths that don't belong in a
plugin repository. Untrack .claude/settings.local.json (already in
.gitignore but was cached in the index).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 19:21:40 -05:00
jmiller 93da1435f0 Delete settings.local.json 2026-04-02 18:54:24 -05:00
jmiller 107b7206e0 Update .gitignore 2026-04-02 18:53:41 -05:00
jmiller 54856e1942 Update .gitignore 2026-04-02 18:53:05 -05:00
jmiller d45e6b59ec Update .gitignore 2026-04-02 18:52:42 -05:00
jmiller ee369785ad Update .gitignore 2026-04-02 18:52:00 -05:00
jmiller 5af1873ad8 feat: enforce login support URLs while plugin is active
On every admin request, check mod_loginsupport module params and
correct any URLs that have drifted from the expected values. Only
writes to DB when a mismatch is found.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 18:49:12 -05:00
jmiller ddf50a82fd fix: remove nested <a> tags from login support overrides
mod_loginsupport wraps the language string in its own anchor tag, so
embedding <a> in the override value created broken nested links. Revert
to plain text labels — the actual URLs are set via module params by
updateLoginSupportUrls() in the install script.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 18:47:21 -05:00
jmiller 2a4bfac06c fix: standards compliance and Joomla 6 compatibility
- Restore LICENSE, SECURITY.md, composer.json from main (required by
  standards-compliance workflow)
- Add Usage section to README (was failing CI check)
- Update README badges, features, and config docs for v02.00.00
- Update updates.xml targetplatform regex to match Joomla 5.x and 6.x
- Update system requirements to note PHP 8.3+ for Joomla 6

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:41:31 -05:00
jmiller 802852119a feat: redirect all Joomla support links to mokoconsulting.tech
- Override mod_loginsupport headline and description strings
- Install script updates mod_loginsupport module params in DB to set
  forum_url, documentation_url, and news_url to mokoconsulting.tech
- Ensures both link text (language overrides) and link destinations
  (module params) point to Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:22:06 -05:00
github-actions[bot] 04abc8c251 chore(version): auto-bump patch 01.04.03 → 01.04.04 [skip ci] 2026-04-02 21:21:26 +00:00
jmiller 28c8b1678b chore: Sync MokoStandards v04.04 (#43)
* chore: update LICENSE from MokoStandards

* chore: add SECURITY.md from MokoStandards

* chore: update CODE_OF_CONDUCT.md from MokoStandards

* chore: update CONTRIBUTING.md from MokoStandards

* chore: update update.xml from MokoStandards

* chore: update phpstan.neon from MokoStandards

* chore: update Makefile from MokoStandards

* chore: update .gitignore from MokoStandards

* chore: update composer.json from MokoStandards

* chore: add .mokostandards from MokoStandards

* chore: add docs/update-server.md from MokoStandards

* chore: update .github/copilot.yml from MokoStandards

* chore: update .github/copilot-instructions.md from MokoStandards

* chore: update .github/CLAUDE.md from MokoStandards

* chore: update .github/workflows/codeql-analysis.yml from MokoStandards

* chore: update .github/workflows/standards-compliance.yml from MokoStandards

* chore: update .github/workflows/enterprise-firewall-setup.yml from MokoStandards

* chore: update .github/workflows/deploy-dev.yml from MokoStandards

* chore: update .github/workflows/deploy-demo.yml from MokoStandards

* chore: update .github/workflows/deploy-rs.yml from MokoStandards

* chore: update .github/workflows/sync-version-on-merge.yml from MokoStandards

* chore: update .github/workflows/auto-release.yml from MokoStandards

* chore: update .github/workflows/repository-cleanup.yml from MokoStandards

* chore: update .github/workflows/auto-dev-issue.yml from MokoStandards

* chore: update .github/workflows/repo_health.yml from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/config.yml from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/adr.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/bug_report.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/documentation.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/enterprise_support.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/feature_request.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/firewall-request.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/question.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/request-license.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/rfc.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/security.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/joomla_issue.md from MokoStandards

* chore: update .github/CODEOWNERS from MokoStandards

* chore: migrate .mokostandards to .github/
2026-04-02 16:21:11 -05:00
jmiller bb0dffd2c2 feat: add login support URLs for forum, docs, and news
Set admin login support links to mokoconsulting.tech:
- Forum → /support
- Documentation → /kb
- News → /news

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:15:01 -05:00
jmiller f903e6af4e feat: add hyperlink to Powered by brand attribution
Wrap {{BRAND_NAME}} in an anchor tag linking to {{SUPPORT_URL}} in all
Powered by override strings (Atum, Cassiopeia, footer module, and
generic JLIB_HTML_POWERED_BY).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:12:44 -05:00
jmiller 81b822004a fix: update all workflows to latest MokoStandards v04.04 templates [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 10:13:23 -05:00
jmiller e4f3467b47 fix: update all workflows to latest MokoStandards v04.04 templates [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 10:13:19 -05:00
jmiller f1d06bba99 docs: testing guide, expanded overrides, updated config docs
- Added testing guide with 10 test suites covering install, uninstall,
  config changes, override preservation, and key coverage
- Expanded admin overrides with 9 more Joomla Update component keys
- Added frontend offline page and error page override keys
- Updated configuration guide to v02.00.00 documenting brand_name,
  company_name, support_url params and two-layer override system

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:54:46 -05:00
jmiller 9542dd7f39 Language alignment 2026-03-31 13:45:30 -05:00
jmiller 83248d03b8 Update .gitignore 2026-03-31 13:45:05 -05:00
jmiller c72a9331fc Update .gitignore 2026-03-31 13:44:56 -05:00
jmiller 361e14dc33 Update .gitignore 2026-03-31 13:44:23 -05:00
jmiller 790ebdcf6e fix: delete retired workflows and fix duplicate env: [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 12:25:58 -05:00
jmiller 2f3d47d60f fix: delete retired workflows and fix duplicate env: [skip ci]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:17:31 -05:00
github-actions[bot] 6258589774 chore(version): auto-bump patch 01.04.02 → 01.04.03 [skip ci] 2026-03-27 01:06:13 +00:00
jmiller 6c8a18ba2a chore: Sync MokoStandards 04.01.00 (#22)
* chore: update LICENSE from MokoStandards

* chore: update update.xml from MokoStandards

* chore: update phpstan.neon from MokoStandards

* chore: update Makefile from MokoStandards

* chore: update .gitignore from MokoStandards

* chore: update composer.json from MokoStandards

* chore: update .moko-standards from MokoStandards

* chore: update .github/copilot.yml from MokoStandards

* chore: update .github/copilot-instructions.md from MokoStandards

* chore: update .github/CLAUDE.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/config.yml from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/adr.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/bug_report.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/documentation.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/enterprise_support.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/feature_request.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/firewall-request.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/question.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/request-license.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/rfc.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/security.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/joomla_issue.md from MokoStandards

* chore: update .github/workflows/deploy-dev.yml from MokoStandards

* chore: update .github/workflows/deploy-demo.yml from MokoStandards

* chore: update .github/workflows/deploy-rs.yml from MokoStandards

* chore: update .github/workflows/enterprise-firewall-setup.yml from MokoStandards

* chore: update .github/workflows/sync-version-on-merge.yml from MokoStandards

* chore: update .github/workflows/auto-release.yml from MokoStandards

* chore: add .github/workflows/repository-cleanup.yml from MokoStandards

* chore: update .github/workflows/standards-compliance.yml from MokoStandards

* chore: update .github/workflows/codeql-analysis.yml from MokoStandards

* chore: update .github/workflows/repo_health.yml from MokoStandards
2026-03-26 20:05:54 -05:00
github-actions[bot] 6a606d7f2a chore: remove repository-cleanup.yml after successful run [skip ci] 2026-03-26 23:58:16 +00:00
github-actions[bot] ed11e065d3 chore(release): set version to 01.04.02 [skip ci] 2026-03-26 23:18:47 +00:00
jmiller fec5fa1e71 chore: Sync MokoStandards 04.01.00 (#21)
* chore: update LICENSE from MokoStandards

* chore: update update.xml from MokoStandards

* chore: update phpstan.neon from MokoStandards

* chore: update Makefile from MokoStandards

* chore: update .gitignore from MokoStandards

* chore: update composer.json from MokoStandards

* chore: update .moko-standards from MokoStandards

* chore: update .github/copilot.yml from MokoStandards

* chore: update .github/copilot-instructions.md from MokoStandards

* chore: update .github/CLAUDE.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/config.yml from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/adr.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/bug_report.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/documentation.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/enterprise_support.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/feature_request.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/firewall-request.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/question.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/request-license.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/rfc.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/security.md from MokoStandards

* chore: update .github/ISSUE_TEMPLATE/joomla_issue.md from MokoStandards

* chore: update .github/workflows/deploy-dev.yml from MokoStandards

* chore: add .github/workflows/deploy-demo.yml from MokoStandards

* chore: add .github/workflows/deploy-rs.yml from MokoStandards

* chore: update .github/workflows/enterprise-firewall-setup.yml from MokoStandards

* chore: update .github/workflows/sync-version-on-merge.yml from MokoStandards

* chore: add .github/workflows/auto-release.yml from MokoStandards

* chore: add .github/workflows/repository-cleanup.yml from MokoStandards

* chore: update .github/workflows/standards-compliance.yml from MokoStandards

* chore: update .github/workflows/codeql-analysis.yml from MokoStandards

* chore: add .github/workflows/repo_health.yml from MokoStandards
2026-03-26 18:17:28 -05:00
jmiller b1197f23d8 feat: template-based language overrides with configurable brand name
Replace hardcoded "MokoWaaS" in override files with {{BRAND_NAME}},
{{COMPANY_NAME}}, and {{SUPPORT_URL}} placeholders. Brand values come
from plugin config params (defaults: MokoWaaS / Moko Consulting).

- Runtime: plugin resolves placeholders on every request from live params
- Install-time: script resolves and writes to Joomla override files
- Added ~20 new admin override keys (Quick Icons, System Info, Installer,
  Global Config, Privacy, Update component)
- Added brand_name, company_name, support_url config fields to manifest

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 14:10:27 -05:00
jmiller 2c1a7361d7 fix: merge language overrides instead of replacing existing files
Rework the install script to use a sentinel-block pattern (BEGIN/END
MokoWaaS Overrides) so existing site overrides are preserved verbatim.
On install the block is appended; on update it is stripped and rebuilt;
on uninstall only MokoWaaS keys are removed.

Also hardcode the plugin display name in the manifest and fix
creationDate XML formatting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 13:53:24 -05:00
jmiller 24a8bb3635 Version Bump > 02.00.00 2026-03-26 13:38:19 -05:00
jmiller 65db518241 Update mokowaas.xml 2026-03-26 13:36:43 -05:00
jmiller 6dc3b30fa9 Update .gitignore 2026-03-26 13:36:01 -05:00