# HG changeset patch # User Kim Alvefur # Date 1428035968 -7200 # Node ID c78f8f8f44348c5a2be4e69ea3ba6775f2945a67 # Parent d2faaaca695dcb9052f28e58001ece2f99e42ddc# Parent 2aae36312eb941ce88df013ab4ab39861b476063 Merge 0.10->trunk diff -r d2faaaca695d -r c78f8f8f4434 core/rostermanager.lua --- a/core/rostermanager.lua Fri Mar 27 22:24:57 2015 +0000 +++ b/core/rostermanager.lua Fri Apr 03 06:39:28 2015 +0200 @@ -54,7 +54,7 @@ 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 @@ 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 @@ 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 @@ --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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 -r d2faaaca695d -r c78f8f8f4434 plugins/mod_presence.lua --- a/plugins/mod_presence.lua Fri Mar 27 22:24:57 2015 +0000 +++ b/plugins/mod_presence.lua Fri Apr 03 06:39:28 2015 +0200 @@ -106,10 +106,8 @@ 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 -r d2faaaca695d -r c78f8f8f4434 plugins/mod_roster.lua --- a/plugins/mod_roster.lua Fri Mar 27 22:24:57 2015 +0000 +++ b/plugins/mod_roster.lua Fri Apr 03 06:39:28 2015 +0200 @@ -44,7 +44,7 @@ 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 @@ 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 @@ 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 @@ 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 diff -r d2faaaca695d -r c78f8f8f4434 prosodyctl --- a/prosodyctl Fri Mar 27 22:24:57 2015 +0000 +++ b/prosodyctl Fri Apr 03 06:39:28 2015 +0200 @@ -552,6 +552,7 @@ if not hgid and hgrepo then return path.." - "..hgrepo .."!\n "; end + -- 010452cfaf53 is the first commit in the prosody-modules repository hgrepo = hgrepo == "010452cfaf53" and "prosody-modules"; return path..(hgid and " - "..(hgrepo or "HG").." rev: "..hgid or "") .."\n "; @@ -1093,7 +1094,7 @@ local x509_verify_identity = require"util.x509".verify_identity; local ssl = dependencies.softreq"ssl"; -- local datetime_parse = require"util.datetime".parse_x509; - local load_cert = ssl and ssl.x509 and ssl.x509.load; + local load_cert = ssl and ssl.loadcertificate; -- or ssl.cert_from_pem if not ssl then print("LuaSec not available, can't perform certificate checks") diff -r d2faaaca695d -r c78f8f8f4434 util-src/Makefile --- a/util-src/Makefile Fri Mar 27 22:24:57 2015 +0000 +++ b/util-src/Makefile Fri Apr 03 06:39:28 2015 +0200 @@ -14,9 +14,9 @@ .PHONY: all install clean .SUFFIXES: .c .o .so -all: encodings.so hashes.so net.so pposix.so signal.so +all: encodings.so hashes.so net.so pposix.so signal.so table.so -install: encodings.so hashes.so net.so pposix.so signal.so +install: encodings.so hashes.so net.so pposix.so signal.so table.so install *.so ../util/ clean: diff -r d2faaaca695d -r c78f8f8f4434 util-src/table.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util-src/table.c Fri Apr 03 06:39:28 2015 +0200 @@ -0,0 +1,14 @@ +#include +#include + +static int Lcreate_table(lua_State* L) { + lua_createtable(L, luaL_checkinteger(L, 1), luaL_checkinteger(L, 2)); + return 1; +} + +int luaopen_util_table(lua_State *L) { + lua_newtable(L); + lua_pushcfunction(L, Lcreate_table); + lua_setfield(L, -2, "create"); + return 1; +}