public function ReceiveMessage($senderJId, array $arMessage, CXMPPClient $senderClient) { if (!$senderClient->IsAuthenticated()) { return false; } if (strlen($senderJId) <= 0) { return false; } if (!array_key_exists("iq", $arMessage)) { return false; } $to = ""; if (array_key_exists("to", $arMessage["iq"]["."])) { $to = $arMessage["iq"]["."]["to"]; } if (strlen($to) > 0 && strpos($to, "@") !== false) { $arResult = true; $arMessage["iq"]["."]["to"] = CXMPPUtility::GetJIdWithResource($arMessage["iq"]["."]["to"], ""); $server = CXMPPServer::GetServer(); $server->Send($to, $arMessage, $senderClient->GetClientDomain()); } else { if ($arMessage["iq"]["."]["type"] == "get" && $arMessage["iq"]["query"]["."]["xmlns"] == "http://jabber.org/protocol/disco#items") { $arResult = array("iq" => array("." => array("type" => "result", "from" => $senderClient->GetClientDomain(), "id" => $arMessage['iq']['.']['id']), "query" => array("." => array("xmlns" => "http://jabber.org/protocol/disco#items")))); } elseif ($arMessage["iq"]["."]["type"] == "set" && $arMessage["iq"]["session"]["."]["xmlns"] == "urn:ietf:params:xml:ns:xmpp-session") { $arResult = array("iq" => array("." => array("type" => "result", "from" => $senderClient->GetClientDomain(), "id" => $arMessage['iq']['.']['id']))); } else { $arResult = array("iq" => array("." => array("type" => "error", "from" => $senderClient->GetClientDomain(), "id" => $arMessage['iq']['.']['id']), "error" => array("." => array("type" => "cancel"), "feature-not-implemented" => array("." => array("xmlns" => "urn:ietf:params:xml:ns:xmpp-stanzas"))))); } //$arResult = CXMPPUtility::GetErrorArray($senderJId, "iq", "cancel", "feature-not-implemented", "", $arMessage['iq']['.']['id'], ""); } return $arResult; }
public function ProcessServerMessage(array $arMessage, $clientDomain = "") { if (!array_key_exists("query", $arMessage) || !array_key_exists(".", $arMessage["query"])) { return false; } $arResult = array(); $type = "get"; if (array_key_exists("type", $arMessage["query"]["."])) { $type = $arMessage["query"]["."]["type"]; } $kind = "common"; if ($type == "get") { $server = CXMPPServer::GetServer(); $arResult = array("query" => array("." => array("type" => "result"), "common" => array("online" => array("#" => $server->NumberOfOnlineUsers()), "connected" => array("#" => $server->NumberOfConnectedUsers() - 1)))); } elseif ($type == "set") { $action = $arMessage["query"]["action"]["#"]; if ($action == "die") { $server = CXMPPServer::GetServer(); $server->Stop(); die; } elseif ($action == "clearcache") { $server = CXMPPServer::GetServer(); $server->ClearCaches(); $arResult = array("query" => array("." => array("type" => "result"))); } elseif ($action == "dump") { CXMPPUtility::MakeDump(); $arResult = array("query" => array("." => array("type" => "result"))); } } return $arResult; }
public function Run() { $server = CXMPPServer::GetServer(); $startSSL = strtoupper(COption::GetOptionString("xmpp", "start_ssl", "N")) == "Y"; if ($server->Start() && (!$startSSL || $server->StartSSL())) { if ($server->testMode) { $server->Stop(); } $server->Listen(); } }
private function __SendMessage($senderId, $receiverId, $messageID, $type, $message, $domain = "") { if (!$this->isInitialized) { $this->Initialize(); } $receiverId = intval($receiverId); if ($receiverId <= 0) { return false; } $messageID = intval($messageID); if ($messageID <= 0) { return false; } if (!in_array($type, array("P", "S"))) { return false; } if (strlen($message) <= 0) { return false; } if (!CXMPPUtility::CheckXmppStatusOnline()) { return false; } $senderJId = false; $receiverJId = false; $arUserID = array(); $arUserID[] = $receiverId; $senderId = intval($senderId); if ($senderId <= 0) { if ($senderId != -5) { return false; } $senderJId = self::GetSystemJId($domain); } else { $arUserID[] = $senderId; } if (!($arJID = CXMPPUtility::GetJIdByUserId($arUserID, $domain))) { return false; } if ($senderId > 0) { $senderJId = $arJID[$senderId]; } $receiverJId = $arJID[$receiverId]; if (!$senderJId) { CXMPPUtility::Show("Error senderId=" . $senderId . ", receiverId=" . $receiverId . ", messageID=" . $messageID . " - Sender not found", 0); return false; } if (!$receiverJId) { CXMPPUtility::Show("Error senderId=" . $senderId . ", receiverId=" . $receiverId . ", messageID=" . $messageID . " - Reseiver not found", 0); return false; } $messageType = "chat"; if ($type == "S") { $messageType = "normal"; } $arMessage = CXMPPUtility::GetMessageArray($senderJId, $receiverJId, $messageType, $message, $domain); $result = false; if (CXMPPServer::IsServerStarted()) { $server = CXMPPServer::GetServer(); $result = $server->Send($receiverJId, $arMessage, $domain); } else { $result = CXMPPUtility::SendToServer($arMessage, $domain); } if ($result === true) { if (IsModuleInstalled("im") && CModule::IncludeModule("im")) { if ($type == "S") { $CIMNotify = new CIMNotify($receiverId); $CIMNotify->MarkNotifyRead($messageID); } else { $CIMMessage = new CIMMessage($receiverId); $CIMMessage->SetReadMessage($senderId); } } else { CSocNetMessages::MarkMessageRead($receiverId, $messageID); } } else { CXMPPUtility::Show("Error senderId=" . $senderId . ", receiverId=" . $receiverId . ", messageID=" . $messageID . " - Message was not send", 0); } return $result; }
public function ReceiveMessage($senderJId, array $arMessage, CXMPPClient $senderClient) { if (!$senderClient->IsAuthenticated()) { return false; } if (strlen($senderJId) <= 0) { return false; } if (!array_key_exists("iq", $arMessage)) { return false; } if ($arMessage['iq']['query']['.']['xmlns'] != 'jabber:iq:roster' && ($arMessage['iq']['query']['.']['xmlns'] != 'jabber:iq:private' || $arMessage['iq']['query']['roster']['.']['xmlns'] != 'roster:delimiter')) { return false; } if ($arMessage['iq']['query']['.']['xmlns'] == 'jabber:iq:roster') { $arResult = array("iq" => array("." => array("type" => "result", "to" => $senderJId, "id" => $arMessage['iq']['.']['id']), "query" => array("." => array("xmlns" => $arMessage['iq']['query']['.']['xmlns'])))); if ($this->intranet) { $clientDomain = $senderClient->GetClientDomain(); if (!array_key_exists($clientDomain, $this->rosterCache)) { $this->rosterCache[$clientDomain] = array(); } if (!array_key_exists($clientDomain, $this->rosterCacheAlt)) { $this->rosterCacheAlt[$clientDomain] = array(); } if ($senderClient->IsSubGroupsSupported() && count($this->rosterCache[$clientDomain]) <= 0 || !$senderClient->IsSubGroupsSupported() && count($this->rosterCacheAlt[$clientDomain]) <= 0) { $arDepCache = array(); $arDepCacheValue = array(); $dbUsers = CUser::GetList($b = "LAST_NAME", $o = "asc", array("ACTIVE" => "Y", "!UF_DEPARTMENT" => false), array('SELECT' => array('UF_*'))); while ($arUser = $dbUsers->Fetch()) { $arT = array("." => array("subscription" => "both", "name" => CUser::FormatName($this->nameTemplate, $arUser), "jid" => CXMPPUtility::GetJId($arUser, $clientDomain))); if (is_array($arUser['UF_DEPARTMENT']) && count($arUser['UF_DEPARTMENT']) > 0) { $arNewDep = array_diff($arUser['UF_DEPARTMENT'], $arDepCache); if (count($arNewDep) > 0) { $dbRes = CIBlockSection::GetList(array('SORT' => 'ASC'), array('ID' => $arNewDep)); while ($arSect = $dbRes->Fetch()) { $arDepCache[] = $arSect['ID']; $dbRes1 = CIBlockSection::GetNavChain($arSect['IBLOCK_ID'], $arSect['ID']); while ($arSect1 = $dbRes1->Fetch()) { if ($senderClient->IsSubGroupsSupported()) { if (strlen($arDepCacheValue[$arSect['ID']]) > 0) { $arDepCacheValue[$arSect['ID']] .= "/"; } $arDepCacheValue[$arSect['ID']] .= htmlspecialcharsbx($arSect1['NAME']); } else { if (strlen($arDepCacheValue[$arSect['ID']]) > 0) { $arDepCacheValue[$arSect['ID']] = "/" . $arDepCacheValue[$arSect['ID']]; } $arDepCacheValue[$arSect['ID']] = htmlspecialcharsbx($arSect1['NAME']) . $arDepCacheValue[$arSect['ID']]; } } } } foreach ($arUser['UF_DEPARTMENT'] as $key => $sect) { if (strlen($arDepCacheValue[$sect]) > 0) { $arT["group"][] = array("#" => $arDepCacheValue[$sect]); if (!is_array($GLOBALS["BX_JHGDHGFJKDFSDG67"])) { $GLOBALS["BX_JHGDHGFJKDFSDG67"] = array(); } if (!is_array($GLOBALS["BX_JHGDHGFJKDFSDG67"][$clientDomain])) { $GLOBALS["BX_JHGDHGFJKDFSDG67"][$clientDomain] = array(); } if (!in_array($arDepCacheValue[$sect], $GLOBALS["BX_JHGDHGFJKDFSDG67"][$clientDomain])) { $GLOBALS["BX_JHGDHGFJKDFSDG67"][$clientDomain][] = $arDepCacheValue[$sect]; } } } } if ($senderClient->IsSubGroupsSupported()) { $this->rosterCache[$clientDomain][] = $arT; } else { $this->rosterCacheAlt[$clientDomain][] = $arT; } } } if ($senderClient->IsSubGroupsSupported()) { foreach ($this->rosterCache[$clientDomain] as $ar) { if ($senderClient->GetJId() != $ar["."]["jid"]) { $arResult["iq"]["query"]["item"][] = $ar; } } } else { foreach ($this->rosterCacheAlt[$clientDomain] as $ar) { if ($senderClient->GetJId() != $ar["."]["jid"]) { $arResult["iq"]["query"]["item"][] = $ar; } } } } else { $ar = array(); $dbFriends = CSocNetUserRelations::GetRelatedUsers($senderClient->GetId(), SONET_RELATIONS_FRIEND); while ($arFriends = $dbFriends->GetNext()) { $pref = $senderClient->GetId() == $arFriends["FIRST_USER_ID"] ? "SECOND" : "FIRST"; $name = CUser::FormatName($this->nameTemplate, array("NAME" => $arFriends[$pref . "_USER_NAME"], "LAST_NAME" => $arFriends[$pref . "_USER_LAST_NAME"], "SECOND_NAME" => $arFriends[$pref . "_USER_SECOND_NAME"], "LOGIN" => $arFriends[$pref . "_USER_LOGIN"]), true); $arT = array("." => array("subscription" => "both", "name" => $name, "jid" => CXMPPUtility::GetJId(array("LOGIN" => $arFriends[$pref . "_USER_LOGIN"]), $senderClient->GetClientDomain()))); $ar[] = $arT; } $arResult["iq"]["query"]["item"] = $ar; } $senderClient->Send($arResult); $server = CXMPPServer::GetServer(); $server->SendPresenceMessages($senderJId, $senderClient->GetClientDomain()); $server->SendPresenceMessages2($senderJId, $senderClient->GetClientDomain()); } elseif ($arMessage['iq']['query']['.']['xmlns'] == 'jabber:iq:private' && $arMessage['iq']['query']['roster']['.']['xmlns'] == 'roster:delimiter') { $arResult = array("iq" => array("." => array("type" => "result", "to" => $senderJId, "id" => $arMessage['iq']['.']['id']), "query" => array("." => array("xmlns" => 'jabber:iq:private'), "roster" => array("." => array("xmlns" => 'roster:delimiter'), "#" => "/")))); $senderClient->SetSubGroupsSupport(true); $senderClient->Send($arResult); } return true; }
public function ProcessServerMessage(array $arMessage, $clientDomain = "") { if (!array_key_exists("message", $arMessage) || !array_key_exists(".", $arMessage["message"])) { return false; } $type = "normal"; if (array_key_exists("type", $arMessage["message"]["."])) { $type = $arMessage["message"]["."]["type"]; } if ($type == "error") { return false; } if (!in_array($type, array("chat", "groupchat", "headline", "normal"))) { return CXMPPUtility::GetServerErrorArray("bad-request"); } $recipientJId = ""; if (array_key_exists("to", $arMessage["message"]["."])) { $recipientJId = $arMessage["message"]["."]["to"]; } if (strlen($recipientJId) <= 0) { return CXMPPUtility::GetServerErrorArray("bad-request"); } $server = CXMPPServer::GetServer(); $res = $server->Send($recipientJId, $arMessage, $clientDomain); return array('result' => array("." => array("type" => $res ? "success" : "skip"))); }
public function _Authenticate($id, $login, $jid, $provider = "", $resource = "") { $id = intval($id); $this->authenticated = false; if ($id <= 0 || strlen($login) <= 0 || strlen($jid) <= 0) { return false; } $this->id = $id; $this->login = $login; $this->provider = $provider; $this->jid = strtolower($jid); $this->resource = $resource; $server = CXMPPServer::GetServer(); $server->_IndexClient($this->jid, $this->xmppId, $this->GetClientDomain()); $this->authenticated = true; CXMPPUtility::Show("Authenticate " . $this->jid . " (" . $this->xmppId . ")", 5); $this->ChangeWorkPresence("Authenticate", ""); CXMPPClient::SetLastActivityDate($this->id, time(), true); return true; }
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"?' . '><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" id="%s" from="%s" version="1.0"><stream:features><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/><ping xmlns="urn:xmpp:ping"/></stream:features>', $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 (strlen($version) > 0) { $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('<?xml version="1.0"?><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" id="%s" from="%s" version="1.0"><stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism></mechanisms><auth xmlns="http://jabber.org/features/iq-auth"/></stream:features>', rand(1000, 9999), htmlspecialcharsbx($senderClient->GetClientDomain())); } else { $message = sprintf('<?xml version="1.0"?><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" id="%s" from="%s">', 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 = strtoupper($arMessage["auth"]["."]["mechanism"]); } $message = ''; if ($mechanism == "PLAIN") { $r = base64_decode($arMessage["auth"]["#"]); if (strlen($r) > 0) { if (substr($r, 0, 1) == "") { $r = "z" . $r; } $arResp = explode("", $r); $jid = $arResp[0]; $login = $arResp[1]; $pwd = $arResp[2]; if (strlen($login) > 0) { $authResult = $GLOBALS["USER"]->Login($login, $pwd, "N"); CXMPPUtility::Show("!S " . $login . ": " . (is_array($authResult) ? Print_R($authResult, true) : $authResult), 0); if ($authResult === true) { $message = '<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>'; $senderClient->_Authenticate($GLOBALS["USER"]->GetID(), $login, CXMPPUtility::GetJId(array("LOGIN" => $login), $senderClient->GetClientDomain()), false, $arMessage['iq']['query']['resource']['#']); } else { $message = '<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure></stream:stream>'; } } else { $message = '<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><temporary-auth-failure/></failure></stream:stream>'; } } else { $message = '<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><temporary-auth-failure/></failure></stream:stream>'; } } else { $message = '<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><invalid-mechanism/></failure></stream:stream>'; } $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('<iq type="result" id="%s" from="%s"><query xmlns="%s"><username>%s</username><password/><resource/></query></iq>', 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('<iq type="result" id="%s" from="%s"/>', 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('<iq type="error" id="%s" from="%s"><error code="401" type="auth"><not-authorized xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>', htmlspecialcharsbx($arMessage['iq']['.']['id']), htmlspecialcharsbx($senderClient->GetClientDomain())); } } } else { $message = '<failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><invalid-mechanism/></failure></stream:stream>'; } $senderClient->__Send($message); } return $arResult; }
public function ProcessServerMessage(array $arMessage, $clientDomain = "") { if (!array_key_exists("presence", $arMessage) || !array_key_exists(".", $arMessage["presence"])) { return false; } $type = "available"; if (array_key_exists("type", $arMessage["presence"]["."])) { $type = $arMessage["presence"]["."]["type"]; } if ($type == "error") { return false; } if (!in_array($type, array("available", "unavailable", "subscribe", "subscribed", "unsubscribe", "unsubscribed", "probe"))) { return CXMPPUtility::GetServerErrorArray("bad-request"); } $recipientJId = ""; if (array_key_exists("to", $arMessage["presence"]["."])) { $recipientJId = $arMessage["presence"]["."]["to"]; } $server = CXMPPServer::GetServer(); if (strlen($recipientJId) <= 0) { $server->SendAll($arMessage, $clientDomain); } else { $server->Send($recipientJId, $arMessage, $clientDomain); } return true; }
public static function MakeDump() { $server = CXMPPServer::GetServer(); if ($fp = @fopen($_SERVER["DOCUMENT_ROOT"] . "/xmpp_dump_" . date("YmdHis"), "w")) { fwrite($fp, $server->GetDumpData()); fclose($fp); } }