# HG changeset patch # User Matthew Wild # Date 1773075791 0 # Node ID bf8f96ee26051c115ced9e07bcd9c4bd2ddc0eef # Parent 987f0ee7d395587743a2e4b0cec23d8350327aee mod_dnsbl: Fix support for IPv6 lookups (thanks Zash) diff -r 987f0ee7d395 -r bf8f96ee2605 mod_dnsbl/mod_dnsbl.lua --- a/mod_dnsbl/mod_dnsbl.lua Mon Mar 09 17:02:46 2026 +0000 +++ b/mod_dnsbl/mod_dnsbl.lua Mon Mar 09 17:03:11 2026 +0000 @@ -2,6 +2,7 @@ local adns = require "net.adns"; local it = require "util.iterators"; +local hex = require "util.hex"; local parse_cidr = require "util.ip".parse_cidr; local parse_ip = require "util.ip".new_ip; local promise = require "util.promise"; @@ -96,9 +97,18 @@ local mod_flags = module:depends("flags"); local function reverse(ip, suffix) - local a,b,c,d = ip:match("^(%d+).(%d+).(%d+).(%d+)$"); - if not a then return end - return ("%d.%d.%d.%d.%s"):format(d,c,b,a, suffix); + if ip.proto == "IPv4" then + local query_string = ip.packed:reverse(); + return ("%d.%d.%d.%d.%s"):format( + query_string:byte(4, 4), + query_string:byte(3, 3), + query_string:byte(2, 2), + query_string:byte(1, 1), + suffix + ); + elseif ip.proto == "IPv6" then + return hex.encode(ip.packed):reverse():gsub("%x", "%1.")..suffix; + end end function check_dnsbl(ip_address, dnsbl, callback, ud) @@ -116,8 +126,13 @@ ip_address = ip_address:sub(8); end - local rbl_ip = reverse(ip_address, dnsbl); - if not rbl_ip then return; end + local parsed_ip = parse_ip(ip_address); + + local rbl_ip = reverse(parsed_ip, dnsbl); + if not rbl_ip then + module:log("warn", "Unable to query dnsbls for invalid IP: %s", parsed_ip.proto); + return; + end module:log("debug", "Sending DNSBL lookup for %s", ip_address); adns.lookup(function (reply)