aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/mod_blocklist.lua18
-rw-r--r--plugins/mod_offline.lua4
-rw-r--r--plugins/mod_tls.lua22
-rw-r--r--util/dataforms.lua48
4 files changed, 48 insertions, 44 deletions
diff --git a/plugins/mod_blocklist.lua b/plugins/mod_blocklist.lua
index baed6709..8589c1e9 100644
--- a/plugins/mod_blocklist.lua
+++ b/plugins/mod_blocklist.lua
@@ -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
diff --git a/plugins/mod_offline.lua b/plugins/mod_offline.lua
index c168711b..08ab8490 100644
--- a/plugins/mod_offline.lua
+++ b/plugins/mod_offline.lua
@@ -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);
diff --git a/plugins/mod_tls.lua b/plugins/mod_tls.lua
index d1138e1c..39c4649e 100644
--- a/plugins/mod_tls.lua
+++ b/plugins/mod_tls.lua
@@ -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
diff --git a/util/dataforms.lua b/util/dataforms.lua
index 244fb3f3..05846ab3 100644
--- a/util/dataforms.lua
+++ b/util/dataforms.lua
@@ -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"] =