annotate mod_admin_message/mod_admin_message.lua @ 5401:c8d04ac200fc

mod_http_oauth2: Reject loopback URIs as client_uri This really should be a proper website with info, https://localhost is not good enough. Ideally we'd validate that it's got proper DNS and is actually reachable, but triggering HTTP or even DNS lookups seems like it would carry abuse potential that would best to avoid.
author Kim Alvefur <zash@zash.se>
date Tue, 02 May 2023 16:20:55 +0200
parents 65082d91950e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1594
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
2636
9ed6d44b9fed mod_admin_message: Fix invalid character escape (fixes #626)
Kim Alvefur <zash@zash.se>
parents: 1594
diff changeset
88 session.fulltext = tostring(session.fulltext):gsub("\n|%s*$", "")
1594
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,
2887
65082d91950e Many modules: Simplify st.message(…):tag("body"):text(…):up() into st.message(…, …)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 2636
diff changeset
92 type = "chat" }, session.fulltext);
1594
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);