view mod_alias/mod_alias.lua @ 4326:f6fdefc5c6ac

mod_roster_command: Fix subscription when the "user JID" is a bare domain. Do not attempt to update the roster when the user is bare domain (e.g. a component), since they don't have rosters and the attempt results in an error: $ prosodyctl mod_roster_command subscribe proxy.example.com contact@example.com xxxxxxxxxxFailed to execute command: Error: /usr/lib/prosody/core/rostermanager.lua:104: attempt to concatenate local 'username' (a nil value) stack traceback: /usr/lib/prosody/core/rostermanager.lua:104: in function 'load_roster' /usr/lib/prosody/core/rostermanager.lua:305: in function 'set_contact_pending_out' mod_roster_command.lua:44: in function 'subscribe'
author Boris Grozev <boris@jitsi.org>
date Tue, 05 Jan 2021 13:15:00 -0600
parents 65082d91950e
children
line wrap: on
line source

-- Copyright (C) 2015 Travis Burtrum
-- This file is MIT/X11 licensed.

-- set like so in prosody config, works on full or bare jids, or hosts:
--aliases = {
--		["old@example.net"] = "new@example.net";
--		["you@example.com"] = "you@example.net";
--		["conference.example.com"] = "conference.example.net";
--}

local aliases = module:get_option("aliases", {});
local alias_response = module:get_option("alias_response", "User $alias can be contacted at $target");

local st = require "util.stanza";

function handle_alias(event)

	if event.stanza.attr.type ~= "error" then
		local alias = event.stanza.attr.to;
		local target = aliases[alias];
		if target then
			local replacements = {
				alias = alias,
				target = target
			};
			local error_message = alias_response:gsub("%$([%w_]+)", function (v)
					return replacements[v] or nil;
				end);
			local message = st.message({ type = "chat", from = alias, to = event.stanza.attr.from }, error_message);
			module:send(message);
			return event.origin.send(st.error_reply(event.stanza, "cancel", "gone", error_message));
		end
	end

end

module:hook("message/bare", handle_alias, 300);
module:hook("message/full", handle_alias, 300);
module:hook("message/host", handle_alias, 300);

module:hook("presence/bare", handle_alias, 300);
module:hook("presence/full", handle_alias, 300);
module:hook("presence/host", handle_alias, 300);