Software /
code /
prosody
Comparison
plugins/mod_roster.lua @ 326:99a8317d1235
Send unsubscribe and unsubscribed on roster item delete, and broadcast available resources' presence in reply to pre-approved subscription request
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Mon, 17 Nov 2008 13:51:47 +0500 |
parent | 299:300b5a201ad3 |
child | 421:63be85693710 |
comparison
equal
deleted
inserted
replaced
325:5de1048b3fbf | 326:99a8317d1235 |
---|---|
2 local st = require "util.stanza" | 2 local st = require "util.stanza" |
3 | 3 |
4 local jid_split = require "util.jid".split; | 4 local jid_split = require "util.jid".split; |
5 local t_concat = table.concat; | 5 local t_concat = table.concat; |
6 | 6 |
7 local handle_outbound_presence_subscriptions_and_probes = require "core.presencemanager".handle_outbound_presence_subscriptions_and_probes; | |
7 local rm_remove_from_roster = require "core.rostermanager".remove_from_roster; | 8 local rm_remove_from_roster = require "core.rostermanager".remove_from_roster; |
8 local rm_add_to_roster = require "core.rostermanager".add_to_roster; | 9 local rm_add_to_roster = require "core.rostermanager".add_to_roster; |
9 local rm_roster_push = require "core.rostermanager".roster_push; | 10 local rm_roster_push = require "core.rostermanager".roster_push; |
10 | 11 |
11 add_iq_handler("c2s", "jabber:iq:roster", | 12 add_iq_handler("c2s", "jabber:iq:roster", |
36 if #query.tags == 1 and query.tags[1].name == "item" | 37 if #query.tags == 1 and query.tags[1].name == "item" |
37 and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid | 38 and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid |
38 and query.tags[1].attr.jid ~= "pending" then | 39 and query.tags[1].attr.jid ~= "pending" then |
39 local item = query.tags[1]; | 40 local item = query.tags[1]; |
40 local from_node, from_host = jid_split(stanza.attr.from); | 41 local from_node, from_host = jid_split(stanza.attr.from); |
42 local from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID | |
41 local node, host, resource = jid_split(item.attr.jid); | 43 local node, host, resource = jid_split(item.attr.jid); |
42 if not resource then | 44 local to_bare = node and (node.."@"..host) or host; -- bare JID |
45 if not resource and host then | |
43 if item.attr.jid ~= from_node.."@"..from_host then | 46 if item.attr.jid ~= from_node.."@"..from_host then |
44 if item.attr.subscription == "remove" then | 47 if item.attr.subscription == "remove" then |
45 if session.roster[item.attr.jid] then | 48 local r_item = session.roster[item.attr.jid]; |
49 if r_item then | |
46 local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, item.attr.jid); | 50 local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, item.attr.jid); |
47 if success then | 51 if success then |
48 session.send(st.reply(stanza)); | 52 session.send(st.reply(stanza)); |
49 rm_roster_push(from_node, from_host, item.attr.jid); | 53 rm_roster_push(from_node, from_host, item.attr.jid); |
54 if r_item.subscription == "both" or r_item.subscription == "from" then | |
55 handle_outbound_presence_subscriptions_and_probes(session, | |
56 st.presence({type="unsubscribed"}), from_bare, to_bare); | |
57 elseif r_item.subscription == "both" or r_item.subscription == "to" then | |
58 handle_outbound_presence_subscriptions_and_probes(session, | |
59 st.presence({type="unsubscribe"}), from_bare, to_bare); | |
60 end | |
50 else | 61 else |
51 session.send(st.error_reply(stanza, err_type, err_cond, err_msg)); | 62 session.send(st.error_reply(stanza, err_type, err_cond, err_msg)); |
52 end | 63 end |
53 else | 64 else |
54 session.send(st.error_reply(stanza, "modify", "item-not-found")); | 65 session.send(st.error_reply(stanza, "modify", "item-not-found")); |