public function ReceiveMessage($senderJId, array $arMessage, CXMPPClient $senderClient) { if (!$senderClient->IsAuthenticated()) { return false; } if (strlen($senderJId) <= 0) { return false; } 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; } $mid = ""; if (array_key_exists("id", $arMessage["message"]["."])) { $mid = $arMessage["message"]["."]["id"]; } if (!in_array($type, array("chat", "groupchat", "headline", "normal"))) { return CXMPPUtility::GetErrorArray($senderJId, "message", "modify", "bad-request", "", $mid, "", $senderClient->GetClientDomain()); } $recipientJId = ""; if (array_key_exists("to", $arMessage["message"]["."])) { $recipientJId = $arMessage["message"]["."]["to"]; } if (strlen($recipientJId) <= 0) { return CXMPPUtility::GetErrorArray($senderJId, "message", "modify", "bad-request", "", $mid, "", $senderClient->GetClientDomain()); } $body = ""; if (array_key_exists("body", $arMessage["message"])) { $body = $arMessage["message"]["body"]["#"]; } if (strlen($body) <= 0) { return true; } //$body = CXMPPReceiveMessage::htmlspecialcharsback($body); //$body = html_entity_decode($body); $body = html_entity_decode($body, ENT_COMPAT, SITE_CHARSET); $body = str_replace("'", "'", $body); $arSender = CXMPPUtility::GetUserByJId($senderJId); if (!$arSender) { return CXMPPUtility::GetErrorArray($senderJId, "message", "auth", "forbidden", $recipientJId, $mid, "", $senderClient->GetClientDomain()); } $arRecipient = CXMPPUtility::GetUserByJId($recipientJId); if (!$arRecipient) { return CXMPPUtility::GetErrorArray($senderJId, "message", "cancel", "item-not-found", $recipientJId, $mid, "", $senderClient->GetClientDomain()); } if (!CSocNetUserPerms::CanPerformOperation($arSender["ID"], $arRecipient["ID"], "message", false)) { return CXMPPUtility::GetErrorArray($senderJId, "message", "auth", "forbidden", $recipientJId, $mid, "", $senderClient->GetClientDomain()); } if (IsModuleInstalled("im") && CModule::IncludeModule("im")) { $arMessageFields = array("FROM_USER_ID" => $arSender["ID"], "TO_USER_ID" => $arRecipient["ID"], "MESSAGE" => $body); CIMMessage::Add($arMessageFields); } else { $arMessageFields = array("=DATE_CREATE" => $GLOBALS["DB"]->CurrentTimeFunction(), "MESSAGE_TYPE" => SONET_MESSAGE_PRIVATE, "FROM_USER_ID" => $arSender["ID"], "TO_USER_ID" => $arRecipient["ID"], "MESSAGE" => $body); CSocNetMessages::Add($arMessageFields); } return true; }
public function ReceiveMessage($senderJId, array $arMessage, CXMPPClient $senderClient) { if (!$senderClient->IsAuthenticated()) { return false; } if (strlen($senderJId) <= 0) { return false; } 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; } // available (empty) - Signals that the sender is online and available for communication. // unavailable - Signals that the sender is no longer available for communication. // subscribe - The sender wishes to subscribe to the recipient's presence. // subscribed - The sender has allowed the recipient to receive their presence. // unsubscribe - The sender is unsubscribing from another entity's presence. // unsubscribed - The subscription request has been denied or a previously-granted subscription has been cancelled. // probe - A request for an entity's current presence; SHOULD be generated only by a server on behalf of a user. // error - An error has occurred regarding processing or delivery of a previously-sent presence stanza. if (!in_array($type, array("available", "unavailable", "subscribe", "subscribed", "unsubscribe", "unsubscribed", "probe"))) { return CXMPPUtility::GetErrorArray($senderJId, "presence", "modify", "bad-request", "", "", "", $senderClient->GetClientDomain()); } $to = ""; if (array_key_exists("to", $arMessage["presence"]["."])) { $to = $arMessage["presence"]["."]["to"]; } $server = CXMPPServer::GetServer(); if (strlen($to) <= 0) { $server->SendAll($arMessage, $senderClient->GetClientDomain()); } else { $server->Send($to, $arMessage, $senderClient->GetClientDomain()); } if (!in_array($type, array("available"))) { return true; } $userJId = $senderJId; $show = "online"; if (array_key_exists("show", $arMessage["presence"])) { $show = $arMessage["presence"]["show"]["#"]; } $status = ""; if (array_key_exists("status", $arMessage["presence"])) { $status = $arMessage["presence"]["status"]["#"]; } $priority = 0; if (array_key_exists("priority", $arMessage["presence"])) { $priority = intval($arMessage["presence"]["priority"]["#"]); } $arUser = CXMPPUtility::GetUserByJId($userJId); if (!$arUser) { return CXMPPUtility::GetErrorArray($senderJId, "presence", "auth", "forbidden", "", "", "", $senderClient->GetClientDomain()); } CUser::SetLastActivityDate($arUser["ID"]); CXMPPFactory::SendUnreadMessages($senderJId, $senderClient->GetClientDomain()); $senderClient->ChangeWorkPresence("Status", $show); return true; }