mod_admin_message/mod_admin_message.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 2891 65082d91950e
permissions -rw-r--r--
mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel) Otherwise the global event handlers accumulate, one added each time logging is reoladed, and each invocation of the signal or event triggers one dump of each created ringbuffer.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1598
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
-- Prosody IM
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
--
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
-- mod_admin_message -- Console-over-XMPP implementation.
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
--
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
-- This module depends on Prosody's admin_telnet module
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
--
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
-- Copyright (C) 2008-2010 Matthew Wild
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
-- Copyright (C) 2008-2010 Waqas Hussain
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
-- Copyright (C) 2012-2013 Mikael Berthe
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
--
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
-- This project is MIT/X11 licensed. Please see the
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
-- COPYING file in the source package for more information.
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
--
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
local st = require "util.stanza";
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
local um_is_admin = require "core.usermanager".is_admin;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
local admin_telnet = module:depends("admin_telnet");
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
local telnet_def_env = module:shared("/*/admin_telnet/env");
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
local telnet_commands = module:shared("/*/admin_telnet/commands");
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
local default_env_mt = { __index = telnet_def_env };
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
local host = module.host;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
-- Create our own session.  print() will store the results in a text
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
-- string.  send(), quit(), disconnect() are no-op.
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
local function new_session ()
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
	local session = {
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
			send        = function ()  end;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
			quit        = function ()  end;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
			disconnect  = function ()  end;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
			};
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
	session.print = function (...)
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
		local t = {};
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
		for i=1,select("#", ...) do
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
			t[i] = tostring(select(i, ...));
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
		end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
		local text = "| "..table.concat(t, "\t");
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
		if session.fulltext then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
		    session.fulltext = session.fulltext .. "\n" .. text;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
		else
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
		    session.fulltext = text;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
		end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    45
	end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
	session.env = setmetatable({}, default_env_mt);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
	-- Load up environment with helper objects
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
	for name, t in pairs(telnet_def_env) do
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
		if type(t) == "table" then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
			session.env[name] = setmetatable({ session = session },
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
							 { __index = t });
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
		end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
	end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
	return session;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
local function on_message(event)
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
	-- Check the type of the incoming stanza to avoid loops:
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
	if event.stanza.attr.type == "error" then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
		return; -- We do not want to reply to these, so leave.
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
	end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
	local userjid = event.stanza.attr.from;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
	local bodytag = event.stanza:get_child("body");
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
	local body = bodytag and bodytag:get_text() or "";
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
	if not body or body == "" then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
		-- We do not reply to empty messages (chatstates, etc.)
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
		return true;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
	end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
	-- Check the requester is an admin user
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
	if not um_is_admin(userjid, module.host) then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
		module:log("info", "Ignored request from non-admin: %s",
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
			   userjid);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
		return;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    79
	end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
	-- Create a session in order to use an admin_telnet-like environment
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
	local session = new_session();
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
	-- Process the message using admin_telnet's onincoming function
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    85
	admin_telnet.console:process_line(session, body.."\n");
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
	-- Strip trailing blank line
2640
9ed6d44b9fed mod_admin_message: Fix invalid character escape (fixes #626)
Kim Alvefur <zash@zash.se>
parents: 1598
diff changeset
    88
	session.fulltext = tostring(session.fulltext):gsub("\n|%s*$", "")
1598
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    90
	-- Send the reply stanza
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    91
	local reply_stanza = st.message({ from = host, to = userjid,
2891
65082d91950e Many modules: Simplify st.message(…):tag("body"):text(…):up() into st.message(…, …)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2640
diff changeset
    92
					type = "chat" }, session.fulltext);
1598
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
	module:send(reply_stanza);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
	return true;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
local function on_presence(event)
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
	local send_presence = false;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   102
	local userjid = event.stanza.attr.from;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   103
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
	-- Check the requester is an admin user
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
	if not um_is_admin(userjid, module.host) then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   106
		module:log("info", "Ignored presence from non-admin: %s",
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   107
			   userjid);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   108
		return;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   109
	end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   110
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   111
	if (event.stanza.attr.type == "subscribe") then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   112
		module:log("info", "Subscription request from %s", userjid);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   113
		send_presence = true;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
		-- Send a subscription ack
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
		local presence_stanza = st.presence({ from = host,
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   116
					to = userjid, type = "subscribed",
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   117
					id = event.stanza.attr.id });
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   118
		module:send(presence_stanza);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   119
	elseif (event.stanza.attr.type == "probe") then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   120
		send_presence = true;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   121
	elseif (event.stanza.attr.type == "unsubscribe") then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   122
		-- For information only...
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   123
		module:log("info", "Unsubscription request from %s", userjid);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   124
	end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   125
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   126
	if (send_presence == true) then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   127
		-- Send a presence stanza
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   128
		module:send(st.presence({ from = host, to = userjid }));
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   129
	end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   130
	return true;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   131
end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   132
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   133
module:hook("message/bare", on_message);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   134
module:hook("presence/bare", on_presence);