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/im/lib/integration/intranet/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/im/lib/integration/intranet/user.php
<?php
namespace Bitrix\Im\Integration\Intranet;

use Bitrix\Im\V2\Chat\GeneralChat;
use Bitrix\Im\V2\Entity\User\UserCollaber;
use Bitrix\Im\V2\Recent\Initializer;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Entity\ExpressionField;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Type\DateTime;
use Bitrix\Main\UserTable;

class User
{
	static $isEmployee = [];

	const INVITE_MAX_USER_NOTIFY = 50;

	public static function canInvite(): bool
	{
		if (!\Bitrix\Main\ModuleManager::isModuleInstalled('intranet'))
		{
			return false;
		}

		return \Bitrix\Intranet\Invitation::canListDelete();
	}
	public static function onInviteLinkCopied(\Bitrix\Main\Event $event): bool
	{
		if (!\Bitrix\Main\ModuleManager::isModuleInstalled('intranet'))
		{
			return false;
		}

		$userId = (int)$event->getParameter('userId');

		return self::sendMessageToGeneralChat($userId, [
			'MESSAGE' => Loc::getMessage('IM_INT_USR_LINK_COPIED', [
				'#USER_NAME#' => self::getUserBlock($userId)
			]),
			'SYSTEM' => 'Y'
		]);
	}

	public static function onUserInvited(\Bitrix\Main\Event $event): bool
	{
		if (!\Bitrix\Main\ModuleManager::isModuleInstalled('intranet'))
		{
			return false;
		}

		$originatorId = (int)$event->getParameter('originatorId');
		$users = (array)$event->getParameter('userId');

		if (!self::isEmployee($originatorId))
		{
			return false;
		}

		$users = self::filterEmployee($users);
		if (empty($users))
		{
			return false;
		}

		$userForSend = [];
		$result = \Bitrix\Intranet\UserTable::getList([
			'filter' => [
				'=ID' => $users
			],
			'select' => ['ID', 'EMAIL']

		]);
		while ($row = $result->fetch())
		{
			$userForSend[] = [
				'ID' => $row['ID'],
				'INVITED' => [
					'originator_id' => $originatorId,
					'can_resend' => !empty($row['EMAIL'])
				]
			];
		}

		if (empty($userForSend))
		{
			return false;
		}

		self::sendInviteEvent($userForSend);

		$userForSend = array_map(function($user) {
			return self::getUserBlock($user['ID']);
		}, $userForSend);

		return self::sendMessageToGeneralChat($originatorId, [
			'MESSAGE' => Loc::getMessage('IM_INT_USR_INVITE_USERS', [
				'#USER_NAME#' => self::getUserBlock($originatorId),
				'#USERS#' => implode(', ', $userForSend)
			]),
			'SYSTEM' => 'Y',
			'PUSH' => 'N'
		]);
	}

	public static function onUserAdded(\Bitrix\Main\Event $event): bool
	{
		if (!\Bitrix\Main\ModuleManager::isModuleInstalled('intranet'))
		{
			return false;
		}

		$originatorId = (int)$event->getParameter('originatorId');
		$users = (array)$event->getParameter('userId');

		if (!self::isEmployee($originatorId))
		{
			return false;
		}

		$users = self::filterEmployee($users);
		if (empty($users))
		{
			return false;
		}

		$userForSend = [];
		$result = \Bitrix\Intranet\UserTable::getList([
			'filter' => [
				'=ID' => $users
			],
			'select' => ['ID', 'EMAIL']

		]);
		while ($row = $result->fetch())
		{
			$userForSend[] = [
				'ID' => $row['ID'],
				'INVITED' => [
					'originator_id' => $originatorId,
					'can_resend' => !empty($row['EMAIL'])
				]
			];
		}

		self::sendInviteEvent($userForSend);

		$users = array_map(function($userId) {
			return self::getUserBlock($userId);
		}, $users);

		return self::sendMessageToGeneralChat($originatorId, [
			'MESSAGE' => Loc::getMessage('IM_INT_USR_REGISTER_USERS', [
				'#USER_NAME#' => self::getUserBlock($originatorId),
				'#USERS#' => implode(', ', $users)
			]),
			'SYSTEM' => 'Y',
			'PUSH' => 'N'
		]);
	}

