- Remove -dev suffix from all version strings
- Convert CHANGELOG [Unreleased] section to 01.00.00
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
#18 — Dashboard Quickicon Widget:
- plg_quickicon_mokobackup: shows backup status on admin dashboard
- Displays: last backup time, total count, storage used
- Warning states: no backups, recent failures, stale (>7 days)
- Links to backup records view
#19 — Differential Backups:
- New backup_type: "differential" — only backs up changed/new files
- DifferentialScanner: builds manifest (path+size+mtime) on full backups
- Compares current filesystem against base manifest on differential runs
- Manifest stored in backup record (LONGTEXT column)
- Falls back to full backup if no base manifest exists
- Database is always fully dumped (no incremental DB)
#20 — JPA Format Import:
- JpaUnarchiver: parses Akeeba JPA binary format
- Handles: archive header, file entities, gzip decompression, permissions
- RestoreEngine auto-detects JPA vs ZIP by reading signature bytes
- Enables restoring from existing Akeeba .jpa backup files
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Per-profile encryption_password field in archive settings
- BackupEngine encrypts all files in ZIP using ZipArchive::EM_AES_256
(WinZip-compatible, requires PHP 7.2+ with libzip 1.2.0+)
- Encryption runs after ZIP creation, before checksum computation
- RestoreEngine accepts password parameter for decryption
- BackupsController passes encryption_password to restore
- Kickstart restore.php: password input field in Step 2, passed to
ZipArchive::setPassword() before extraction
- Clear error messages for wrong password or missing AES support
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- NotificationSender: sends email via Joomla's mailer on backup
complete or fail, with site info, duration, size, and log excerpt
- Per-profile settings: notify_email (comma-separated), notify_on_success,
notify_on_failure (default: on)
- Notifications tab added to profile editor
- Wired into BackupEngine for both success and failure paths
- Failure emails include last 30 lines of backup log for debugging
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Import Akeeba profiles, filters, remote storage settings, and backup
history into MokoJoomBackup. After successful import, Akeeba plugins
and scheduled tasks are automatically disabled.
- AkeebaImporter: reads #__ak_profiles and #__ak_stats tables
- Parses both INI-format and JSON-format Akeeba configuration
- Maps backup types (dbonly→database, filesonly→files)
- Maps remote storage (ftp, googledrive) with credential transfer
- Parses Akeeba filter format (per-root, nested) to newline lists
- Imports backup history with profile ID remapping
- "Import from Akeeba" button auto-detected in Profiles view toolbar
- Disables Akeeba plugins + scheduled tasks (does NOT uninstall)
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Backup Now button was hardcoded to profile 1. Now the backups
view shows a profile dropdown with all published profiles, displaying
name and type (full/database/files). The selected profile is passed
to the stepped backup engine.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On shared hosting where max_execution_time cannot be overridden,
backups now run as a series of small AJAX requests. Each request
does one unit of work (dump one table, add one batch of files)
and returns within the time limit.
- SteppedBackupEngine: orchestrates init → database → files →
finalize → upload → complete phases
- SteppedSession: persists state between requests via temp JSON files
with automatic cleanup of stale sessions (24h)
- AjaxController: handles init and step requests with CSRF protection
- Admin UI: progress bar modal with real-time phase and percentage
updates, auto-reloads on completion
- Steps: 1 table per DB step, 200 files per file step (configurable)
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add RemoteUploaderInterface for pluggable storage backends
- Add FtpUploader: FTP/FTPS with passive mode, SSL, recursive dir
creation, and post-upload size verification
- Add GoogleDriveUploader: OAuth2 refresh token auth, resumable upload
API with 5 MB chunking for reliable large-file transfers
- Wire uploaders into BackupEngine Step 3: after ZIP creation, upload
to configured remote, optionally delete local copy
- No SDK dependencies — pure PHP with cURL for Google Drive
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add plg_task_mokobackup: Joomla Scheduled Tasks integration so each
backup profile can run on its own schedule (like Akeeba Backup Pro)
- Replace JSON config/filters with individual form fields and DB columns
- Add FTP/FTPS and Google Drive remote storage options per profile
- Add archive settings tab (format, compression, split size, backup dir)
- Add exclusion filter fields (dirs, files, tables) as newline-separated
textareas instead of raw JSON
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Full-site backup and restore for Joomla with three sub-extensions:
- com_mokobackup: Admin component with backup engine, profiles, and records
- plg_system_mokobackup: Auto-cleanup of expired backups
- plg_webservices_mokobackup: REST API wire-compatible with mcp_mokobackup
Backup engine supports full/database/files modes with step-based execution,
file/directory/table exclusion filters, and CLI script for cron use.
Authored-by: Moko Consulting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>