view mod_graceful_shutdown/mod_graceful_shutdown.lua @ 5418:f2c7bb3af600

mod_http_oauth2: Add role selector to consent page List includes all roles available to the user, if more than one. Defaults to either the first role in the scope string or the users primary role. Earlier draft listed all roles, but having options that can't be selected is bad UX and the entire list of all roles on the server could be long, and perhaps even sensitive. Allows e.g. picking a role with fewer permissions than what might otherwise have been selected. UX wise, doing this with more checkboxes or possibly radio buttons would have been confusion and/or looked messier. Fixes the previous situation where unselecting a role would default to the primary role, which could be more permissions than requested.
author Kim Alvefur <zash@zash.se>
date Fri, 05 May 2023 01:23:13 +0200
parents d4ce29c772ac
children
line wrap: on
line source

-- luacheck: ignore 122/prosody 113/prosody

local timer = require "util.timer";
local portman = require "core.portmanager";
local server = require "net.server";

module:set_global();
local orig_shutdown = prosody.shutdown;

local pause = module:get_option_number("shutdown_pause", 1);

function module.unload()
	prosody.shutdown = orig_shutdown;
end

prosody.shutdown = coroutine.wrap(function (reason, code)
	prosody.shutdown_reason = reason;
	prosody.shutdown_code = code;
	timer.add_task(pause, prosody.shutdown);
	coroutine.yield(true, "shutdown initiated");
	-- Close c2s ports, stop accepting new connections
	portman.deactivate("c2s");
	portman.deactivate("legacy_ssl");
	portman.deactivate("c2s_direct_tls");

	-- Close multiplexing ports to ensure c2s is not reachable via those either
	portman.deactivate("multiplex");
	portman.deactivate("multiplex_ssl");
	portman.deactivate("proxy"); -- mod_net_proxy

	-- Close all c2s sessions
	for _, sess in pairs(prosody.full_sessions) do
		sess:close{ condition = "system-shutdown", text = reason }
	end
	-- Wait for notifications to be sent
	coroutine.yield(pause);
	-- Event for everything else to shut down
	prosody.events.fire_event("server-stopping", {
		reason = reason;
		code = code;
	});
	-- And wait
	coroutine.yield(pause);
	-- And stop main event loop
	server.setquitting(true);
	-- And wait for death
	coroutine.yield(pause * 3);
	-- you came back? die zombie!
	os.exit(1);
end);