plugins/mod_mimicking.lua
author Kim Alvefur <zash@zash.se>
Mon, 29 Apr 2019 17:27:08 +0200
changeset 9990 9cb639ef5c72
parent 9989 46c038969eb3
child 11852 b4d4f0339e16
permissions -rw-r--r--
mod_mimicking: Improve error handling
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
9985
8758febbaca2 mod_mimicking: Import skeleton() from current location
Kim Alvefur <zash@zash.se>
parents: 9984
diff changeset
     9
local encodings = require "util.encodings";
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
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
local usage = require "util.prosodyctl".show_usage;
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    14
local usermanager = require "core.usermanager";
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    15
local storagemanager = require "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
9986
d09575dae242 mod_mimicking: Hook the correct event names
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
    32
module:hook("user-deleted", function(user)
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    33
	local skel = skeleton(user.username);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    34
	local ok, err = skeletons:set(skel, nil);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    35
	if not ok and err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    36
		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
    37
	end
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
end);
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
9986
d09575dae242 mod_mimicking: Hook the correct event names
Kim Alvefur <zash@zash.se>
parents: 9985
diff changeset
    40
module:hook("user-registering", function(user)
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    41
	local existing, err = skeletons:get(skeleton(user.username));
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    42
	if existing then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    43
		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
    44
		user.allowed = false;
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    45
	elseif err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    46
		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
    47
	end
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
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
function module.command(arg)
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
	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
    52
		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
    53
		return;
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
	end
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
	local host = arg[2];
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
	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
    59
	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
    60
		return "No such host";
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
	end
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    62
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
	storagemanager.initialize_host(host);
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    64
	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
    65
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    66
	skeletons = storagemanager.open(host, "skeletons");
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    67
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    68
	local count = 0;
9988
bbabd35b30ae mod_mimicking: Update command to work with current code
Kim Alvefur <zash@zash.se>
parents: 9987
diff changeset
    69
	for user in usermanager.users(host) do
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    70
		local skel = skeleton(user);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    71
		local existing, err = skeletons:get(skel);
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    72
		if existing and existing.username ~= user then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    73
			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
    74
		elseif err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    75
			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
    76
		end
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    77
		local ok, err = skeletons:set(skel, { username = user });
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    78
		if ok then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    79
			count = count + 1;
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    80
		elseif err then
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    81
			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
    82
		end
9984
73a447249fe4 mod_mimicking: Prevents registration of confusable usernames (by Florob) (fixes #1347)
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
	end
9990
9cb639ef5c72 mod_mimicking: Improve error handling
Kim Alvefur <zash@zash.se>
parents: 9989
diff changeset
    84
	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
    85
end