Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Tue, 11 Aug 2015 10:29:25 +0200
changeset 6778 22c8deb43daf
parent 6773 cb84731b2dfd (current diff)
parent 6777 3965662ae091 (diff)
child 6779 4412a2307c89
Merge 0.10->trunk
--- a/plugins/mod_component.lua	Mon Jul 27 09:38:40 2015 +0100
+++ b/plugins/mod_component.lua	Tue Aug 11 10:29:25 2015 +0200
@@ -33,7 +33,7 @@
 	if module:get_host_type() ~= "component" then
 		error("Don't load mod_component manually, it should be for a component, please see http://prosody.im/doc/components", 0);
 	end
-
+	
 	local env = module.environment;
 	env.connected = false;
 
@@ -44,26 +44,26 @@
 		send = nil;
 		session.on_destroy = nil;
 	end
-
+	
 	-- Handle authentication attempts by component
 	local function handle_component_auth(event)
 		local session, stanza = event.origin, event.stanza;
-
+		
 		if session.type ~= "component_unauthed" then return; end
-
+	
 		if (not session.host) or #stanza.tags > 0 then
 			(session.log or log)("warn", "Invalid component handshake for host: %s", session.host);
 			session:close("not-authorized");
 			return true;
 		end
-
+		
 		local secret = module:get_option("component_secret");
 		if not secret then
 			(session.log or log)("warn", "Component attempted to identify as %s, but component_secret is not set", session.host);
 			session:close("not-authorized");
 			return true;
 		end
-
+		
 		local supplied_token = t_concat(stanza);
 		local calculated_token = sha1(session.streamid..secret, true);
 		if supplied_token:lower() ~= calculated_token:lower() then
@@ -71,13 +71,13 @@
 			session:close{ condition = "not-authorized", text = "Given token does not match calculated token" };
 			return true;
 		end
-
+		
 		if env.connected then
 			module:log("error", "Second component attempted to connect, denying connection");
 			session:close{ condition = "conflict", text = "Component already connected" };
 			return true;
 		end
-
+		
 		env.connected = true;
 		send = session.send;
 		session.on_destroy = on_destroy;
@@ -85,7 +85,8 @@
 		session.type = "component";
 		module:log("info", "External component successfully authenticated");
 		session.send(st.stanza("handshake"));
-
+		module:fire_event("component-authenticated", { session = session });
+	
 		return true;
 	end
 	module:hook("stanza/jabber:component:accept:handshake", handle_component_auth, -1);
@@ -116,7 +117,7 @@
 		end
 		return true;
 	end
-
+	
 	module:hook("iq/bare", handle_stanza, -1);
 	module:hook("message/bare", handle_stanza, -1);
 	module:hook("presence/bare", handle_stanza, -1);
@@ -273,14 +274,14 @@
 	if opt_keepalives then
 		conn:setoption("keepalive", opt_keepalives);
 	end
-
+	
 	session.log("info", "Incoming Jabber component connection");
-
+	
 	local stream = new_xmpp_stream(session, stream_callbacks);
 	session.stream = stream;
-
+	
 	session.notopen = true;
-
+	
 	function session.reset_stream()
 		session.notopen = true;
 		session.stream:reset();
@@ -292,7 +293,7 @@
 		module:log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_"));
 		session:close("not-well-formed");
 	end
-
+	
 	session.dispatch_stanza = stream_callbacks.handlestanza;
 
 	sessions[conn] = session;
--- a/util/interpolation.lua	Mon Jul 27 09:38:40 2015 +0100
+++ b/util/interpolation.lua	Tue Aug 11 10:29:25 2015 +0200
@@ -1,6 +1,6 @@
 -- Simple template language
 --
--- The new() function takes a pattern and an escape function and returns 
+-- The new() function takes a pattern and an escape function and returns
 -- a render() function.  Both are required.
 --
 -- The function render() takes a string template and a table of values.
@@ -9,14 +9,14 @@
 -- symbol.
 --
 -- Variants are:
