• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/call/auth.php
  • Класс: BitrixImCallAuth
  • Вызов: Auth::onRestCheckAuth
static function onRestCheckAuth(array $query, $scope, &$res)
{
	global $USER;

	$authCode = null;
	foreach(static::$authQueryParams as $key)
	{
		if(array_key_exists($key, $query))
		{
			$authCode = $query[$key];
			break;
		}
	}

	if ($authCode === null)
	{
		return null;
	}

	$conference = null;
	$method = CRestServer::instance()->getMethod();
	if ($method === self::PASSWORD_CHECK_METHOD)
	{
		$conference = Conference::getById((int)$query['videoconf_id']);

		if (!$conference || !$conference->isActive())
		{
			$res = [
				'error' => 'CALL_AUTH_NOT_ACTIVE',
				'error_description' => 'Call: conference is not active',
				'additional' => []
			];

			return false;
		}
	}
	else
	{
		$storage = BitrixMainApplication::getInstance()->getLocalSession('conference_check_' . $query['videoconf_id']);
		if($storage->get('checked') === true)
		{
			//TODO: check conf status by checking start date from cache
		}
		else
		{
			$conference = Conference::getById((int)$query['videoconf_id']);

			if (!$conference || !$conference->isActive())
			{
				$res = [
					'error' => 'CALL_AUTH_VIDEOCONF_NOT_ACTIVE',
					'error_description' => 'Call: conference is not active',
					'additional' => []
				];

				return false;
			}

			if ($conference->isPasswordRequired())
			{
				if ($conference->getPassword() === $query['videoconf_password'])
				{
					$storage->set('checked', true);
				}
				else
				{
					$res = [
						'error' => 'CALL_AUTH_ACCESS_DENIED',
						'error_description' => 'Call: access to conference is denied',
						'additional' => []
					];

					return false;
				}
			}
		}
	}

	if ($authCode == self::AUTH_CODE_GUEST)
	{
		if (self::checkQueryMethod(self::METHODS_WITHOUT_AUTH))
		{
			$res = self::getSuccessfulResult();

			return true;
		}
		else
		{
			$res = [
				'error' => 'CALL_AUTH_METHOD_ERROR',
				'error_description' => 'Call: you don't have access to use this method [1]',
				'additional' => []
			];

			return false;
		}
	}
	else if (!preg_match("/^[a-fA-F0-9]{32}$/i", $authCode))
	{
		$res = [
			'error' => 'CALL_AUTH_FAILED',
			'error_description' => 'Call: user auth failed [code is not correct]',
			'additional' => []
		];
	}

	if (!self::checkQueryMethod(array_merge(self::METHODS_WITH_AUTH, self::METHODS_WITHOUT_AUTH)))
	{
		$res = [
			'error' => 'CALL_AUTH_METHOD_ERROR',
			'error_description' => 'Call: you don't have access to use this method [2]',
			'additional' => []
		];

		return false;
	}

	$xmlId = self::AUTH_TYPE."|".$authCode;

	if ($USER->IsAuthorized())
	{
		if ($USER->GetParam('EXTERNAL_AUTH_ID') == 'call')
		{
			if ($USER->GetParam('XML_ID') == $xmlId)
			{
				$res = self::getSuccessfulResult();

				CUser::SetLastActivityDate($USER->GetID(), true);

				return true;
			}
			else
			{
				$res = [
					'error' => 'CALL_AUTH_DIFF_USER',
					'error_description' => 'Call: you are authorized with a different user [2]',
					'additional' => ['hash' => mb_substr($USER->GetParam('XML_ID'), mb_strlen(self::AUTH_TYPE) + 1)]
				];

				return false;
			}
		}
		else
		{
			$res = [
				'error' => 'CALL_AUTH_PORTAL_USER',
				'error_description' => 'Call: you are authorized with a portal user [2]',
				'additional' => []
			];

			return false;
		}
	}

	$userData = BitrixMainUserTable::getList(
		[
			'select' => ['ID', 'EXTERNAL_AUTH_ID'],
			'filter' => ['=XML_ID' => $xmlId]
		]
	)->fetch();

	if ($userData && $userData['EXTERNAL_AUTH_ID'] == 'call')
	{
		self::authorizeById($userData['ID']);

		$res = self::getSuccessfulResult();

		CUser::SetLastActivityDate($USER->GetID(), true);

		return true;
	}

	$res = [
		'error' => 'CALL_AUTH_FAILED',
		'error_description' => 'Call: user auth failed [user not found]',
		'additional' => []
	];

	return false;
}