mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-11-10 09:02:45 +08:00
95 lines
2.9 KiB
PHP
95 lines
2.9 KiB
PHP
<?php
|
|
|
|
class BackupPlugin extends \RainLoop\Plugins\AbstractPlugin
|
|
{
|
|
const
|
|
NAME = 'Backup',
|
|
AUTHOR = 'SnappyMail',
|
|
URL = 'https://snappymail.eu/',
|
|
VERSION = '1.2',
|
|
RELEASE = '2024-03-18',
|
|
REQUIRED = '2.30.0',
|
|
CATEGORY = 'General',
|
|
LICENSE = 'MIT',
|
|
DESCRIPTION = '';
|
|
|
|
public function Init() : void
|
|
{
|
|
// Admin Settings tab
|
|
$this->addJs('js/BackupAdminSettings.js', true); // add js file
|
|
$this->addJsonHook('JsonAdminBackupData');
|
|
$this->addJsonHook('JsonAdminRestoreData');
|
|
$this->addTemplate('templates/BackupAdminSettingsTab.html', true);
|
|
}
|
|
|
|
public function JsonAdminBackupData()
|
|
{
|
|
if (!($this->Manager()->Actions() instanceof \RainLoop\ActionsAdmin)
|
|
|| !$this->Manager()->Actions()->IsAdminLoggined()
|
|
) {
|
|
return $this->jsonResponse(__FUNCTION__, false);
|
|
}
|
|
|
|
\file_put_contents(APP_PRIVATE_DATA.'cache/CACHEDIR.TAG', 'Signature: 8a477f597d28d172789f06886806bc55');
|
|
|
|
$sFileName = APP_PRIVATE_DATA . \MailSo\Base\Utils::Sha1Rand();
|
|
|
|
if (true) {
|
|
$sType = 'application/zip';
|
|
$sFileName .= '.zip';
|
|
if (\class_exists('ZipArchive')) {
|
|
// $oArchive = new \ZipArchive();
|
|
// $oArchive->open($sFileName, \ZIPARCHIVE::CREATE | \ZIPARCHIVE::OVERWRITE);
|
|
// $oArchive->setArchiveComment('SnappyMail/'.APP_VERSION);
|
|
}
|
|
$oArchive = new \SnappyMail\Stream\ZIP($sFileName);
|
|
} else {
|
|
$sType = 'application/x-gzip';
|
|
$sFileName .= '.tgz';
|
|
$oArchive = new \SnappyMail\Stream\TAR($sFileName);
|
|
}
|
|
|
|
// $oArchive->addRecursive(APP_PRIVATE_DATA, '#/(cache.*)#');
|
|
$oArchive->addRecursive(APP_PRIVATE_DATA.'configs', 'configs');
|
|
$oArchive->addRecursive(APP_PRIVATE_DATA.'domains', 'domains');
|
|
$oArchive->addRecursive(APP_PRIVATE_DATA.'plugins', 'plugins');
|
|
$oArchive->addRecursive(APP_PRIVATE_DATA.'storage', 'storage');
|
|
if (\is_readable(APP_PRIVATE_DATA.'AddressBook.sqlite')) {
|
|
$oArchive->addFile(APP_PRIVATE_DATA.'AddressBook.sqlite');
|
|
}
|
|
// $oArchive->addFile(APP_DATA_FOLDER_PATH.'SALT.php');
|
|
$oArchive->close();
|
|
|
|
$data = \base64_encode(\file_get_contents($sFileName));
|
|
\unlink($sFileName);
|
|
|
|
return $this->jsonResponse(__FUNCTION__, array(
|
|
'name' => \basename($sFileName),
|
|
'data' => "data:{$sType};base64,{$data}"
|
|
));
|
|
}
|
|
|
|
public function JsonAdminRestoreData()
|
|
{
|
|
if (!($this->Manager()->Actions() instanceof \RainLoop\ActionsAdmin)
|
|
|| empty($_FILES['backup'])
|
|
|| 'application/zip' !== $_FILES['backup']['type']
|
|
|| !\is_uploaded_file($_FILES['backup']['tmp_name'])
|
|
) {
|
|
return $this->jsonResponse(__FUNCTION__, false);
|
|
}
|
|
|
|
$result = false;
|
|
if (\class_exists('ZipArchive')) {
|
|
$oArchive = new \ZipArchive();
|
|
$oArchive->open($_FILES['backup']['tmp_name'], \ZIPARCHIVE::CREATE);
|
|
$result = $oArchive->extractTo(APP_PRIVATE_DATA);
|
|
} else if (\class_exists('PharData')) {
|
|
$oArchive = new \PharData($sTmp, 0, null, \Phar::GZ);
|
|
$result = $oArchive->extractTo(APP_PRIVATE_DATA);
|
|
}
|
|
|
|
return $this->jsonResponse(__FUNCTION__, $result);
|
|
}
|
|
|
|
}
|