annotate mod_admin_message/mod_admin_message.lua @ 2712:d89ab70808f6

mod_cloud_notify: fix bug when multiple resources are used This bug was triggered under the rare circumstances that a message arrived and one resource was smacks hibernated while the other one(s) were offline. Then only the hibernated resource but not the offline one(s) (or the other way round) got notified.
author tmolitor <thilo@eightysoft.de>
date Mon, 08 May 2017 18:24:29 +0200
parents 9ed6d44b9fed
children 65082d91950e
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,
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);