%PDF- %PDF-
Direktori : /www/varak.net/dmarc.varak.net/classes/Report/ |
Current File : //www/varak.net/dmarc.varak.net/classes/Report/Report.php |
<?php /** * dmarc-srg - A php parser, viewer and summary report generator for incoming DMARC reports. * Copyright (C) 2020-2024 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\Report; use Liuch\DmarcSrg\Core; use Liuch\DmarcSrg\Domains\Domain; use Liuch\DmarcSrg\Exception\SoftException; use Liuch\DmarcSrg\Exception\DatabaseNotFoundException; class Report { private $db = null; private $data = null; public function __construct($data, $db = null) { if (is_array($data)) { $domain = $data['domain']; $data = ReportData::fromArray($data); } else { $domain = $data->domain; } if ($domain instanceof Domain) { $data->domain = $domain->fqdn(); } $this->data = $data; $this->db = $db ?? Core::instance()->database(); } public static function fromXmlFile($fd) { $data = ReportData::fromXmlFile($fd); if (!$data->isValid()) { throw new SoftException('Incorrect or incomplete report data'); } return new Report($data); } public function fetch() { $this->prepareData(true); try { $this->db->getMapper('report')->fetch($this->data); } catch (DatabaseNotFoundException $e) { throw new SoftException('Report not found'); } } public function save(string $real_fname) { $b_ts = $this->data->date['begin']; $e_ts = $this->data->date['end']; if (!$b_ts->getTimestamp() || !$e_ts->getTimestamp() || strlen($b_ts->format('Y')) !== 4 || strlen($e_ts->format('Y')) !== 4 ) { throw new SoftException('Failed to add an incoming report: wrong date value'); } if ($b_ts > $e_ts) { throw new SoftException('Failed to add an incoming report: start date is later than end date'); } $this->db->getMapper('report')->save($this->data); return [ 'message' => 'The report is loaded successfully' ]; } public function __get(string $name) { return $this->data->$name; } public function toArray(): array { return $this->data->toArray(); } public function set($name, $value) { $this->prepareData(false); $this->db->getMapper('report')->setProperty($this->data, $name, $value); return [ 'message' => 'Ok' ]; } /** * Checks and prepares report data for queries * * @param bool $replace If true, it leaves only the data required for the request * * @return void */ private function prepareData(bool $replace): void { $data = []; $ne_f = false; foreach ([ 'domain', 'date', 'org_name', 'report_id'] as $fld) { if (empty($this->data->$fld)) { $ne_f = true; break; } if ($replace) { $data[$fld] = $this->data->$fld; } } if ($ne_f || empty($this->data->date['begin'])) { throw new SoftException('Not enough data to identify the report'); } if ($replace) { $this->data = ReportData::fromArray($data); } } }