Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Thu, 17 Sep 2015 22:15:26 +0200
changeset 6838 3afb8aa78069
parent 6831 9019bc4c9a5a (current diff)
parent 6837 750a97b45f88 (diff)
child 6839 9f45f0fe5aef
Merge 0.10->trunk
plugins/muc/muc.lib.lua
--- a/plugins/mod_blocklist.lua	Thu Sep 17 13:02:09 2015 -0700
+++ b/plugins/mod_blocklist.lua	Thu Sep 17 22:15:26 2015 +0200
@@ -95,7 +95,8 @@
 		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 @@
 	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 @@
 
 	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 @@
 	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 @@
 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 @@
 		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
 
--- a/plugins/mod_offline.lua	Thu Sep 17 13:02:09 2015 -0700
+++ b/plugins/mod_offline.lua	Thu Sep 17 22:15:26 2015 +0200
@@ -30,7 +30,7 @@
 	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 @@
 	end
 	datamanager.list_store(node, host, "offline", nil);
 	return true;
-end);
+end, -1);
--- a/plugins/mod_tls.lua	Thu Sep 17 13:02:09 2015 -0700
+++ b/plugins/mod_tls.lua	Thu Sep 17 22:15:26 2015 +0200
@@ -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_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
--- a/util/dataforms.lua	Thu Sep 17 13:02:09 2015 -0700
+++ b/util/dataforms.lua	Thu Sep 17 22:15:26 2015 +0200
@@ -145,30 +145,29 @@
 	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 @@
 		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 @@
 
 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"] =