Software /
code /
prosody
Comparison
plugins/mod_roster.lua @ 6613:2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 03 Apr 2015 06:38:22 +0200 |
parent | 5776:bd0ff8ae98a8 |
child | 7331:c8ad387aab1c |
comparison
equal
deleted
inserted
replaced
6612:6cc48b51d699 | 6613:2aae36312eb9 |
---|---|
42 | 42 |
43 if not (client_ver and server_ver) or client_ver ~= server_ver then | 43 if not (client_ver and server_ver) or client_ver ~= server_ver then |
44 roster:query("jabber:iq:roster"); | 44 roster:query("jabber:iq:roster"); |
45 -- Client does not support versioning, or has stale roster | 45 -- Client does not support versioning, or has stale roster |
46 for jid, item in pairs(session.roster) do | 46 for jid, item in pairs(session.roster) do |
47 if jid ~= "pending" and jid then | 47 if jid then |
48 roster:tag("item", { | 48 roster:tag("item", { |
49 jid = jid, | 49 jid = jid, |
50 subscription = item.subscription, | 50 subscription = item.subscription, |
51 ask = item.ask, | 51 ask = item.ask, |
52 name = item.name, | 52 name = item.name, |
62 session.send(roster); | 62 session.send(roster); |
63 session.interested = true; -- resource is interested in roster updates | 63 session.interested = true; -- resource is interested in roster updates |
64 else -- stanza.attr.type == "set" | 64 else -- stanza.attr.type == "set" |
65 local query = stanza.tags[1]; | 65 local query = stanza.tags[1]; |
66 if #query.tags == 1 and query.tags[1].name == "item" | 66 if #query.tags == 1 and query.tags[1].name == "item" |
67 and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid | 67 and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid then |
68 -- Protection against overwriting roster.pending, until we move it | |
69 and query.tags[1].attr.jid ~= "pending" then | |
70 local item = query.tags[1]; | 68 local item = query.tags[1]; |
71 local from_node, from_host = jid_split(stanza.attr.from); | 69 local from_node, from_host = jid_split(stanza.attr.from); |
72 local jid = jid_prep(item.attr.jid); | 70 local jid = jid_prep(item.attr.jid); |
73 local node, host, resource = jid_split(jid); | 71 local node, host, resource = jid_split(jid); |
74 if not resource and host then | 72 if not resource and host then |
76 if item.attr.subscription == "remove" then | 74 if item.attr.subscription == "remove" then |
77 local roster = session.roster; | 75 local roster = session.roster; |
78 local r_item = roster[jid]; | 76 local r_item = roster[jid]; |
79 if r_item then | 77 if r_item then |
80 local to_bare = node and (node.."@"..host) or host; -- bare JID | 78 local to_bare = node and (node.."@"..host) or host; -- bare JID |
81 if r_item.subscription == "both" or r_item.subscription == "from" or (roster.pending and roster.pending[jid]) then | 79 if r_item.subscription == "both" or r_item.subscription == "from" or roster[false].pending[jid] then |
82 core_post_stanza(session, st.presence({type="unsubscribed", from=session.full_jid, to=to_bare})); | 80 core_post_stanza(session, st.presence({type="unsubscribed", from=session.full_jid, to=to_bare})); |
83 end | 81 end |
84 if r_item.subscription == "both" or r_item.subscription == "to" or r_item.ask then | 82 if r_item.subscription == "both" or r_item.subscription == "to" or r_item.ask then |
85 core_post_stanza(session, st.presence({type="unsubscribe", from=session.full_jid, to=to_bare})); | 83 core_post_stanza(session, st.presence({type="unsubscribe", from=session.full_jid, to=to_bare})); |
86 end | 84 end |
142 local username, host = event.username, event.host; | 140 local username, host = event.username, event.host; |
143 if host ~= module.host then return end | 141 if host ~= module.host then return end |
144 local bare = username .. "@" .. host; | 142 local bare = username .. "@" .. host; |
145 local roster = rm_load_roster(username, host); | 143 local roster = rm_load_roster(username, host); |
146 for jid, item in pairs(roster) do | 144 for jid, item in pairs(roster) do |
147 if jid and jid ~= "pending" then | 145 if jid then |
148 if item.subscription == "both" or item.subscription == "from" or (roster.pending and roster.pending[jid]) then | 146 if item.subscription == "both" or item.subscription == "from" or roster[false].pending[jid] then |
149 module:send(st.presence({type="unsubscribed", from=bare, to=jid})); | 147 module:send(st.presence({type="unsubscribed", from=bare, to=jid})); |
150 end | 148 end |
151 if item.subscription == "both" or item.subscription == "to" or item.ask then | 149 if item.subscription == "both" or item.subscription == "to" or item.ask then |
152 module:send(st.presence({type="unsubscribe", from=bare, to=jid})); | 150 module:send(st.presence({type="unsubscribe", from=bare, to=jid})); |
153 end | 151 end |