Changeset 433
Legend:
- Unmodified
- Added
- Removed
-
trunk/sm/pres.c
r406 r433 91 91 xhash_iter_get(sess->user->roster, NULL, (void *) &item); 92 92 93 /* Is the user local ? */93 /* Is the user local ? */ 94 94 user_is_local = (item->jid->node[0] != '\0' && strcmp(pkt->sm->id, item->jid->domain) == 0); 95 95 if (user_is_local) { … … 100 100 /* if we're coming available, and we can see them, we need to probe them */ 101 101 if(!sess->available && item->to) { 102 103 /* Shortcut */ 104 if ((!user_is_local) || (user_is_local && user_connected)) { 105 log_debug(ZONE, "probing %s", jid_full(item->jid)); 106 pkt_router(pkt_create(sess->user->sm, "presence", "probe", jid_full(item->jid), jid_user(sess->jid))); 107 } else 108 log_debug(ZONE, "skipping probe to local user %s - not connected", jid_full(item->jid)); 102 log_debug(ZONE, "probing %s", jid_full(item->jid)); 103 pkt_router(pkt_create(sess->user->sm, "presence", "probe", jid_full(item->jid), jid_user(sess->jid))); 109 104 110 105 /* flag if we probed ourselves */ … … 115 110 /* if they can see us, forward */ 116 111 if(item->from && !jid_search(sess->E, item->jid)) { 117 /* Shortcut: if the domain of this user's jid is the same as this sm, 118 and the user has no active sessions, don't send presence update */ 119 112 /* Shortcut: if the domain of this user's jid is the same as this sm, 113 and the user has no active sessions, don't send presence update */ 120 114 if ((!user_is_local) || (user_is_local && user_connected)) { 121 115 log_debug(ZONE, "forwarding available to %s", jid_full(item->jid)); … … 167 161 xhash_iter_get(sess->user->roster, NULL, (void *) &item); 168 162 169 /* Is the user local ? */163 /* Is the user local ? */ 170 164 user_is_local = (strcmp(pkt->sm->id, item->jid->domain)==0); 171 165 if (user_is_local) { … … 227 221 228 222 default: 229 log_debug(ZONE, "pres_update got packet type %d, this shouldn't happen", pkt->type);223 log_debug(ZONE, "pres_update got packet type 0x%X, this shouldn't happen", pkt->type); 230 224 pkt_free(pkt); 231 225 return; … … 236 230 } 237 231 238 /** presence updates from a remote jid */232 /** presence updates from a remote jid - RFC 3921bis 4.3.2. */ 239 233 void pres_in(user_t user, pkt_t pkt) { 240 234 sess_t scan; 241 235 242 log_debug(ZONE, "type 0x%X presence packet from %s", pkt->type, jid_full(pkt->from)); 236 log_debug(ZONE, "\n\n===\n\ntype 0x%X presence packet from %s\n\n", pkt->type, jid_full(pkt->from)); 237 238 /* handle probes */ 239 if(pkt->type == pkt_PRESENCE_PROBE) { 240 /* unsubscribe untrusted users */ 241 if(!pres_trust(user, pkt->from)) { 242 log_debug(ZONE, "unsubscribing untrusted %s", jid_full(pkt->from)); 243 pkt_router(pkt_create(user->sm, "presence", "unsubscribe", jid_full(pkt->from), jid_full(pkt->to))); 244 245 pkt_free(pkt); 246 return; 247 } 248 249 /* respond with last unavailable presence if no available session */ 250 if(user->top == NULL) { 251 os_t os; 252 os_object_t o; 253 nad_t nad; 254 pkt_t pres; 255 256 /* get user last presence stanza */ 257 if(storage_get(user->sm->st, "status", jid_user(user->jid), NULL, &os) == st_SUCCESS && os_iter_first(os)) { 258 o = os_iter_object(os); 259 os_object_get_nad(os, o, "xml", &nad); 260 pres = pkt_new(pkt->sm, nad_copy(nad)); 261 pkt_router(pkt_dup(pres, jid_full(pkt->from), jid_user(user->jid))); 262 os_free(os); 263 pkt_free(pres); 264 } 265 pkt_free(pkt); 266 return; 267 } 268 } 243 269 244 270 /* loop over each session */ … … 256 282 log_debug(ZONE, "probe from %s for %s", jid_full(pkt->from), jid_full(scan->jid)); 257 283 258 /* B3: respond if in T */ 259 if(pres_trust(user, pkt->from)) { 260 log_debug(ZONE, "responding with last presence update"); 261 pkt_router(pkt_dup(scan->pres, jid_full(pkt->from), jid_full(scan->jid))); 262 } 263 264 else { 265 log_debug(ZONE, "probe not authorised, ignoring"); 266 } 284 /* B3: respond (already checked for T) */ 285 log_debug(ZONE, "responding with last presence update"); 286 pkt_router(pkt_dup(scan->pres, jid_full(pkt->from), jid_full(scan->jid))); 267 287 268 288 /* remove from E */ -
trunk/UPGRADE
r408 r433 1 1 This file contains upgrade instructions between different versions of jabberd2. 2 3 * 2.1.18 to 2.1.19 upgrade: 4 5 What had change: 6 - mod_status stores full last presence stanza 7 - so called "offline status" support 8 (sending last unavailable presence stanza for unavailable users) 9 10 You need to add "xml" column to "status" table: 11 ALTER TABLE "status" ADD COLUMN "xml" TEXT; 12 2 13 3 14 * 2.1.17 to 2.1.18 upgrade:
