diff options
author | Kim Alvefur <zash@zash.se> | 2015-04-03 06:38:22 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2015-04-03 06:38:22 +0200 |
commit | 28c58565ace33870970010c9d195c5da5d9cf4d1 (patch) | |
tree | 8a900a61e238f2b5322212f10401172cb4d37b40 | |
parent | 90aa3a710b37162abe64ad36a0af03cb29da5822 (diff) | |
download | prosody-28c58565ace33870970010c9d195c5da5d9cf4d1.tar.gz prosody-28c58565ace33870970010c9d195c5da5d9cf4d1.zip |
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
-rw-r--r-- | core/rostermanager.lua | 40 | ||||
-rw-r--r-- | plugins/mod_presence.lua | 6 | ||||
-rw-r--r-- | plugins/mod_roster.lua | 12 |
3 files changed, 32 insertions, 26 deletions
diff --git a/core/rostermanager.lua b/core/rostermanager.lua index 8c7612b4..19d07c94 100644 --- a/core/rostermanager.lua +++ b/core/rostermanager.lua @@ -54,7 +54,7 @@ function remove_from_roster(session, jid) end function roster_push(username, host, jid) - local roster = jid and jid ~= "pending" and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster; + local roster = jid and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster; if roster then local item = hosts[host].sessions[username].roster[jid]; local stanza = st.iq({type="set"}); @@ -79,6 +79,22 @@ function roster_push(username, host, jid) end end +local function roster_metadata(roster, err) + local metadata = roster[false]; + if not metadata then + metadata = { broken = err or nil }; + roster[false] = metadata; + end + if not metadata.pending then + if roster.pending and not type(roster.pending.subscription) == "string" then + metadata.pending, roster.pending = roster.pending, nil; + else + metadata.pending = {}; + end + end + return metadata; +end + function load_roster(username, host) local jid = username.."@"..host; log("debug", "load_roster: asked for: %s", jid); @@ -94,7 +110,7 @@ function load_roster(username, host) local data, err = datamanager.load(username, host, "roster"); roster = data or {}; if user then user.roster = roster; end - if not roster[false] then roster[false] = { broken = err or nil }; end + roster_metadata(roster, err); if roster[jid] then roster[jid] = nil; log("warn", "roster for %s has a self-contact", jid); @@ -120,15 +136,11 @@ function save_roster(username, host, roster) --end end if roster then - local metadata = roster[false]; - if not metadata then - metadata = {}; - roster[false] = metadata; - end + local metadata = roster_metadata(roster); if metadata.version ~= true then metadata.version = (metadata.version or 0) + 1; end - if roster[false].broken then return nil, "Not saving broken roster" end + if metadata.broken then return nil, "Not saving broken roster" end return datamanager.store(username, host, "roster", roster); end log("warn", "save_roster: user had no roster to save"); @@ -176,7 +188,7 @@ function process_inbound_unsubscribe(username, host, jid) local item = roster[jid]; local changed = nil; if is_contact_pending_in(username, host, jid) then - roster.pending[jid] = nil; -- TODO maybe delete roster.pending if empty? + roster[false].pending[jid] = nil; changed = true; end if item then @@ -213,7 +225,7 @@ end function is_contact_pending_in(username, host, jid) local roster = load_roster(username, host); - return roster.pending and roster.pending[jid]; + return roster[false].pending[jid]; end function set_contact_pending_in(username, host, jid, pending) local roster = load_roster(username, host); @@ -221,8 +233,7 @@ function set_contact_pending_in(username, host, jid, pending) if item and (item.subscription == "from" or item.subscription == "both") then return; -- false end - if not roster.pending then roster.pending = {}; end - roster.pending[jid] = true; + roster[false].pending[jid] = true; return save_roster(username, host, roster); end function is_contact_pending_out(username, host, jid) @@ -272,8 +283,7 @@ function subscribed(username, host, jid) else -- subscription == to item.subscription = "both"; end - roster.pending[jid] = nil; - -- TODO maybe remove roster.pending if empty + roster[false].pending[jid] = nil; return save_roster(username, host, roster); end -- TODO else implement optional feature pre-approval (ask = subscribed) end @@ -282,7 +292,7 @@ function unsubscribed(username, host, jid) local item = roster[jid]; local pending = is_contact_pending_in(username, host, jid); if pending then - roster.pending[jid] = nil; -- TODO maybe delete roster.pending if empty? + roster[false].pending[jid] = nil; end local subscribed; if item then diff --git a/plugins/mod_presence.lua b/plugins/mod_presence.lua index 9e8f37db..ab57a158 100644 --- a/plugins/mod_presence.lua +++ b/plugins/mod_presence.lua @@ -106,10 +106,8 @@ function handle_normal_presence(origin, stanza) res.presence.attr.to = nil; end end - if roster.pending then -- resend incoming subscription requests - for jid in pairs(roster.pending) do - origin.send(st.presence({type="subscribe", from=jid})); -- TODO add to attribute? Use original? - end + for jid in pairs(roster[false].pending) do -- resend incoming subscription requests + origin.send(st.presence({type="subscribe", from=jid})); -- TODO add to attribute? Use original? end local request = st.presence({type="subscribe", from=origin.username.."@"..origin.host}); for jid, item in pairs(roster) do -- resend outgoing subscription requests diff --git a/plugins/mod_roster.lua b/plugins/mod_roster.lua index 56af5368..a674740c 100644 --- a/plugins/mod_roster.lua +++ b/plugins/mod_roster.lua @@ -44,7 +44,7 @@ module:hook("iq/self/jabber:iq:roster:query", function(event) roster:query("jabber:iq:roster"); -- Client does not support versioning, or has stale roster for jid, item in pairs(session.roster) do - if jid ~= "pending" and jid then + if jid then roster:tag("item", { jid = jid, subscription = item.subscription, @@ -64,9 +64,7 @@ module:hook("iq/self/jabber:iq:roster:query", function(event) else -- stanza.attr.type == "set" local query = stanza.tags[1]; if #query.tags == 1 and query.tags[1].name == "item" - and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid - -- Protection against overwriting roster.pending, until we move it - and query.tags[1].attr.jid ~= "pending" then + and query.tags[1].attr.xmlns == "jabber:iq:roster" and query.tags[1].attr.jid then local item = query.tags[1]; local from_node, from_host = jid_split(stanza.attr.from); local jid = jid_prep(item.attr.jid); @@ -78,7 +76,7 @@ module:hook("iq/self/jabber:iq:roster:query", function(event) local r_item = roster[jid]; if r_item then local to_bare = node and (node.."@"..host) or host; -- bare JID - if r_item.subscription == "both" or r_item.subscription == "from" or (roster.pending and roster.pending[jid]) then + if r_item.subscription == "both" or r_item.subscription == "from" or roster[false].pending[jid] then core_post_stanza(session, st.presence({type="unsubscribed", from=session.full_jid, to=to_bare})); end if r_item.subscription == "both" or r_item.subscription == "to" or r_item.ask then @@ -144,8 +142,8 @@ module:hook_global("user-deleted", function(event) local bare = username .. "@" .. host; local roster = rm_load_roster(username, host); for jid, item in pairs(roster) do - if jid and jid ~= "pending" then - if item.subscription == "both" or item.subscription == "from" or (roster.pending and roster.pending[jid]) then + if jid then + if item.subscription == "both" or item.subscription == "from" or roster[false].pending[jid] then module:send(st.presence({type="unsubscribed", from=bare, to=jid})); end if item.subscription == "both" or item.subscription == "to" or item.ask then |