	public static function onUserAdminRights(\Bitrix\Main\Event $event): bool
	{
		if (!\Bitrix\Main\ModuleManager::isModuleInstalled('intranet'))
		{
			return false;
		}

		if (!\COption::GetOptionString("im", "general_chat_message_admin_rights", true))
		{
			return false;
		}

		$originatorId = (int)$event->getParameter('originatorId');
		$users = (array)$event->getParameter('userId');
		$type = (string)$event->getParameter('type');

		$users = array_map(function($userId) {
			return self::getUserBlock($userId);
		}, $users);

		$originatorGender = 'M';
		if ($originatorId > 0)
		{
			$dbUser = \CUser::GetList('', '', ['ID_EQUAL_EXACT' => $originatorId], array('FIELDS' => ['PERSONAL_GENDER']));
			if ($user = $dbUser->Fetch())
			{
				$originatorGender = $user["PERSONAL_GENDER"] == 'F'? 'F': 'M';
			}
		}

		$messId = (
			$type === 'setAdminRigths'
				? 'IM_INT_USR_SET_ADMIN_RIGTHS_'.$originatorGender
				: 'IM_INT_USR_REMOVE_ADMIN_RIGTHS_'.$originatorGender
		);

		return self::sendMessageToGeneralChat($originatorId, [
			'MESSAGE' => Loc::getMessage($messId, [
				'#USER_NAME#' => self::getUserBlock($originatorId),
				'#USERS#' => implode(', ', $users)
			]),
			'SYSTEM' => 'Y'
		]);

	}

	public static function onInviteSend(array $params): bool
	{
		if (!\Bitrix\Main\ModuleManager::isModuleInstalled('intranet'))
		{
			return false;
		}

		$userId = (int)$params['ID'];

		if (!self::isEmployee($userId))
		{
			return false;
		}

		\CIMContactList::SetRecent(['ENTITY_ID' => $userId]);

		return true;
	}

	public static function onInviteAccepted(array $params): bool
	{
		if (!\Bitrix\Main\ModuleManager::isModuleInstalled('intranet'))
		{
			return true;
		}

		$userData = $params['user_fields'];

		if (in_array($userData['EXTERNAL_AUTH_ID'], \Bitrix\Main\UserTable::getExternalUserTypes()))
		{
			return true;
		}

		if ($userData['LAST_LOGIN'])
		{
			return true;
		}

		$userId = (int)$userData['ID'];
		if ($userData['LAST_ACTIVITY_DATE'])
		{
			return true;
		}

		$user = \Bitrix\Im\V2\Entity\User\User::getInstance($userId);

		if (!self::isEmployee($userId) && !($user instanceof UserCollaber))
		{
			return false;
		}

		\CUser::SetLastActivityDate($userId);
		$user->unsetOnlineData();
		Initializer::onAfterUserAcceptInvite($userId);

		if ($user instanceof UserCollaber)
		{
			return true;
		}

		self::addUserToGeneralChat($userData);
		\CIMContactList::SetRecent(Array('ENTITY_ID' => $userId));

		if (self::isCountOfUsersExceededForPersonalNotify())
		{
			if (!\CIMChat::GetGeneralChatAutoMessageStatus(\CIMChat::GENERAL_MESSAGE_TYPE_JOIN))
			{
				return false;
			}

			return self::sendMessageToGeneralChat($userId, [
				"MESSAGE" => Loc::getMessage('IM_INT_USR_JOIN_GENERAL_2'),
				"PARAMS" => [
					"CODE" => 'USER_JOIN_GENERAL',
				]
			]);
		}

		self::sendInviteEvent([[
			'ID' => $userId,
			'INVITED' => false
		]]);

		$orm = \Bitrix\Main\UserTable::getList([
			'select' => ['ID'],
			'filter' => [
				'=ACTIVE' => 'Y',
				'=IS_REAL_USER' => 'Y',
				'!=UF_DEPARTMENT' => false
			]
		]);
		while($row = $orm->fetch())
		{
			if ($row['ID'] == $userId)
			{
				continue;
			}

			$viewCommonUsers = (bool)\CIMSettings::GetSetting(\CIMSettings::SETTINGS, 'viewCommonUsers', $row['ID']);
			if (!$viewCommonUsers)
			{
				continue;
			}

			\CIMMessage::Add([
				"TO_USER_ID" => $row['ID'],
				"FROM_USER_ID" => $userId,
				"MESSAGE" => Loc::getMessage('IM_INT_USR_JOIN_2'),
				"SYSTEM" => 'Y',
				"RECENT_SKIP_AUTHOR" => 'Y',
				"MESSAGE_OUT" => IM_MAIL_SKIP,
				"PARAMS" => [
					"CODE" => 'USER_JOIN',
				],
			]);
		}

		return true;
	}

