%PDF- %PDF-
| Direktori : /www/varak.net/dmarc.varak.net/public/ |
| Current File : /www/varak.net/dmarc.varak.net/public/files.php |
<?php
/**
* dmarc-srg - A php parser, viewer and summary report generator for incoming DMARC reports.
* Copyright (C) 2020-2025 Aleksey Andreev (liuch)
*
* Available at:
* https://github.com/liuch/dmarc-srg
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Liuch\DmarcSrg;
use Liuch\DmarcSrg\Users\User;
use Liuch\DmarcSrg\Mail\MailBoxes;
use Liuch\DmarcSrg\Report\ReportFetcher;
use Liuch\DmarcSrg\Sources\MailboxSource;
use Liuch\DmarcSrg\Sources\DirectorySource;
use Liuch\DmarcSrg\Sources\UploadedFilesSource;
use Liuch\DmarcSrg\Sources\RemoteFilesystemSource;
use Liuch\DmarcSrg\Directories\DirectoryList;
use Liuch\DmarcSrg\Exception\AuthException;
use Liuch\DmarcSrg\Exception\RuntimeException;
use Liuch\DmarcSrg\Exception\ForbiddenException;
use Liuch\DmarcSrg\RemoteFilesystems\RemoteFilesystemList;
require realpath(__DIR__ . '/..') . '/init.php';
if (Core::requestMethod() == 'GET') {
if (!Core::isJson()) {
Core::instance()->sendHtml();
return;
}
try {
$auth = Core::instance()->auth();
$auth->isAllowed(User::LEVEL_MANAGER);
$res = [];
$up_max = ini_get('max_file_uploads');
if ($up_max) {
$res['upload_max_file_count'] = intval($up_max);
}
$up_size = ini_get('upload_max_filesize');
if ($up_size) {
$ch = strtolower($up_size[strlen($up_size) - 1]);
$up_size = intval($up_size);
switch ($ch) {
case 'g':
$up_size *= 1024;
// no break
case 'm':
$up_size *= 1024;
// no break
case 'k':
$up_size *= 1024;
// no break
}
$res['upload_max_file_size'] = $up_size;
}
try {
$auth->isAllowed(User::LEVEL_ADMIN);
$res['mailboxes'] = array_map(function ($mb) {
return [
'id' => $mb['id'],
'name' => $mb['name'],
'host' => $mb['host'],
'mailbox' => $mb['mailbox']
];
}, (new MailBoxes())->list());
$dmap = [
[ 'directories', (new DirectoryList())->list() ]
];
try {
Core::instance()->checkDependencies('flyfs');
$dmap[] = [ 'remotefs', (new RemoteFilesystemList(true))->list() ];
} catch (RuntimeException $e) {
}
foreach ($dmap as $it) {
$dirs = [];
foreach ($it[1] as $dir) {
$da = $dir->toArray();
try {
$da['files'] = $dir->count();
} catch (RuntimeException $e) {
$da['error'] = true;
}
$dirs[] = $da;
}
$res[$it[0]] = $dirs;
}
} catch (ForbiddenException $e) {
}
Core::sendJson($res);
} catch (RuntimeException $e) {
Core::sendJson(ErrorHandler::exceptionResult($e));
}
return;
}
if (Core::requestMethod() == 'POST') {
try {
$core = Core::instance();
$data = Core::getJsonData();
if ($data) {
$core->auth()->isAllowed(User::LEVEL_ADMIN);
if (isset($data['cmd'])) {
$cmd_id = array_search($data['cmd'], [ 'load-mailbox', 'load-directory', 'load-remotefs' ]);
if ($cmd_id !== false) {
if (isset($data['ids']) && gettype($data['ids']) === 'array' && count($data['ids']) > 0) {
$done = [];
$slst = [];
switch ($cmd_id) {
case 0:
$core->checkDependencies('imap,xml,zip');
$list = new MailBoxes();
break;
case 1:
$core->checkDependencies('xml,zip');
$list = new DirectoryList();
break;
case 2:
$core->checkDependencies('flyfs,xml,zip');
$list = new RemoteFilesystemList(true);
break;
default:
$list = [];
}
foreach ($data['ids'] as $id) {
$dir_id = gettype($id) === 'integer' ? $id : -1;
if (!in_array($id, $done, true)) {
$done[] = $id;
if ($cmd_id === 0) {
$slst[] = new MailboxSource($list->mailbox($dir_id));
} elseif ($cmd_id === 1) {
$slst[] = new DirectorySource($list->directory($dir_id));
} elseif ($cmd_id === 2) {
$slst[] = new RemoteFilesystemSource($list->filesystem($dir_id));
}
}
}
if (count($slst) > 0) {
$results = [];
foreach ($slst as $sou) {
$sres = (new ReportFetcher($sou))->fetch();
foreach ($sres as &$r) {
$results[] = $r;
}
unset($r);
}
Core::sendJson(ReportFetcher::makeSummaryResult($results));
return;
}
}
}
}
} elseif (isset($_FILES['report_file']) && isset($_POST['cmd']) && $_POST['cmd'] === 'upload-report') {
$core->auth()->isAllowed(User::LEVEL_MANAGER);
$core->checkDependencies('xml,zip');
$results = (new ReportFetcher(new UploadedFilesSource($_FILES['report_file'])))->fetch();
Core::sendJson(ReportFetcher::makeSummaryResult($results));
return;
}
} catch (RuntimeException $e) {
Core::sendJson(ErrorHandler::exceptionResult($e));
return;
}
}
Core::sendBad();