diff mod_register_dnsbl/mod_register_dnsbl.lua @ 2890:6412595e2046

mod_register_dnsbl: Use async support in trunk to actually block registration if a positive match is found in the DNSBL
author Kim Alvefur <zash@zash.se>
date Fri, 23 Feb 2018 21:56:42 +0100
parents 2dcc3079572c
children 84670bac7348
line wrap: on
line diff
--- a/mod_register_dnsbl/mod_register_dnsbl.lua	Fri Feb 23 21:50:47 2018 +0100
+++ b/mod_register_dnsbl/mod_register_dnsbl.lua	Fri Feb 23 21:56:42 2018 +0100
@@ -1,4 +1,6 @@
 local adns = require "net.adns";
+local async = require "util.async";
+
 local rbl = module:get_option_string("registration_rbl");
 
 local function reverse(ip, suffix)
@@ -7,19 +9,27 @@
 	return ("%d.%d.%d.%d.%s"):format(d,c,b,a, suffix);
 end
 
--- TODO async
--- module:hook("user-registering", function (event) end);
+module:hook("user-registering", function (event)
+	local session, ip = event.session, event.ip;
+	if not ip then
+		session.log("debug", "Unable to check DNSBL when IP is unknown");
+		return;
+	end
+	local rbl_ip, err = reverse(ip, rbl);
+	if not rbl_ip then
+		session.log("debug", "Unable to check DNSBL for ip %s: %s", ip, err);
+		return;
+	end
 
-module:hook("user-registered", function (event)
-	local session = event.session;
-	local ip = session and session.ip;
-	local rbl_ip = ip and reverse(ip, rbl);
-	if rbl_ip then
-		local log = session.log;
-		adns.lookup(function (reply)
-			if reply and reply[1] then
-				log("warn", "Account %s@%s registered from IP %s found in RBL (%s)", event.username, event.host or module.host, ip, reply[1].a);
-			end
-		end, rbl_ip);
-	end
+	local wait, done = async.waiter();
+	adns.lookup(function (reply)
+		if reply and reply[1] and reply[1].a then
+			session.log("debug", "DNSBL response: %s IN A %s", rbl_ip, reply[1].a);
+			session.log("info", "Blocking %s from registering %s (dnsbl hit)", ip, event.username);
+			event.allowed = false;
+			event.reason = "Blocked by DNSBL";
+		end
+		done();
+	end, rbl_ip);
+	wait();
 end);