Software /
code /
prosody
Comparison
plugins/mod_roster.lua @ 928:92288c13d7bc
Fixed: mod_roster: Prep JIDs being added to roster (part of issue #57)
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Mon, 30 Mar 2009 02:38:51 +0500 |
parent | 916:f0743928ef7e |
child | 1133:b293d7dc6a45 |
comparison
equal
deleted
inserted
replaced
927:cc180d25dbeb | 928:92288c13d7bc |
---|---|
9 | 9 |
10 | 10 |
11 local st = require "util.stanza" | 11 local st = require "util.stanza" |
12 | 12 |
13 local jid_split = require "util.jid".split; | 13 local jid_split = require "util.jid".split; |
14 local jid_prep = require "util.jid".prep; | |
14 local t_concat = table.concat; | 15 local t_concat = table.concat; |
15 local tostring = tostring; | 16 local tostring = tostring; |
16 | 17 |
17 local handle_presence = require "core.presencemanager".handle_presence; | 18 local handle_presence = require "core.presencemanager".handle_presence; |
18 local rm_remove_from_roster = require "core.rostermanager".remove_from_roster; | 19 local rm_remove_from_roster = require "core.rostermanager".remove_from_roster; |
59 -- Protection against overwriting roster.pending, until we move it | 60 -- Protection against overwriting roster.pending, until we move it |
60 and query.tags[1].attr.jid ~= "pending" then | 61 and query.tags[1].attr.jid ~= "pending" then |
61 local item = query.tags[1]; | 62 local item = query.tags[1]; |
62 local from_node, from_host = jid_split(stanza.attr.from); | 63 local from_node, from_host = jid_split(stanza.attr.from); |
63 local from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID | 64 local from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID |
64 local node, host, resource = jid_split(item.attr.jid); | 65 local jid = jid_prep(item.attr.jid); |
65 local to_bare = node and (node.."@"..host) or host; -- bare JID | 66 local node, host, resource = jid_split(jid); |
66 if not resource and host then | 67 if not resource and host then |
67 if item.attr.jid ~= from_node.."@"..from_host then | 68 if jid ~= from_node.."@"..from_host then |
68 if item.attr.subscription == "remove" then | 69 if item.attr.subscription == "remove" then |
69 local r_item = session.roster[item.attr.jid]; | 70 local r_item = session.roster[jid]; |
70 if r_item then | 71 if r_item then |
71 local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, item.attr.jid); | 72 local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, jid); |
72 if success then | 73 if success then |
73 session.send(st.reply(stanza)); | 74 session.send(st.reply(stanza)); |
74 rm_roster_push(from_node, from_host, item.attr.jid); | 75 rm_roster_push(from_node, from_host, jid); |
76 local to_bare = node and (node.."@"..host) or host; -- bare JID | |
75 if r_item.subscription == "both" or r_item.subscription == "from" then | 77 if r_item.subscription == "both" or r_item.subscription == "from" then |
76 handle_presence(session, st.presence({type="unsubscribed"}), from_bare, to_bare, | 78 handle_presence(session, st.presence({type="unsubscribed"}), from_bare, to_bare, |
77 core_route_stanza, false); | 79 core_route_stanza, false); |
78 elseif r_item.subscription == "both" or r_item.subscription == "to" then | 80 elseif r_item.subscription == "both" or r_item.subscription == "to" then |
79 handle_presence(session, st.presence({type="unsubscribe"}), from_bare, to_bare, | 81 handle_presence(session, st.presence({type="unsubscribe"}), from_bare, to_bare, |
86 session.send(st.error_reply(stanza, "modify", "item-not-found")); | 88 session.send(st.error_reply(stanza, "modify", "item-not-found")); |
87 end | 89 end |
88 else | 90 else |
89 local r_item = {name = item.attr.name, groups = {}}; | 91 local r_item = {name = item.attr.name, groups = {}}; |
90 if r_item.name == "" then r_item.name = nil; end | 92 if r_item.name == "" then r_item.name = nil; end |
91 if session.roster[item.attr.jid] then | 93 if session.roster[jid] then |
92 r_item.subscription = session.roster[item.attr.jid].subscription; | 94 r_item.subscription = session.roster[jid].subscription; |
93 r_item.ask = session.roster[item.attr.jid].ask; | 95 r_item.ask = session.roster[jid].ask; |
94 else | 96 else |
95 r_item.subscription = "none"; | 97 r_item.subscription = "none"; |
96 end | 98 end |
97 for _, child in ipairs(item) do | 99 for _, child in ipairs(item) do |
98 if child.name == "group" then | 100 if child.name == "group" then |
100 if text and text ~= "" then | 102 if text and text ~= "" then |
101 r_item.groups[text] = true; | 103 r_item.groups[text] = true; |
102 end | 104 end |
103 end | 105 end |
104 end | 106 end |
105 local success, err_type, err_cond, err_msg = rm_add_to_roster(session, item.attr.jid, r_item); | 107 local success, err_type, err_cond, err_msg = rm_add_to_roster(session, jid, r_item); |
106 if success then | 108 if success then |
107 session.send(st.reply(stanza)); | 109 session.send(st.reply(stanza)); |
108 rm_roster_push(from_node, from_host, item.attr.jid); | 110 rm_roster_push(from_node, from_host, jid); |
109 else | 111 else |
110 session.send(st.error_reply(stanza, err_type, err_cond, err_msg)); | 112 session.send(st.error_reply(stanza, err_type, err_cond, err_msg)); |
111 end | 113 end |
112 end | 114 end |
113 else | 115 else |