Changeset

6631:45222bfb206f

net.dns, mod_s2s: Add chasing of CNAMEs to net.dns and remove it from mod_s2s
author Kim Alvefur <zash@zash.se>
date Fri, 24 Apr 2015 14:14:01 +0200
parents 6601:debd9a7be528
children 6632:855085439f7f 6644:6cb6855f60df
files net/dns.lua plugins/mod_s2s/s2sout.lib.lua
diffstat 2 files changed, 8 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/net/dns.lua	Tue Mar 24 19:12:04 2015 +0000
+++ b/net/dns.lua	Fri Apr 24 14:14:01 2015 +0200
@@ -694,15 +694,20 @@
 end
 
 
-function resolver:peek (qname, qtype, qclass)    -- - - - - - - - - - - -  peek
+function resolver:peek (qname, qtype, qclass, n)    -- - - - - - - - - - - -  peek
 	qname, qtype, qclass = standardize(qname, qtype, qclass);
 	local rrs = get(self.cache, qclass, qtype, qname);
-	if not rrs then return nil; end
+	if not rrs then
+		if n then if n <= 0 then return end else n = 3 end
+		rrs = get(self.cache, qclass, "CNAME", qname);
+		if not (rrs and rrs[1]) then return end
+		return self:peek(rrs[1].cname, qtype, qclass, n - 1);
+	end
 	if prune(rrs, socket.gettime()) and qtype == '*' or not next(rrs) then
 		set(self.cache, qclass, qtype, qname, nil);
 		return nil;
 	end
-	if self.unsorted[rrs] then table.sort (rrs, comp_mx); end
+	if self.unsorted[rrs] then table.sort (rrs, comp_mx); self.unsorted[rrs] = nil; end
 	return rrs;
 end
 
--- a/plugins/mod_s2s/s2sout.lib.lua	Tue Mar 24 19:12:04 2015 +0000
+++ b/plugins/mod_s2s/s2sout.lib.lua	Fri Apr 24 14:14:01 2015 +0200
@@ -169,18 +169,6 @@
 			handle4 = adns.lookup(function (reply, err)
 				handle4 = nil;
 
-				-- COMPAT: This is a compromise for all you CNAME-(ab)users :)
-				if not (reply and reply[#reply] and reply[#reply].a) then
-					local count = max_dns_depth;
-					reply = dns.peek(connect_host, "CNAME", "IN");
-					while count > 0 and reply and reply[#reply] and not reply[#reply].a and reply[#reply].cname do
-						log("debug", "Looking up %s (DNS depth is %d)", tostring(reply[#reply].cname), count);
-						reply = dns.peek(reply[#reply].cname, "A", "IN") or dns.peek(reply[#reply].cname, "CNAME", "IN");
-						count = count - 1;
-					end
-				end
-				-- end of CNAME resolving
-
 				if reply and reply[#reply] and reply[#reply].a then
 					for _, ip in ipairs(reply) do
 						log("debug", "DNS reply for %s gives us %s", connect_host, ip.a);