Your IP : 3.129.250.65


Current Path : /home/bitrix/ext_www/ballu.in.ua/bitrix/modules/mail/lib/helper/
Upload File :
Current File : /home/bitrix/ext_www/ballu.in.ua/bitrix/modules/mail/lib/helper/message.php

<?php

namespace Bitrix\Mail\Helper;

use Bitrix\Main;
use Bitrix\Main\Security;
use Bitrix\Mail;

class Message
{

	public static function prepare(&$message)
	{
		$message['__email'] = null;
		foreach (array($message['MAILBOX_EMAIL'], $message['MAILBOX_NAME'], $message['MAILBOX_LOGIN']) as $item)
		{
			$address = new Main\Mail\Address($item);
			if ($address->validate())
			{
				$message['__email'] = $address->getEmail();
				break;
			}
		}

		$fieldsMap = array(
			'__from' => 'FIELD_FROM',
			'__reply_to' => 'FIELD_REPLY_TO',
			'__to' => 'FIELD_TO',
			'__cc' => 'FIELD_CC',
			'__bcc' => 'FIELD_BCC',
		);
		foreach ($fieldsMap as $__field => $field)
		{
			$isFromField = in_array($__field, array('__from', '__reply_to'));

			$message[$__field] = array();
			foreach (explode(',', $message[$field]) as $item)
			{
				if (trim($item))
				{
					$address = new Main\Mail\Address($item);
					if ($address->validate())
					{
						if ($isFromField && $address->getEmail() == $message['__email'])
						{
							$message['__is_outcome'] = true;
						}

						$message[$__field][] = array(
							'name'  => $address->getName(),
							'email' => $address->getEmail(),
						);
					}
					else
					{
						$message[$__field][] = array(
							'name'  => $item,
						);
					}
				}
			}
		}

		if (empty($message['__reply_to']))
		{
			$message['__reply_to'] = $message['__from'];
		}

		// @TODO: path
		$message['__href'] = sprintf('/mail/message/%u', $message['ID']);

		$urlManager = Attachment\Storage::getUrlManager();

		if (!empty($message['__files']) && is_array($message['__files']))
		{
			$urlParams = array();

			if (isset($_REQUEST['mail_uf_message_token']) && is_string($_REQUEST['mail_uf_message_token']))
			{
				$urlParams['mail_uf_message_token'] = $_REQUEST['mail_uf_message_token'];
			}

			foreach ($message['__files'] as $k => $item)
			{
				if ($diskFile = Attachment\Storage::getObjectByAttachment($item, true))
				{
					$message['__files'][$k] = array(
						'id'      => sprintf('n%u', $diskFile->getId()),
						'name'    => $item['FILE_NAME'],
						'url'     => $urlManager->getUrlForShowFile($diskFile, $urlParams),
						'size'    => \CFile::formatSize($diskFile->getSize()),
					);

					if (\Bitrix\Disk\TypeFile::isImage($diskFile))
					{
						$message['__files'][$k]['preview'] = $urlManager->getUrlForShowFile(
							$diskFile,
							array_merge(
								array('width' => 80, 'height' => 80),
								$urlParams
							)
						);
					}

					$message['BODY_HTML'] = preg_replace(
						sprintf('/("|\')\s*aid:%u\s*\1/i', $item['ID']),
						sprintf('\1%s\1', $urlManager->getUrlForShowFile($diskFile, array('__bxacid' => sprintf('n%u', $diskFile->getId())))),
						$message['BODY_HTML']
					);
				}
				else
				{
					$file = \CFile::getFileArray($item['FILE_ID']);
					if (!empty($file) && is_array($file))
					{
						$preview = \CFile::resizeImageGet(
							$file, array('width' => 80, 'height' => 80),
							BX_RESIZE_IMAGE_EXACT, false
						);

						$message['__files'][$k] = array(
							'id'      => $file['ID'],
							'name'    => $item['FILE_NAME'],
							'url'     => $file['SRC'],
							'preview' => !empty($preview['src']) ? $preview['src'] : null,
							'size'    => \CFile::formatSize($file['FILE_SIZE']),
						);

						$message['BODY_HTML'] = preg_replace(
							sprintf('/("|\')\s*aid:%u\s*\1/i', $item['ID']),
							sprintf('\1%s\1', $file['SRC']),
							$message['BODY_HTML']
						);
					}
					else
					{
						unset($message['__files'][$k]);
					}
				}
			}
		}

		return $message;
	}

