Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Thu, 17 Sep 2015 20:15:26 +0000 (22:15 +0200)
committerKim Alvefur <zash@zash.se>
Thu, 17 Sep 2015 20:15:26 +0000 (22:15 +0200)
plugins/mod_blocklist.lua
plugins/mod_offline.lua
plugins/mod_tls.lua
util/dataforms.lua

index baed6709379003bcd45dedd69eb1e681236a8b68..8589c1e9f3d0d445c39653ce19ec86d7db919399 100644 (file)
@@ -95,7 +95,8 @@ module:hook("iq-get/self/urn:xmpp:blocking:blocklist", function (event)
                end
        end
        origin.interested_blocklist = true; -- Gets notified about changes
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end);
 
 -- Add or remove some jid(s) from the blocklist
@@ -109,7 +110,8 @@ local function edit_blocklist(event)
        for item in action:childtags("item") do
                local jid = jid_prep(item.attr.jid);
                if not jid then
-                       return origin.send(st_error_reply(stanza, "modify", "jid-malformed"));
+                       origin.send(st_error_reply(stanza, "modify", "jid-malformed"));
+                       return true;
                end
                item.attr.jid = jid; -- echo back prepped
                new[jid] = is_contact_subscribed(username, module.host, jid) or false;
@@ -119,7 +121,8 @@ local function edit_blocklist(event)
 
        if mode and not next(new) then
                -- <block/> element does not contain at least one <item/> child element
-               return origin.send(st_error_reply(stanza, "modify", "bad-request"));
+               origin.send(st_error_reply(stanza, "modify", "bad-request"));
+               return true;
        end
 
        local blocklist = get_blocklist(username);
@@ -141,7 +144,8 @@ local function edit_blocklist(event)
        if ok then
                origin.send(st.reply(stanza));
        else
-               return origin.send(st_error_reply(stanza, "wait", "internal-server-error", err));
+               origin.send(st_error_reply(stanza, "wait", "internal-server-error", err));
+               return true;
        end
 
        if mode then
@@ -208,7 +212,8 @@ end
 local function bounce_stanza(event)
        local origin, stanza = event.origin, event.stanza;
        if drop_stanza(event) then
-               return origin.send(st_error_reply(stanza, "cancel", "service-unavailable"));
+               origin.send(st_error_reply(stanza, "cancel", "service-unavailable"));
+               return true;
        end
 end
 
@@ -244,8 +249,9 @@ local function bounce_outgoing(event)
                return drop_outgoing(event);
        end
        if drop_outgoing(event) then
-               return origin.send(st_error_reply(stanza, "cancel", "not-acceptable", "You have blocked this JID")
+               origin.send(st_error_reply(stanza, "cancel", "not-acceptable", "You have blocked this JID")
                        :tag("blocked", { xmlns = "urn:xmpp:blocking:errors" }));
+               return true;
        end
 end
 
index c168711b65d381606d6ed6e6be72f2f5ac782039..08ab8490bbc90a8743b1c91cf068a4466ccb49f1 100644 (file)
@@ -30,7 +30,7 @@ module:hook("message/offline/handle", function(event)
        stanza.attr.stamp, stanza.attr.stamp_legacy = nil, nil;
 
        return result;
-end);
+end, -1);
 
 module:hook("message/offline/broadcast", function(event)
        local origin = event.origin;
@@ -48,4 +48,4 @@ module:hook("message/offline/broadcast", function(event)
        end
        datamanager.list_store(node, host, "offline", nil);
        return true;
-end);
+end, -1);
index d1138e1c40e5dbf047648d69944f506f9a21dfa6..39c4649e97206bf2a51dbed349abf439ed016fc7 100644 (file)
@@ -7,6 +7,7 @@
 --
 
 local create_context = require "core.certmanager".create_context;
+local rawgetopt = require"core.configmanager".rawget;
 local st = require "util.stanza";
 
 local c2s_require_encryption = module:get_option("c2s_require_encryption", module:get_option("require_encryption"));
@@ -36,19 +37,20 @@ local ssl_ctx_c2s, ssl_ctx_s2sout, ssl_ctx_s2sin;
 local ssl_cfg_c2s, ssl_cfg_s2sout, ssl_cfg_s2sin;
 do
        local NULL, err = {};
