Commit Graph

56 Commits

Author SHA1 Message Date
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 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 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 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
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 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 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 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 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 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
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 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 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 26c6baa21a Update mokowaas.xml 2026-03-26 13:35:46 -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
copilot-swe-agent[bot] 77d4f5dcd4 Changes before error encountered
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-27 01:28:44 +00:00
jmiller 42a019f13f Language Fix 2026-02-26 19:11:04 -06:00
copilot-swe-agent[bot] 5f68d6ec8c Fix InstallerScriptInterface method return types to bool
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-26 20:29:03 +00:00
copilot-swe-agent[bot] d217820518 Add installation script to deploy language overrides
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-26 20:22:24 +00:00
copilot-swe-agent[bot] bde5d17da1 Fix language loading by implementing programmatic override loading
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-26 20:18:54 +00:00
copilot-swe-agent[bot] a444be870a Add language override files to XML manifest
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-26 20:11:08 +00:00
copilot-swe-agent[bot] 197a0b28d7 Remove .sys.ini files from frontend language directories
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-26 20:04:00 +00:00
copilot-swe-agent[bot] aa62e9207a Fix class not found error by adding proper namespace
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-26 19:58:06 +00:00
copilot-swe-agent[bot] 869ff9839c Repair XML: Remove .sys.ini files from frontend language section
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-26 19:50:16 +00:00
copilot-swe-agent[bot] 96dd58da9e Fix language file references in mokowaasbrand.xml to match actual file structure
Co-authored-by: jmiller-moko <230051081+jmiller-moko@users.noreply.github.com>
2026-02-26 19:46:21 +00:00
jmiller 0262451a85 Update mokowaasbrand.xml 2026-02-26 13:43:25 -06:00
jmiller ba28f08b95 admn 2026-02-26 11:14:38 -06:00
jmiller 28a41017b9 Reset 2026-02-26 11:08:20 -06:00
jmiller 311947de3e Restructure 2026-02-26 11:06:20 -06:00