Пример #1
0
 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;
 }
Пример #2
0
 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;
 }
Пример #3
0
 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;
 }
Пример #4
0
 public function Send($jid, $arMessage, $clientDomain = "")
 {
     $p = strpos($jid, "/");
     if ($p !== false) {
         $jid = substr($jid, 0, $p);
     }
     if (empty($clientDomain)) {
         $clientDomain = CXMPPServer::GetDomain();
     }
     if (array_key_exists($clientDomain, $this->arClientsIndex)) {
         if (array_key_exists($jid, $this->arClientsIndex[$clientDomain])) {
             $r = false;
             foreach ($this->arClientsIndex[$clientDomain][$jid] as $v) {
                 $r = $this->arClients[$v]->Send($arMessage);
             }
             return $r;
         } else {
             CXMPPUtility::Show("Error jid=" . $jid . " - Not connected", 0);
         }
     } else {
         CXMPPUtility::Show("Error clientDomain=" . $clientDomain . " - Not connected", 0);
     }
     return false;
 }
Пример #5
0
 static function SelectDatabase($clientDomain)
 {
     if (!CXMPPUtility::IsBitrix24Mode()) {
         return true;
     }
     if (empty($clientDomain)) {
         return true;
     }
     static $arDomainDatabases = array();
     if (!array_key_exists($clientDomain, $arDomainDatabases)) {
         CXMPPUtility::Show("Creating connection to " . $clientDomain . " database", 5);
         $dbHost = $GLOBALS["DB"]->DBHost;
         $dbTmp = new CDatabase();
         if ($dbTmp->Connect($dbHost, $clientDomain, "root", "12345")) {
             // ($dbTmp->Connect($dbHost, $clientDomain, $clientDomain, ""))
             $arDomainDatabases[$clientDomain] = $dbTmp;
         }
         //$arDomainDatabases[$clientDomain] = $GLOBALS["DB"];
     }
     if (array_key_exists($clientDomain, $arDomainDatabases)) {
         CXMPPUtility::Show("Database selected: " . $clientDomain, 0);
         $GLOBALS["DB"] = $arDomainDatabases[$clientDomain];
         return true;
     }
     CXMPPUtility::Show("Error connecting to " . $clientDomain . " database", 5);
     return false;
 }