Mercurial > prosody-modules
changeset 6426:bf8f96ee2605
mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 09 Mar 2026 17:03:11 +0000 |
| parents | 987f0ee7d395 |
| children | 03e46a11eac6 |
| files | mod_dnsbl/mod_dnsbl.lua |
| diffstat | 1 files changed, 20 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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)
