about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command/cmd_funcs.c10
-rw-r--r--src/xmpp/iq.c4
-rw-r--r--src/xmpp/xmpp.h1
-rw-r--r--tests/functionaltests/functionaltests.c7
-rw-r--r--tests/functionaltests/test_ping.c117
-rw-r--r--tests/functionaltests/test_ping.h7
6 files changed, 138 insertions, 8 deletions
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c
index 71c8816a..6409ec54 100644
--- a/src/command/cmd_funcs.c
+++ b/src/command/cmd_funcs.c
@@ -5863,6 +5863,16 @@ cmd_ping(ProfWin *window, const char *const command, gchar **args)
         return TRUE;
     }
 
+    if (args[0] == NULL && connection_supports(XMPP_FEATURE_PING) == FALSE) {
+        cons_show("Server does not support ping requests.");
+        return TRUE;
+    }
+
+    if (args[0] != NULL && caps_jid_has_feature(args[0], XMPP_FEATURE_PING) == FALSE) {
+        cons_show("%s does not support ping requests.", args[0]);
+        return TRUE;
+    }
+
     iq_send_ping(args[0]);
 
     if (args[0] == NULL) {
diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c
index 4a44e05f..7f6b8de0 100644
--- a/src/xmpp/iq.c
+++ b/src/xmpp/iq.c
@@ -967,13 +967,13 @@ _autoping_timed_send(xmpp_conn_t *const conn, void *const userdata)
         return 1;
     }
 
-    if (connection_jid_for_feature(STANZA_NS_PING) == NULL) {
+    if (connection_supports(STANZA_NS_PING) == FALSE) {
         log_warning("Server doesn't advertise %s feature, disabling autoping.", STANZA_NS_PING);
         prefs_set_autoping(0);
         cons_show_error("Server ping not supported, autoping disabled.");
         xmpp_conn_t *conn = connection_get_conn();
         xmpp_timed_handler_delete(conn, _autoping_timed_send);
-		return 1;
+        return 1;
     }
 
     if (autoping_wait) {
diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h
index 2befccd2..fa36cf19 100644
--- a/src/xmpp/xmpp.h
+++ b/src/xmpp/xmpp.h
@@ -55,6 +55,7 @@
 #define JABBER_PRIORITY_MIN -128
 #define JABBER_PRIORITY_MAX 127
 
+#define XMPP_FEATURE_PING "urn:xmpp:ping"
 #define XMPP_FEATURE_BLOCKING "urn:xmpp:blocking"
 #define XMPP_FEATURE_RECEIPTS "urn:xmpp:receipts"
 #define XMPP_FEATURE_LASTACTIVITY "jabber:iq:last"
diff --git a/tests/functionaltests/functionaltests.c b/tests/functionaltests/functionaltests.c
index 1e01071d..b634cfd2 100644
--- a/tests/functionaltests/functionaltests.c
+++ b/tests/functionaltests/functionaltests.c
@@ -35,8 +35,11 @@ int main(int argc, char* argv[]) {
         PROF_FUNC_TEST(connect_bad_password),
         PROF_FUNC_TEST(connect_shows_presence_updates),
 
-        PROF_FUNC_TEST(ping_multiple),
-        PROF_FUNC_TEST(ping_responds),
+        PROF_FUNC_TEST(ping_server),
+        PROF_FUNC_TEST(ping_server_not_supported),
+        PROF_FUNC_TEST(ping_responds_to_server_request),
+        PROF_FUNC_TEST(ping_jid),
+        PROF_FUNC_TEST(ping_jid_not_supported),
 
         PROF_FUNC_TEST(rooms_query),
 
diff --git a/tests/functionaltests/test_ping.c b/tests/functionaltests/test_ping.c
index ecbbfee1..5bb937b6 100644
--- a/tests/functionaltests/test_ping.c
+++ b/tests/functionaltests/test_ping.c
@@ -12,8 +12,17 @@
 #include "proftest.h"
 
 void
-ping_multiple(void **state)
+ping_server(void **state)
 {
+    stbbr_for_id("prof_disco_info_onconnect_2",
+        "<iq id='prof_disco_info_onconnect_2' to='stabber@localhost/profanity' type='result' from='localhost'>"
+            "<query xmlns='http://jabber.org/protocol/disco#info'>"
+                "<identity category='server' type='im' name='Prosody'/>"
+                "<feature var='urn:xmpp:ping'/>"
+            "</query>"
+        "</iq>"
+    );
+
     stbbr_for_id("prof_ping_4",
         "<iq id='prof_ping_4' type='result' to='stabber@localhost/profanity'/>"
     );
@@ -41,7 +50,24 @@ ping_multiple(void **state)
 }
 
 void
-ping_responds(void **state)
+ping_server_not_supported(void **state)
+{
+    stbbr_for_id("prof_disco_info_onconnect_2",
+        "<iq id='prof_disco_info_onconnect_2' to='stabber@localhost/profanity' type='result' from='localhost'>"
+            "<query xmlns='http://jabber.org/protocol/disco#info'>"
+                "<identity category='server' type='im' name='Stabber'/>"
+            "</query>"
+        "</iq>"
+    );
+
+    prof_connect();
+
+    prof_input("/ping");
+    assert_true(prof_output_exact("Server does not support ping requests."));
+}
+
+void
+ping_responds_to_server_request(void **state)
 {
     prof_connect();
 
@@ -55,3 +81,90 @@ ping_responds(void **state)
         "<iq id='pingtest1' type='result' from='stabber@localhost/profanity' to='localhost'/>"
     ));
 }
+
+void ping_jid(void **state)
+{
+    stbbr_for_id("prof_caps_4",
+        "<iq id='prof_caps_4' to='stabber@localhost/profanity' type='result' from='buddy1@localhost/mobile'>"
+            "<query xmlns='http://jabber.org/protocol/disco#info' node='http://www.profanity.im#LpT2xs3nun7jC2sq4gg3WRDQFZ4='>"
+                "<identity category='client' type='console' name='Profanity0.6.0'/>"
+                "<feature var='urn:xmpp:ping'/>"
+                "<feature var='http://jabber.org/protocol/disco#info'/>"
+                "<feature var='http://jabber.org/protocol/caps'/>"
+            "</query>"
+        "</iq>"
+    );
+
+    prof_connect();
+
+    stbbr_send(
+        "<presence to='stabber@localhost' from='buddy1@localhost/mobile'>"
+            "<priority>10</priority>"
+            "<status>I'm here</status>"
+            "<c "
+                "hash='sha-1' "
+                "xmlns='http://jabber.org/protocol/caps' "
+                "node='http://www.profanity.im' "
+                "ver='LpT2xs3nun7jC2sq4gg3WRDQFZ4='"
+            "/>"
+        "</presence>"
+    );
+    assert_true(prof_output_exact("Buddy1 (mobile) is online, \"I'm here\""));
+
+    assert_true(stbbr_received(
+        "<iq id='prof_caps_4' to='buddy1@localhost/mobile' type='get'>"
+            "<query xmlns='http://jabber.org/protocol/disco#info' node='http://www.profanity.im#LpT2xs3nun7jC2sq4gg3WRDQFZ4='/>"
+        "</iq>"
+    ));
+
+    stbbr_for_id("prof_ping_5",
+        "<iq from='buddy1@localhost/mobile' to='stabber@localhost' id='prof_ping_5' type='result'/>"
+    );
+
+    prof_input("/ping buddy1@localhost/mobile");
+
+    assert_true(stbbr_received(
+        "<iq id='prof_ping_5' type='get' to='buddy1@localhost/mobile'>"
+            "<ping xmlns='urn:xmpp:ping'/>"
+        "</iq>"
+    ));
+    assert_true(prof_output_exact("Ping response from buddy1@localhost/mobile"));
+}
+
+void ping_jid_not_supported(void **state)
+{
+    stbbr_for_id("prof_caps_4",
+        "<iq id='prof_caps_4' to='stabber@localhost/profanity' type='result' from='buddy1@localhost/mobile'>"
+            "<query xmlns='http://jabber.org/protocol/disco#info' node='http://www.profanity.im#LpT2xs3nun7jC2sq4gg3WRDQFZ4='>"
+                "<identity category='client' type='console' name='Profanity0.6.0'/>"
+                "<feature var='http://jabber.org/protocol/disco#info'/>"
+                "<feature var='http://jabber.org/protocol/caps'/>"
+            "</query>"
+        "</iq>"
+    );
+
+    prof_connect();
+
+    stbbr_send(
+        "<presence to='stabber@localhost' from='buddy1@localhost/mobile'>"
+            "<priority>10</priority>"
+            "<status>I'm here</status>"
+            "<c "
+                "hash='sha-1' "
+                "xmlns='http://jabber.org/protocol/caps' "
+                "node='http://www.profanity.im' "
+                "ver='LpT2xs3nun7jC2sq4gg3WRDQFZ4='"
+            "/>"
+        "</presence>"
+    );
+    assert_true(prof_output_exact("Buddy1 (mobile) is online, \"I'm here\""));
+
+    assert_true(stbbr_received(
+        "<iq id='prof_caps_4' to='buddy1@localhost/mobile' type='get'>"
+            "<query xmlns='http://jabber.org/protocol/disco#info' node='http://www.profanity.im#LpT2xs3nun7jC2sq4gg3WRDQFZ4='/>"
+        "</iq>"
+    ));
+
+    prof_input("/ping buddy1@localhost/mobile");
+    assert_true(prof_output_exact("buddy1@localhost/mobile does not support ping requests."));
+}
diff --git a/tests/functionaltests/test_ping.h b/tests/functionaltests/test_ping.h
index a222a486..1f2eeb91 100644
--- a/tests/functionaltests/test_ping.h
+++ b/tests/functionaltests/test_ping.h
@@ -1,2 +1,5 @@
-void ping_multiple(void **state);
-void ping_responds(void **state);
+void ping_server(void **state);
+void ping_server_not_supported(void **state);
+void ping_responds_to_server_request(void **state);
+void ping_jid(void **state);
+void ping_jid_not_supported(void **state);