From 95292a41ab037a1ff8d4b7064a674648d2c17e49 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Wed, 15 Jun 2011 00:26:25 -0400 Subject: [PATCH] xmpp_destroy_buddy() now accepts an 'aggressively' flag that indicates whether the server should push an 'unsubscribed' presence tag. Apparently we can only do this when sending a roster flush at the beginning of the session, because sending it when another user logs out in the middle of our session confuses Jitsi into thinking that the other user rejected a subscription request. I think it's making Pidgin behave better too, but more testing is needed. --- citadel/modules/xmpp/xmpp_presence.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/citadel/modules/xmpp/xmpp_presence.c b/citadel/modules/xmpp/xmpp_presence.c index 4175771c4..f42d74f40 100644 --- a/citadel/modules/xmpp/xmpp_presence.c +++ b/citadel/modules/xmpp/xmpp_presence.c @@ -119,7 +119,7 @@ void xmpp_wholist_presence_dump(void) * Function to remove a buddy subscription and delete from the roster * (used in several places) */ -void xmpp_destroy_buddy(char *presence_jid) { +void xmpp_destroy_buddy(char *presence_jid, int aggressively) { static int unsolicited_id = 1; char xmlbuf1[256]; char xmlbuf2[256]; @@ -133,10 +133,20 @@ void xmpp_destroy_buddy(char *presence_jid) { xmlesc(xmlbuf1, presence_jid, sizeof xmlbuf1), xmlesc(xmlbuf2, XMPP->client_jid, sizeof xmlbuf2) ); - cprintf("", - xmlesc(xmlbuf1, presence_jid, sizeof xmlbuf1), - xmlesc(xmlbuf2, XMPP->client_jid, sizeof xmlbuf2) - ); + + /* + * Setting the "aggressively" flag also sends an "unsubscribed" presence update. + * We only ask for this when flushing the client side roster, because if we do it + * in the middle of a session when another user logs off, some clients (Jitsi) interpret + * it as a rejection of a subscription request. + */ + if (aggressively) { + cprintf("", + xmlesc(xmlbuf1, presence_jid, sizeof xmlbuf1), + xmlesc(xmlbuf2, XMPP->client_jid, sizeof xmlbuf2) + ); + } + // FIXME ... we should implement xmpp_indicate_nonpresence so we can use it elsewhere /* Do an unsolicited roster update that deletes the contact. */ @@ -206,7 +216,7 @@ void xmpp_presence_notify(char *presence_jid, int event_type) { if (visible_sessions == 0) { syslog(LOG_DEBUG, "Telling session %d that <%s> logged out\n", CC->cs_pid, presence_jid); - xmpp_destroy_buddy(presence_jid); + xmpp_destroy_buddy(presence_jid, 0); /* non aggressive presence update */ } free(cptr); @@ -391,7 +401,7 @@ void xmpp_delete_old_buddies_who_no_longer_exist_from_the_client_roster(void) } if (!online_now) { - xmpp_destroy_buddy((char *)Value); + xmpp_destroy_buddy((char *)Value, 1); /* aggressive presence update */ } } -- 2.30.2