feat: rename mokojoombackup → mokosuitebackup, add [HOME] placeholder for backup directory
Generic: Repo Health / Scripts governance (push) Blocked by required conditions
Generic: Repo Health / Repository health (push) Blocked by required conditions
Generic: Repo Health / Report Issues (push) Blocked by required conditions
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 2s
Universal: Auto Version Bump / Version Bump (push) Successful in 10s

Renames all sub-extensions from mokojoombackup to mokosuitebackup
(package, component, 7 plugins, language files, manifests).

Adds [HOME] placeholder to BackupDirectory and PlaceholderResolver
so users can set backup_dir to [HOME]/backups (outside web root).
Fixes folder browser "access denied" on PHP-FPM shared hosting
where getenv('HOME') returns empty by adding POSIX and JPATH_ROOT
fallback detection.
This commit is contained in:
Jonathan Miller
2026-06-11 12:24:27 -05:00
parent 8bcd5c058c
commit ace33b60fe
229 changed files with 993 additions and 874 deletions
+29 -29
View File
@@ -1,7 +1,7 @@
<?php
/**
* @package MokoJoomBackup
* @package MokoSuiteBackup
* @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
* @license GNU General Public License version 3 or later; see LICENSE
@@ -14,7 +14,7 @@ use Joomla\CMS\Installer\InstallerAdapter;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;
class Pkg_MokoJoomBackupInstallerScript
class Pkg_MokoSuiteBackupInstallerScript
{
/**
* Minimum Joomla version required
@@ -91,7 +91,7 @@ class Pkg_MokoJoomBackupInstallerScript
$db->quoteName('#__extensions', 'e')
. ' ON ' . $db->quoteName('e.extension_id') . ' = ' . $db->quoteName('use.extension_id')
)
->where($db->quoteName('e.element') . ' = ' . $db->quote('pkg_mokojoombackup'))
->where($db->quoteName('e.element') . ' = ' . $db->quote('pkg_mokosuitebackup'))
->where($db->quoteName('e.type') . ' = ' . $db->quote('package'))
->setLimit(1);
$db->setQuery($query);
@@ -101,7 +101,7 @@ class Pkg_MokoJoomBackupInstallerScript
$this->savedDownloadKey = $key;
}
} catch (\Throwable $e) {
error_log('MokoJoomBackup: Could not save download key: ' . $e->getMessage());
error_log('MokoSuiteBackup: Could not save download key: ' . $e->getMessage());
}
}
@@ -120,7 +120,7 @@ class Pkg_MokoJoomBackupInstallerScript
->set($db->quoteName('enabled') . ' = 1')
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote('system'))
->where($db->quoteName('element') . ' = ' . $db->quote('mokojoombackup'));
->where($db->quoteName('element') . ' = ' . $db->quote('mokosuitebackup'));
$db->setQuery($query);
$db->execute();
@@ -131,7 +131,7 @@ class Pkg_MokoJoomBackupInstallerScript
->set($db->quoteName('enabled') . ' = 1')
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote('quickicon'))
->where($db->quoteName('element') . ' = ' . $db->quote('mokojoombackup'));
->where($db->quoteName('element') . ' = ' . $db->quote('mokosuitebackup'));
$db->setQuery($query);
$db->execute();
@@ -142,7 +142,7 @@ class Pkg_MokoJoomBackupInstallerScript
->set($db->quoteName('enabled') . ' = 1')
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote('task'))
->where($db->quoteName('element') . ' = ' . $db->quote('mokojoombackup'));
->where($db->quoteName('element') . ' = ' . $db->quote('mokosuitebackup'));
$db->setQuery($query);
$db->execute();
@@ -153,7 +153,7 @@ class Pkg_MokoJoomBackupInstallerScript
->set($db->quoteName('enabled') . ' = 1')
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote('webservices'))
->where($db->quoteName('element') . ' = ' . $db->quote('mokojoombackup'));
->where($db->quoteName('element') . ' = ' . $db->quote('mokosuitebackup'));
$db->setQuery($query);
$db->execute();
@@ -164,7 +164,7 @@ class Pkg_MokoJoomBackupInstallerScript
->set($db->quoteName('enabled') . ' = 1')
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote('console'))
->where($db->quoteName('element') . ' = ' . $db->quote('mokojoombackup'));
->where($db->quoteName('element') . ' = ' . $db->quote('mokosuitebackup'));
$db->setQuery($query);
$db->execute();
@@ -175,7 +175,7 @@ class Pkg_MokoJoomBackupInstallerScript
->set($db->quoteName('enabled') . ' = 1')
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote('content'))
->where($db->quoteName('element') . ' = ' . $db->quote('mokojoombackup'));
->where($db->quoteName('element') . ' = ' . $db->quote('mokosuitebackup'));
$db->setQuery($query);
$db->execute();
@@ -186,13 +186,13 @@ class Pkg_MokoJoomBackupInstallerScript
->set($db->quoteName('enabled') . ' = 1')
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote('actionlog'))
->where($db->quoteName('element') . ' = ' . $db->quote('mokojoombackup'));
->where($db->quoteName('element') . ' = ' . $db->quote('mokosuitebackup'));
$db->setQuery($query);
$db->execute();
// Create and protect default backup directory
$backupDir = JPATH_ADMINISTRATOR . '/components/com_mokojoombackup/backups';
$backupDir = JPATH_ADMINISTRATOR . '/components/com_mokosuitebackup/backups';
if (!is_dir($backupDir)) {
mkdir($backupDir, 0755, true);
@@ -231,7 +231,7 @@ class Pkg_MokoJoomBackupInstallerScript
// Remind user to review backup profile settings
if ($type === 'install') {
$profileUrl = Route::_('index.php?option=com_mokojoombackup&view=profiles');
$profileUrl = Route::_('index.php?option=com_mokosuitebackup&view=profiles');
Factory::getApplication()->enqueueMessage(
'<strong>Review Your Backup Settings</strong> — '
@@ -249,16 +249,16 @@ class Pkg_MokoJoomBackupInstallerScript
$db = Factory::getDbo();
$query = $db->getQuery(true)
->select('COUNT(*)')
->from($db->quoteName('#__mokojoombackup_profiles'))
->from($db->quoteName('#__mokosuitebackup_profiles'))
->where($db->quoteName('published') . ' = 1')
->where('(' . $db->quoteName('backup_dir') . ' = ' . $db->quote('administrator/components/com_mokojoombackup/backups')
->where('(' . $db->quoteName('backup_dir') . ' = ' . $db->quote('administrator/components/com_mokosuitebackup/backups')
. ' OR ' . $db->quoteName('backup_dir') . ' = ' . $db->quote('[DEFAULT_DIR]')
. ' OR ' . $db->quoteName('backup_dir') . ' = ' . $db->quote('')
. ' OR ' . $db->quoteName('backup_dir') . ' IS NULL)');
$db->setQuery($query);
if ((int) $db->loadResult() > 0) {
$profileUrl = Route::_('index.php?option=com_mokojoombackup&view=profiles');
$profileUrl = Route::_('index.php?option=com_mokosuitebackup&view=profiles');
Factory::getApplication()->enqueueMessage(
'<strong>Backup Directory Warning</strong> — '
@@ -269,7 +269,7 @@ class Pkg_MokoJoomBackupInstallerScript
);
}
} catch (\Throwable $e) {
error_log('MokoJoomBackup: warnDefaultBackupDir() failed: ' . $e->getMessage());
error_log('MokoSuiteBackup: warnDefaultBackupDir() failed: ' . $e->getMessage());
}
}
@@ -278,11 +278,11 @@ class Pkg_MokoJoomBackupInstallerScript
try {
$db = Factory::getDbo();
// Check if a MokoJoomBackup task already exists
// Check if a MokoSuiteBackup task already exists
$query = $db->getQuery(true)
->select('COUNT(*)')
->from($db->quoteName('#__scheduler_tasks'))
->where($db->quoteName('type') . ' = ' . $db->quote('mokojoombackup.run_profile'));
->where($db->quoteName('type') . ' = ' . $db->quote('mokosuitebackup.run_profile'));
$db->setQuery($query);
if ((int) $db->loadResult() > 0) {
@@ -292,8 +292,8 @@ class Pkg_MokoJoomBackupInstallerScript
$now = date('Y-m-d H:i:s');
$task = (object) [
'title' => 'MokoJoomBackup — Monthly Full Backup',
'type' => 'mokojoombackup.run_profile',
'title' => 'MokoSuiteBackup — Monthly Full Backup',
'type' => 'mokosuitebackup.run_profile',
'execution_rules' => json_encode([
'rule-type' => 'interval-days',
'interval-days' => '30',
@@ -329,7 +329,7 @@ class Pkg_MokoJoomBackupInstallerScript
$db->insertObject('#__scheduler_tasks', $task);
} catch (\Throwable $e) {
error_log('MokoJoomBackup: createDefaultScheduledTask() failed: ' . $e->getMessage());
error_log('MokoSuiteBackup: createDefaultScheduledTask() failed: ' . $e->getMessage());
}
}
@@ -349,7 +349,7 @@ class Pkg_MokoJoomBackupInstallerScript
->update($db->quoteName('#__menu'))
->set($db->quoteName('img') . ' = ' . $db->quote($icon))
->where($db->quoteName('client_id') . ' = 1')
->where($db->quoteName('link') . ' LIKE ' . $db->quote('%com_mokojoombackup%' . $linkFragment . '%'));
->where($db->quoteName('link') . ' LIKE ' . $db->quote('%com_mokosuitebackup%' . $linkFragment . '%'));
$db->setQuery($query);
$db->execute();
}
@@ -359,12 +359,12 @@ class Pkg_MokoJoomBackupInstallerScript
->update($db->quoteName('#__menu'))
->set($db->quoteName('img') . ' = ' . $db->quote('class:archive'))
->where($db->quoteName('client_id') . ' = 1')
->where($db->quoteName('link') . ' LIKE ' . $db->quote('index.php?option=com_mokojoombackup'))
->where($db->quoteName('link') . ' LIKE ' . $db->quote('index.php?option=com_mokosuitebackup'))
->where($db->quoteName('level') . ' = 1');
$db->setQuery($query);
$db->execute();
} catch (\Throwable $e) {
error_log('MokoJoomBackup: syncMenuIcons() failed: ' . $e->getMessage());
error_log('MokoSuiteBackup: syncMenuIcons() failed: ' . $e->getMessage());
}
}
@@ -388,7 +388,7 @@ class Pkg_MokoJoomBackupInstallerScript
$db->quoteName('#__extensions', 'e')
. ' ON ' . $db->quoteName('e.extension_id') . ' = ' . $db->quoteName('use.extension_id')
)
->where($db->quoteName('e.element') . ' = ' . $db->quote('pkg_mokojoombackup'))
->where($db->quoteName('e.element') . ' = ' . $db->quote('pkg_mokosuitebackup'))
->where($db->quoteName('e.type') . ' = ' . $db->quote('package'))
->setLimit(1);
$db->setQuery($query);
@@ -403,7 +403,7 @@ class Pkg_MokoJoomBackupInstallerScript
$db->execute();
}
} catch (\Throwable $e) {
error_log('MokoJoomBackup: Could not restore download key: ' . $e->getMessage());
error_log('MokoSuiteBackup: Could not restore download key: ' . $e->getMessage());
}
}
@@ -416,7 +416,7 @@ class Pkg_MokoJoomBackupInstallerScript
$db->getQuery(true)
->select([$db->quoteName('update_site_id'), $db->quoteName('extra_query')])
->from($db->quoteName('#__update_sites'))
->where('(' . $db->quoteName('name') . ' LIKE ' . $db->quote('%MokoJoomBackup%') . ' OR ' . $db->quoteName('location') . ' LIKE ' . $db->quote('%MokoJoomBackup%') . ')')
->where('(' . $db->quoteName('name') . ' LIKE ' . $db->quote('%MokoSuiteBackup%') . ' OR ' . $db->quoteName('location') . ' LIKE ' . $db->quote('%MokoSuiteBackup%') . ')')
->setLimit(1)
);
$site = $db->loadObject();
@@ -440,7 +440,7 @@ class Pkg_MokoJoomBackupInstallerScript
);
}
catch (\Throwable $e) {
error_log('MokoJoomBackup: License key check failed: ' . $e->getMessage());
error_log('MokoSuiteBackup: License key check failed: ' . $e->getMessage());
}
}
}