Mercurial > prosody-modules
comparison mod_dnsbl/mod_dnsbl.lua @ 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 | b82fceda0abc |
comparison
equal
deleted
inserted
replaced
| 6425:987f0ee7d395 | 6426:bf8f96ee2605 |
|---|---|
| 1 local lfs = require "lfs"; | 1 local lfs = require "lfs"; |
| 2 | 2 |
| 3 local adns = require "net.adns"; | 3 local adns = require "net.adns"; |
| 4 local it = require "util.iterators"; | 4 local it = require "util.iterators"; |
| 5 local hex = require "util.hex"; | |
| 5 local parse_cidr = require "util.ip".parse_cidr; | 6 local parse_cidr = require "util.ip".parse_cidr; |
| 6 local parse_ip = require "util.ip".new_ip; | 7 local parse_ip = require "util.ip".new_ip; |
| 7 local promise = require "util.promise"; | 8 local promise = require "util.promise"; |
| 8 local set = require "util.set"; | 9 local set = require "util.set"; |
| 9 local st = require "util.stanza"; | 10 local st = require "util.stanza"; |
| 94 reload_file_dnsbls(); | 95 reload_file_dnsbls(); |
| 95 | 96 |
| 96 local mod_flags = module:depends("flags"); | 97 local mod_flags = module:depends("flags"); |
| 97 | 98 |
| 98 local function reverse(ip, suffix) | 99 local function reverse(ip, suffix) |
| 99 local a,b,c,d = ip:match("^(%d+).(%d+).(%d+).(%d+)$"); | 100 if ip.proto == "IPv4" then |
| 100 if not a then return end | 101 local query_string = ip.packed:reverse(); |
| 101 return ("%d.%d.%d.%d.%s"):format(d,c,b,a, suffix); | 102 return ("%d.%d.%d.%d.%s"):format( |
| 103 query_string:byte(4, 4), | |
| 104 query_string:byte(3, 3), | |
| 105 query_string:byte(2, 2), | |
| 106 query_string:byte(1, 1), | |
| 107 suffix | |
| 108 ); | |
| 109 elseif ip.proto == "IPv6" then | |
| 110 return hex.encode(ip.packed):reverse():gsub("%x", "%1.")..suffix; | |
| 111 end | |
| 102 end | 112 end |
| 103 | 113 |
| 104 function check_dnsbl(ip_address, dnsbl, callback, ud) | 114 function check_dnsbl(ip_address, dnsbl, callback, ud) |
| 105 if dnsbl:byte(1) == 64 then -- '@' | 115 if dnsbl:byte(1) == 64 then -- '@' |
| 106 local parsed_ip = parse_ip(ip_address); | 116 local parsed_ip = parse_ip(ip_address); |
| 114 else | 124 else |
| 115 if ip_address:sub(1,7):lower() == "::ffff:" then | 125 if ip_address:sub(1,7):lower() == "::ffff:" then |
| 116 ip_address = ip_address:sub(8); | 126 ip_address = ip_address:sub(8); |
| 117 end | 127 end |
| 118 | 128 |
| 119 local rbl_ip = reverse(ip_address, dnsbl); | 129 local parsed_ip = parse_ip(ip_address); |
| 120 if not rbl_ip then return; end | 130 |
| 131 local rbl_ip = reverse(parsed_ip, dnsbl); | |
| 132 if not rbl_ip then | |
| 133 module:log("warn", "Unable to query dnsbls for invalid IP: %s", parsed_ip.proto); | |
| 134 return; | |
| 135 end | |
| 121 | 136 |
| 122 module:log("debug", "Sending DNSBL lookup for %s", ip_address); | 137 module:log("debug", "Sending DNSBL lookup for %s", ip_address); |
| 123 adns.lookup(function (reply) | 138 adns.lookup(function (reply) |
| 124 local hit = not not (reply and reply[1]); | 139 local hit = not not (reply and reply[1]); |
| 125 module:log("debug", "Received DNSBL result for %s: %s", ip_address, hit and "present" or "absent"); | 140 module:log("debug", "Received DNSBL result for %s: %s", ip_address, hit and "present" or "absent"); |
