public function ReceiveMessage($senderJId, array $arMessage, CXMPPClient $senderClient)
{
if ($senderClient->IsAuthenticated() && !array_key_exists("stream:stream", $arMessage))
return false;
$server = CXMPPServer::GetServer();
$arResult = true;
if (array_key_exists("stream:stream", $arMessage))
{
if ($senderClient->IsAuthenticated())
{
$senderClient->SetStreamId("bx".rand(1000, 9999));
$message = sprintf(
'<'.'?xml version="1.0" encoding="UTF-8"?'.'>',
$senderClient->GetStreamId(),
htmlspecialcharsbx($senderClient->GetClientDomain())
);
$senderClient->__Send($message);
}
else
{
$version = "";
if (is_array($arMessage["stream:stream"]["."]) && array_key_exists("version", $arMessage["stream:stream"]["."]))
$version = $arMessage["stream:stream"]["."]["version"];
$to = "";
if (is_array($arMessage["stream:stream"]["."]) && array_key_exists("to", $arMessage["stream:stream"]["."]))
$to = $arMessage["stream:stream"]["."]["to"];
if (CXMPPUtility::IsBitrix24Mode())
$senderClient->SetClientDomain($to);
else
$senderClient->SetClientDomain(CXMPPServer::GetDomain());
if (CXMPPUtility::SelectDatabase($senderClient->GetClientDomain()))
{
$bAllowSasl = false;
if ($version <> '')
{
$ar = explode(".", $version);
$majorV = intval($ar[0]);
if ($majorV >= 1)
$bAllowSasl = true;
}
if ($bAllowSasl)
$senderClient->SetAuthenticationType("SASL");
else
$senderClient->SetAuthenticationType("NON-SASL");
if ($bAllowSasl)
{
$message = sprintf(
'PLAIN',
rand(1000, 9999),
htmlspecialcharsbx($senderClient->GetClientDomain())
);
}
else
{
$message = sprintf(
'',
rand(1000, 9999),
htmlspecialcharsbx($senderClient->GetClientDomain())
);
}
$senderClient->__Send($message);
}
else
{
$senderClient->Disconnect();
}
}
}
elseif (array_key_exists("auth", $arMessage) && $senderClient->GetAuthenticationType() == "SASL")
{
$mechanism = "PLAIN";
if (array_key_exists("mechanism", $arMessage["auth"]["."]))
$mechanism = mb_strtoupper($arMessage["auth"]["."]["mechanism"]);
$message = '';
if ($mechanism == "PLAIN")
{
$r = base64_decode($arMessage["auth"]["#"]);
if ($r <> '')
{
if (mb_substr($r, 0, 1) == "x00")
$r = "z".$r;
$arResp = explode("x00", $r);
$jid = $arResp[0];
$login = $arResp[1];
$pwd = $arResp[2];
if ($login <> '')
{
$authResult = $GLOBALS["USER"]->Login($login, $pwd, "N");
CXMPPUtility::Show("!S ".$login.": ".(is_array($authResult) ? Print_R($authResult, true) : $authResult), 0);
if ($authResult === true)
{
$message = '';
$senderClient->_Authenticate(
$GLOBALS["USER"]->GetID(),
$login,
CXMPPUtility::GetJId(array("LOGIN" => $login), $senderClient->GetClientDomain()),
false,
$arMessage['iq']['query']['resource']['#']
);
}
else
{
$message = '';
}
}
else
{
$message = '';
}
}
else
{
$message = '';
}
}
else
{
$message = '';
}
$senderClient->__Send($message);
}
elseif (array_key_exists("iq", $arMessage) && $senderClient->GetAuthenticationType() == "NON-SASL")
{
$message = '';
if ($arMessage['iq']['query']['.']['xmlns'] == 'jabber:iq:auth')
{
$type = $arMessage['iq']['.']['type'];
if (!in_array($type, array("get", "set")))
return;
if ($type == 'get')
{
$message = sprintf(
'%s',
htmlspecialcharsbx($arMessage['iq']['.']['id']),
htmlspecialcharsbx($senderClient->GetClientDomain()),
htmlspecialcharsbx($arMessage['iq']['query']['.']['xmlns']),
htmlspecialcharsbx($arMessage['iq']['query']['username']['#'])
);
}
elseif ($type == 'set')
{
$username = $arMessage['iq']['query']['username']['#'];
$password = $arMessage['iq']['query']['password']['#'];
$authResult = $GLOBALS["USER"]->Login($username, $password, "N");
CXMPPUtility::Show("!N ".$username.": ".(is_array($authResult) ? print_r($authResult, true) : $authResult), 0);
if ($authResult === true)
{
$message = sprintf(
'',
htmlspecialcharsbx($arMessage['iq']['.']['id']),
htmlspecialcharsbx($senderClient->GetClientDomain())
);
$senderClient->_Authenticate($GLOBALS["USER"]->GetID(), $username,
CXMPPUtility::GetJId(array("LOGIN" => $username), $senderClient->GetClientDomain()),
false, $arMessage['iq']['query']['resource']['#']
);
}
else
{
$message = sprintf(
'',
htmlspecialcharsbx($arMessage['iq']['.']['id']),
htmlspecialcharsbx($senderClient->GetClientDomain())
);
}
}
}
else
{
$message = '';
}
$senderClient->__Send($message);
}
return $arResult;
}