--- {name} is substituted for values["name"] and is escaped using the 
+-- {name} is substituted for values["name"] and is escaped using the
 -- second argument to new_render().  To disable the escaping, use {name!}.
 -- {name.item} can be used to access table items.
 -- To renter lists of items: {name# item number {idx} is {item} }
 -- Or key-value pairs: {name% t[ {idx} ] = {item} }
--- To show a defaults for missing values {name? sub-template } can be used, 
+-- To show a defaults for missing values {name? sub-template } can be used,
 -- which renders a sub-template if values["name"] is false-ish.
--- {name& sub-template } does the opposite, the sub-template is rendered 
+-- {name& sub-template } does the opposite, the sub-template is rendered
 -- if the selected value is anything but false or nil.
 
 local type, tostring = type, tostring;
@@ -24,7 +24,7 @@
 local s_sub, s_gsub, s_match = string.sub, string.gsub, string.match;
 local t_concat = table.concat;
 
-local function new_render(pat, escape)
+local function new_render(pat, escape, funcs)
 	-- assert(type(pat) == "string", "bad argument #1 to 'new_render' (string expected)");
 	-- assert(type(escape) == "function", "bad argument #2 to 'new_render' (function expected)");
 	local function render(template, values)
@@ -42,6 +42,14 @@
 					if not value then break; end
 				end
 			end
+			if funcs then
+				while value ~= nil and opt == '|' do
+					local f;
+					f, opt, e = s_match(block, "^([%a_][%w_.]*)(%p?)()", e);
+					f = funcs[f];
+					if f then value = f(value); end
+				end
+			end
 			if opt == '#' or opt == '%' then
 				if type(value) ~= "table" then return ""; end
 				local iter = opt == '#' and ipairs or pairs;
--- a/util/prosodyctl.lua	Mon Jul 27 09:38:40 2015 +0100
+++ b/util/prosodyctl.lua	Tue Aug 11 10:29:25 2015 +0200
@@ -1,7 +1,7 @@
 -- Prosody IM
 -- Copyright (C) 2008-2010 Matthew Wild
 -- Copyright (C) 2008-2010 Waqas Hussain
--- 
+--
 -- This project is MIT/X11 licensed. Please see the
 -- COPYING file in the source package for more information.
 --
@@ -146,7 +146,7 @@
 	if not(provider) or provider.name == "null" then
 		usermanager.initialize_host(host);
 	end
-	
+
 	local ok, errmsg = usermanager.create_user(user, password, host);
 	if not ok then
 		return false, errmsg;
@@ -162,7 +162,7 @@
 	if not(provider) or provider.name == "null" then
 		usermanager.initialize_host(host);
 	end
-	
+
 	return usermanager.user_exists(user, host);
 end
 
@@ -170,7 +170,7 @@
 	if not _M.user_exists(params) then
 		return false, "no-such-user";
 	end
-	
+
 	return _M.adduser(params);
 end
 
@@ -179,7 +179,7 @@
 		return false, "no-such-user";
 	end
 	local user, host = nodeprep(params.user), nameprep(params.host);
-	
+
 	return usermanager.delete_user(user, host);
 end
 
@@ -192,30 +192,30 @@
 	if type(pidfile) ~= "string" then
 		return false, "invalid-pidfile";
 	end
-	
+
 	local modules_enabled = set.new(config.get("*", "modules_disabled"));
 	if prosody.platform ~= "posix" or modules_enabled:contains("posix") then
 		return false, "no-posix";
 	end
-	
+
 	local file, err = io.open(pidfile, "r+");
 	if not file then
 		return false, "pidfile-read-failed", err;
 	end
-	
+
 	local locked, err = lfs.lock(file, "w");
 	if locked then
 		file:close();
 		return false, "pidfile-not-locked";
 	end
-	
+
 	local pid = tonumber(file:read("*a"));
 	file:close();
-	
+
 	if not pid then
 		return false, "invalid-pid";
 	end
-	
+
 	return true, pid;
 end
 
@@ -256,10 +256,10 @@
 	if not ret then
 		return false, "not-running";
 	end
-	
+
 	local ok, pid = _M.getpid()
 	if not ok then return false, pid; end
-	
+
 	signal.kill(pid, signal.SIGTERM);
 	return true;
 end
@@ -272,10 +272,10 @@
 	if not ret then
 		return false, "not-running";
 	end
-	
+
 	local ok, pid = _M.getpid()
 	if not ok then return false, pid; end
-	
+
 	signal.kill(pid, signal.SIGHUP);
 	return true;
 end
--- a/util/sql.lua	Mon Jul 27 09:38:40 2015 +0100
+++ b/util/sql.lua	Tue Aug 11 10:29:25 2015 +0200
@@ -285,7 +285,7 @@
 	if not ok then
 		return ok, err;
 	end
-	
+
 	if driver == "MySQL" then
 		local ok, actual_charset = self:transaction(function ()
 			return self:select"SHOW SESSION VARIABLES LIKE 'character_set_client'";
@@ -297,7 +297,7 @@
 			end
 		end
 	end
-	
+
 	return true;
 end
 local engine_mt = { __index = engine };