-       local global = module:context("*");
-       local parent = module:context(module.host:match("%.(.*)$"));
+       local modhost = module.host;
+       local parent = modhost:match("%.(.*)$");
 
-       local parent_ssl = parent:get_option("ssl");
-       local host_ssl   = module:get_option("ssl", parent_ssl);
+       local global_ssl = rawgetopt("*",     "ssl") or NULL;
+       local parent_ssl = rawgetopt(parent,  "ssl") or NULL;
+       local host_ssl   = rawgetopt(modhost, "ssl") or parent_ssl;
 
-       local global_c2s = global:get_option("c2s_ssl", NULL);
-       local parent_c2s = parent:get_option("c2s_ssl", NULL);
-       local host_c2s   = module:get_option("c2s_ssl", parent_c2s);
+       local global_c2s = rawgetopt("*",     "c2s_ssl") or NULL;
+       local parent_c2s = rawgetopt(parent,  "c2s_ssl") or NULL;
+       local host_c2s   = rawgetopt(modhost, "c2s_ssl") or parent_ssl;
 
-       local global_s2s = global:get_option("s2s_ssl", NULL);
-       local parent_s2s = parent:get_option("s2s_ssl", NULL);
-       local host_s2s   = module:get_option("s2s_ssl", parent_s2s);
+       local global_s2s = rawgetopt("*",     "s2s_ssl") or NULL;
+       local parent_s2s = rawgetopt(parent,  "s2s_ssl") or NULL;
+       local host_s2s   = rawgetopt(modhost, "s2s_ssl") or parent_ssl;
 
        ssl_ctx_c2s, err, ssl_cfg_c2s = create_context(host.host, "server", host_c2s, host_ssl, global_c2s); -- for incoming client connections
        if not ssl_ctx_c2s then module:log("error", "Error creating context for c2s: %s", err); end
index 244fb3f31b3aff563c156012212058e53a4a1b59..05846ab3a5b58614df89ba1c779ecc848d096b36 100644 (file)
@@ -145,30 +145,29 @@ function form_t.data(layout, stanza)
        return data;
 end
 
-field_readers["text-single"] =
-       function (field_tag, required)
-               local data = field_tag:get_child_text("value");
-               if data and #data > 0 then
-                       return data
-               elseif required then
-                       return nil, "Required value missing";
-               end
+local function simple_text(field_tag, required)
+       local data = field_tag:get_child_text("value");
+       -- XEP-0004 does not say if an empty string is acceptable for a required value
+       -- so we will follow HTML5 which says that empty string means missing
+       if required and (data == nil or data == "") then
+               return nil, "Required value missing";
        end
+       return data; -- Return whatever get_child_text returned, even if empty string
+end
 
-field_readers["text-private"] =
-       field_readers["text-single"];
+field_readers["text-single"] = simple_text;
+
+field_readers["text-private"] = simple_text;
 
 field_readers["jid-single"] =
        function (field_tag, required)
-               local raw_data = field_tag:get_child_text("value")
+               local raw_data, err = simple_text(field_tag, required);
+               if not raw_data then return raw_data, err; end
                local data = jid_prep(raw_data);
-               if data and #data > 0 then
-                       return data
-               elseif raw_data then
+               if not data then
                        return nil, "Invalid JID: " .. raw_data;
-               elseif required then
-                       return nil, "Required value missing";
                end
+               return data;
        end
 
 field_readers["jid-multi"] =
@@ -212,8 +211,7 @@ field_readers["text-multi"] =
                return data, err;
        end
 
-field_readers["list-single"] =
-       field_readers["text-single"];
+field_readers["list-single"] = simple_text;
 
 local boolean_values = {
        ["1"] = true, ["true"] = true,
@@ -222,15 +220,13 @@ local boolean_values = {
 
 field_readers["boolean"] =
        function (field_tag, required)
-               local raw_value = field_tag:get_child_text("value");
-               local value = boolean_values[raw_value ~= nil and raw_value];
-               if value ~= nil then
-                       return value;
-               elseif raw_value then
-                       return nil, "Invalid boolean representation";
-               elseif required then
-                       return nil, "Required value missing";
+               local raw_value, err = simple_text(field_tag, required);
+               if not raw_value then return raw_value, err; end
+               local value = boolean_values[raw_value];
+               if value == nil then
+                       return nil, "Invalid boolean representation:" .. raw_value;
                end
+               return value;
        end
 
 field_readers["hidden"] =