annotate mod_admin_message/mod_admin_message.lua @ 1702:725ebd494000

mod_smacks_offline: Monkeypatch mod_smacks to send unacked messages to offline storage IFF there was only one session
author Kim Alvefur <zash@zash.se>
date Wed, 06 May 2015 00:55:00 +0200
parents 620cc035ae1e
children 9ed6d44b9fed
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
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
88 session.fulltext = tostring(session.fulltext):gsub("\n\|%s*$", "")
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,
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
92 type = "chat" });
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
93 reply_stanza = reply_stanza:body(session.fulltext);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
94 module:send(reply_stanza);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
95
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
96 return true;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
97 end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
98
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
99 local function on_presence(event)
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
100
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
101 local send_presence = false;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
102
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
103 local userjid = event.stanza.attr.from;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
104
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
105 -- Check the requester is an admin user
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
106 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
107 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
108 userjid);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
109 return;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
110 end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
111
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
112 if (event.stanza.attr.type == "subscribe") then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
113 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
114 send_presence = true;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
115 -- Send a subscription ack
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
116 local presence_stanza = st.presence({ from = host,
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
117 to = userjid, type = "subscribed",
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
118 id = event.stanza.attr.id });
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
119 module:send(presence_stanza);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
120 elseif (event.stanza.attr.type == "probe") then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
121 send_presence = true;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
122 elseif (event.stanza.attr.type == "unsubscribe") then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
123 -- For information only...
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
124 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
125 end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
126
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
127 if (send_presence == true) then
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
128 -- Send a presence stanza
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
129 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
130 end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
131 return true;
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
132 end
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
133
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
134 module:hook("message/bare", on_message);
620cc035ae1e mod_admin_message: New IM-based administration console
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
135 module:hook("presence/bare", on_presence);