Commit Graph

20 Commits

Author SHA1 Message Date
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
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 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 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 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 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 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 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 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 24a8bb3635 Version Bump > 02.00.00 2026-03-26 13:38:19 -05:00
jmiller 56f26ca8cf refactor: rename plugin from MokoWaaSBrand to MokoWaaS
Drop the "Brand" suffix from all naming conventions:
- PascalCase: MokoWaaSBrand → MokoWaaS
- lowercase: mokowaasbrand → mokowaas
- Display: MokoWaaS-Brand → MokoWaaS
- Language keys: PLG_SYSTEM_MOKOWAASBRAND → PLG_SYSTEM_MOKOWAAS

Renames 6 files and updates 28 files across PHP, XML, INI,
Markdown, YAML, and shell scripts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 13:19:16 -05:00
copilot-swe-agent[bot] 097b6350b3 chore: flatten plugin source from src/plugins/system/mokowaasbrand/ down to src/
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-03-04 05:55:04 +00:00
jmiller 311947de3e Restructure 2026-02-26 11:06:20 -06:00
copilot-swe-agent[bot] cd13ced7b9 Complete version updates to 01.04.00
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-22 22:53:57 +00:00
copilot-swe-agent[bot] 04b99e0216 Update docs, changelog, and language overrides to version 01.04.00
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-22 22:53:02 +00:00
copilot-swe-agent[bot] 0033bef862 Add MokoWaaSBrand Joomla system plugin files
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-22 22:33:31 +00:00
jmiller a43340d541 INIT 2026-01-08 19:49:02 -06:00