aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/mod_mimicking.lua
blob: da03967fc5f00261cc3394344cae9a2cbffa6a7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
-- Prosody IM
-- Copyright (C) 2012 Florian Zeitz
-- Copyright (C) 2019 Kim Alvefur
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--

local encodings = require "util.encodings";
assert(encodings.confusable, "This module requires that Prosody be built with ICU");
local skeleton = encodings.confusable.skeleton;

local datamanager = require "util.datamanager";
local usage = require "util.prosodyctl".show_usage;
local warn = require "util.prosodyctl".show_warning;
local users = require "usermanager".users;

module:hook("user-registered", function(user)
	datamanager.store(skeleton(user.username), user.host, "skeletons", {username = user.username});
end);

module:hook("user-deregistered", function(user)
	datamanager.store(skeleton(user.username), user.host, "skeletons", nil);
end);

module:hook("registration-attempt", function(user)
	if datamanager.load(skeleton(user.username), user.host, "skeletons") then
		user.allowed = false;
	end
end);

function module.command(arg)
	if (arg[1] ~= "bootstrap" or not arg[2]) then
		usage("mod_mimicking bootstrap <host>", "Initialize skeleton database");
		return;
	end

	local host = arg[2];

	local host_session = prosody.hosts[host];
	if not host_session then
		return "No such host";
	end
	local provider = host_session.users;
	if not(provider) or provider.name == "null" then
		usermanager.initialize_host(host);
	end
	storagemanager.initialize_host(host);

	for user in users(host) do
		datamanager.store(skeleton(user), host, "skeletons", {username = user});
	end
end