plugins/mod_mimicking.lua
author Kim Alvefur <zash@zash.se>
Wed, 27 Mar 2024 19:33:11 +0100
changeset 13471 c2a476f4712a
parent 12981 74b9e05af71e
permissions -rw-r--r--
util.startup: Fix exiting on pidfile trouble prosody.shutdown() relies on prosody.main_thread, which has not been set yet at this point. Doing a clean shutdown might actually be harmful in case it tears down things set up by the conflicting Prosody, such as the very pidfile we were looking at. Thanks again SigmaTel71 for noticing
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- Prosody IM
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
-- Copyright (C) 2012 Florian Zeitz
9985
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9984
diff changeset
     3
-- Copyright (C) 2019 Kim Alvefur
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
--
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
-- COPYING file in the source package for more information.
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
--
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11852
diff changeset
     9
local encodings = require "prosody.util.encodings";
9985
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9984
diff changeset
    10
assert(encodings.confusable, "This module requires that Prosody be built with ICU");
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9984
diff changeset
    11
local skeleton = encodings.confusable.skeleton;
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9984
diff changeset
    12
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11852
diff changeset
    13
local usage = require "prosody.util.prosodyctl".show_usage;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11852
diff changeset
    14
local usermanager = require "prosody.core.usermanager";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11852
diff changeset
    15
local storagemanager = require "prosody.core.storagemanager";
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    17
local skeletons
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    18
function module.load()
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    19
	if module.host ~= "*" then
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    20
		skeletons = module:open_store("skeletons");
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    21
	end
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    22
end
9987
f7d11503fdce mod_mimicking: Use new storage API
Kim Alvefur <zash@zash.se>
parents: 9986
diff changeset
    23
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
module:hook("user-registered", function(user)
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    25
	local skel = skeleton(user.username);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    26
	local ok, err = skeletons:set(skel, { username = user.username });
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    27
	if not ok then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    28
		module:log("error", "Unable to store mimicry data (%q => %q): %s", user.username, skel, err);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    29
	end
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
end);
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
11852
b4d4f0339e16 mod_mimicking: Correctly hook the *global* user-deleted event
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
    32
module:hook_global("user-deleted", function(user)
b4d4f0339e16 mod_mimicking: Correctly hook the *global* user-deleted event
Kim Alvefur <zash@zash.se>
parents: 9990
diff changeset
    33
	if user.host ~= module.host then return end
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    34
	local skel = skeleton(user.username);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    35
	local ok, err = skeletons:set(skel, nil);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    36
	if not ok and err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    37
		module:log("error", "Unable to clear mimicry data (%q): %s", skel, err);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    38
	end
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
end);
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
9986
d09575dae242 mod_mimicking: Hook the correct event names
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
    41
module:hook("user-registering", function(user)
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    42
	local existing, err = skeletons:get(skeleton(user.username));
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    43
	if existing then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    44
		module:log("debug", "Attempt to register username '%s' which could be confused with '%s'", user.username, existing.username);
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
		user.allowed = false;
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    46
	elseif err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    47
		module:log("error", "Unable to check if new username '%s' can be confused with any existing user: %s", err);
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
	end
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
end);
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
function module.command(arg)
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
	if (arg[1] ~= "bootstrap" or not arg[2]) then
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    53
		usage("mod_mimicking bootstrap <host>", "Initialize username mimicry database");
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
		return;
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
	end
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
	local host = arg[2];
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
	local host_session = prosody.hosts[host];
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
	if not host_session then
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
		return "No such host";
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
	end
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    63
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
	storagemanager.initialize_host(host);
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    65
	usermanager.initialize_host(host);
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    67
	skeletons = storagemanager.open(host, "skeletons");
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    68
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    69
	local count = 0;
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    70
	for user in usermanager.users(host) do
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    71
		local skel = skeleton(user);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    72
		local existing, err = skeletons:get(skel);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    73
		if existing and existing.username ~= user then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    74
			module:log("warn", "Existing usernames '%s' and '%s' are confusable", existing.username, user);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    75
		elseif err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    76
			module:log("error", "Error checking for existing mimicry data (%q = %q): %s", user, skel, err);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    77
		end
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    78
		local ok, err = skeletons:set(skel, { username = user });
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    79
		if ok then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    80
			count = count + 1;
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    81
		elseif err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    82
			module:log("error", "Unable to store mimicry data (%q => %q): %s", user, skel, err);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    83
		end
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
	end
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    85
	module:log("info", "%d usernames indexed", count);
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
end