summaryrefslogtreecommitdiff
path: root/src/xmpp
diff options
context:
space:
mode:
authorFlorent Le Coz <louiz@louiz.org>2014-11-12 06:16:10 +0100
committerFlorent Le Coz <louiz@louiz.org>2014-11-12 08:12:43 +0100
commitd8da7984b23bf8f30b5f8f53895cbae5be50347a (patch)
treea32beb182ca95a27670cba0005ca34f90c2875fe /src/xmpp
parente1d69806ed7c92bdfe1bf632064bf68b3d1d266b (diff)
downloadbiboumi-d8da7984b23bf8f30b5f8f53895cbae5be50347a.tar.gz
biboumi-d8da7984b23bf8f30b5f8f53895cbae5be50347a.tar.bz2
biboumi-d8da7984b23bf8f30b5f8f53895cbae5be50347a.tar.xz
biboumi-d8da7984b23bf8f30b5f8f53895cbae5be50347a.zip
Implement PING, user to user only (XMPP and IRC side, using CTCP PING)
ref #2757
Diffstat (limited to 'src/xmpp')
-rw-r--r--src/xmpp/xmpp_component.cpp40
-rw-r--r--src/xmpp/xmpp_component.hpp8
2 files changed, 48 insertions, 0 deletions
diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp
index 948e680..5f76bd3 100644
--- a/src/xmpp/xmpp_component.cpp
+++ b/src/xmpp/xmpp_component.cpp
@@ -555,6 +555,16 @@ void XmppComponent::handle_iq(const Stanza& stanza)
stanza_error.disable();
}
}
+ else if ((query = stanza.get_child("ping", PING_NS)))
+ {
+ Iid iid(to.local);
+ if (iid.is_user)
+ { // Ping any user (no check on the nick done ourself)
+ bridge->send_irc_user_ping_request(iid.get_server(),
+ iid.get_local(), id, from, to_str);
+ }
+ stanza_error.disable();
+ }
}
else if (type == "result")
{
@@ -1080,6 +1090,36 @@ void XmppComponent::send_iq_version_request(const std::string& from,
this->send_stanza(iq);
}
+void XmppComponent::send_ping_request(const std::string& from,
+ const std::string& jid_to,
+ const std::string& id)
+{
+ Stanza iq("iq");
+ iq["type"] = "get";
+ iq["id"] = id;
+ iq["from"] = from + "@" + this->served_hostname;
+ iq["to"] = jid_to;
+ XmlNode ping("ping");
+ ping["xmlns"] = PING_NS;
+ ping.close();
+ iq.add_child(std::move(ping));
+ iq.close();
+ this->send_stanza(iq);
+
+ auto result_cb = [from, id](Bridge* bridge, const Stanza& stanza)
+ {
+ Jid to(stanza.get_tag("to"));
+ if (to.local != from)
+ {
+ log_error("Received a corresponding ping result, but the 'to' from "
+ "the response mismatches the 'from' of the request");
+ }
+ else
+ bridge->send_irc_ping_result(from, id);
+ };
+ this->waiting_iq[id] = result_cb;
+}
+
void XmppComponent::send_iq_result(const std::string& id, const std::string& to_jid, const std::string& from_local_part)
{
Stanza iq("iq");
diff --git a/src/xmpp/xmpp_component.hpp b/src/xmpp/xmpp_component.hpp
index 6ccc753..d7f7f7a 100644
--- a/src/xmpp/xmpp_component.hpp
+++ b/src/xmpp/xmpp_component.hpp
@@ -24,6 +24,8 @@
#define STREAMS_NS "urn:ietf:params:xml:ns:xmpp-streams"
#define VERSION_NS "jabber:iq:version"
#define ADHOC_NS "http://jabber.org/protocol/commands"
+#define PING_NS "urn:xmpp:ping"
+
/**
* A callback called when the waited iq result is received (it is matched
* against the iq id)
@@ -217,6 +219,12 @@ public:
void send_iq_version_request(const std::string& from,
const std::string& jid_to);
/**
+ * Send a ping request
+ */
+ void send_ping_request(const std::string& from,
+ const std::string& jid_to,
+ const std::string& id);
+ /**
* Send an empty iq of type result
*/
void send_iq_result(const std::string& id, const std::string& to_jid, const std::string& from);