	public static function hasAccess(&$message, $userId = null)
	{
		global $USER;

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

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

		$access = (bool) Mail\MailboxTable::getUserMailbox($message['MAILBOX_ID'], $userId);

		$message['__access_level'] = $access ? 'full' : false;

		if (!$access && isset($_REQUEST['mail_uf_message_token']))
		{
			$token = $signature = '';
			if (is_string($_REQUEST['mail_uf_message_token']) && strpos($_REQUEST['mail_uf_message_token'], ':') > 0)
			{
				list($token, $signature) = explode(':', $_REQUEST['mail_uf_message_token'], 2);
			}

			if (strlen($token) > 0 && strlen($signature) > 0)
			{
				$excerpt = Mail\Internals\MessageAccessTable::getList(array(
					'select' => array('SECRET', 'MESSAGE_ID'),
					'filter' => array(
						'=TOKEN' => $token,
						'=MAILBOX_ID' => $message['MAILBOX_ID'],
					),
					'limit' => 1,
				))->fetch();

				if (!empty($excerpt['SECRET']))
				{
					$signer = new Security\Sign\Signer(new Security\Sign\HmacAlgorithm('md5'));

					if ($signer->validate($excerpt['SECRET'], $signature, sprintf('user%u', $userId)))
					{
						$access = $message['ID'] == $excerpt['MESSAGE_ID'];

						if (!$access) // check parent access
						{
							$access = (bool) Mail\Internals\MessageClosureTable::getList(array(
								'select' => array('PARENT_ID'),
								'filter' => array(
									'=MESSAGE_ID' => $message['ID'],
									'=PARENT_ID' => $excerpt['MESSAGE_ID'],
								),
							))->fetch();
						}
					}
				}
			}
		}

		if (false === $message['__access_level'])
		{
			$message['__access_level'] = $access ? 'read' : false;
		}

		return $access;
	}

	public static function prepareSearchContent(&$fields)
	{
		// @TODO: filter short words, filter duplicates, str_rot13?
		return str_rot13(join(
			' ',
			array(
				$fields['FIELD_FROM'],
				$fields['FIELD_REPLY_TO'],
				$fields['FIELD_TO'],
				$fields['FIELD_CC'],
				$fields['FIELD_BCC'],
				$fields['SUBJECT'],
				$fields['BODY'],
			)
		));
	}

	public static function prepareSearchString($string)
	{
		return str_rot13($string);
	}

	public static function getTotalUnseenCount($userId)
	{
		$unseenTotal = static::getTotalUnseenForMailboxes($userId);
		$unseen = 0;
		foreach ($unseenTotal as $index => $item)
		{
			$unseen += (int)$item['UNSEEN'];
		}
		return $unseen;
	}

	public static function getTotalUnseenForMailboxes($userId)
	{
		$mailboxes = Mail\MailboxTable::getUserMailboxes($userId);
		$mailboxes = array_combine(
			array_column($mailboxes, 'ID'),
			$mailboxes
		);

		$mailboxFilter = array(
			'LOGIC' => 'OR',
		);
		foreach ($mailboxes as $item)
		{
			$mailboxFilter[] = array(
				'=MAILBOX_ID' => $item['ID'],
				'!@DIR_MD5' => array_map(
					'md5',
					array_merge(
						(array) $item['OPTIONS']['imap'][MessageFolder::TRASH],
						(array) $item['OPTIONS']['imap'][MessageFolder::SPAM]
					)
				),
			);
		}
		$totalUnseen = Mail\MailMessageUidTable::getList(array(
			'select' => array(
				'MAILBOX_ID',
				new \Bitrix\Main\Entity\ExpressionField('TOTAL', 'COUNT(1)'),
				new \Bitrix\Main\Entity\ExpressionField(
					'UNSEEN',
					"COUNT(IF(%s IN('N','U'), 1, NULL))",
					array('IS_SEEN')
				),
			),
			'filter' => array(
				$mailboxFilter,
				'>MESSAGE_ID' => 0,
			),
			'group' => array(
				'MAILBOX_ID',
			),
		))->fetchAll();
		$result = [];
		foreach ($totalUnseen as $index => $item)
		{
			$result[$item['MAILBOX_ID']] = [
				'TOTAL' => $item['TOTAL'],
				'UNSEEN' => $item['UNSEEN'],
			];
		}
		return $result;
	}
}