Skip to content

Instantly share code, notes, and snippets.

@hirthwork
Last active November 5, 2015 04:50
Show Gist options
  • Save hirthwork/c9d5199ebcdcb82927d0 to your computer and use it in GitHub Desktop.
Save hirthwork/c9d5199ebcdcb82927d0 to your computer and use it in GitHub Desktop.
--- a/mcabber/xmpp.c
+++ b/mcabber/xmpp.c
@@ -1538,7 +1538,9 @@
{
char *r;
char *buf;
+ GSList* roster_node;
int newbuddy;
+ guint subscription;
guint hook_result;
LmMessageSubType mstype = lm_message_get_sub_type(m);
const char *from = lm_message_get_from(m);
@@ -1556,14 +1558,21 @@
}
r = jidtodisp(from);
- newbuddy = !roster_find(r, jidsearch, 0);
+ roster_node = roster_find(r, jidsearch, 0);
+ if (roster_node) {
+ newbuddy = 0;
+ subscription = buddy_getsubscription(roster_node->data);
+ } else {
+ newbuddy = 1;
+ subscription = 0;
+ }
hook_result = hk_subscription(mstype, r, msg);
if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) {
/* The sender wishes to subscribe to our presence */
- if (hook_result) {
+ if (hook_result || (subscription & sub_from)) {
g_free(r);
return LM_HANDLER_RESULT_REMOVE_MESSAGE;
}
@@ -1600,6 +1609,11 @@
scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
g_free(buf);
} else if (mstype == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE) {
+ if (!(subscription & sub_from)) {
+ g_free(r);
+ return LM_HANDLER_RESULT_REMOVE_MESSAGE;
+ }
+
/* The sender is unsubscribing from our presence */
xmpp_send_s10n(from, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED);
buf = g_strdup_printf("<%s> is unsubscribing from your "
@@ -1608,6 +1622,11 @@
scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
g_free(buf);
} else if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBED) {
+ if (subscription & sub_to) {
+ g_free(r);
+ return LM_HANDLER_RESULT_REMOVE_MESSAGE;
+ }
+
/* The sender has allowed us to receive their presence */
buf = g_strdup_printf("<%s> has allowed you to receive their "
"presence updates", from);
@@ -1615,6 +1634,11 @@
scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
g_free(buf);
} else if (mstype == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED) {
+ if (!(subscription & sub_to)) {
+ g_free(r);
+ return LM_HANDLER_RESULT_REMOVE_MESSAGE;
+ }
+
/* The subscription request has been denied or a previously-granted
subscription has been cancelled */
roster_unsubscribed(from);
@McKael
Copy link

McKael commented Nov 4, 2015

The patch looks good; what's annoying is that it is just a workaround for a server bug :/
Still, if we want a client-side solution, what about this slightly updated version?

diff --git a/mcabber/mcabber/xmpp.c b/mcabber/mcabber/xmpp.c
--- a/mcabber/mcabber/xmpp.c
+++ b/mcabber/mcabber/xmpp.c
@@ -1591,6 +1591,7 @@ static LmHandlerResult handle_s10n(LmMes
   char *r;
   char *buf;
   int newbuddy;
+  guint subscription;
   guint hook_result;
   LmMessageSubType mstype = lm_message_get_sub_type(m);
   const char *from = lm_message_get_from(m);
@@ -1609,16 +1610,15 @@ static LmHandlerResult handle_s10n(LmMes
   r = jidtodisp(from);

   newbuddy = !roster_find(r, jidsearch, 0);
+  subscription = roster_getsubscription(r);

   hook_result = hk_subscription(mstype, r, msg);

   if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBE) {
     /* The sender wishes to subscribe to our presence */

-    if (hook_result) {
-      g_free(r);
-      return LM_HANDLER_RESULT_REMOVE_MESSAGE;
-    }
+    if (hook_result || (subscription & sub_from))
+      goto handle_s10n_return;

     buf = g_strdup_printf("<%s> wants to subscribe to your presence updates",
                           from);
@@ -1654,6 +1654,8 @@ static LmHandlerResult handle_s10n(LmMes
   } else if (mstype == LM_MESSAGE_SUB_TYPE_UNSUBSCRIBE) {
     /* The sender is unsubscribing from our presence */
     xmpp_send_s10n(from, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED);
+    if (!(subscription & sub_from))
+      goto handle_s10n_return;
     buf = g_strdup_printf("<%s> is unsubscribing from your "
                           "presence updates", from);
     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
@@ -1661,6 +1663,8 @@ static LmHandlerResult handle_s10n(LmMes
     g_free(buf);
   } else if (mstype == LM_MESSAGE_SUB_TYPE_SUBSCRIBED) {
     /* The sender has allowed us to receive their presence */
+    if (subscription & sub_to)
+      goto handle_s10n_return;
     buf = g_strdup_printf("<%s> has allowed you to receive their "
                           "presence updates", from);
     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
@@ -1671,6 +1675,8 @@ static LmHandlerResult handle_s10n(LmMes
        subscription has been cancelled */
     roster_unsubscribed(from);
     update_roster = TRUE;
+    if (!(subscription & sub_to))
+      goto handle_s10n_return;
     buf = g_strdup_printf("<%s> has cancelled your subscription to "
                           "their presence updates", from);
     scr_WriteIncomingMessage(r, buf, 0, HBB_PREFIX_INFO, 0);
@@ -1683,6 +1689,8 @@ static LmHandlerResult handle_s10n(LmMes

   if (newbuddy)
     update_roster = TRUE;
+
+handle_s10n_return:
   g_free(r);
   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment