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

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

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

namespace Bitrix\Mail\Controller;

use Bitrix\Forum\ForumTable;
use Bitrix\Mail\Helper\Message;
use Bitrix\Mail\Integration\Calendar\ICal\ICalMailManager;
use Bitrix\Mail\Internals\MailMessageAttachmentTable;
use Bitrix\Main\Application;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Engine\Action;
use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Error;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;

class Secretary extends Controller
{
	protected function processBeforeAction(Action $action)
	{
		if (! Loader::includeModule('intranet'))
		{
			return false;
		}
		return parent::processBeforeAction($action);
	}

	/**
	 * Configure actions.
	 *
	 * @return array
	 */
	public function configureActions()
	{
		$config = [
			'createChatFromMessage' => [
				'+prefilters' => [
					new \Bitrix\Main\Engine\ActionFilter\HttpMethod(['POST']),
					new \Bitrix\Main\Engine\ActionFilter\Csrf(),
				]
			],
			'onCalendarSave' => [
				'+prefilters' => [
					new \Bitrix\Main\Engine\ActionFilter\HttpMethod(['POST']),
					new \Bitrix\Main\Engine\ActionFilter\Csrf(),
				]
			],
			'getCalendarEventDataFromMessage' => [
				'+prefilters' => [
					new \Bitrix\Main\Engine\ActionFilter\HttpMethod(['POST']),
					new \Bitrix\Main\Engine\ActionFilter\Csrf(),
				]
			],
		];

		if (Loader::includeModule('intranet'))
		{
			$config['createChatFromMessage']['+prefilters'][] = new \Bitrix\Intranet\ActionFilter\IntranetUser();
			$config['onCalendarSave']['+prefilters'][] = new \Bitrix\Intranet\ActionFilter\IntranetUser();
			$config['getCalendarEventDataFromMessage']['+prefilters'][] = new \Bitrix\Intranet\ActionFilter\IntranetUser();
		}

		return $config;
	}

	/**
	 * Create chat for mail message or go back to existing chat.
	 *
	 * @param int $messageId  mail message id
	 * @return int|null  chat id
	 * @throws \Bitrix\Main\LoaderException
	 */
	public function createChatFromMessageAction(int $messageId): ?int
	{
		if (!Loader::includeModule('im'))
		{
			return null;
		}

		global $USER;
		$userId = $USER->GetID();

		if (!$this->canBindEntities($messageId, (int)$userId))
		{
			$this->addError(new Error(Loc::getMessage('MAIL_SECRETARY_ACCESS_DENIED')));
			return null;
		}

		$message = \Bitrix\Mail\Integration\Intranet\Secretary::getMessage($messageId);
		$messageData = $message->toArray();
		$messageData['USER_IDS'] = [$USER->GetID()];

		if ($chatId = \Bitrix\Intranet\Secretary::getChatIdIfExists($messageId, 'MAIL'))
		{
			// get back to chat if user left in past
			if (! \Bitrix\Intranet\Secretary::isUserInChat($chatId, $userId))
			{
				\Bitrix\Intranet\Secretary::addUserToChat($chatId, $userId, false);
				// // post welcome message again because it was hidden
				// \Bitrix\Intranet\Secretary::postMailChatWelcomeMessage($message, $chatId, $userId);
			}
		}
		else
		{
			$lockName = "chat_create_mail_{$messageId}";
			if (!Application::getConnection()->lock($lockName))
			{
				$this->addError(new Error(
						Loc::getMessage('MAIL_SECRETARY_CREATE_CHAT_LOCK_ERROR'), 'lock_error')
				);
				return null;
			}

			$chatId = \Bitrix\Intranet\Secretary::createMailChat($messageData, $userId);

			Application::getConnection()->unlock($lockName);
		}

		if (Loader::includeModule('pull'))
		{
			$mailboxId = \Bitrix\Mail\Integration\Intranet\Secretary::getMailboxIdForMessage($messageId);

			if($mailboxId)
			{
				\CPullWatch::addToStack(
					'mail_mailbox_' . $mailboxId,
					[
						'module_id' => 'mail',
						'command' => 'messageBindingCreated',
						'params' => [
							'messageId' => $messageId,
							'mailboxId' => $mailboxId,
							'entityType' => Message::ENTITY_TYPE_IM_CHAT,
							'entityId' => $chatId,
							'bindingEntityLink' =>
							\CComponentEngine::makePathFromTemplate(
								'/online/?IM_DIALOG=chat#chat_id#',
								[
									'chat_id' => $chatId,
								]
							),
						],
					]
				);
			}
		}

		return $chatId;
	}

	public function onCalendarSaveAction(int $messageId, int $calendarEventId)
	{
		if ($this->provideAccessToMessage($messageId, $calendarEventId))
		{
			if ($this->postCalendarBackLinkComment($messageId, $calendarEventId))
			{
				$this->assignCreatedCalendarLabelToMessage($messageId, $calendarEventId);
			}
			else
			{
				$this->addError(new Error('secretary: comment post error'));
			}
		}
		else
		{
			$this->addError(new Error('secretary: grant access to message failed'));
		}
	}

	/**
	 * Assign event label to mail messages list.
	 *
	 * @param int $messageId
	 * @param int $calendarEventId
	 * @return bool
	 * @throws \Bitrix\Main\LoaderException
	 */
	private function assignCreatedCalendarLabelToMessage(int $messageId, int $calendarEventId): bool
	{
		if (Loader::includeModule('pull'))
		{
			$mailboxId = \Bitrix\Mail\Integration\Intranet\Secretary::getMailboxIdForMessage($messageId);

			if($mailboxId)
			{
				global $USER;

				$userPage = \Bitrix\Main\Config\Option::get('socialnetwork', 'user_page', '/company/personal/', SITE_ID);

				\CPullWatch::addToStack(
					'mail_mailbox_' . $mailboxId,
					[
						'module_id' => 'mail',
						'command' => 'messageBindingCreated',
						'params' => [
							'messageId' => $messageId,
							'mailboxId' => $mailboxId,
							'entityType' => Message::ENTITY_TYPE_CALENDAR_EVENT,
							'entityId' => $calendarEventId,
							'bindingEntityLink' =>
								\CComponentEngine::makePathFromTemplate(
									$userPage . 'user/#user_id#/calendar/?EVENT_ID=#event_id#',
									[
										'user_id' => $USER->getId(),
										'event_id' => $calendarEventId,
									]
								),
						],
					]
				);
			}

			return true;
		}

		return false;
	}

	/**
	 * Grant access to message for calendar event attendees.
	 *
	 * @param int $messageId
	 * @param int $calendarEventId
	 * @return bool
	 */
	private function provideAccessToMessage(int $messageId, int $calendarEventId): bool
	{
		global $USER;
		$userId = $USER->GetID();

		return \Bitrix\Mail\Integration\Intranet\Secretary::provideAccessToMessage(
			$messageId,
			Message::ENTITY_TYPE_CALENDAR_EVENT,
			$calendarEventId,
			$userId
		);
	}

	/**
	 * Post comment to calendar event with tokenized backlink.
	 *
	 * @param int $messageId
	 * @param int $calendarEventId
	 * @return bool
	 * @throws \Bitrix\Main\LoaderException
	 */
	private function postCalendarBackLinkComment(int $messageId, int $calendarEventId): bool
	{
		if (! Loader::includeModule('calendar'))
		{
			$this->addError(new Error('module calendar unloaded'));
			return false;
		}

		if (! Loader::includeModule('forum'))
		{
			$this->addError(new Error('module forum unloaded'));
			return false;
		}

		global $USER;
		$userId = (int)$USER->GetID();

		$xmlId = 'EVENT_' . $calendarEventId;

		$calendarEntry = \CCalendarEvent::getEventForViewInterface($calendarEventId, [
			'eventDate' => '',
			'userId' => $userId,
		]);

		if (!$this->canBindEntities($messageId, $userId))
		{
			$this->addError(new Error(Loc::getMessage('MAIL_SECRETARY_ACCESS_DENIED')));
			return false;
		}

		if (! isset($calendarEntry['CREATED_BY']) || (int)$calendarEntry['CREATED_BY'] !== $userId)
		{
			$this->addError(new Error(Loc::getMessage('MAIL_SECRETARY_ACCESS_DENIED_CALENDAR')));
			return false;
		}

		if ($calendarEntry)
		{
			$xmlId = \CCalendarEvent::getEventCommentXmlId($calendarEntry);
		}

		$feedParams = [
			'type' => 'EV', // \Bitrix\Socialnetwork\Livefeed\ForumPost::getForumTypeMap()
			'id' => $calendarEventId,
			'xml_id' => $xmlId,
		];

		$forumId = self::getForumId(array_merge($feedParams, [
			'SITE_ID' => SITE_ID,
		]));

		if (!$forumId)
		{
			$this->addError(new Error('forum id error'));
			return false;
		}

		$feed = new \Bitrix\Forum\Comments\Feed(
			$forumId,
			$feedParams,
			$userId
		);

		$link = \Bitrix\Mail\Integration\Intranet\Secretary::getMessageUrlForCalendarEvent($messageId, $calendarEventId);
		$commentMessage = Loc::getMessage('MAIL_SECRETARY_POST_MESSAGE_CALENDAR_EVENT', [
			'#LINK#' => $link,
		]);

		$forumMessageFields = [
			'POST_MESSAGE' => $commentMessage,
		];
		$forumComment = $feed->add($forumMessageFields);

		if (!$forumComment)
		{
			$this->addError(new Error('forum comment error'));
			return false;
		}

		// TODO post to social network feed
		// if (! Loader::includeModule('socialnetwork'))
		// {
		// 	$this->addError(new Error('module socialnetwork unloaded'));
		// 	return null;
		// }

		return true;
	}

	/**
	 * Prepare name and description for new calendar event,
	 * created from mail message.
	 *
	 * @param int $messageId
	 * @return array|null
	 * @throws \Bitrix\Main\LoaderException
	 */
	public function getCalendarEventDataFromMessageAction(int $messageId)
	{
		if (! Loader::includeModule('intranet'))
		{
			$this->addError(new Error('module intranet unloaded')); // FIXME translate
			return null;
		}

		global $USER;
		if (!$this->canBindEntities($messageId, (int)$USER->getId()))
		{
			$this->addError(new Error(Loc::getMessage('MAIL_SECRETARY_ACCESS_DENIED')));
			return null;
		}

		$message = \Bitrix\Mail\Integration\Intranet\Secretary::getMessage($messageId);
		$address = new \Bitrix\Main\Mail\Address($message->getFrom());
		$desc = Loc::getMessage('MAIL_SECRETARY_CALENDAR_EVENT_DESC', [
			'#SUBJECT#' => htmlspecialcharsbx($message->getSubject()),
			'#FROM#' => htmlspecialcharsbx($message->getFrom()),
			'#DATE#' => $message->getDate()->toString(),
			'#LINK_FROM#' => 'mailto:' . htmlspecialcharsbx($address->getEmail()),
			'#LINK#' => \Bitrix\Mail\Integration\Intranet\Secretary::getDirectMessageUrl($message->getId()),
		]);

		$isIcal = Message::isIcalMessage($message);

		return [
			'name' => htmlspecialcharsbx($message->getSubject()),
			'desc' => $desc,
			'isIcal' => $isIcal,
			'isNewEvent' => !$isIcal,
			// 'userIds' => $data['USER_IDS'],
		];
	}

	// FIXME copypaste from forum module, must be simplified
	private static function getForumId($params = [])
	{
		$result = 0;

		$siteId = (
		isset($params['SITE_ID'])
		&& $params['SITE_ID'] <> ''
			? $params['SITE_ID']
			: SITE_ID
		);

		if (isset($params['type']))
		{
			if ($params['type'] === 'TK')
			{
				$result = Option::get('tasks', 'task_forum_id', 0, $siteId);

				if (
					(int)$result <= 0
					&& Loader::includeModule('forum')
				)
				{
					$res = ForumTable::getList([
						'filter' => [
							'=XML_ID' => 'intranet_tasks',
						],
						'select' => [ 'ID' ],
					]);
					if ($forumFields = $res->fetch())
					{
						$result = (int)$forumFields['ID'];
					}
				}
			}
			elseif ($params['type'] === 'WF')
			{
				$result = Option::get('bizproc', 'forum_id', 0, $siteId);

				if ((int)$result <= 0)
				{
					$res = ForumTable::getList([
						'filter' => [
							'=XML_ID' => 'bizproc_workflow',
						],
						'select' => [ 'ID' ],
					]);
					if ($forumFields = $res->fetch())
					{
						$result = (int)$forumFields['ID'];
					}
				}
			}
			elseif (in_array($params['type'], [ 'TM', 'TR' ]))
			{
				$result = Option::get('timeman', 'report_forum_id', 0, $siteId);
			}
			elseif (
				$params['type'] === 'EV'
				&& Loader::includeModule('calendar')
			)
			{
				$calendarSettings = \CCalendar::getSettings();
				$result = $calendarSettings["forum_id"];
			}
			elseif (
				$params['type'] === 'PH'
				&& Loader::includeModule('forum')
			)
			{
				$res = ForumTable::getList(array(
					'filter' => array(
						'=XML_ID' => 'PHOTOGALLERY_COMMENTS'
					),
					'select' => array('ID')
				));
				if ($forumFields = $res->fetch())
				{
					$result = (int)$forumFields['ID'];
				}
			}
			elseif ($params['type'] === 'IBLOCK')
			{
				$result = Option::get('wiki', 'socnet_forum_id', 0, $siteId);
			}
			else
			{
				$res = ForumTable::getList(array(
					'filter' => array(
						'=XML_ID' => 'USERS_AND_GROUPS'
					),
					'select' => array('ID')
				));
				if ($forumFields = $res->fetch())
				{
					$result = (int)$forumFields['ID'];
				}
			}
		}

		return $result;
	}

	/**
	 * Check user can create linked entities
	 *
	 * @param int $messageId
	 * @param int $userId
	 * @return bool
	 */
	private function canBindEntities(int $messageId, int $userId): bool
	{
		return  \Bitrix\Mail\MessageAccess::createByMessageId($messageId, $userId)->canModifyMessage();
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit