plugins/adhoc/adhoc.lib.lua
author Kim Alvefur <zash@zash.se>
Sat, 23 Mar 2024 20:48:19 +0100
changeset 13465 c673ff1075bd
parent 13024 3174308d127e
permissions -rw-r--r--
mod_posix: Move everything to util.startup This allows greater control over the order of events. Notably, the internal ordering between daemonization, initialization of libunbound and setup of signal handling is sensitive. libunbound starts a separate thread for processing DNS requests. If this thread is started before signal handling has been set up, it will not inherit the signal handlers and instead behave as it would have before signal handlers were set up, i.e. cause the whole process to immediately exit. libunbound is usually initialized on the first DNS request, usually triggered by an outgoing s2s connection attempt. If daemonization happens before signals have been set up, signals may not be processed at all.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3230
a5c3a82d677e mod_adhoc/adhoc.lib: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 3229
diff changeset
     1
-- Copyright (C) 2009-2010 Florian Zeitz
a5c3a82d677e mod_adhoc/adhoc.lib: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 3229
diff changeset
     2
--
a5c3a82d677e mod_adhoc/adhoc.lib: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 3229
diff changeset
     3
-- This file is MIT/X11 licensed. Please see the
a5c3a82d677e mod_adhoc/adhoc.lib: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 3229
diff changeset
     4
-- COPYING file in the source package for more information.
a5c3a82d677e mod_adhoc/adhoc.lib: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 3229
diff changeset
     5
--
a5c3a82d677e mod_adhoc/adhoc.lib: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 3229
diff changeset
     6
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12646
diff changeset
     7
local st, uuid = require "prosody.util.stanza", require "prosody.util.uuid";
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
local xmlns_cmd = "http://jabber.org/protocol/commands";
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
local states = {}
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
local _M = {};
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
4975
6f689c155186 adhoc.lib: Make some globals local
Kim Alvefur <zash@zash.se>
parents: 4860
diff changeset
    15
local function _cmdtag(desc, status, sessionid, action)
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
	local cmd = st.stanza("command", { xmlns = xmlns_cmd, node = desc.node, status = status });
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
	if sessionid then cmd.attr.sessionid = sessionid; end
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
	if action then cmd.attr.action = action; end
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
	return cmd;
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
end
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
function _M.new(name, node, handler, permission)
10569
421b2f8369fd mod_adhoc: Improve permission setting (fix #1482) BC
Kim Alvefur <zash@zash.se>
parents: 8475
diff changeset
    24
	if not permission then
421b2f8369fd mod_adhoc: Improve permission setting (fix #1482) BC
Kim Alvefur <zash@zash.se>
parents: 8475
diff changeset
    25
		error "adhoc.new() expects a permission argument, none given"
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12433
diff changeset
    26
	elseif permission == "user" then
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12433
diff changeset
    27
		error "the permission mode 'user' has been renamed 'any', please update your code"
10569
421b2f8369fd mod_adhoc: Improve permission setting (fix #1482) BC
Kim Alvefur <zash@zash.se>
parents: 8475
diff changeset
    28
	end
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12433
diff changeset
    29
	if permission == "admin" then
13024
3174308d127e mod_adhoc: Remove "mod_" prefix from permission action name
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
    30
		module:default_permission("prosody:admin", "adhoc:"..node);
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12433
diff changeset
    31
		permission = "check";
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12433
diff changeset
    32
	elseif permission == "global_admin" then
13024
3174308d127e mod_adhoc: Remove "mod_" prefix from permission action name
Kim Alvefur <zash@zash.se>
parents: 12981
diff changeset
    33
		module:default_permission("prosody:operator", "adhoc:"..node);
12646
9061f9621330 Switch to a new role-based authorization framework, removing is_admin()
Matthew Wild <mwild1@gmail.com>
parents: 12433
diff changeset
    34
		permission = "check";
10569
421b2f8369fd mod_adhoc: Improve permission setting (fix #1482) BC
Kim Alvefur <zash@zash.se>
parents: 8475
diff changeset
    35
	end
421b2f8369fd mod_adhoc: Improve permission setting (fix #1482) BC
Kim Alvefur <zash@zash.se>
parents: 8475
diff changeset
    36
	return { name = name, node = node, handler = handler, cmdtag = _cmdtag, permission = permission };
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
end
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
function _M.handle_cmd(command, origin, stanza)
8474
a6f58305411e Backed out changeset 84c117cdd048, broke things
Kim Alvefur <zash@zash.se>
parents: 8462
diff changeset
    40
	local cmdtag = stanza.tags[1]
a6f58305411e Backed out changeset 84c117cdd048, broke things
Kim Alvefur <zash@zash.se>
parents: 8462
diff changeset
    41
	local sessionid = cmdtag.attr.sessionid or uuid.generate();
7954
2b91da49285a mod_adhoc/adhoc.lib: instantiate table with all fields
Kim Alvefur <zash@zash.se>
parents: 6302
diff changeset
    42
	local dataIn = {
12433
16a49f04d507 adhoc: Include stanza and origin in adhoc event data
Kim Alvefur <zash@zash.se>
parents: 11355
diff changeset
    43
		origin = origin;
16a49f04d507 adhoc: Include stanza and origin in adhoc event data
Kim Alvefur <zash@zash.se>
parents: 11355
diff changeset
    44
		stanza = stanza;
7954
2b91da49285a mod_adhoc/adhoc.lib: instantiate table with all fields
Kim Alvefur <zash@zash.se>
parents: 6302
diff changeset
    45
		to = stanza.attr.to;
2b91da49285a mod_adhoc/adhoc.lib: instantiate table with all fields
Kim Alvefur <zash@zash.se>
parents: 6302
diff changeset
    46
		from = stanza.attr.from;
8474
a6f58305411e Backed out changeset 84c117cdd048, broke things
Kim Alvefur <zash@zash.se>
parents: 8462
diff changeset
    47
		action = cmdtag.attr.action or "execute";
a6f58305411e Backed out changeset 84c117cdd048, broke things
Kim Alvefur <zash@zash.se>
parents: 8462
diff changeset
    48
		form = cmdtag:get_child("x", "jabber:x:data");
7954
2b91da49285a mod_adhoc/adhoc.lib: instantiate table with all fields
Kim Alvefur <zash@zash.se>
parents: 6302
diff changeset
    49
	};
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
	local data, state = command:handler(dataIn, states[sessionid]);
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
	states[sessionid] = state;
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    53
	local cmdreply;
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
	if data.status == "completed" then
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
		states[sessionid] = nil;
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    56
		cmdreply = command:cmdtag("completed", sessionid);
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
	elseif data.status == "canceled" then
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
		states[sessionid] = nil;
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    59
		cmdreply = command:cmdtag("canceled", sessionid);
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
	elseif data.status == "error" then
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
		states[sessionid] = nil;
11355
6b541d3c4c1b adhoc.lib: Tweak to allow using util.error objects
Kim Alvefur <zash@zash.se>
parents: 10569
diff changeset
    62
		local reply = st.error_reply(stanza, data.error);
5758
ebc074918173 adhoc.lib: Don't build error reply from reply stanza
Kim Alvefur <zash@zash.se>
parents: 5075
diff changeset
    63
		origin.send(reply);
3229
0abb73c43bc8 mod_adhoc/adhoc.lib: Handle errors according to XEP
Matthew Wild <mwild1@gmail.com>
parents: 3220
diff changeset
    64
		return true;
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3484
diff changeset
    65
	else
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    66
		cmdreply = command:cmdtag("executing", sessionid);
4860
b66e73793cb7 adhoc.lib: Default actions to 'complete' (replacement for rev 52b6901cabb0)
Kim Alvefur <zash@zash.se>
parents: 4858
diff changeset
    67
		data.actions = data.actions or { "complete" };
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
	end
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
	for name, content in pairs(data) do
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
		if name == "info" then
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    72
			cmdreply:tag("note", {type="info"}):text(content):up();
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
		elseif name == "warn" then
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    74
			cmdreply:tag("note", {type="warn"}):text(content):up();
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
		elseif name == "error" then
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    76
			cmdreply:tag("note", {type="error"}):text(content.message):up();
5075
4d939d2b1574 mod_adhoc: Add support for specifying a default action
Florian Zeitz <florob@babelmonkeys.de>
parents: 4993
diff changeset
    77
		elseif name == "actions" then
4d939d2b1574 mod_adhoc: Add support for specifying a default action
Florian Zeitz <florob@babelmonkeys.de>
parents: 4993
diff changeset
    78
			local actions = st.stanza("actions", { execute = content.default });
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
			for _, action in ipairs(content) do
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
				if (action == "prev") or (action == "next") or (action == "complete") then
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
					actions:tag(action):up();
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
				else
4993
5243b74a4cbb Hopefully inert commit to clean up logging across a number of modules, removing all cases of concatenation when building log messages
Matthew Wild <mwild1@gmail.com>
parents: 4975
diff changeset
    83
					module:log("error", "Command %q at node %q provided an invalid action %q",
5243b74a4cbb Hopefully inert commit to clean up logging across a number of modules, removing all cases of concatenation when building log messages
Matthew Wild <mwild1@gmail.com>
parents: 4975
diff changeset
    84
						command.name, command.node, action);
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
				end
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
			end
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    87
			cmdreply:add_child(actions);
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
		elseif name == "form" then
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    89
			cmdreply:add_child((content.layout or content):form(content.values));
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    90
		elseif name == "result" then
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    91
			cmdreply:add_child((content.layout or content):form(content.values, "result"));
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
		elseif name == "other" then
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    93
			cmdreply:add_child(content);
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
		end
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    95
	end
5758
ebc074918173 adhoc.lib: Don't build error reply from reply stanza
Kim Alvefur <zash@zash.se>
parents: 5075
diff changeset
    96
	local reply = st.reply(stanza);
8475
d88dc6827675 adhoc.lib: Rename other variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8474
diff changeset
    97
	reply:add_child(cmdreply);
5758
ebc074918173 adhoc.lib: Don't build error reply from reply stanza
Kim Alvefur <zash@zash.se>
parents: 5075
diff changeset
    98
	origin.send(reply);
3220
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    99
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
	return true;
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
end
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   102
b3772f9bc359 mod_adhoc: Imported from prosody-modules, thanks Florob!
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   103
return _M;