• Модуль: xmpp
  • Путь к файлу: ~/bitrix/modules/xmpp/classes/factory_classes/stream.php
  • Класс: CXMPPStream
  • Вызов: CXMPPStream::ReceiveMessage
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;
	}