403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/mail/lib/helper/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/mail/lib/helper/licensemanager.php
<?php

namespace Bitrix\Mail\Helper;

use Bitrix\Main\ORM\Query\Join;
use Bitrix\Main\ORM\Fields\Relations\Reference;
use Bitrix\Mail\Internals\MailEntityOptionsTable;
use Bitrix\Main;
use Bitrix\Bitrix24;
use Bitrix\Mail\MailboxTable;
use Bitrix\Main\Mail\Internal\SenderTable;
use Bitrix\Main\Type\DateTime;
use Bitrix\Mail\Integration\Im\Notification;

/**
 * Class LicenseManager
 */
class LicenseManager
{
	private const MAILBOX_IS_LOCKED_PROPERTY = 1;
	private const MAILBOX_IS_AVAILABLE_PROPERTY = 0;

	private static function sendNotificationsAboutBlockedMailboxes($ids): void
	{
		foreach ($ids as $id)
		{
			Notification::add(
				null,
				'imposed_tariff_restrictions_on_the_mailbox',
				null,
				$id,
			);
		}
	}

	private static function getTariffRestrictionsMailboxListsByDBData($mailboxes, $filterByStatus = null): array
	{
		$lists = [
			'IDS_FOR_ADD' => [],
			'IDS_FOR_UPDATE' => [],
			'IDS_ALL' => [],
		];

		foreach ($mailboxes as $mailbox)
		{
			$mailboxId = (int) $mailbox['ID'];

			if (is_null($mailbox['TARIFF_RESTRICTIONS']))
			{
				$lists['IDS_FOR_ADD'][] = $mailboxId;
				$lists['IDS_ALL'][] = $mailboxId;
			}
			else if(is_null($filterByStatus) || (int)$mailbox['TARIFF_RESTRICTIONS'] === $filterByStatus)
			{
				$lists['IDS_FOR_UPDATE'][] = $mailboxId;
				$lists['IDS_ALL'][] = $mailboxId;
			}
		}

		return $lists;
	}

	private static function checkIdInTariffRestrictionsMailboxLists($checkedMailboxId, $lists): bool
	{
		foreach ($lists as $list)
		{
			foreach ($list as $id)
			{
				if ($id === $checkedMailboxId)
				{
					return true;
				}
			}
		}

		return false;
	}

	private static function getAvailabilitySyncStatusByMailboxList($checkedMailboxId, $mailboxList): bool
	{
		foreach ($mailboxList as $mailbox)
		{
			if ($checkedMailboxId === (int) $mailbox['ID'])
			{
				return !($mailbox['TARIFF_RESTRICTIONS']);
			}
		}

		return true;
	}

