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/cvetdv.ru/bitrix/modules/main/lib/mail/sender/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/main/lib/mail/sender/usersenderdataprovider.php
<?php

namespace Bitrix\Main\Mail\Sender;

use Bitrix\Main\Config\Configuration;
use Bitrix\Main;
use Bitrix\Main\Mail\Internal\SenderTable;
use Bitrix\Main\Mail\Sender;
use Bitrix\Main\ORM\Query\Query;
use Bitrix\Main\Config;
use Bitrix\Main\Loader;
use Bitrix\Mail\MailboxTable;

final class UserSenderDataProvider
{
	public const SENDER_TYPE = 'sender';
	public const ALIAS_TYPE = 'alias';
	public const MAILBOX_SENDER_TYPE = 'mailboxSender';
	public const MAILBOX_TYPE = 'mailbox';

	/**
	 * Returns a list of available senders for a specific or current user
	 */
	public static function getUserAvailableSenders(?int $userId = null): array
	{
		$isAdmin = false;
		if (!($userId > 0))
		{
			$currentUser = Main\Engine\CurrentUser::get();
			$userId = (int)$currentUser->getId();
			$isAdmin = self::isAdmin();
		}

		if (!$userId)
		{
			return [];
		}

		$senders = [];

		$userFormattedName = self::getUserFormattedName($userId);

		$sendersList = SenderTable::query()
			->setSelect(['ID', 'NAME', 'EMAIL', 'USER_ID', 'OPTIONS'])
			->where('IS_CONFIRMED')
			->where(Query::filter()
				->logic('or')
				->where('USER_ID', $userId)
				->where('IS_PUBLIC', true)
			)
			->where('PARENT_MODULE_ID', 'main')
			->fetchAll()
		;

		$emailsWithSmtpSenders = [];
		$availableSmtpSenders = [];
		$emailsWithoutSmtpSenders = [];
		foreach ($sendersList as $sender)
		{
			$sender['USER_ID'] = (int)$sender['USER_ID'];
			if (in_array($sender['EMAIL'], $emailsWithoutSmtpSenders, true))
			{
				continue;
			}

			if (
				!in_array($sender['EMAIL'], $availableSmtpSenders, true)
				&& !in_array($sender['EMAIL'], $emailsWithSmtpSenders, true)
			)
			{
				//excluded emails senders for box, the list of senders contains senders with smtp and mail addresses without smtp senders
				if (Sender::hasUserAvailableSmtpSenderByEmail($sender['EMAIL'], $userId))
				{
					$availableSmtpSenders[] = $sender['EMAIL'];
				}
				else
				{
					$emailsWithoutSmtpSenders[] = $sender['EMAIL'];

					continue;
				}
			}

			if (
				$userId !== $sender['USER_ID']
				&& self::getUserFormattedName($sender['USER_ID']) === $sender['NAME']
			)
			{
				$sender['NAME'] = $userFormattedName ?? $sender['NAME'];
			}
			else
			{
				$sender['NAME'] = trim($sender['NAME']) ?: $userFormattedName;
			}

			$sender['EMAIL'] = mb_strtolower($sender['EMAIL']);

			$senders[] = [
				'id' => (int)$sender['ID'],
				'name' => $sender['NAME'],
				'email' => $sender['EMAIL'],
				'can_delete' => $sender['USER_ID'] === $userId || $isAdmin,
				'type' => !empty($sender['OPTIONS']['smtp']) ? self::SENDER_TYPE : self::ALIAS_TYPE,
				'showEditHint' => false,
			];

			//excluded emails senders for box, the list of senders contains senders with smtp and mail addresses without smtp senders
			if (
				!in_array($sender['EMAIL'], $emailsWithSmtpSenders, true)
				&& !empty($sender['OPTIONS']['smtp'])
			)
			{
				$emailsWithSmtpSenders[] = $sender['EMAIL'];
			}
		}

		$senders = array_merge(
			self::getUserAvailableMailboxSenders(
				getMailboxesWithoutSmtp: true,
				userId: $userId,
			),
			$senders,
		);

		//leaves only senders with unique names
		$uniqueSenders = [];
		$uniqueSenderNames = [];
		foreach ($senders as $key => $sender)
		{
			$senders[$key]['formated'] = "{$sender['name']} <{$sender['email']}>";
			if (in_array($senders[$key]['formated'], $uniqueSenderNames, true))
			{
				continue;
			}

			$uniqueSenderNames[] = $senders[$key]['formated'];
			$uniqueSenders[] = $senders[$key];
		}

		return $uniqueSenders;
	}

	/**
	 * Returns a list of available senders for user
	 */
	public static function getUserAvailableSendersByEmail(string $email, int $userId = null): ?array
	{
		$isAdmin = false;
		if (!$userId)
		{
			$userId = (int)Main\Engine\CurrentUser::get()->getId();
			$isAdmin = self::isAdmin();
		}

		$senders = [];
		$mailboxSenders = self::getUserAvailableMailboxSenders(
			email: $email,
			userId: $userId,
		);

		$senderListQuery = SenderTable::query()
			->setSelect(['*'])
			->where('IS_CONFIRMED')
			->where('EMAIL', $email)
			->where(Query::filter()
				->logic('or')
				->where('USER_ID', $userId)
				->where('IS_PUBLIC', true)
			)
		;

		if (Loader::includeModule('mail'))
		{
			$senderListQuery->where('PARENT_MODULE_ID', 'main');
		}

		$userFormattedName = self::getUserFormattedName($userId);
		$senderList = $senderListQuery->fetchAll();
		$userData = [];
		foreach ($senderList as $sender)
		{
			$ownerId = (int)$sender['USER_ID'];
			if (!empty($sender['OPTIONS']['smtp']['server']))
			{
				$type = self::SENDER_TYPE;
			}
			else
			{
				$type = self::ALIAS_TYPE;
			}

			if (empty($sender['NAME']))
			{
				$sender['NAME'] =  self::getUserFormattedName($ownerId);
			}

			if (!isset($userData[$ownerId]))
			{
				$userData[$ownerId] = self::getUserInfo($ownerId);
			}

			$canEdit = $ownerId === $userId || $isAdmin;
			$isOwner = $ownerId === $userId;

			if (
				$userId !== $ownerId
				&& self::getUserFormattedName((int)$sender['USER_ID']) === $sender['NAME']
			)
			{
				$sender['NAME'] = $userFormattedName ?? $sender['NAME'];
			}

			$senders[] = [
				'id' => (int)$sender['ID'],
				'name' => $sender['NAME'],
				'type' => $type,
				'email' => $sender['EMAIL'],
				'userId' => $ownerId,
				'canEdit' => $canEdit,
				'isOwner' => $isOwner,
				'avatar' => $userData[$ownerId]['userAvatar'] ?? null,
				'userUrl' => $userData[$ownerId]['userUrl'] ?? null,
			];
		}

		return array_merge($senders, $mailboxSenders);
	}

