Software /
code /
prosody
File
net/resolvers/basic.lua @ 10360:64ddcbc9a328
core.stanza_router: Do strict jidprep on c2s
Be conservative in what you let your clients send, be liberal in what
you let in via s2s.
Being strict on s2s leads to interop problems and poor experiences, ie
users being ejected from MUCs if something invalid enters. By starting
with tightening up input into the network, we may be able to gradually
approach a point where no invalid JIDs are allowed.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 09 Sep 2019 22:32:01 +0200 |
parent | 9691:e11e076f0eb8 |
child | 10386:cf93a951da37 |
line wrap: on
line source
local adns = require "net.adns"; local inet_pton = require "util.net".pton; local unpack = table.unpack or unpack; -- luacheck: ignore 113 local methods = {}; local resolver_mt = { __index = methods }; -- Find the next target to connect to, and -- pass it to cb() function methods:next(cb) if self.targets then if #self.targets == 0 then cb(nil); return; end local next_target = table.remove(self.targets, 1); cb(unpack(next_target, 1, 4)); return; end local targets = {}; local n = 2; local function ready() n = n - 1; if n > 0 then return; end self.targets = targets; self:next(cb); end local is_ip = inet_pton(self.hostname); if is_ip then if #is_ip == 16 then cb(self.conn_type.."6", self.hostname, self.port, self.extra); elseif #is_ip == 4 then cb(self.conn_type.."4", self.hostname, self.port, self.extra); end return; end -- Resolve DNS to target list local dns_resolver = adns.resolver(); dns_resolver:lookup(function (answer) if answer then for _, record in ipairs(answer) do table.insert(targets, { self.conn_type.."4", record.a, self.port, self.extra }); end end ready(); end, self.hostname, "A", "IN"); dns_resolver:lookup(function (answer) if answer then for _, record in ipairs(answer) do table.insert(targets, { self.conn_type.."6", record.aaaa, self.port, self.extra }); end end ready(); end, self.hostname, "AAAA", "IN"); end local function new(hostname, port, conn_type, extra) return setmetatable({ hostname = hostname; port = port; conn_type = conn_type or "tcp"; extra = extra; }, resolver_mt); end return { new = new; };