	private static function  addUserToGeneralChat(array $userData): void
	{
		$userId = (int)$userData['ID'];
		if (
			$userData['ACTIVE'] !== 'Y'
			|| in_array($userData['EXTERNAL_AUTH_ID'], \Bitrix\Main\UserTable::getExternalUserTypes(), true)
			|| !self::isEmployee($userId)
		)
		{
			return;
		}

		$generalChatId = GeneralChat::getGeneralChatId();
		if (empty($generalChatId))
		{
			return;
		}

		$chatService = new \CIMChat(0);
		$chatService->AddUser($generalChatId, [$userId], false, true);
	}

	private static function sendInviteEvent(array $users): bool
	{
		if (!\Bitrix\Main\Loader::includeModule('pull'))
		{
			return false;
		}

		if (!\Bitrix\Main\ModuleManager::isModuleInstalled('intranet'))
		{
			return false;
		}

		$onlineUsers = \Bitrix\Im\Helper::getOnlineIntranetUsers();
		foreach ($users as $user)
		{
			\Bitrix\Pull\Event::add($onlineUsers, [
				'module_id' => 'im',
				'command' => 'userInvite',
				'expiry' => 3600,
				'params' => [
					'userId' => $user['ID'],
					'invited' => $user['INVITED'],
					'user' => \Bitrix\Im\User::getInstance($user['ID'])->getFields(),
					'date' => new DateTime(),
				],
				'extra' => \Bitrix\Im\Common::getPullExtra()
			]);
		}

		return true;
	}

	private static function sendMessageToGeneralChat(int $fromUserId, array $params): bool
	{
		$chatId = \CIMChat::GetGeneralChatId();
		if (!$chatId)
			return false;

		$params = array_merge($params, [
			"TO_CHAT_ID" =>  $chatId,
			"FROM_USER_ID" => $fromUserId,
			"MESSAGE_OUT" => IM_MAIL_SKIP,
			"SKIP_USER_CHECK" => 'Y',
		]);

		$result = \CIMChat::AddMessage($params);

		return $result !== false;
	}

	private static function getUserBlock(int $userId): string
	{
		return '[USER='.$userId.'][/USER]';
	}

	private static function isEmployee(int $userId): bool
	{
		if (isset(self::$isEmployee[$userId]))
		{
			return self::$isEmployee[$userId];
		}

		if (!\Bitrix\Main\Loader::includeModule('humanresources'))
		{
			return false;
		}

		try
		{
			$isEmployee = \Bitrix\HumanResources\Service\Container::getUserService()->isEmployee($userId);
		}
		catch (\Exception $exception)
		{
			$isEmployee = false;
		}

		self::$isEmployee[$userId] = $isEmployee;

		return self::$isEmployee[$userId];
	}

	private static function filterEmployee(array $userIds): array
	{
		if (!\Bitrix\Main\Loader::includeModule('humanresources'))
		{
			return [];
		}

		try
		{
			return \Bitrix\HumanResources\Service\Container::getUserService()->filterEmployees($userIds);
		}
		catch (\Exception $exception)
		{
			return [];
		}
	}

	public static function getBirthdayForToday()
	{
		if (!\Bitrix\Main\ModuleManager::isModuleInstalled('intranet'))
		{
			return [];
		}

		$option = Option::get('im', 'contact_list_birthday');
		if ($option === 'none' || \Bitrix\Im\User::getInstance()->isExtranet())
		{
			return [];
		}

		global $USER;

		$today = (new DateTime())->format('m-d');
		if ($option === 'department')
		{
			$cacheId = 'birthday_'.$today.'_'.$USER->GetID();
		}
		else
		{
			$cacheId = 'birthday_'.$today;
		}

		$cache = \Bitrix\Main\Data\Cache::createInstance();
		if($cache->initCache(86400, $cacheId, '/bx/im/birthday/'))
		{
			return $cache->getVars();
		}

		$user = \CUser::getById($USER->GetId())->Fetch();

		$filter = [
			'=ACTIVE' => 'Y',
			'=BIRTHDAY_DATE' => $today,
			'=IS_REAL_USER' => true,
		];
		if ($option === 'department')
		{
			$filter['=UF_DEPARTMENT'] = $user['UF_DEPARTMENT'];
		}
		else
		{
			$filter['!=UF_DEPARTMENT'] = false;
		}

		$connection = \Bitrix\Main\Application::getConnection();
		$helper = $connection->getSqlHelper();

		$result = [];
		$users = UserTable::getList([
			'filter' => $filter,
			'select' => ['ID'],
			'runtime' => [
				new ExpressionField('BIRTHDAY_DATE', str_replace('PERSONAL_BIRTHDAY', '%s', str_replace('%', '%%', $helper->formatDate('MM-DD', 'PERSONAL_BIRTHDAY'))), 'PERSONAL_BIRTHDAY')
			],
			'limit' => 100,
		])->fetchAll();

		foreach ($users as $user)
		{
			$result[] = \Bitrix\Im\User::getInstance($user['ID'])->getArray(['SKIP_ONLINE' => 'Y', 'JSON' => 'Y']);
		}

		$cache->forceRewriting(true);
		$cache->startDataCache();
		$cache->endDataCache($result);

		return $result;
	}

	private static function isCountOfUsersExceededForPersonalNotify(): bool
	{
		$count = UserTable::query()
			->setSelect(['ID'])
			->where('ACTIVE', true)
			->where('IS_REAL_USER', true)
			->whereNotNull('LAST_LOGIN')
			->setLimit(self::INVITE_MAX_USER_NOTIFY + 1)
			->fetchCollection()
			->count()
		;

		return $count > self::INVITE_MAX_USER_NOTIFY;
	}

	public static function registerEventHandler()
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->registerEventHandlerCompatible('main', 'OnAfterUserAuthorize', 'im', self::class, 'onInviteAccepted');
		$eventManager->registerEventHandlerCompatible('intranet', 'OnRegisterUser', 'im', self::class, 'onInviteSend');
		$eventManager->registerEventHandler('intranet', 'OnCopyRegisterUrl', 'im', self::class, 'onInviteLinkCopied');
		$eventManager->registerEventHandler('intranet', 'onUserInvited', 'im', self::class, 'onUserInvited');
		$eventManager->registerEventHandler('intranet', 'onUserAdded', 'im', self::class, 'onUserAdded');
		$eventManager->registerEventHandler('intranet', 'onUserAdminRights', 'im', self::class, 'onUserAdminRights');
	}

	public static function unRegisterEventHandler()
	{
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->unRegisterEventHandler('main', 'OnAfterUserAuthorize', 'im', self::class, 'onInviteAccepted');
		$eventManager->unRegisterEventHandler('intranet', 'OnRegisterUser', 'im', self::class, 'onInviteSend');
		$eventManager->unRegisterEventHandler('intranet', 'OnCopyRegisterUrl', 'im', self::class, 'onInviteLinkCopied');
		$eventManager->unRegisterEventHandler('intranet', 'onUserInvited', 'im', self::class, 'onUserInvited');
		$eventManager->unRegisterEventHandler('intranet', 'onUserAdded', 'im', self::class, 'onUserAdded');
		$eventManager->unRegisterEventHandler('intranet', 'onUserAdminRights', 'im', self::class, 'onUserAdminRights');
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit