AnonSec Shell
Server IP : 85.193.89.191  /  Your IP : 3.145.7.194
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/calendar/lib/ical/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/bitrix/www/bitrix/modules/calendar/lib/ical/incomingeventmanager.php
<?php


namespace Bitrix\Calendar\ICal;


use Bitrix\Calendar\ICal\Builder\AttendeesCollection;
use Bitrix\Calendar\ICal\MailInvitation\Helper;
use Bitrix\Calendar\ICal\MailInvitation\IncomingInvitationRequestHandler;
use Bitrix\Mail\Internals\MessageAccessTable;
use Bitrix\Mail\MailboxTable;
use Bitrix\Mail\MailMessageTable;
use Bitrix\Main\IO\FileNotFoundException;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ORM\Fields\Relations\Reference;
use Bitrix\Main\ORM\Query\Join;
use Bitrix\Main\ORM\Query\Query;
use Bitrix\Main\Text\Encoding;
use Bitrix\Tasks\Integration\Disk;
use Bitrix\Calendar\ICal\Basic\{Dictionary, ICalUtil};
use Bitrix\Main\Type\Date;


class IncomingEventManager
{
	public static function handleRequest($params)
	{
		$event = $params['event'];
		$userId = $params['userId'];
		$answer = $params['answer'];
		$userEmail = $params['emailTo'];
		$organizerEmail = $event['ORGANIZER_MAIL']['EMAIL'];

		$event = static::updateEvent($event, $userId, $answer);
		$attendees = static::handleAttendeesFromRequest([
			'attendees' => $event['ATTENDEES_MAIL'],
			'answer' => $answer,
			'userId' => $userId,
			'userEmail' => $userEmail,
			'organizerEmail' => $organizerEmail
		]);

		$parentId = \CCalendar::SaveEvent([
			'arFields' => static::updateParentEvent($event),
		]);

		\CCalendar::SaveEvent([
			'arFields' => static::updateChildEvent($event, $parentId),
		]);


		$replyStatus = OutcomingEventManager::createInstance([
			'icalMethod' => 'reply',
			'arFields' => $event,
			'userIndex' => $attendees,
			'receiver' => $event['ORGANIZER_MAIL'],
			'sender' => $attendees[$event['OWNER_ID']],
		])->replyInvitation()->getStatus();
	}

	public static function handleReply(array $params): bool
	{
		$uid = $params['event']['DAV_XML_ID'];
		$emailUser = $params['event']['ATTENDEES_MAIL'][0];
		$userId = ICalUtil::getUserIdByEmail($emailUser);
		$localEvent = ICalUtil::getEventByUId($userId, $uid);

		if (!empty($localEvent))
		{
			$status = $params['event']['ATTENDEES_MAIL'][0]['STATUS'];

			\CCalendarEvent::SetMeetingStatusEx([
				'attendeeId' => $localEvent['OWNER_ID'],
				'eventId' => $localEvent['ID'],
				'status' => Dictionary::LOCAL_ATTENDEES_STATUS[$status],
				'personalNotification' => $localEvent['MEETING_HOST'],
			]);
		}

		return true;
	}

	public static function handleReplyReceivedICalInvent(\Bitrix\Main\Event $event)
	{
		$attachments = $event->getParameter('attachments');

		if (is_array($attachments))
		{
			foreach($attachments as $key => $file)
			{
				if ($file['type'] === OutcomingEventManager::CONTENT_TYPE)
				{
					$fileObject = new \Bitrix\Main\IO\File($file['tmp_name'], $event->getParameter('site_id'));
					try
					{
						$fileContent = $fileObject->getContents();
					}
					catch (FileNotFoundException $e)
					{
						die();
					}
					$fileContent = Encoding::convertEncoding($fileContent, OutcomingEventManager::CHARSET, SITE_CHARSET);
					$icalComponent = static::getDataInfo($fileContent);

					if ($method === Dictionary::METHODS['reply'])
					{
						static::handleReply(['event' => $icalEvent]);
					}
				}
			}
		}
	}

	public static function handleCancel($params)
	{
		$event = $params['event'];
		$userId = $params['userId'];

		$originalValue = ICalUtil::getEventByUId($userId, $event['DAV_XML_ID']);
		if (!empty($originalValue))
		{
			$deleteParams = [
				'sendNotification' => true,
				'checkPermissions' => false,
			];

			\CCalendar::DeleteEvent($originalValue['ID'], true, $deleteParams);
		}
	}

	public static function getDataInfo($data, $params = []): array
	{

		$attachmentManager = IncomingAttachmentManager::getInstance([
			'data' => $data,
		]);
		$event = $attachmentManager->prepareEventAttachment()->getEvent();
		$method = $attachmentManager->getMethod();

		return [$event, $method];
	}

	public static function rehandleRequest($params)
	{
		$params['event']['SKIP_TIME'] = $params['event']['DT_SKIP_TIME'] === 'Y';

		$attendees = static::handleAttendeesByUser(
			ICalUtil::getUsersByCode($params['event']['ATTENDEES_CODES']),
			$params['answer'],
			$params['userId']
		);

		$mailBoxQuery = MessageAccessTable::query()
			->setSelect(['EMAIL' => 'MAILBOX.EMAIL'])
			->registerRuntimeField(
				'MAILBOX',
				new Reference(
					'MAILBOX',
					MailboxTable::class,
					Join::on('this.MAILBOX_ID', 'ref.ID'),
					['join_type' => Join::TYPE_INNER]
				)
			)
			->where('ENTITY_TYPE', MessageAccessTable::ENTITY_TYPE_CALENDAR_EVENT)
			->where('ENTITY_ID', $params['event']['ID'])
		;

		$mailbox = $mailBoxQuery->fetch();
		if (!$mailbox)
		{
			return;
		}

		$params['event']['ORGANIZER_MAIL'] = $attendees[$params['event']['MEETING_HOST']];
		$params['event']['ORGANIZER_MAIL']['MAILTO'] = $params['event']['MEETING']['MAILTO'];
		$params['event']['ATTENDEES_MAIL'] = $attendees[$params['event']['OWNER_ID']];
		$params['event']['ICAL_ORGANIZER'] = (Helper::getAttendee($params['event']['MEETING_HOST'], $params['event']['PARENT_ID'], false))
			->setStatus(null)
			->setRole(null)
			->setRsvp(false)
			->setCutype(null)
		;

		$answer = isset($params['answer']) && $params['answer']
			? IncomingInvitationRequestHandler::MEETING_STATUS_ACCEPTED_CODE
			: IncomingInvitationRequestHandler::MEETING_STATUS_DECLINED_CODE
		;
		$attendee = Helper::getAttendee($params['event']['OWNER_ID'], $params['event']['PARENT_ID'], false);
		$status = Dictionary::OUT_ATTENDEES_STATUS[$answer];
		$attendee->setStatus($status);
		$attendee->setEmail($mailbox['EMAIL'])->setMailto($mailbox['EMAIL']);
		$attendeesCollection = new AttendeesCollection([$attendee]);

		$replyStatus = OutcomingEventManager::createInstance([
			'icalMethod' => 'reply',
			'arFields' => $params['event'],
			'userIndex' => $attendeesCollection,
			'receiver' => $params['event']['ORGANIZER_MAIL'],
			'sender' => $attendees[$params['event']['OWNER_ID']],
			'answer' => $answer,
		])->replyInvitation()->getStatus();
	}

	private static function updateEvent(array $event, $userId, $answer): array
	{
		if (isset($event['DATE_FROM']))
		{
			$event['DATE_FROM_MAIL'] = $event['SKIP_TIME']
				? static::getDateString($event['DATE_FROM'])
				: static::getDateTimeString($event['DATE_FROM']);
			$event['DATE_FROM'] = static::getDateTimeString($event['DATE_FROM']);
		}

		if (isset($event['DATE_TO']))
		{
			$event['DATE_TO'] = static::getDateTimeString($event['DATE_TO']);
		}

		if (isset($event['DATE_CREATE']))
		{
			$event['DATE_CREATE'] = static::getDateTimeString($event['DATE_CREATE']);
		}

		if (isset($event['TIMESTAMP_X']))
		{
			$event['TIMESTAMP_X'] = static::getDateTimeString($event['TIMESTAMP_X']);
		}

		if (isset($event['DT_STAMP']))
		{
			$event['DT_STAMP'] = static::getDateTimeString($event['DT_STAMP']);
		}

		if (isset($event['TZ_FROM']))
		{
			$event['TZ_FROM'] = static::getTimezoneNameString($event['TZ_FROM']);
		}

		if (isset($event['TZ_TO']))
		{
			$event['TZ_TO'] = static::getTimezoneNameString($event['TZ_TO']);
		}

		$event['OWNER_ID'] = $userId;
		$event['MEETING_HOST'] = ICalUtil::getUserIdByEmail($event['ORGANIZER_MAIL']);
		$event['IS_MEETING'] = 1;
		$event['SECTION_CAL_TYPE'] = 'user';
		$event['ATTENDEES_CODES'] = ['U'.$event['OWNER_ID'], 'U'.$event['MEETING_HOST']];
		$event['MEETING_STATUS'] = $answer === 'confirmed' ? 'Y' : 'N';

		if (empty($event['ACCESSIBILITY']))
		{
			$event['ACCESSIBILITY'] = 'free';
		}

		if (empty($event['IMPORTANCE']))
		{
			$event['IMPORTANCE'] = 'normal';
		}

		if (empty($event['STATUS']))
		{
			$event['STATUS'] = $answer === 'ACCEPT' ? 'CONFIRMED' : 'CANCELLED';
		}

		if (empty($event['REMIND']))
		{
			$event['REMIND'] = [
				'type' => 'min',
				'count' => '15'
			];
		}

		if (empty($event['MEETING']))
		{
			$event['MEETING'] = [
				'HOST_NAME' => $event['ORGANIZER_MAIL']['name'],
				'NOTIFY' => 1,
				'REINVITE' => 0,
				'ALLOW_INVITE' => 0,
				'MEETING_CREATOR' => $event['MEETING_HOST'],
				'EXTERNAL_TYPE' => 'mail',
			];
		}

		$originalValue = ICalUtil::getEventByUId($userId, $event['DAV_XML_ID']);
		$event['ID'] = $originalValue ? $originalValue['ID'] : 0;

		return $event;
	}

