diff --git a/.mokogitea/workflows/issue-branch.yml b/.mokogitea/workflows/issue-branch.yml index 11958bd..719d327 100644 --- a/.mokogitea/workflows/issue-branch.yml +++ b/.mokogitea/workflows/issue-branch.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: Gitea.Workflow # INGROUP: mokocli.Automation -# VERSION: 01.00.00 +# VERSION: 01.44.01 # BRIEF: Auto-create feature branch when an issue is opened name: "Universal: Issue Branch" diff --git a/CHANGELOG.md b/CHANGELOG.md index 92664e7..f6e78b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,8 @@ # Changelog + ## [Unreleased] -## [01.44.00] --- 2026-06-28 - - -## [01.44.00] --- 2026-06-28 +## [01.43.35] --- 2026-06-28 ### Added - Customizable restore script filename per backup profile (reduces discoverability on remote servers) @@ -21,6 +19,7 @@ - MokoRestore cleanup and security messages now reference the actual script filename instead of hardcoded "restore.php" ### Fixed +- SSH key indicator detection and missing delete language key - Bootstrap 5 modal conversion for snapshots view (data-bs-dismiss, modal-footer, getOrCreateInstance) - ntfy default URL changed from ntfy.sh to ntfy.mokoconsulting.tech - Untranslated JFIELD_ORDERING_ASC / JFIELD_ORDERING_LABEL language keys replaced with component-specific keys @@ -28,12 +27,132 @@ - Profile dropdown IDs in backup records and dashboard show "#ID — Title (type)" format - MokoRestore stalling: unhandled promise rejections from network errors or non-JSON responses left UI in loading state -## [01.43.00] --- 2026-06-24 - - ## [01.43.00] --- 2026-06-24 ## [01.42.00] --- 2026-06-23 ## [01.42.00] --- 2026-06-23 + +## [01.41.00] — 2026-06-23 + +### Added — Multi-Remote Storage +- New `#__mokosuitebackup_remotes` table for multiple destinations per profile +- Remote destinations UI: AJAX-driven add/edit/delete/toggle modal on profile edit +- Engine uploads to ALL enabled destinations (BackupEngine + SteppedBackupEngine) +- Migration auto-converts existing SFTP/S3/GDrive/FTP profile columns to new table +- Backward compatibility: falls back to legacy single-remote columns if table empty +- Secrets masked in API responses, merged from DB on save + +### Added — Content Snapshots +- Lightweight JSON snapshots of articles, categories, and modules +- Includes tags, custom fields, workflow associations, field values +- Restore modes: Replace (clean slate), Merge (upsert), Selective (per-article) +- Snapshot retention: max count + max age with automatic cleanup +- Scheduled snapshot task via com_scheduler +- CLI: `mokosuitebackup:snapshot create|restore|list|delete` +- REST API: create, list, restore, delete, download snapshots +- Tabbed browse modal: Articles / Categories / Modules with item counts + +### Added — SFTP Remote Storage +- SFTP support with SSH key file authentication (key stored base64 in database) +- Auth type dropdown: Password / Key File / Key File + Passphrase +- SshKeyField: file upload via FileReader, key never exposed in HTML +- SFTP remote directory browser for path selection +- `__KEEP_EXISTING__` sentinel preserves key on profile re-save + +### Added — MokoRestore Wizard (9 steps) +- Per-table conflict resolution: Replace / Skip / Merge / Data Only +- Preset buttons: "All Replace", "All Skip", "Everything except users" +- Post-restore actions: reset passwords, hits, versions, sessions, cache +- Auto-detect sanitized passwords and prompt for reset (random temp password) +- Standalone mode: restore.php scans directory for ZIP files +- Wrapped mode: restore.php bundled inside backup ZIP +- Security gate with filesystem verification + path traversal protection + +### Added — Data Sanitization +- Sanitize user passwords: replace hashes with invalid sentinel +- Sanitize user emails: replace with dummy values +- Clear session data: exclude `#__session` table +- Preserve super admin credentials (optional) +- GDPR-friendly backup sharing for demos and staging sites + +### Added — Backup Engine +- Pre-flight validation: directory, disk space, extensions, credentials, running backups +- Auto-verify archive integrity after creation (ZIP, tar.gz, 7z) +- 7z archive format via system 7za/7z CLI binary with native encryption +- Streaming database dump to temp file (prevents OOM on large sites) +- S3 streaming upload via CURLOPT_PUT (prevents OOM) +- Graceful remote degradation: local backup preserved if upload fails +- DatabaseDumper::dumpToFile() for memory-efficient operation + +### Added — Admin UI +- Dashboard: snapshot widget, 30-day backup trend chart, per-profile storage breakdown +- CPanel admin dashboard module (mod_mokosuitebackup_cpanel) with quick actions +- Backup type filter dropdown in backups list +- Backup comparison: select two backups for side-by-side diff +- Archive browser: view files inside backup without extracting +- Manual purge: delete backups older than a date with count preview +- Backup count badges on profile list +- "Do not navigate away" warning in backup/restore progress modals +- Clickable placeholder pills for backup directory and archive name fields +- Comprehensive help modal with absolute/relative/placeholder path documentation +- Placeholder resolution display with EXAMPLE prefix +- All placeholders UPPERCASE: [HOST], [SITE_NAME], [DATE], [DATETIME], etc. + +### Added — CLI & API +- `mokosuitebackup:restore` with --files-only, --db-only, --password options +- `mokosuitebackup:snapshot` with create, restore, list, delete actions +- REST API for snapshots: create, list, restore, delete, download +- Profile credentials masked in API responses + +### Added — Notifications & Logging +- Email/ntfy notifications for site restore, snapshot create/restore +- Joomla Action Logs for restore, snapshot, and snapshot restore events +- Global ntfy server/topic/token settings (fallback for profiles) + +### Added — Security & Configuration +- Webcron secret field with CSPRNG generator + strength meter +- IP whitelist field with current IP detection + one-click "Add my IP" +- 10 ACL permissions with full enforcement audit across all controllers +- Config defaults: archive format, MokoRestore mode, sanitization settings +- Path traversal protection on all archive extraction (ZIP, tar.gz, JPA) + +### Fixed +- CLI RestoreCommand passed wrong arguments (filepath instead of record ID) +- JPA path traversal: reject `../` in archive entry paths +- S3Uploader OOM: streaming upload instead of file_get_contents +- DatabaseDumper OOM: streaming to file instead of in-memory string +- AkeebaImporter: removed unserialize() (PHP object injection risk) +- BackupTable: delete DB row before file (prevents data loss) +- RestoreEngine: staging path sanitized with preg_replace +- API profiles: sensitive fields masked with `***` +- Webcron: missing return after sendJsonResponse on auth failure +- loadFormData(): cast array to object (PHP 8.x TypeError fix) +- MokoRestore data-only mode: uses REPLACE INTO for existing rows +- Plaintext archive deleted on encryption failure +- TarGzArchiver: intermediate .tar cleaned in finally block +- Install script: single-line comments converted to block comments +- Orphaned root-level webservices plugin files removed +- include_mokorestore column: TINYINT changed to VARCHAR(20) +- Snapshot fields_values: scoped dump and restore to com_content.article (previously destroyed values for contacts, users, etc.) +- Run Backup button: accept CSRF token from GET (fixes "token did not match" on profile edit) +- SFTP fields: moved into remote fieldset for showon visibility; removed required attr that blocked non-SFTP saves +- Script.php merge conflict markers resolved + +## [01.24.00] — 2026-06-02 + +### Added +- Initial release: full-site backup and restore for Joomla 6 +- Database, files, and configuration backup +- ZIP and tar.gz archive formats with AES-256 encryption +- Differential backups based on file manifests +- FTP/FTPS, S3, Google Drive remote storage +- MokoRestore standalone restore wizard +- CLI backup and restore commands +- REST API for remote management +- Scheduled tasks via com_scheduler +- Email and ntfy push notifications +- Per-profile retention, exclusions, and notifications +- Akeeba Backup migration tool +- Admin dashboard with system health checks diff --git a/README.md b/README.md index b949bbb..7ab2b19 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ Full-site backup and restore for Joomla — database, files, and configuration. - Stepped AJAX engine prevents timeout on shared hosting - AES-256 ZIP encryption with configurable password - Configurable archive naming with placeholders ([HOST], [DATE], [SITE_NAME], etc.) +- Per-profile retention — configure max backup count and max age (days) per profile, with global defaults - Data sanitization — optionally clear user passwords, emails, and sessions in backup ### Content Snapshots diff --git a/SECURITY.md b/SECURITY.md index abcf806..d6dc672 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -23,7 +23,7 @@ DEFGROUP: Template-Joomla INGROUP: Template-Joomla.Documentation REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Joomla PATH: /SECURITY.md -VERSION: 01.44.00 +VERSION: 01.44.01 BRIEF: Security vulnerability reporting and handling policy --> diff --git a/source/packages/MokoSuiteClient b/source/packages/MokoSuiteClient index f0a8ad6..9df6bea 160000 --- a/source/packages/MokoSuiteClient +++ b/source/packages/MokoSuiteClient @@ -1 +1 @@ -Subproject commit f0a8ad6c39cc9fa4190a7f1b06c63dda16c0c6c0 +Subproject commit 9df6bea4b7480b2e443898ad84a279070ba4a7f6 diff --git a/source/packages/com_mokosuitebackup/mokosuitebackup.xml b/source/packages/com_mokosuitebackup/mokosuitebackup.xml index 81687eb..d426355 100644 --- a/source/packages/com_mokosuitebackup/mokosuitebackup.xml +++ b/source/packages/com_mokosuitebackup/mokosuitebackup.xml @@ -7,7 +7,7 @@ --> MokoSuiteBackup - 01.44.00 + 01.44.01 2026-06-02 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/com_mokosuitebackup/sql/updates/mysql/01.43.36.sql b/source/packages/com_mokosuitebackup/sql/updates/mysql/01.43.36.sql new file mode 100644 index 0000000..7663707 --- /dev/null +++ b/source/packages/com_mokosuitebackup/sql/updates/mysql/01.43.36.sql @@ -0,0 +1 @@ +/* 01.43.36 — no schema changes */ diff --git a/source/packages/com_mokosuitebackup/sql/updates/mysql/01.43.37.sql b/source/packages/com_mokosuitebackup/sql/updates/mysql/01.43.37.sql new file mode 100644 index 0000000..de192f8 --- /dev/null +++ b/source/packages/com_mokosuitebackup/sql/updates/mysql/01.43.37.sql @@ -0,0 +1 @@ +/* 01.43.37 — no schema changes */ diff --git a/source/packages/com_mokosuitebackup/sql/updates/mysql/01.43.38.sql b/source/packages/com_mokosuitebackup/sql/updates/mysql/01.43.38.sql new file mode 100644 index 0000000..c60cda0 --- /dev/null +++ b/source/packages/com_mokosuitebackup/sql/updates/mysql/01.43.38.sql @@ -0,0 +1 @@ +/* 01.43.38 — no schema changes */ diff --git a/source/packages/com_mokosuitebackup/sql/updates/mysql/01.44.01.sql b/source/packages/com_mokosuitebackup/sql/updates/mysql/01.44.01.sql new file mode 100644 index 0000000..abd91d5 --- /dev/null +++ b/source/packages/com_mokosuitebackup/sql/updates/mysql/01.44.01.sql @@ -0,0 +1 @@ +/* 01.44.01 — no schema changes */ diff --git a/source/packages/mod_mokosuitebackup_cpanel/mod_mokosuitebackup_cpanel.xml b/source/packages/mod_mokosuitebackup_cpanel/mod_mokosuitebackup_cpanel.xml index bb9d8e2..98faafe 100644 --- a/source/packages/mod_mokosuitebackup_cpanel/mod_mokosuitebackup_cpanel.xml +++ b/source/packages/mod_mokosuitebackup_cpanel/mod_mokosuitebackup_cpanel.xml @@ -8,7 +8,7 @@ --> mod_mokosuitebackup_cpanel - 01.44.00 + 01.44.01 2026-06-23 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_actionlog_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_actionlog_mokosuitebackup/mokosuitebackup.xml index 63c15d4..b6153a0 100644 --- a/source/packages/plg_actionlog_mokosuitebackup/mokosuitebackup.xml +++ b/source/packages/plg_actionlog_mokosuitebackup/mokosuitebackup.xml @@ -7,7 +7,7 @@ --> Action Log - MokoSuiteBackup - 01.44.00 + 01.44.01 2026-06-04 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_console_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_console_mokosuitebackup/mokosuitebackup.xml index 959fc39..8406be3 100644 --- a/source/packages/plg_console_mokosuitebackup/mokosuitebackup.xml +++ b/source/packages/plg_console_mokosuitebackup/mokosuitebackup.xml @@ -7,7 +7,7 @@ --> Console - MokoSuiteBackup - 01.44.00 + 01.44.01 2026-06-04 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_content_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_content_mokosuitebackup/mokosuitebackup.xml index 3447338..11b81ef 100644 --- a/source/packages/plg_content_mokosuitebackup/mokosuitebackup.xml +++ b/source/packages/plg_content_mokosuitebackup/mokosuitebackup.xml @@ -7,7 +7,7 @@ --> Content - MokoSuiteBackup - 01.44.00 + 01.44.01 2026-06-04 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_quickicon_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_quickicon_mokosuitebackup/mokosuitebackup.xml index fd79855..660403e 100644 --- a/source/packages/plg_quickicon_mokosuitebackup/mokosuitebackup.xml +++ b/source/packages/plg_quickicon_mokosuitebackup/mokosuitebackup.xml @@ -1,7 +1,7 @@ Quick Icon - MokoSuiteBackup - 01.44.00 + 01.44.01 2026-06-02 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_system_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_system_mokosuitebackup/mokosuitebackup.xml index 5978715..024e237 100644 --- a/source/packages/plg_system_mokosuitebackup/mokosuitebackup.xml +++ b/source/packages/plg_system_mokosuitebackup/mokosuitebackup.xml @@ -7,7 +7,7 @@ --> System - MokoSuiteBackup - 01.44.00 + 01.44.01 2026-06-02 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_task_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_task_mokosuitebackup/mokosuitebackup.xml index 83cadcf..3b86900 100644 --- a/source/packages/plg_task_mokosuitebackup/mokosuitebackup.xml +++ b/source/packages/plg_task_mokosuitebackup/mokosuitebackup.xml @@ -7,7 +7,7 @@ --> Task - MokoSuiteBackup - 01.44.00 + 01.44.01 2026-06-02 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_webservices_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_webservices_mokosuitebackup/mokosuitebackup.xml index 53214e8..eab68d5 100644 --- a/source/packages/plg_webservices_mokosuitebackup/mokosuitebackup.xml +++ b/source/packages/plg_webservices_mokosuitebackup/mokosuitebackup.xml @@ -7,7 +7,7 @@ --> Web Services - MokoSuiteBackup - 01.44.00 + 01.44.01 2026-06-02 Moko Consulting hello@mokoconsulting.tech diff --git a/source/pkg_mokosuitebackup.xml b/source/pkg_mokosuitebackup.xml index 70759bc..ac0f65d 100644 --- a/source/pkg_mokosuitebackup.xml +++ b/source/pkg_mokosuitebackup.xml @@ -8,7 +8,7 @@ Package - MokoSuiteBackup mokosuitebackup - 01.44.00 + 01.44.01 2026-06-02 Moko Consulting hello@mokoconsulting.tech