diff options
author | Florent Le Coz <louiz@louiz.org> | 2014-06-18 22:42:58 +0200 |
---|---|---|
committer | Florent Le Coz <louiz@louiz.org> | 2014-06-18 22:42:58 +0200 |
commit | 04de62a4e0af4843e84c933e16f249ba1df6874f (patch) | |
tree | 764c8234801de762a73aa0acff26efc742976cd2 /src/xmpp | |
parent | 56eb5df28a1023db2039388fe6c8fc1346da1a3d (diff) | |
download | biboumi-04de62a4e0af4843e84c933e16f249ba1df6874f.tar.gz biboumi-04de62a4e0af4843e84c933e16f249ba1df6874f.tar.bz2 biboumi-04de62a4e0af4843e84c933e16f249ba1df6874f.tar.xz biboumi-04de62a4e0af4843e84c933e16f249ba1df6874f.zip |
Messages to room participants are forwarded to the IRC user
For example, both JID #chan%server@biboumi/Toto and toto!server@biboumi are
equivalent, except that if you send a message to the first one, subsequent
messages coming from the user toto will come from that same JID. This is
done to be consistent for the XMPP user, and respond from the same JID than
the 'to' of the first message.
fix #2468
Diffstat (limited to 'src/xmpp')
-rw-r--r-- | src/xmpp/xmpp_component.cpp | 36 | ||||
-rw-r--r-- | src/xmpp/xmpp_component.hpp | 6 |
2 files changed, 33 insertions, 9 deletions
diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp index ec8517c..da9cded 100644 --- a/src/xmpp/xmpp_component.cpp +++ b/src/xmpp/xmpp_component.cpp @@ -1,4 +1,5 @@ #include <utils/scopeguard.hpp> +#include <utils/tolower.hpp> #include <logger/logger.hpp> #include <xmpp/xmpp_component.hpp> @@ -351,13 +352,14 @@ void XmppComponent::handle_message(const Stanza& stanza) utils::ScopeGuard stanza_error([&](){ this->send_stanza_error("message", from, to_str, id, error_type, error_name, ""); - }); + }); XmlNode* body = stanza.get_child("body", COMPONENT_NS); if (type == "groupchat" && iid.is_channel) { - if (to.resource.empty()) - if (body && !body->get_inner().empty()) + if (body && !body->get_inner().empty()) + { bridge->send_channel_message(iid, body->get_inner()); + } XmlNode* subject = stanza.get_child("subject", COMPONENT_NS); if (subject) bridge->set_channel_topic(iid, subject->get_inner()); @@ -374,15 +376,30 @@ void XmppComponent::handle_message(const Stanza& stanza) { const XmlNode* condition = error->get_last_child(); if (kickable_errors.find(condition->get_name()) == kickable_errors.end()) - kickable_error = false; + kickable_error = false; } if (kickable_error) bridge->shutdown("Error from remote client"); } - else if (type == "chat" && iid.is_user && !iid.get_local().empty()) + else if (type == "chat") { if (body && !body->get_inner().empty()) - bridge->send_private_message(iid, body->get_inner()); + { + // a message for nick!server + if (iid.is_user && !iid.get_local().empty()) + { + bridge->send_private_message(iid, body->get_inner()); + bridge->remove_preferred_from_jid(iid.get_local()); + } + else if (!iid.is_user && !to.resource.empty()) + { // a message for chan%server@biboumi/Nick or + // server@biboumi/Nick + // Convert that into a message to nick!server + Iid user_iid(utils::tolower(to.resource) + "!" + iid.get_server()); + bridge->send_private_message(user_iid, body->get_inner()); + bridge->set_preferred_from_jid(user_iid.get_local(), to_str); + } + } } else if (iid.is_user) this->send_invalid_user_error(to.local, from); @@ -571,11 +588,14 @@ void* XmppComponent::get_receive_buffer(const size_t size) const return this->parser.get_buffer(size); } -void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, const std::string& to, const std::string& type) +void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, const std::string& to, const std::string& type, const bool fulljid) { XmlNode node("message"); node["to"] = to; - node["from"] = from + "@" + this->served_hostname; + if (fulljid) + node["from"] = from; + else + node["from"] = from + "@" + this->served_hostname; if (!type.empty()) node["type"] = type; XmlNode body_node("body"); diff --git a/src/xmpp/xmpp_component.hpp b/src/xmpp/xmpp_component.hpp index f1806de..17462f4 100644 --- a/src/xmpp/xmpp_component.hpp +++ b/src/xmpp/xmpp_component.hpp @@ -111,9 +111,13 @@ public: void close_document(); /** * Send a message from from@served_hostname, with the given body + * + * If fulljid is false, the provided 'from' doesn't contain the + * server-part of the JID and must be added. */ void send_message(const std::string& from, Xmpp::body&& body, - const std::string& to, const std::string& type); + const std::string& to, const std::string& type, + const bool fulljid=false); /** * Send a join from a new participant */ |