	public static function checkTheMailboxForSyncAvailability(int $checkedMailboxId, ?int $ownerMailboxUserId = null): bool
	{
		$maxCountAvailableMailboxes = self::getUserMailboxesLimit();
		static $checkedMailboxes = [];

		if (!array_key_exists($checkedMailboxId, $checkedMailboxes))
		{
			if (is_null($ownerMailboxUserId))
			{
				$checkedMailboxes[$checkedMailboxId] = MailboxTable::getList(([
					'select' => [
						'ID',
						'USER_ID',
					],
					'filter' => [
						'=ID' => $checkedMailboxId,
					],
				]))->fetch();
			}
			else
			{
				$checkedMailboxes[$checkedMailboxId] = [
					'ID' => $checkedMailboxId,
					'USER_ID' => $ownerMailboxUserId,
				];
			}
		}

		if ($checkedMailboxes[$checkedMailboxId] && isset($checkedMailboxes[$checkedMailboxId]['USER_ID']))
		{
			$userId = (int) $checkedMailboxes[$checkedMailboxId]['USER_ID'];

			static $userMailboxes = [];

			if (!array_key_exists($userId, $userMailboxes))
			{
				$userMailboxes = MailboxTable::query()->addSelect('ID')
				->setSelect([
					'ID',
					'TARIFF_RESTRICTIONS' => 'OPTIONS.VALUE',
				])
				->where('USER_ID', $userId)
				->where('ACTIVE', 'Y')
				->registerRuntimeField(
					'',
					new Reference(
						'OPTIONS',
						MailEntityOptionsTable::class,
						Join::on('this.ID', 'ref.MAILBOX_ID')->where('ref.PROPERTY_NAME', 'TARIFF_RESTRICTIONS'),
						['join_type' => Join::TYPE_LEFT],
					),
				)->fetchAll();
			}

			if ($maxCountAvailableMailboxes < 0)
			{
				$activateMailboxes = self::getTariffRestrictionsMailboxListsByDBData(array_slice($userMailboxes, 0, count($userMailboxes)), static::MAILBOX_IS_LOCKED_PROPERTY);
				static::changeTariffRestrictionsOnTheMailboxes($activateMailboxes, static::MAILBOX_IS_AVAILABLE_PROPERTY);
				$mailboxAvailabilitySyncStatus = true;
			}
			else
			{
				$activateMailboxes = self::getTariffRestrictionsMailboxListsByDBData(array_slice($userMailboxes, 0, $maxCountAvailableMailboxes), static::MAILBOX_IS_LOCKED_PROPERTY);
				$blockMailboxes = self::getTariffRestrictionsMailboxListsByDBData(array_slice($userMailboxes, $maxCountAvailableMailboxes), static::MAILBOX_IS_AVAILABLE_PROPERTY);

				if (self::checkIdInTariffRestrictionsMailboxLists($checkedMailboxId, $activateMailboxes))
				{
					$mailboxAvailabilitySyncStatus = true;
				}
				else if(self::checkIdInTariffRestrictionsMailboxLists($checkedMailboxId, $blockMailboxes))
				{
					$mailboxAvailabilitySyncStatus = false;
				}
				else
				{
					$mailboxAvailabilitySyncStatus = self::getAvailabilitySyncStatusByMailboxList($checkedMailboxId, $userMailboxes);
				}

				self::sendNotificationsAboutBlockedMailboxes($blockMailboxes['IDS_ALL']);
				static::changeTariffRestrictionsOnTheMailboxes($activateMailboxes, static::MAILBOX_IS_AVAILABLE_PROPERTY);
				static::changeTariffRestrictionsOnTheMailboxes($blockMailboxes, static::MAILBOX_IS_LOCKED_PROPERTY);
			}

			return $mailboxAvailabilitySyncStatus;
		}

		return false;
	}

	public static function changeTariffRestrictionsOnTheMailboxes($tariffRestrictionsMailboxLists, $tariffRestrictionsType): void
	{
		if (isset($tariffRestrictionsMailboxLists['IDS_FOR_ADD']) && count($tariffRestrictionsMailboxLists['IDS_FOR_ADD']))
		{
			$rowsForAdd = [];
			foreach ($tariffRestrictionsMailboxLists['IDS_FOR_ADD'] as $id)
			{
				$rowsForAdd[] = [
					'MAILBOX_ID' => $id,
					'ENTITY_TYPE' => 'MAILBOX',
					'ENTITY_ID' => $id,
					'PROPERTY_NAME' => 'TARIFF_RESTRICTIONS',
					'VALUE' => $tariffRestrictionsType,
					'DATE_INSERT' => new DateTime(),
				];
			}

			foreach ($rowsForAdd as $row)
			{
				$filter = [
					'=MAILBOX_ID' => $row['MAILBOX_ID'],
					'=ENTITY_TYPE' => 'MAILBOX',
					'=ENTITY_ID' => $row['ENTITY_ID'],
					'=PROPERTY_NAME' => 'TARIFF_RESTRICTIONS',
				];

				$keyRow = [
					'MAILBOX_ID' => $row['MAILBOX_ID'],
					'ENTITY_TYPE' => 'MAILBOX',
					'ENTITY_ID' => $row['ENTITY_ID'],
					'PROPERTY_NAME' => 'TARIFF_RESTRICTIONS',
				];

				if (MailEntityOptionsTable::getCount($filter))
				{
					MailEntityOptionsTable::update(
						$keyRow,
						[
							'VALUE' => $row['VALUE'],
							'DATE_INSERT' => new DateTime(),
						],
					);
				}
				else
				{
					MailEntityOptionsTable::add($row);
				}
			}
		}

		if (isset($tariffRestrictionsMailboxLists['IDS_FOR_UPDATE']) && count($tariffRestrictionsMailboxLists['IDS_FOR_UPDATE']))
		{
			$rowsForUpdate = [];
			foreach ($tariffRestrictionsMailboxLists['IDS_FOR_UPDATE'] as $id)
			{
				$rowsForUpdate[] = [
					'MAILBOX_ID' => $id,
					'ENTITY_TYPE' => 'MAILBOX',
					'ENTITY_ID' => $id,
					'PROPERTY_NAME' => 'TARIFF_RESTRICTIONS',
				];
			}

			if (count($rowsForUpdate))
			{
				MailEntityOptionsTable::updateMulti($rowsForUpdate, [
					'VALUE' => $tariffRestrictionsType,
					'DATE_INSERT' => new DateTime(),
				]);
			}
		}
	}

