IMPORTANT: due to a drive failure, as of 13-Mar-2021, the Mercurial repository had to be re-mirrored, which changed every commit SHA. The old SHAs and trees are backed up in the vault branches. Please migrate to the new branches as soon as you can.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
prosody/core/hostmanager.lua

121 lines
3.9 KiB

-- Prosody IM
-- Copyright (C) 2008-2010 Matthew Wild
-- Copyright (C) 2008-2010 Waqas Hussain
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
local ssl = ssl
local certmanager = require "core.certmanager";
local configmanager = require "core.configmanager";
local modulemanager = require "core.modulemanager";
local events_new = require "util.events".new;
local uuid_gen = require "util.uuid".generate;
local log = require "util.logger".init("hostmanager");
local hosts = hosts;
local prosody_events = prosody.events;
if not _G.prosody.incoming_s2s then
require "core.s2smanager";
end
local incoming_s2s = _G.prosody.incoming_s2s;
local pairs, setmetatable = pairs, setmetatable;
module "hostmanager"
local hosts_loaded_once;
local function load_enabled_hosts(config)
local defined_hosts = config or configmanager.getconfig();
local activated_any_host;
for host, host_config in pairs(defined_hosts) do
if host ~= "*" and host_config.core.enabled ~= false and not host_config.core.component_module then
activated_any_host = true;
activate(host, host_config);
end
end
if not activated_any_host then
log("error", "No active VirtualHost entries in the config file. This may cause unexpected behaviour as no modules will be loaded.");
end
prosody_events.fire_event("hosts-activated", defined_hosts);
hosts_loaded_once = true;
end
prosody_events.add_handler("server-starting", load_enabled_hosts);
function activate(host, host_config)
hosts[host] = {type = "local", connected = true, sessions = {},
host = host, s2sout = {}, events = events_new(),
disallow_s2s = configmanager.get(host, "core", "disallow_s2s")
or (configmanager.get(host, "core", "anonymous_login")
and (configmanager.get(host, "core", "disallow_s2s") ~= false));
dialback_secret = configmanager.get(host, "core", "dialback_secret") or uuid_gen();
};
for option_name in pairs(host_config.core) do
if option_name:match("_ports$") or option_name:match("_interface$") then
log("warn", "%s: Option '%s' has no effect for virtual hosts - put it in the server-wide section instead", host, option_name);
end
end
hosts[host].ssl_ctx = certmanager.create_context(host, "client", host_config); -- for outgoing connections
hosts[host].ssl_ctx_in = certmanager.create_context(host, "server", host_config); -- for incoming connections
log((hosts_loaded_once and "info") or "debug", "Activated host: %s", host);
prosody_events.fire_event("host-activated", host, host_config);
end
function deactivate(host, reason)
local host_session = hosts[host];
log("info", "Deactivating host: %s", host);
prosody_events.fire_event("host-deactivating", host, host_session);
reason = reason or { condition = "host-gone", text = "This server has stopped serving "..host };
-- Disconnect local users, s2s connections
if host_session.sessions then
for username, user in pairs(host_session.sessions) do
for resource, session in pairs(user.sessions) do
log("debug", "Closing connection for %s@%s/%s", username, host, resource);
session:close(reason);
end
end
end
if host_session.s2sout then
for remotehost, session in pairs(host_session.s2sout) do
if session.close then
log("debug", "Closing outgoing connection to %s", remotehost);
if session.srv_hosts then session.srv_hosts = nil; end
session:close(reason);
end
end
end
for remote_session in pairs(incoming_s2s) do
if remote_session.to_host == host then
log("debug", "Closing incoming connection from %s", remote_session.from_host or "<unknown>");
remote_session:close(reason);
end
end
if host_session.modules then
for module in pairs(host_session.modules) do
modulemanager.unload(host, module);
end
end
hosts[host] = nil;
prosody_events.fire_event("host-deactivated", host);
log("info", "Deactivated host: %s", host);
end
function getconfig(name)
end
return _M;