%PDF- %PDF-
Direktori : /www/varak.net/dmarc.varak.net/classes/Report/ |
Current File : //www/varak.net/dmarc.varak.net/classes/Report/ReportList.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/>. * * ========================= * * This file contains ReportList class * * @category API * @package DmarcSrg * @author Aleksey Andreev (liuch) * @license https://www.gnu.org/licenses/gpl-3.0.html GNU/GPLv3 */ namespace Liuch\DmarcSrg\Report; use Liuch\DmarcSrg\Core; /** * It's the main class for working with the incoming reports, such as: * - getting a list of reports * - deleting several reports at once * - getting the number of reports stored in the database */ class ReportList { public const ORDER_NONE = 0; public const ORDER_BEGIN_TIME = 1; public const ORDER_ASCENT = 2; public const ORDER_DESCENT = 3; private $db = null; private $user = null; private $limit = 0; private $filter = []; private $order = null; /** * The constructor * * @param \Liuch\DmarcSrg\Users\User $user User to get list * @param \Liuch\DmarcSrg\Database\DatabaseController $db The database controller */ public function __construct($user, $db = null) { $this->user = $user; $this->db = $db ?? Core::instance()->database(); $this->resetOrderParams(); } /** * Returns a list of reports with specified parameters from position $pos * * This method returns a list of reports that depends on the filter and order. * The filter, order, and limit for the list can be set using the setFilter, setOrder and setMaxCount methods. * * @param int $pos The starting position from which the list will be returned * * @return array An array with keys `reports` and `more`. * `reports` is an array of incoming reports which contains maximum 25 records by default. * Another value of the number of records can be specified by calling * the method setMaxCount. * `more` is true if there are more records in the database, false otherwise. */ public function getList(int $pos): array { $max_rec = $this->limit > 0 ? $this->limit : 25; $limit = [ 'offset' => $pos, 'count' => $max_rec + 1 ]; $list = $this->db->getMapper('report')->list($this->filter, $this->order, $limit, $this->user->id()); if (count($list) > $max_rec) { $more = true; unset($list[$max_rec]); } else { $more = false; } return [ 'reports' => $list, 'more' => $more ]; } /** * Sets the sort order for the list and for deleting several reports at once * * @param int $field The field to sort by. Currently only ORDER_BEGIN_TIME is available. * @param int $direction The sorting direction. ORDER_ASCENT or ORDER_DESCENT must be used here. * * @return self */ public function setOrder(int $field, int $direction) { $this->order = null; if ($field > self::ORDER_NONE && $field < self::ORDER_ASCENT) { if ($direction !== self::ORDER_ASCENT) { $direction = self::ORDER_DESCENT; } $this->order = [ 'field' => 'begin_time', 'direction' => $direction === self::ORDER_ASCENT ? 'ascent' : 'descent' ]; } else { $this->resetOrderParams(); } return $this; } /** * Sets maximum numbers of records in the list and for deleting reports * * @param int $num Maximum number of records in the list * * @return self */ public function setMaxCount(int $num) { if ($num > 0) { $this->limit = $num; } else { $this->limit = 0; } return $this; } /** * Sets filter values for the list and for deleting reports * * @param array $filter Key-value array: * 'before_time' => DateTime, timestamp * 'dkim' => string, 'fail' or 'pass' * 'domain' => string or instance of Domain class * 'month' => string, yyyy-mm format * 'organization' => string * 'spf' => string, 'fail' or 'pass' * 'status' => string, 'read' or 'unread' * Note! 'dkim', 'spf' and 'disposition' do not affect the delete method * * @return self */ public function setFilter(array $filter) { $this->filter = $filter; return $this; } /** * Returns the number of reports in the database * * It returns the number of reports in the database. * The limit and some filter items `dkim`, `spf` and `disposition` do not affect this. * * @return int The number of reports in the database */ public function count(): int { $limit = [ 'offset' => 0, 'count' => $this->limit ]; return $this->db->getMapper('report')->count($this->filter, $limit, $this->user->id()); } /** * Deletes reports from the database * * It deletes repors form the database. The filter items `dkim`, `spf` and `disposition` do not affect this. * * @return void */ public function delete(): void { $limit = [ 'offset' => 0, 'count' => $this->limit ]; $this->db->getMapper('report')->delete($this->filter, $this->order, $limit); } /** * Returns a list of values for each filter item except for `before_time` * * @return array An key-value array, where the key is the filter item name * and the value is an array of possible values for the item */ public function getFilterList(): array { $domainMapper = $this->db->getMapper('domain'); $reportMapper = $this->db->getMapper('report'); $user_id = $this->user->id(); return [ 'domain' => $domainMapper->names($user_id), 'month' => $reportMapper->months($user_id), 'organization' => $reportMapper->organizations($user_id), 'dkim' => [ 'pass', 'fail' ], 'spf' => [ 'pass', 'fail' ], 'disposition' => [ 'none', 'reject', 'quarantine' ], 'status' => [ 'read', 'unread' ] ]; } /** * Resets the sort params * * @return void */ private function resetOrderParams(): void { $this->order = [ 'field' => 'begin_time', 'direction' => 'descent' ]; } }