Software /
code /
prosody-modules
Comparison
mod_remote_roster/mod_remote_roster.lua @ 315:dead242beee3
mod_remote_roster: Implement section 2.5 of <http://jkaluza.fedorapeople.org/remote-roster.html>.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Mon, 10 Jan 2011 17:20:34 +0500 |
parent | 314:df212e1fa576 |
child | 316:c86fc337d56f |
comparison
equal
deleted
inserted
replaced
314:df212e1fa576 | 315:dead242beee3 |
---|---|
11 local tonumber = tonumber; | 11 local tonumber = tonumber; |
12 local pairs, ipairs = pairs, ipairs; | 12 local pairs, ipairs = pairs, ipairs; |
13 local hosts = hosts; | 13 local hosts = hosts; |
14 | 14 |
15 local load_roster = require "core.rostermanager".load_roster; | 15 local load_roster = require "core.rostermanager".load_roster; |
16 local save_roster = require "core.rostermanager".save_roster; | |
16 local rm_remove_from_roster = require "core.rostermanager".remove_from_roster; | 17 local rm_remove_from_roster = require "core.rostermanager".remove_from_roster; |
17 local rm_add_to_roster = require "core.rostermanager".add_to_roster; | 18 local rm_add_to_roster = require "core.rostermanager".add_to_roster; |
18 local rm_roster_push = require "core.rostermanager".roster_push; | 19 local rm_roster_push = require "core.rostermanager".roster_push; |
19 local core_post_stanza = core_post_stanza; | 20 local core_post_stanza = core_post_stanza; |
20 local user_exists = require "core.usermanager".user_exists; | 21 local user_exists = require "core.usermanager".user_exists; |
66 -- Protection against overwriting roster.pending, until we move it | 67 -- Protection against overwriting roster.pending, until we move it |
67 and query.tags[1].attr.jid ~= "pending" then | 68 and query.tags[1].attr.jid ~= "pending" then |
68 local item = query.tags[1]; | 69 local item = query.tags[1]; |
69 local jid = jid_prep(item.attr.jid); | 70 local jid = jid_prep(item.attr.jid); |
70 local node, host, resource = jid_split(jid); | 71 local node, host, resource = jid_split(jid); |
71 if not resource and host then | 72 if not resource and host == session.host then |
72 if jid ~= stanza.attr.to then | 73 if jid ~= stanza.attr.to then -- not self-jid |
73 if item.attr.subscription == "remove" then | 74 if item.attr.subscription == "remove" then |
74 local r_item = roster[jid]; | 75 local r_item = roster[jid]; |
75 if r_item then | 76 if r_item then |
76 local to_bare = node and (node.."@"..host) or host; -- bare JID | 77 local to_bare = node and (node.."@"..host) or host; -- bare JID |
77 if r_item.subscription == "both" or r_item.subscription == "from" or (roster.pending and roster.pending[jid]) then | 78 --if r_item.subscription == "both" or r_item.subscription == "from" or (roster.pending and roster.pending[jid]) then |
78 core_post_stanza(session, st.presence({type="unsubscribed", from=session.full_jid, to=to_bare})); | 79 -- core_post_stanza(hosts[module.host], st.presence({type="unsubscribed", from=stanza.attr.to, to=to_bare})); |
79 end | 80 --end |
80 if r_item.subscription == "both" or r_item.subscription == "to" or r_item.ask then | 81 --if r_item.subscription == "both" or r_item.subscription == "to" or r_item.ask then |
81 core_post_stanza(session, st.presence({type="unsubscribe", from=session.full_jid, to=to_bare})); | 82 -- core_post_stanza(hosts[module.host], st.presence({type="unsubscribe", from=stanza.attr.to, to=to_bare})); |
82 end | 83 --end |
83 local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, jid); | 84 roster[jid] = nil; |
84 if success then | 85 if save_roster(from_node, from_host, roster) then |
85 session.send(st.reply(stanza)); | 86 session.send(st.reply(stanza)); |
86 rm_roster_push(from_node, from_host, jid); | 87 rm_roster_push(from_node, from_host, jid); |
87 else | 88 else |
88 session.send(st.error_reply(stanza, err_type, err_cond, err_msg)); | 89 roster[jid] = item; |
90 session.send(st.error_reply(stanza, "wait", "internal-server-error", "Unable to save roster")); | |
89 end | 91 end |
90 else | 92 else |
91 session.send(st.error_reply(stanza, "modify", "item-not-found")); | 93 session.send(st.error_reply(stanza, "modify", "item-not-found")); |
92 end | 94 end |
93 else | 95 else |
94 local r_item = {name = item.attr.name, groups = {}}; | 96 local r_item = {name = item.attr.name, groups = {}}; |
95 if r_item.name == "" then r_item.name = nil; end | 97 if r_item.name == "" then r_item.name = nil; end |
96 if session.roster[jid] then | 98 if roster[jid] then |
97 r_item.subscription = session.roster[jid].subscription; | 99 r_item.subscription = roster[jid].subscription; |
98 r_item.ask = session.roster[jid].ask; | 100 r_item.ask = roster[jid].ask; |
99 else | 101 else |
100 r_item.subscription = "none"; | 102 r_item.subscription = "none"; |
101 end | 103 end |
102 for _, child in ipairs(item) do | 104 for _, child in ipairs(item) do |
103 if child.name == "group" then | 105 if child.name == "group" then |
105 if text and text ~= "" then | 107 if text and text ~= "" then |
106 r_item.groups[text] = true; | 108 r_item.groups[text] = true; |
107 end | 109 end |
108 end | 110 end |
109 end | 111 end |
110 local success, err_type, err_cond, err_msg = rm_add_to_roster(session, jid, r_item); | 112 local olditem = roster[jid]; |
111 if success then -- Ok, send success | 113 roster[jid] = r_item; |
114 if save_roster(from_node, from_host, roster) then -- Ok, send success | |
112 session.send(st.reply(stanza)); | 115 session.send(st.reply(stanza)); |
113 -- and push change to all resources | 116 -- and push change to all resources |
114 rm_roster_push(from_node, from_host, jid); | 117 rm_roster_push(from_node, from_host, jid); |
115 else -- Adding to roster failed | 118 else -- Adding to roster failed |
116 session.send(st.error_reply(stanza, err_type, err_cond, err_msg)); | 119 roster[jid] = olditem; |
120 session.send(st.error_reply(stanza, "wait", "internal-server-error", "Unable to save roster")); | |
117 end | 121 end |
118 end | 122 end |
119 else -- Trying to add self to roster | 123 else -- Trying to add self to roster |
120 session.send(st.error_reply(stanza, "cancel", "not-allowed")); | 124 session.send(st.error_reply(stanza, "cancel", "not-allowed")); |
121 end | 125 end |