snappymail/plugins/backup/index.php

97 lines
2.9 KiB
PHP
Raw Normal View History

2023-11-28 01:06:12 +08:00
<?php
class BackupPlugin extends \RainLoop\Plugins\AbstractPlugin
{
const
NAME = 'Backup',
AUTHOR = 'SnappyMail',
URL = 'https://snappymail.eu/',
VERSION = '1.1',
RELEASE = '2023-12-12',
2023-11-28 01:06:12 +08:00
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('JsonAdminGetData');
$this->addJsonHook('JsonAdminRestoreData');
2023-11-28 01:06:12 +08:00
$this->addTemplate('templates/BackupAdminSettingsTab.html', true);
}
public function JsonAdminGetData()
{
2023-11-30 07:10:16 +08:00
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');
2023-11-28 01:06:12 +08:00
2023-12-13 05:52:31 +08:00
$sFileName = APP_PRIVATE_DATA . \MailSo\Base\Utils::Sha1Rand();
if (true) {
$sType = 'application/zip';
2023-12-13 05:52:31 +08:00
$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';
2023-12-13 05:52:31 +08:00
$sFileName .= '.tgz';
$oArchive = new \SnappyMail\Stream\TAR($sFileName);
2023-11-28 01:06:12 +08:00
}
2023-12-13 05:52:31 +08:00
// $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');
2023-12-11 00:02:07 +08:00
if (\is_readable(APP_PRIVATE_DATA.'AddressBook.sqlite')) {
2023-12-13 05:52:31 +08:00
$oArchive->addFile(APP_PRIVATE_DATA.'AddressBook.sqlite');
2023-12-11 00:02:07 +08:00
}
2023-12-13 05:52:31 +08:00
// $oArchive->addFile(APP_DATA_FOLDER_PATH.'SALT.php');
$oArchive->close();
2023-11-28 01:06:12 +08:00
2023-12-13 05:52:31 +08:00
$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);
}
if (\class_exists('ZipArchive')) {
$oArchive = new \ZipArchive();
$oArchive->open($_FILES['backup']['tmp_name'], \ZIPARCHIVE::CREATE);
$oArchive->extractTo(APP_PRIVATE_DATA);
} else if (\class_exists('PharData')) {
$oArchive = new \PharData($sTmp, 0, null, \Phar::GZ);
$oArchive->extractTo(APP_PRIVATE_DATA);
}
2023-11-28 01:06:12 +08:00
return $this->jsonResponse(__FUNCTION__, array(
'$_FILES' => $_FILES
2023-11-28 01:06:12 +08:00
));
}
2023-11-28 01:06:12 +08:00
}