mod_mimicking: Improve error handling
authorKim Alvefur <zash@zash.se>
Mon, 29 Apr 2019 17:27:08 +0200
changeset 9990 9cb639ef5c72
parent 9989 46c038969eb3
child 9991 521fb218098d
mod_mimicking: Improve error handling
plugins/mod_mimicking.lua
--- a/plugins/mod_mimicking.lua	Mon Apr 29 17:26:56 2019 +0200
+++ b/plugins/mod_mimicking.lua	Mon Apr 29 17:27:08 2019 +0200
@@ -22,22 +22,34 @@
 end
 
 module:hook("user-registered", function(user)
-	skeletons:set(skeleton(user.username), { username = user.username });
+	local skel = skeleton(user.username);
+	local ok, err = skeletons:set(skel, { username = user.username });
+	if not ok then
+		module:log("error", "Unable to store mimicry data (%q => %q): %s", user.username, skel, err);
+	end
 end);
 
 module:hook("user-deleted", function(user)
-	skeletons:set(skeleton(user.username), nil);
+	local skel = skeleton(user.username);
+	local ok, err = skeletons:set(skel, nil);
+	if not ok and err then
+		module:log("error", "Unable to clear mimicry data (%q): %s", skel, err);
+	end
 end);
 
 module:hook("user-registering", function(user)
-	if skeletons:get(skeleton(user.username)) then
+	local existing, err = skeletons:get(skeleton(user.username));
+	if existing then
+		module:log("debug", "Attempt to register username '%s' which could be confused with '%s'", user.username, existing.username);
 		user.allowed = false;
+	elseif err then
+		module:log("error", "Unable to check if new username '%s' can be confused with any existing user: %s", err);
 	end
 end);
 
 function module.command(arg)
 	if (arg[1] ~= "bootstrap" or not arg[2]) then
-		usage("mod_mimicking bootstrap <host>", "Initialize username mimicry index");
+		usage("mod_mimicking bootstrap <host>", "Initialize username mimicry database");
 		return;
 	end
 
@@ -53,7 +65,21 @@
 
 	skeletons = storagemanager.open(host, "skeletons");
 
+	local count = 0;
 	for user in usermanager.users(host) do
-		skeletons:set(skeleton(user), { username = user });
+		local skel = skeleton(user);
+		local existing, err = skeletons:get(skel);
+		if existing and existing.username ~= user then
+			module:log("warn", "Existing usernames '%s' and '%s' are confusable", existing.username, user);
+		elseif err then
+			module:log("error", "Error checking for existing mimicry data (%q = %q): %s", user, skel, err);
+		end
+		local ok, err = skeletons:set(skel, { username = user });
+		if ok then
+			count = count + 1;
+		elseif err then
+			module:log("error", "Unable to store mimicry data (%q => %q): %s", user, skel, err);
+		end
 	end
+	module:log("info", "%d usernames indexed", count);
 end