	/**
	 * Returns senders connected with mailboxes that current user has access to
	 */
	public static function getUserAvailableMailboxSenders(
		?string $email = null,
		?bool $getMailboxesWithoutSmtp = false,
		?array $excludedEmails = [],
		?int $userId = null,
	): array
	{
		if (!$userId)
		{
			$userId = (int)Main\Engine\CurrentUser::get()->getId();
		}

		$isAdmin = self::isAdmin();

		$senders = [];
		if (!Loader::includeModule('mail') || !$userId)
		{
			return $senders;
		}

		$currentUserFormattedName = self::getUserFormattedName($userId);
		foreach (MailboxTable::getUserMailboxes($userId) as $mailbox)
		{
			if (
				empty($mailbox['EMAIL'])
				|| ($email && $email !== $mailbox['EMAIL'])
				|| in_array($mailbox['EMAIL'], $excludedEmails, true)
			)
			{
				continue;
			}

			$mailbox['USER_ID'] = (int)$mailbox['USER_ID'];
			$canEdit = $mailbox['USER_ID'] === $userId || $isAdmin;
			$isOwner = $mailbox['USER_ID'] === $userId;

			$sender = null;
			if (self::isSmtpAvailable())
			{
				$sender = SenderTable::query()
					->setSelect(['*'])
					->where('IS_CONFIRMED', true)
					->where('PARENT_MODULE_ID', 'mail')
					->where('PARENT_ID', $mailbox['ID'])
					->setLimit(1)
					->fetchObject()
				;
			}

			if (!$sender && !$getMailboxesWithoutSmtp)
			{
				continue;
			}

			$userFormattedName = self::getUserFormattedName((int)($sender['USER_ID'] ?? $mailbox['USER_ID']));
			$senderName = trim($mailbox['USERNAME'] ?? '');
			if ($sender)
			{
				$sender['USER_ID'] = (int)$sender['USER_ID'];
				if (empty($sender['NAME']) && empty($mailbox['USERNAME']))
				{
					$senderName = self::getUserFormattedName($sender['USER_ID']);
				}

				if (!empty($mailbox['USERNAME']))
				{
					if ($sender['NAME'] !== $mailbox['USERNAME'])
					{
						SenderTable::update($sender['ID'], ['NAME' => $senderName]);
					}
				}

				if (empty($senderName) && $sender['NAME'])
				{
					$senderName = $sender['NAME'];
					MailboxTable::update($mailbox['ID'], ['USERNAME' => $senderName]);
				}

				if (!isset($userData[$sender['USER_ID']]))
				{
					$userData[$sender['USER_ID']] = self::getUserInfo($sender['USER_ID']);
				}

				$canEdit = $sender['USER_ID'] === $userId || $isAdmin;
				$isOwner = $sender['USER_ID'] === $userId;
			}

			if (
				empty($senderName)
				|| (
					$userId !== (int)$mailbox['USER_ID']
					&& self::getUserFormattedName((int)$mailbox['USER_ID']) === $senderName
				)
			)
			{
				$senderName = $currentUserFormattedName ?? $senderName;
			}

			if (!empty($sender['USER_ID']))
			{
				$avatar = $userData[$sender['USER_ID']]['userAvatar'] ?? null;
				$userUrl = $userData[$sender['USER_ID']]['userUrl'] ?? null;
			}

			$senders[] = [
				'id' => $sender['ID'] ?? $mailbox['ID'],
				'mailboxId' => $sender['PARENT_ID'] ?? $mailbox['ID'],
				'name' => !empty($senderName) ? $senderName : $userFormattedName,
				'type' => $sender ? self::MAILBOX_SENDER_TYPE : self::MAILBOX_TYPE,
				'email' => $mailbox['EMAIL'],
				'userId' => $sender['USER_ID'] ?? $mailbox['USER_ID'],
				'canEdit' => $canEdit,
				'isOwner' => $isOwner,
				'editHref' => $canEdit ? self::getMailboxConfigPath($sender['PARENT_ID'] ?? $mailbox['ID']) : null,
				'avatar' => $avatar ?? null,
				'userUrl' => $userUrl ?? null,
				'showEditHint' => empty($sender),
			];
		}

		return $senders;
	}

	/**
	 * Returns sender email data available for user and list of available senders associated with that email
	 */
	public static function getSenderTransitionalData(int $senderId): ?array
	{
		$sender = SenderTable::getById($senderId)->fetch();
		$transitionalData = [];

		if (!$sender)
		{
			return null;
		}

		$userId = (int)Main\Engine\CurrentUser::get()->getId();

		if (!$userId)
		{
			return null;
		}

		$isAdmin = self::isAdmin();
		$transitionalData['email'] = $sender['EMAIL'];
		$transitionalData['senders'] = self::getUserAvailableSendersByEmail($sender['EMAIL']);
		$isModuleMailAvailable = Loader::includeModule('mail');

		if ($isModuleMailAvailable)
		{
			foreach (MailboxTable::getUserMailboxes() as $mailbox)
			{
				if (
					$mailbox['EMAIL'] === $sender['EMAIL']
					&& ((int)$mailbox['USER_ID'] === $userId || $isAdmin)
				)
				{
					foreach ($transitionalData['senders'] as $emailSender)
					{
						if ($emailSender['type'] !== self::MAILBOX_SENDER_TYPE)
						{
							continue;
						}
						$transitionalData['id'] = $mailbox['ID'];
						$transitionalData['type'] = self::MAILBOX_TYPE;
						$transitionalData['href'] =  self::getMailboxConfigPath($mailbox['ID']);
						$transitionalData['canEdit'] = true;
						return $transitionalData;
					}

				}
			}
		}

		if (
			($sender['PARENT_MODULE_ID'] === 'main' || !$isModuleMailAvailable)
			&& !empty($sender['OPTIONS']['smtp']['server'])
			&& ((int)$sender['USER_ID'] === $userId || $isAdmin)
		)
		{
			$transitionalData['id'] = $senderId;
			$transitionalData['type'] = self::SENDER_TYPE;
			$transitionalData['canEdit'] = true;
			return $transitionalData;
		}

		foreach ($transitionalData['senders'] as $emailSender)
		{
			if (
				$emailSender['type'] === self::SENDER_TYPE
				&& ($emailSender['USER_ID'] === $userId || $isAdmin)
			)
			{
				$transitionalData['id'] = $emailSender['id'];
				$transitionalData['type'] = self::SENDER_TYPE;
				$transitionalData['canEdit'] = true;
				return $transitionalData;
			}
		}

		return $transitionalData;
	}

	public static function getUserFormattedName(?int $userId = null): ?string
	{
		if (!$userId)
		{
			$userId = Main\Engine\CurrentUser::get()->getId();
		}

		if (!$userId)
		{
			return null;
		}

		$userData = self::getUserData($userId);
		if (!$userData)
		{
			return null;
		}

		return \CUser::formatName(\CSite::getNameFormat(), $userData, true, false);
	}

	public static function getAddressInEmailAngleFormat(
		string $email,
		?string $senderName = null,
		?int $userId = null,
	): ?string
	{
		if (strlen($senderName ?? '') === 0)
		{
			$senderName = self::getUserFormattedName($userId);
		}

		if (!$senderName)
		{
			return null;
		}

		return "{$senderName} <{$email}>";
	}

	public static function getSenderNameByMailboxId(int $mailboxId, bool $getSenderWithoutSmtp = false): ?array
	{
		$sender = SenderTable::query()
			->setSelect(['*'])
			->where('IS_CONFIRMED', true)
			->where('PARENT_MODULE_ID', 'mail')
			->where('PARENT_ID', $mailboxId)
			->setLimit(1)
			->fetchObject()
		;

		if ($sender)
		{
			return [
				'id' => $sender['ID'],
				'name' => (strlen($sender['NAME'] ?? '') > 0) ? $sender['NAME'] : self::getUserFormattedName($sender['USER_ID']),
				'email' => $sender['EMAIL'],
				'type' => self::MAILBOX_SENDER_TYPE,
			];
		}

		if (
			!$getSenderWithoutSmtp
			|| !self::canUseMailboxTable()
		)
		{
			return null;
		}

		$mailbox = MailboxTable::getById($mailboxId)->fetch();

		if (!$mailbox)
		{
			return null;
		}

		return [
			'id' => $mailbox['ID'],
			'name' => (strlen($mailbox['USERNAME'] ?? '') > 0) ? $mailbox['USERNAME'] : self::getUserFormattedName($mailbox['USER_ID']),
			'email' => $mailbox['EMAIL'],
			'type' => self::MAILBOX_TYPE,
		];
	}

	private static function getMailboxConfigPath(int $mailboxId): string
	{
		return str_replace('#id#', $mailboxId, Config\Option::get('intranet', 'path_mail_config', SITE_DIR . 'mail/'));
	}

	public static function getUserInfo(int $userId): ?array
	{
		static $userInfo = [];

		if (isset($userInfo[$userId]))
		{
			return $userInfo[$userId];
		}

		$userData = self::getUserData($userId);
		if (!$userData)
		{
			return null;
		}

		$userUrl = str_replace('#USER_ID#', $userId, \COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/'));

		if ($userData['PERSONAL_PHOTO'])
		{
			$resizedImage = \CFile::ResizeImageGet(
				$userData["PERSONAL_PHOTO"],
				['width' => 50, 'height' => 50],
				BX_RESIZE_IMAGE_EXACT,
				false,
				false,
				true
			);
			if (!empty($resizedImage['src']))
			{
				$userAvatar = $resizedImage['src'];
			}
		}

		$userInfo[$userId] = [
			'userUrl' => $userUrl,
			'userAvatar' => $userAvatar ?? null,
		];

		return $userInfo[$userId];
	}

	private static function canUseMailboxTable(): bool
	{
		return Loader::includeModule('mail') && class_exists('Bitrix\Mail\MailboxTable');
	}

	private static function isSmtpAvailable(): bool
	{
		$defaultMailConfiguration = Configuration::getValue('smtp');
		return Loader::includeModule('bitrix24')
			|| $defaultMailConfiguration['enabled']
		;
	}

	public static function isAdmin(): bool
	{
		$currentUser = Main\Engine\CurrentUser::get();

		return $currentUser->isAdmin() || $currentUser->canDoOperation('bitrix24_config');
	}

	private static function getUserData(int $userId): ?array
	{
		static $userData = [];
		if (!empty($userData[$userId]))
		{
			return $userData[$userId];
		}

		$select = [
			'ID',
			'NAME',
			'LAST_NAME',
			'SECOND_NAME',
			'PERSONAL_PHOTO',
			'LOGIN',
			'EMAIL',
		];

		$userData[$userId] = \Bitrix\Main\UserTable::getList([
			'select' => $select,
			'filter' => ['=ID' => $userId],
		])->fetch();

		return $userData[$userId] ?: null;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit