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/messageview/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/mail/lib/messageview/avatarmanager.php
<?php
namespace Bitrix\Mail\MessageView;

use Bitrix\Main;
use Bitrix\Mail\Internals\MailContactTable;

class AvatarManager
{
	private $currentUserId;

	public function __construct($currentUserId = null)
	{
		$this->currentUserId = $currentUserId;
	}

	public static function getAvatarKeyByString($string): ?string
	{
		$parts = explode(",", $string);
		$firstContact = trim($parts[0]);

		$address = new Main\Mail\Address($firstContact);
		if ($address->validate())
		{
			return $address->getEmail();
		}

		return null;
	}

	public function getAvatarParamsFromEmails($filedFromList)
	{
		$fileds = [];

		foreach ($filedFromList as $filed)
		{
			$fileds = array_merge($fileds, $this->getAvatarParamsFromMessagesHeaders([['FIELD_FROM' => $filed]]));
		}

		return $fileds;
	}

	public function getAvatarParamsFromMessagesHeaders($messages)
	{
		$mailsNames = $this->getEmailsNames($messages);

		$mailContacts = $this->fetchMailContacts(array_map(
			function ($item)
			{
				return $item['email'];
			},
			$mailsNames
		));

		$mailContacts = $this->fillFileIdColumn($mailContacts);

		foreach ($mailsNames as $email => $data)
		{
			if (!empty($mailContacts[$email]))
			{
				if ((!$data['name'] || $data['name'] === $data['email']) &&
					($mailContacts[$email]['NAME'] && $mailContacts[$email]['NAME'] !== $mailContacts[$email]['EMAIL']))
				{
					$mailsNames[$email]['name'] = $mailContacts[$email]['NAME'];
				}
				$mailsNames[$email]['mailContact'] = $mailContacts[$email];
			}
			else
			{
				$mailsNames[$email]['mailContact'] = [
					'EMAIL' => $data['email'],
					'NAME' => $data['name'],
				];
			}
		}
		return $mailsNames;
	}

	private function getEmailsNames($messages, $fieldList = false)
	{
		$emailNames = [];

		if($fieldList)
		{
			$messages = $fieldList;
		}

		foreach ($messages as $index => $message)
		{
			$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_FROM']));
			$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_TO']));
			$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_CC']));
			$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_BCC']));
		}
		$emailNames = $this->getBestNameChoices($emailNames);

		return $emailNames;
	}

	private function getBestNameChoices($emailNames)
	{
		$results = [];
		$bestNames = [];
		foreach ($emailNames as $index => $data)
		{
			if (!isset($bestNames[$data['email']]))
			{
				$bestNames[$data['email']] = $data['name'];
				$results[$data['email']] = [
					'email' => $data['email'],
					'name' => $data['name'],
				];
				continue;
			}
			$newName = $data['name'];
			$oldName = $bestNames[$data['email']];
			if (!$oldName || $oldName == $data['email'])
			{
				$bestNames[$data['email']] = $newName;
				$results[$data['email']] = [
					'email' => $data['email'],
					'name' => $newName,
				];
			}
		}

		return $results;
	}

	private function extractMailsNamesFrom($parsedListOfEmails)
	{
		$emailNames = [];

		if ($parsedListOfEmails)
		{
			foreach (\Bitrix\Mail\Helper\Message::parseAddressList($parsedListOfEmails) as $mailCopy)
			{
				$avatarKey = static::getAvatarKeyByString($mailCopy);
				if ($avatarKey)
				{
					$address = new Main\Mail\Address($avatarKey);
					if ($address->validate())
					{
						$emailNames[] = [
							'email' => $address->getEmail(),
							'name' => $address->getName() ?: $address->getEmail(),
						];
					}
				}
			}
		}
		return $emailNames;
	}

	private function fillFileIdColumn($mailContacts)
	{
		foreach ($mailContacts as $mail => $mailContact)
		{
			if (!empty($mailContacts[$mail]['AVATAR_ID']))
			{
				$mailContacts[$mail]['FILE_ID'] = $mailContacts[$mail]['AVATAR_ID'];
			}
		}
		return $mailContacts;
	}

	protected function fetchMailContacts(array $emails): array
	{
		if (empty($emails))
		{
			return [];
		}

		static $cachedContacts = [];

		$newEmails = array_diff($emails, array_keys($cachedContacts));

		if (!empty($newEmails))
		{
			$fetchedContacts = MailContactTable::getList(array(
				'runtime' => array(
					new Main\ORM\Fields\Relations\Reference(
						'USER',
						Main\UserTable::class,
						array(
							'=this.EMAIL' => 'ref.EMAIL',
							'=ref.ACTIVE' => new Main\DB\SqlExpression('?', 'Y'),
						)
					)
				),
				'select' => array(
					'NAME', 'EMAIL', 'ICON', 'FILE_ID',
					'AVATAR_ID' => 'USER.PERSONAL_PHOTO',
				),
				'filter' => array(
					'=USER_ID' => $this->currentUserId,
					'@EMAIL' => $emails,
				),
			))->fetchAll();

			foreach ($fetchedContacts as $contact)
			{
				$cachedContacts[$contact['EMAIL']] = $contact;
			}
		}

		return array_intersect_key($cachedContacts, array_flip($emails));
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit