From 4de570b1ee34bad2e7565df6a426e497485a5708 Mon Sep 17 00:00:00 2001 From: James Booth Date: Thu, 18 Aug 2016 00:10:15 +0100 Subject: [PATCH] Only include receipts feature in disco responses when enabled issue #829 --- src/command/cmd_funcs.c | 6 +++++ src/xmpp/capabilities.c | 42 +++++++++++++++++++++++++++++++- src/xmpp/xmpp.h | 3 +++ tests/unittests/xmpp/stub_xmpp.c | 2 ++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 342d38d5..ede549b4 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -5987,6 +5987,12 @@ cmd_receipts(ProfWin *window, const char *const command, gchar **args) { if (g_strcmp0(args[0], "send") == 0) { _cmd_set_boolean_preference(args[1], command, "Send delivery receipts", PREF_RECEIPTS_SEND); + if (g_strcmp0(args[1], "on") == 0) { + caps_add_feature(XMPP_FEATURE_RECEIPTS); + } + if (g_strcmp0(args[1], "off") == 0) { + caps_remove_feature(XMPP_FEATURE_RECEIPTS); + } } else if (g_strcmp0(args[0], "request") == 0) { _cmd_set_boolean_preference(args[1], command, "Request delivery receipts", PREF_RECEIPTS_REQUEST); } else { diff --git a/src/xmpp/capabilities.c b/src/xmpp/capabilities.c index f528e05c..17d60e36 100644 --- a/src/xmpp/capabilities.c +++ b/src/xmpp/capabilities.c @@ -54,8 +54,10 @@ #include "common.h" #include "log.h" +#include "event/client_events.h" #include "plugins/plugins.h" #include "config/files.h" +#include "config/preferences.h" #include "xmpp/xmpp.h" #include "xmpp/stanza.h" #include "xmpp/form.h" @@ -100,12 +102,50 @@ caps_init(void) g_hash_table_add(prof_features, strdup(STANZA_NS_VERSION)); g_hash_table_add(prof_features, strdup(STANZA_NS_CHATSTATES)); g_hash_table_add(prof_features, strdup(STANZA_NS_PING)); - g_hash_table_add(prof_features, strdup(STANZA_NS_RECEIPTS)); + if (prefs_get_boolean(PREF_RECEIPTS_SEND)) { + g_hash_table_add(prof_features, strdup(STANZA_NS_RECEIPTS)); + } g_hash_table_add(prof_features, strdup(STANZA_NS_LASTACTIVITY)); my_sha1 = NULL; } +void +caps_add_feature(char *feature) +{ + if (g_hash_table_contains(prof_features, feature)) { + return; + } + + g_hash_table_add(prof_features, strdup(feature)); + + caps_reset_ver(); + + // resend presence to update server's disco info data for this client + if (connection_get_status() == JABBER_CONNECTED) { + resource_presence_t last_presence = accounts_get_last_presence(session_get_account_name()); + cl_ev_presence_send(last_presence, connection_get_presence_msg(), 0); + } +} + +void +caps_remove_feature(char *feature) +{ + if (!g_hash_table_contains(prof_features, feature)) { + return; + } + + g_hash_table_remove(prof_features, feature); + + caps_reset_ver(); + + // resend presence to update server's disco info data for this client + if (connection_get_status() == JABBER_CONNECTED) { + resource_presence_t last_presence = accounts_get_last_presence(session_get_account_name()); + cl_ev_presence_send(last_presence, connection_get_presence_msg(), 0); + } +} + GList* caps_get_features(void) { diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h index 93b02cb2..821abfd6 100644 --- a/src/xmpp/xmpp.h +++ b/src/xmpp/xmpp.h @@ -56,6 +56,7 @@ #define JABBER_PRIORITY_MAX 127 #define XMPP_FEATURE_BLOCKING "urn:xmpp:blocking" +#define XMPP_FEATURE_RECEIPTS "urn:xmpp:receipts" typedef enum { JABBER_CONNECTING, @@ -179,6 +180,8 @@ EntityCapabilities* caps_lookup(const char *const jid); void caps_close(void); void caps_destroy(EntityCapabilities *caps); void caps_reset_ver(void); +void caps_add_feature(char *feature); +void caps_remove_feature(char *feature); gboolean bookmark_add(const char *jid, const char *nick, const char *password, const char *autojoin_str); gboolean bookmark_update(const char *jid, const char *nick, const char *password, const char *autojoin_str); diff --git a/tests/unittests/xmpp/stub_xmpp.c b/tests/unittests/xmpp/stub_xmpp.c index d0c15c52..e77afdcd 100644 --- a/tests/unittests/xmpp/stub_xmpp.c +++ b/tests/unittests/xmpp/stub_xmpp.c @@ -203,6 +203,8 @@ void iq_last_activity_request(gchar *jid) {} void iq_autoping_check(void) {} // caps functions +void caps_add_feature(char *feature) {} +void caps_remove_feature(char *feature) {} EntityCapabilities* caps_lookup(const char * const jid) { return NULL;