- Add CloudronStack/output/CloudronPackages-Artifacts/tirreno/ directory and its contents - Includes package manifest, Dockerfile, source code, documentation, and build artifacts - Add tirreno-1761840148.tar.gz as a build artifact - Add tirreno-cloudron-package-1761841304.tar.gz as the Cloudron package - Include all necessary files for the tirreno Cloudron package This adds the complete tirreno Cloudron package artifacts to the repository.
371 lines
12 KiB
PHP
371 lines
12 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Tirreno ~ Open source user analytics
|
|
* Copyright (c) Tirreno Technologies Sàrl (https://www.tirreno.com)
|
|
*
|
|
* Licensed under GNU Affero General Public License version 3 of the or any later version.
|
|
* For full copyright and license information, please see the LICENSE
|
|
* Redistributions of files must retain the above copyright notice.
|
|
*
|
|
* @copyright Copyright (c) Tirreno Technologies Sàrl (https://www.tirreno.com)
|
|
* @license https://opensource.org/licenses/AGPL-3.0 AGPL License
|
|
* @link https://www.tirreno.com Tirreno(tm)
|
|
*/
|
|
|
|
namespace Utils;
|
|
|
|
class Constants {
|
|
public static function get(string $key): array|string|int {
|
|
$const = __CLASS__ . '::' . $key;
|
|
if (!defined($const)) {
|
|
trigger_error('Undefined constant: ' . $key, E_USER_ERROR);
|
|
}
|
|
|
|
$value = constant($const);
|
|
|
|
$f3 = \Base::instance();
|
|
$f3key = 'EXTRA_' . $key;
|
|
if ($f3->exists($f3key)) {
|
|
$value = is_array($value) ? array_merge($value, $f3->get($f3key)) : $f3->get($f3key);
|
|
}
|
|
|
|
return $value;
|
|
}
|
|
|
|
// TODO: rewrite context so event amount limit will not be needed
|
|
public const RULE_EVENT_CONTEXT_LIMIT = 25;
|
|
public const RULE_CHECK_USERS_PASSED_TO_CLIENT = 25;
|
|
public const RULE_USERS_BATCH_SIZE = 3500;
|
|
public const RULE_EMAIL_MAXIMUM_LOCAL_PART_LENGTH = 17;
|
|
public const RULE_EMAIL_MAXIMUM_DOMAIN_LENGTH = 22;
|
|
public const RULE_MAXIMUM_NUMBER_OF_404_CODES = 4;
|
|
public const RULE_MAXIMUM_NUMBER_OF_500_CODES = 4;
|
|
public const RULE_MAXIMUM_NUMBER_OF_LOGIN_ATTEMPTS = 3;
|
|
public const RULE_LOGIN_ATTEMPTS_WINDOW = 8;
|
|
public const RULE_NEW_DEVICE_MAX_AGE_IN_MINUTES = 60 * 3;
|
|
public const RULE_REGULAR_OS_NAMES = ['Windows', 'Android', 'Mac', 'iOS'];
|
|
public const RULE_REGULAR_BROWSER_NAMES = [
|
|
'Chrome' => 90,
|
|
'Chrome Mobile' => 90,
|
|
'Firefox' => 78,
|
|
'Opera' => 70,
|
|
'Safari' => 13,
|
|
'Mobile Safari' => 13,
|
|
'Samsung Browser' => 12,
|
|
'Internet Explorer' => 12,
|
|
'Microsoft Edge' => 90,
|
|
'Chrome Mobile iOS' => 90,
|
|
'Android Browser' => 81,
|
|
'Chrome Webview' => 90,
|
|
'Google Search App' => 90,
|
|
'Yandex Browser' => 20,
|
|
];
|
|
|
|
public const DEVICE_TYPES = [
|
|
'bot',
|
|
'desktop',
|
|
'smartphone',
|
|
'tablet',
|
|
'other',
|
|
'unknown',
|
|
];
|
|
|
|
public const LOGBOOK_LIMIT = 1000;
|
|
|
|
public const NIGHT_RANGE_SECONDS_START = 0; // midnight
|
|
public const NIGHT_RANGE_SECONDS_END = 18000; // 5 AM
|
|
|
|
public const COUNTRY_CODE_NIGERIA = 160;
|
|
public const COUNTRY_CODE_INDIA = 104;
|
|
public const COUNTRY_CODE_CHINA = 47;
|
|
public const COUNTRY_CODE_BRAZIL = 31;
|
|
public const COUNTRY_CODE_PAKISTAN = 168;
|
|
public const COUNTRY_CODE_INDONESIA = 105;
|
|
public const COUNTRY_CODE_VENEZUELA = 243;
|
|
public const COUNTRY_CODE_SOUTH_AFRICA = 199;
|
|
public const COUNTRY_CODE_PHILIPPINES = 175;
|
|
public const COUNTRY_CODE_ROMANIA = 182;
|
|
public const COUNTRY_CODE_RUSSIA = 183;
|
|
public const COUNTRY_CODE_AUSTRALIA = 14;
|
|
public const COUNTRY_CODE_UAE = 236;
|
|
public const COUNTRY_CODE_JAPAN = 113;
|
|
|
|
public const COUNTRY_CODES_NORTH_AMERICA = [238, 40];
|
|
public const COUNTRY_CODES_EUROPE = [77, 2, 15, 22, 35, 57, 60, 61, 62, 71, 78, 85, 88, 102, 108, 111, 122, 128, 129, 136, 155, 177, 178, 182, 195, 196, 203, 215];
|
|
|
|
public const EVENT_REQUEST_TYPE_HEAD = 3;
|
|
|
|
public const ACCOUNT_OPERATION_QUEUE_CLEAR_COMPLETED_AFTER_DAYS = 7;
|
|
public const ACCOUNT_OPERATION_QUEUE_AUTO_UNCLOG_AFTER_MINUTES = 60 * 2;
|
|
public const ACCOUNT_OPERATION_QUEUE_EXECUTE_TIME_SEC = 60 * 3;
|
|
public const ACCOUNT_OPERATION_QUEUE_BATCH_SIZE = 2500;
|
|
public const NEW_EVENTS_BATCH_SIZE = 15000;
|
|
|
|
public const USER_LOW_SCORE_INF = 0;
|
|
public const USER_LOW_SCORE_SUP = 33;
|
|
public const USER_MEDIUM_SCORE_INF = 33;
|
|
public const USER_MEDIUM_SCORE_SUP = 67;
|
|
public const USER_HIGH_SCORE_INF = 67;
|
|
|
|
public const UNAUTHORIZED_USERID = 'N/A';
|
|
|
|
public const ENRICHMENT_IP_IS_BOGON = 'IP is bogon';
|
|
public const ENRICHMENT_IP_IS_NOT_FOUND = 'Value is not found';
|
|
|
|
public const MAIL_FROM_NAME = 'Analytics';
|
|
public const MAIL_HOST = 'smtp.eu.mailgun.org';
|
|
public const MAIL_SEND_BIN = '/usr/sbin/sendmail';
|
|
|
|
public const PAGE_TITLE_POSTFIX = '| tirreno';
|
|
|
|
public const PAGE_VIEW_EVENT_TYPE_ID = 1;
|
|
public const PAGE_EDIT_EVENT_TYPE_ID = 2;
|
|
public const PAGE_DELETE_EVENT_TYPE_ID = 3;
|
|
public const PAGE_SEARCH_EVENT_TYPE_ID = 4;
|
|
public const ACCOUNT_LOGIN_EVENT_TYPE_ID = 5;
|
|
public const ACCOUNT_LOGOUT_EVENT_TYPE_ID = 6;
|
|
public const ACCOUNT_LOGIN_FAIL_EVENT_TYPE_ID = 7;
|
|
public const ACCOUNT_REGISTRATION_EVENT_TYPE_ID = 8;
|
|
public const ACCOUNT_EMAIL_CHANGE_EVENT_TYPE_ID = 9;
|
|
public const ACCOUNT_PASSWORD_CHANGE_EVENT_TYPE_ID = 10;
|
|
public const ACCOUNT_EDIT_EVENT_TYPE_ID = 11;
|
|
public const PAGE_ERROR_EVENT_TYPE_ID = 12;
|
|
public const FIELD_EDIT_EVENT_TYPE_ID = 13;
|
|
|
|
public const DEFAULT_RULES = [
|
|
// Positive
|
|
'E23' => -20,
|
|
'E24' => -20,
|
|
'E25' => -20,
|
|
'I07' => -20,
|
|
'I08' => -20,
|
|
'I10' => -20,
|
|
// Medium
|
|
'B01' => 10,
|
|
'B04' => 10,
|
|
'B05' => 10,
|
|
'B07' => 10,
|
|
'C01' => 10,
|
|
'C02' => 10,
|
|
'C03' => 10,
|
|
'C04' => 10,
|
|
'C05' => 10,
|
|
'C06' => 10,
|
|
'C07' => 10,
|
|
'C08' => 10,
|
|
'C09' => 10,
|
|
'C10' => 10,
|
|
'C11' => 10,
|
|
'D04' => 10,
|
|
'D08' => 10,
|
|
'E06' => 10,
|
|
'E07' => 10,
|
|
'E08' => 10,
|
|
//'E18' => 10,
|
|
'E21' => 10,
|
|
'E22' => 10,
|
|
'I05' => 10,
|
|
'I06' => 10,
|
|
'I09' => 10,
|
|
// High
|
|
'D01' => 20,
|
|
'D02' => 20,
|
|
'D03' => 20,
|
|
'D05' => 20,
|
|
'D06' => 20,
|
|
'D07' => 20,
|
|
'E03' => 20,
|
|
'E04' => 20,
|
|
'E05' => 20,
|
|
'I02' => 20,
|
|
'I03' => 20,
|
|
'I04' => 20,
|
|
'P03' => 20,
|
|
// Extreme
|
|
'B06' => 70,
|
|
'E01' => 70,
|
|
'E19' => 70,
|
|
'I01' => 70,
|
|
'R01' => 70,
|
|
'R02' => 70,
|
|
'R03' => 70,
|
|
];
|
|
|
|
public const DEFAULT_RULES_EXTENSION = [
|
|
// Positive
|
|
'E20' => -20,
|
|
// Medium
|
|
'E09' => 10,
|
|
'E10' => 10,
|
|
'E12' => 10,
|
|
'E15' => 10,
|
|
'P01' => 10,
|
|
// High
|
|
'E16' => 20,
|
|
// Extreme
|
|
'E02' => 70,
|
|
'E11' => 70,
|
|
'E13' => 70,
|
|
'E14' => 70,
|
|
'E17' => 70,
|
|
];
|
|
|
|
public const CHART_MODEL_MAP = [
|
|
'resources' => \Models\Chart\Resources::class,
|
|
'resource' => \Models\Chart\Resource::class,
|
|
'users' => \Models\Chart\Users::class,
|
|
'user' => \Models\Chart\User::class,
|
|
'isps' => \Models\Chart\Isps::class,
|
|
'isp' => \Models\Chart\Isp::class,
|
|
'ips' => \Models\Chart\Ips::class,
|
|
'ip' => \Models\Chart\Ip::class,
|
|
'domains' => \Models\Chart\Domains::class,
|
|
'domain' => \Models\Chart\Domain::class,
|
|
'bots' => \Models\Chart\Bots::class,
|
|
'bot' => \Models\Chart\Bot::class,
|
|
'events' => \Models\Chart\Events::class,
|
|
'emails' => \Models\Chart\Emails::class,
|
|
'phones' => \Models\Chart\Phones::class,
|
|
'review-queue' => \Models\Chart\ReviewQueue::class,
|
|
'country' => \Models\Chart\Country::class,
|
|
'blacklist' => \Models\Chart\Blacklist::class,
|
|
'logbook' => \Models\Chart\Logbook::class,
|
|
'stats' => \Models\Chart\SessionStat::class,
|
|
];
|
|
|
|
public const LINE_CHARTS = [
|
|
'ips',
|
|
'users',
|
|
'review-queue',
|
|
'events',
|
|
'phones',
|
|
'emails',
|
|
'resources',
|
|
'bots',
|
|
'isps',
|
|
'domains',
|
|
'blacklist',
|
|
'logbook'
|
|
];
|
|
|
|
public const CHART_RESOLUTION = [
|
|
'day' => 60 * 60 * 24,
|
|
'hour' => 60 * 60,
|
|
'minute' => 60,
|
|
];
|
|
|
|
public const TOP_TEN_MODELS_MAP = [
|
|
'mostActiveUsers' => \Models\TopTen\UsersByEvents::class,
|
|
'mostActiveCountries' => \Models\TopTen\CountriesByUsers::class,
|
|
'mostActiveUrls' => \Models\TopTen\ResourcesByUsers::class,
|
|
'ipsWithTheMostUsers' => \Models\TopTen\IpsByUsers::class,
|
|
'usersWithMostLoginFail' => \Models\TopTen\UsersByLoginFail::class,
|
|
'usersWithMostIps' => \Models\TopTen\UsersByIps::class,
|
|
];
|
|
|
|
public const RULES_TOTALS_MODELS = [
|
|
\Models\Phone::class,
|
|
\Models\Ip::class,
|
|
\Models\Session::class,
|
|
\Models\User::class,
|
|
];
|
|
|
|
public const REST_TOTALS_MODELS = [
|
|
'isp' => \Models\Isp::class,
|
|
'resource' => \Models\Resource::class,
|
|
'domain' => \Models\Domain::class,
|
|
'device' => \Models\Device::class,
|
|
'country' => \Models\Country::class,
|
|
];
|
|
|
|
public const ENRICHING_ATTRIBUTES = [
|
|
'ip' => \Models\Ip::class,
|
|
'email' => \Models\Email::class,
|
|
'domain' => \Models\Domain::class,
|
|
'phone' => \Models\Phone::class,
|
|
//'ua' => \Models\Device::class,
|
|
];
|
|
|
|
public const ADMIN_PAGES = [
|
|
'AdminIsps',
|
|
'AdminIsp',
|
|
'AdminUsers',
|
|
'AdminUser',
|
|
'AdminIps',
|
|
'AdminIp',
|
|
'AdminDomains',
|
|
'AdminDomain',
|
|
'AdminCountries',
|
|
'AdminCountry',
|
|
'AdminBots',
|
|
'AdminBot',
|
|
'AdminResources',
|
|
'AdminResource',
|
|
'AdminLogbook',
|
|
'AdminHome',
|
|
'AdminApi',
|
|
'AdminReviewQueue',
|
|
'AdminRules',
|
|
'AdminSettings',
|
|
'AdminWatchlist',
|
|
'AdminBlacklist',
|
|
'AdminManualCheck',
|
|
'AdminEvents',
|
|
];
|
|
|
|
public const IP_TYPES = [
|
|
'Blacklisted',
|
|
'Spam list',
|
|
'Localhost',
|
|
'TOR',
|
|
'Starlink',
|
|
'AppleRelay',
|
|
'VPN',
|
|
'Datacenter',
|
|
'Unknown',
|
|
'Residential',
|
|
];
|
|
|
|
public const ALERT_EVENT_TYPES = [
|
|
self::PAGE_DELETE_EVENT_TYPE_ID,
|
|
self::PAGE_ERROR_EVENT_TYPE_ID,
|
|
self::ACCOUNT_LOGIN_FAIL_EVENT_TYPE_ID,
|
|
self::ACCOUNT_EMAIL_CHANGE_EVENT_TYPE_ID,
|
|
self::ACCOUNT_PASSWORD_CHANGE_EVENT_TYPE_ID,
|
|
];
|
|
|
|
public const EDITING_EVENT_TYPES = [
|
|
self::PAGE_EDIT_EVENT_TYPE_ID,
|
|
self::ACCOUNT_REGISTRATION_EVENT_TYPE_ID,
|
|
self::ACCOUNT_EDIT_EVENT_TYPE_ID,
|
|
self::FIELD_EDIT_EVENT_TYPE_ID,
|
|
];
|
|
|
|
public const NORMAL_EVENT_TYPES = [
|
|
self::PAGE_VIEW_EVENT_TYPE_ID,
|
|
self::PAGE_SEARCH_EVENT_TYPE_ID,
|
|
self::ACCOUNT_LOGIN_EVENT_TYPE_ID,
|
|
self::ACCOUNT_LOGOUT_EVENT_TYPE_ID,
|
|
];
|
|
|
|
public const FAILED_LOGBOOK_EVENT_TYPES = [
|
|
'critical_validation_error',
|
|
'critical_error',
|
|
];
|
|
|
|
public const ISSUED_LOGBOOK_EVENT_TYPES = [
|
|
'validation_error',
|
|
];
|
|
|
|
public const NORMAL_LOGBOOK_EVENT_TYPES = [
|
|
'success',
|
|
];
|
|
|
|
public const ENTITY_TYPES = [
|
|
'IP',
|
|
'Email',
|
|
'Phone',
|
|
];
|
|
}
|