- Модуль: 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;
}