	private static function getDateTimeString(Date $date): string
	{
		return $date->format(Date::convertFormatToPhp(FORMAT_DATETIME));
	}

	private static function getDateString(Date $date): string
	{
		return $date->format('d.m.Y');
	}

	private static function getTimezoneNameString(\DateTimeZone $tz)
	{
		return $tz->getName();
	}

	private static function handleAttendeesFromRequest(array $params): array
	{
		$result = [];

		foreach ($params['attendees'] as $attendee)
		{
			if ($attendee['EMAIL'] == $params['userEmail'])
			{
				$usersInfo = ICalUtil::getIndexUsersById([$params['userId']]);
				$attendee['NAME'] = $usersInfo[$params['userId']]['NAME'];
				$attendee['LAST_NAME'] = $usersInfo[$params['userId']]['LAST_NAME'];
				$attendee['STATUS'] = $params['answer'] === 'confirmed' ? 'accepted' : 'declined';
				$result[$params['userId']] = $attendee;
			}

			if ($attendee['EMAIL'] == $params['organizerEmail'])
			{
				$id = ICalUtil::getUserIdByEmail($attendee);
				$result[$id] = $attendee;
			}
		}

		return $result;
	}

	private static function handleAttendeesByUser(array $attendees, $answer, $userId)
	{
		$result = [];
		foreach ($attendees as $attendee)
		{
			if ($attendee['ID'] == $userId)
			{
				$attendee['STATUS'] = $answer ? 'accepted' : 'declined';
			}

			$result[$attendee['ID']] = $attendee;
		}

		return $result;
	}

	private static function updateChildEvent(array $event, $parentId)
	{
		$event['PARENT_ID'] = $parentId;
		$event['MEETING']['MAILTO'] = $event['ORGANIZER_MAIL']['MAILTO'];
		$event['DESCRIPTION'] .= "\r\n"
			. Loc::getMessage('EC_ORGANIZER_NAME_TITLE') . ': ' . static::getOrganizerString($event['ORGANIZER_MAIL']) . "\r\n"
			. Loc::getMessage('EC_ATTENDEES_LIST_TITLE') . ': ' . static::getAttendeesString($event['ATTENDEES_MAIL']);
		if (!empty($event['ATTACHMENT_LINK']))
		{
			$event['DESCRIPTION'] .= "\r\n"
				. Loc::getMessage('EC_FILES_TITLE') . ': ' . static::getFilesString($event['ATTACHMENT_LINK']);
		}
		return $event;
	}

	private static function getAttendeesString($attendees)
	{
		$res = [];
		foreach ($attendees as $attendee)
		{
			$res[] = $attendee['NAME'] . ' ' . $attendee['LAST_NAME'] . ' ('. $attendee['EMAIL'] .')';
		}

		return implode(', ', $res);
	}

	private static function getOrganizerString($organizer)
	{
		return $organizer['NAME'] . ' ' . $organizer['LAST_NAME'] . ' ('. $organizer['EMAIL'] .')';
	}

	private static function updateParentEvent(array $event)
	{
		$event['OWNER_ID'] = $event['MEETING_HOST'];
		unset($event['DAV_XML_ID']);

		return $event;
	}

	private static function getFilesString(array $attachments)
	{
		$res = [];
		foreach ($attachments as $attachment)
		{
			$res[] = $attachment['filename'] . ' (' . $attachment['link'] . ')';
		}
		return implode(', ', $res);
	}
}

Anon7 - 2022
AnonSec Team