%PDF- %PDF-
| Direktori : /www/varak.net/dmarc.varak.net/classes/ |
| Current File : //www/varak.net/dmarc.varak.net/classes/Common.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 common classes
*
* @category Common
* @package DmarcSrg
* @author Aleksey Andreev (liuch)
* @license https://www.gnu.org/licenses/gpl-3.0.html GNU/GPLv3
*/
namespace Liuch\DmarcSrg;
use Liuch\DmarcSrg\Exception\SoftException;
use Liuch\DmarcSrg\Exception\RuntimeException;
/**
* Static common arrays and methods
*/
class Common
{
/**
* This array needs for converting the align result text constant to integer value and back
* in Report and ReportList classes
*
* @var string[]
*/
public static $align_res = [ 'fail', 'unknown', 'pass' ];
/**
* This array needs for converting the the disposition result text constant to integer value and back
* in Report and ReportList classes
*
* @var string[]
*/
public static $disposition = [ 'reject', 'quarantine', 'none' ];
/**
* Retrieves filter values from HTTP GET parameters and returns them as a key-value array or null
*
* @return array|null
*/
public static function getFilter()
{
$filter = null;
if (isset($_GET['filter'])) {
$filter = [];
$pa = gettype($_GET['filter']) == 'array' ? $_GET['filter'] : [ $_GET['filter'] ];
foreach ($pa as $it) {
$ia = explode(':', $it, 2);
if (count($ia) == 2) {
$filter[$ia[0]] = $ia[1];
}
}
}
return $filter;
}
/**
* Converts month to date range
*
* @param string $month Month representation in yyyy-mm format
*
* @return array Range array:
* - DateTime, Start of the month
* - DateTime, First second of the next month
*/
public static function monthToRange(string $month): array
{
$ma = explode('-', $month);
if (count($ma) != 2) {
throw new SoftException('Incorrect date format');
}
$year = intval($ma[0]);
$month = intval($ma[1]);
if ($year <= 0 || $month < 1 || $month > 12) {
throw new SoftException('Incorrect month or year value');
}
$date1 = new DateTime("{$year}-{$month}-01");
$date2 = (clone $date1)->modify('first day of next month');
return [ $date1, $date2 ];
}
/**
* Returns the range string in short format (without the current year)
*
* @param array $range Array with two dates
*
* @return string
*/
public static function rangeToString(array $range): string
{
$cyear = (new \Datetime())->format('Y');
$dform = ($range[0]->format('Y') !== $cyear || $range[1]->format('Y') !== $cyear) ? 'M d Y' : 'M d';
$res = $range[0]->format($dform);
if ($range[0] != $range[1]) {
$res .= ' - ' . $range[1]->format($dform);
}
return $res;
}
/**
* Returns the percentage with the original number. If $per is 0 then '0' is returned.
*
* @param int $per Value
* @param int $cent Divisor for percentage calculation
* @param bool $with_num Whether to add the numeric value to the result
*
* @return string
*/
public static function num2percent(int $per, int $cent, bool $with_num): string
{
if (!$per) {
return '0';
}
$res = sprintf('%.0f%%', $per / $cent * 100);
if ($with_num) {
$res .= "({$per})";
}
return $res;
}
/**
* Converts array to CSV string
*
* @param array $data Array of data to be converted
*
* @return string CSV string
*/
public static function arrayToCSV(array $data): string
{
$tfd = fopen('php://temp/maxmemory:' . (10 * 1024 * 1024), 'r+');
foreach ($data as &$row) {
if (!fputcsv($tfd, is_array($row) ? $row : [ $row ], ',', '"', "\\", "\n\r")) {
throw new RuntimeException('fputcsv failed');
}
}
unset($row);
rewind($tfd);
$res = stream_get_contents($tfd);
fclose($tfd);
return $res;
}
/**
* Returns a random string of the specified length
*
* @param int $len String length
*
* @return string
*/
public static function randomString(int $len = 16): string
{
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$c_len = strlen($chars);
$res = '';
do {
$res .= $chars[random_int(0, 61)];
} while (--$len > 0);
return $res;
}
}