diff options
-rw-r--r-- | core/rostermanager.lua | 40 | ||||
-rw-r--r-- | plugins/mod_presence.lua | 6 | ||||
-rw-r--r-- | plugins/mod_roster.lua | 12 | ||||
-rwxr-xr-x | prosodyctl | 3 | ||||
-rw-r--r-- | util-src/Makefile | 4 | ||||
-rw-r--r-- | util-src/table.c | 14 |
6 files changed, 50 insertions, 29 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 @@ -552,6 +552,7 @@ function commands.about(arg) 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 @@ function commands.check(arg) 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 --git a/util-src/Makefile b/util-src/Makefile index 3a1ba3f2..3674975c 100644 --- a/util-src/Makefile +++ b/util-src/Makefile @@ -14,9 +14,9 @@ CFLAGS+=-ggdb .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 --git a/util-src/table.c b/util-src/table.c new file mode 100644 index 00000000..118ee334 --- /dev/null +++ b/util-src/table.c @@ -0,0 +1,14 @@ +#include <lua.h> +#include <lauxlib.h> + +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; +} |