	public static function isEnabledNotificationOfMailMessageInCrm($userId): bool
	{
		if (Main\Loader::includeModule('crm') && Main\Loader::includeModule('im'))
		{
			foreach (
				[
					\CIMSettings::CLIENT_SITE,
					\CIMSettings::CLIENT_MAIL,
					\CIMSettings::CLIENT_PUSH,
				] as $clientId
			)
			{
				if (
					\CIMSettings::GetNotifyAccess(
						$userId,
						'crm',
						\CCrmNotifierSchemeType::IncomingEmailName,
						$clientId
					)
				)
				{
					return true;
				}
			}
		}

		return false;
	}

	private static function getCountSenders(int $userId = 0)
	{
		global $USER;

		if (!($userId > 0 || (is_object($USER) && $USER->isAuthorized())))
		{
			return false;
		}

		if (!($userId > 0))
		{
			$userId = $USER->getId();
		}


		return SenderTable::getCount([
			'IS_CONFIRMED' => true,
			[
				'LOGIC' => 'OR',
				'=USER_ID' => $userId,
				'IS_PUBLIC' => true,
			],
		]);
	}

	public static function isMailClientReadyToUse($userId = null): bool
	{
		global $USER;

		if (!($userId > 0 || (is_object($USER) && $USER->isAuthorized())))
		{
			return false;
		}

		if (!($userId > 0))
		{
			$userId = $USER->getId();
		}

		if (
			self::isSyncAvailable()
			&& (self::getCountSenders($userId) || count(MailboxTable::getUserMailboxes($userId)) > 0 )
			&& self::checkUserHasNotExceededTheConnectedMailboxesLimit($userId)
		)
		{
			return true;
		}

		return false;
	}

	public static function checkUserHasNotExceededTheConnectedMailboxesLimit($userId = null): bool
	{
		global $USER;

		if (!($userId > 0 || (is_object($USER) && $USER->isAuthorized())))
		{
			return false;
		}

		if (!($userId > 0))
		{
			$userId = $USER->getId();
		}

		$userMailboxesLimit = LicenseManager::getUserMailboxesLimit();

		if (
			$userMailboxesLimit >= 0
			&& count(MailboxTable::getTheOwnersMailboxes($userId)) > $userMailboxesLimit
		)
		{
			return false;
		}

		return true;
	}

	/**
	 * Checks if mailboxes synchronization is available
	 *
	 * @return bool
	 */
	public static function isSyncAvailable()
	{
		if (!Main\Loader::includeModule('bitrix24'))
		{
			return true;
		}

		return (bool) Bitrix24\Feature::isFeatureEnabled('mail_mailbox_sync');
	}

	public static function getSharedMailboxesLimit()
	{
		if (!Main\Loader::includeModule('bitrix24'))
		{
			return -1;
		}

		return (int) Bitrix24\Feature::getVariable('mail_shared_mailboxes_limit');
	}

	/**
	 * How many mailboxes a user can connect
	 *
	 * @return int
	 */
	public static function getUserMailboxesLimit()
	{
		if (!Main\Loader::includeModule('bitrix24'))
		{
			return -1;
		}

		if (!static::isSyncAvailable())
		{
			return 0;
		}

		return (int) Bitrix24\Feature::getVariable('mail_user_mailboxes_limit');
	}

	public static function getEmailsLimitToSendMessage(): int
	{
		if (Main\Loader::includeModule('bitrix24') && (!static::isSyncAvailable() || \CBitrix24::IsDemoLicense()))
		{
			return 1;
		}

		return -1;
	}

	/**
	 * Returns the number of days to store messages
	 *
	 * @return int
	 */
	public static function getSyncOldLimit()
	{
		if (!Main\Loader::includeModule('bitrix24'))
		{
			return (int) Main\Config\Option::get('mail', 'sync_old_limit2', -1);
		}

		return (int) Bitrix24\Feature::getVariable('mail_sync_old_limit');
	}

	/**
	 * Checks if old messages should be deleted
	 *
	 * @return bool
	 */
	public static function isCleanupOldEnabled(): bool
	{
		if (Main\Application::getConnection()->getType() === 'pgsql')
		{
			return false; // not implemented yet
		}

		return static::getSyncOldLimit() > 0;
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit