SOURCES: jabberd2-presence-handling.patch (NEW) - from http://staf...
hawk
hawk at pld-linux.org
Wed Dec 20 12:10:54 CET 2006
Author: hawk Date: Wed Dec 20 11:10:54 2006 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- from http://staff.xiaoka.com/smoku/stuff/Jabber/jabberd2/jabberd2-presence-handling.patch
---- Files affected:
SOURCES:
jabberd2-presence-handling.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/jabberd2-presence-handling.patch
diff -u /dev/null SOURCES/jabberd2-presence-handling.patch:1.1
--- /dev/null Wed Dec 20 12:10:54 2006
+++ SOURCES/jabberd2-presence-handling.patch Wed Dec 20 12:10:49 2006
@@ -0,0 +1,103 @@
+Index: sm/mod_roster.c
+===================================================================
+--- sm/mod_roster.c (wersja 29)
++++ sm/mod_roster.c (kopia robocza)
+@@ -199,9 +199,9 @@
+ }
+
+ /* a request */
+- if(pkt->type == pkt_S10N)
++ if(pkt->type == pkt_S10N && ! item->to)
+ item->ask = 1;
+- else if(pkt->type == pkt_S10N_UN)
++ else if(pkt->type == pkt_S10N_UN && item->to)
+ item->ask = 2;
+
+ /* changing states */
+@@ -508,8 +508,8 @@
+ /* get the roster item */
+ item = (item_t) xhash_get(user->roster, jid_full(pkt->from));
+ if(item == NULL) {
+- /* they're not on the roster, so subs / unsubs go direct */
+- if(pkt->type == pkt_S10N || pkt->type == pkt_S10N_UN)
++ /* subs go direct */
++ if(pkt->type == pkt_S10N)
+ return mod_PASS;
+
+ /* we didn't ask for this, so we don't care */
+@@ -517,6 +517,23 @@
+ return mod_HANDLED;
+ }
+
++ /* ignore bogus answers */
++ if( (pkt->type == pkt_S10N_ED && (item->ask != 1 || item->to) )
++ || (pkt->type == pkt_S10N_UNED && ! item->to) )
++ {
++ /* remove pending ask */
++ if( (pkt->type == pkt_S10N_ED && item->ask == 1)
++ || (pkt->type == pkt_S10N_UNED && item->ask == 2) )
++ {
++ item->ask = 0;
++ /* save changes */
++ _roster_save_item(user, item);
++ }
++
++ pkt_free(pkt);
++ return mod_HANDLED;
++ }
++
+ /* trying to subscribe */
+ if(pkt->type == pkt_S10N)
+ {
+@@ -536,7 +553,7 @@
+ return mod_PASS;
+ }
+
+- /* trying to unsubscribe */
++ /* handle unsubscribe */
+ if(pkt->type == pkt_S10N_UN)
+ {
+ if(!item->from)
+@@ -545,24 +562,34 @@
+ nad_set_attr(pkt->nad, 1, -1, "type", "unsubscribed", 12);
+ pkt_router(pkt_tofrom(pkt));
+
+- /* update their presence from the leading session */
+- if(user->top != NULL)
+- pres_roster(user->top, item);
+-
+ return mod_HANDLED;
+ }
+
+- return mod_PASS;
++ /* change state */
++ item->from = 0;
++
++ /* confirm unsubscription */
++ pkt_router(pkt_create(user->sm, "presence", "unsubscribed", jid_user(pkt->from), jid_user(user->jid)));
++
++ /* update their presence from the leading session */
++ if(user->top != NULL)
++ pres_roster(user->top, item);
+ }
+
+ /* update our s10n */
+ if(pkt->type == pkt_S10N_ED)
++ {
+ item->to = 1;
+- else
++ if(item->ask == 1)
++ item->ask = 0;
++ }
++ if(pkt->type == pkt_S10N_UNED)
++ {
+ item->to = 0;
++ if(item->ask == 2)
++ item->ask = 0;
++ }
+
+- item->ask = 0;
+-
+ /* save changes */
+ _roster_save_item(user, item);
+
================================================================
More information about the pld-cvs-commit
mailing list