From 3559596245758458516d869f0345bee55928057a Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Fri, 27 Nov 2015 11:44:42 +0200 Subject: [PATCH] Add interpolation support for content --- modules/geoipbackend/geoipbackend.cc | 36 +++++++++++++++++++--------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/modules/geoipbackend/geoipbackend.cc b/modules/geoipbackend/geoipbackend.cc index ef37d5c863..cb193cd7c8 100644 --- a/modules/geoipbackend/geoipbackend.cc +++ b/modules/geoipbackend/geoipbackend.cc @@ -250,21 +250,30 @@ void GeoIPBackend::lookup(const QType &qtype, const DNSName& qdomain, DNSPacket if (!found) return; // not found } + string ip = "0.0.0.0"; + bool v6 = false; + if (pkt_p != NULL) { + ip = pkt_p->getRealRemote().toStringNoMask(); + v6 = pkt_p->getRealRemote().isIpv6(); + } + + gl.netmask = 0; + auto i = dom.records.find(search); if (i != dom.records.end()) { // return static value - for(const DNSResourceRecord& rr : i->second) { + // we want MUTABLE rr here. + for(DNSResourceRecord rr : i->second) { if (qtype == QType::ANY || rr.qtype == qtype) { + rr.content = format2str(rr.content, ip, v6, &gl); d_result.push_back(rr); d_result.back().qname = qdomain; } } - } - - string ip = "0.0.0.0"; - bool v6 = false; - if (pkt_p != NULL) { - ip = pkt_p->getRealRemote().toStringNoMask(); - v6 = pkt_p->getRealRemote().isIpv6(); + // ensure we get most strict netmask + for(DNSResourceRecord& rr: d_result) { + rr.scopeMask = gl.netmask; + } + return; // no need to go further } auto target = dom.services.find(search); @@ -283,14 +292,19 @@ void GeoIPBackend::lookup(const QType &qtype, const DNSName& qdomain, DNSPacket // see if the record can be found auto ri = dom.records.find(DNSName(format)); if (ri != dom.records.end()) { // return static value - for(DNSResourceRecord& rr : ri->second) { + // we want MUTABLE rr here. + for(DNSResourceRecord rr : ri->second) { if (qtype == QType::ANY || rr.qtype == qtype) { - rr.scopeMask = gl.netmask; + rr.content = format2str(rr.content, ip, v6, &gl); d_result.push_back(rr); d_result.back().qname = qdomain; } } - return; + // ensure we get most strict netmask + for(DNSResourceRecord& rr: d_result) { + rr.scopeMask = gl.netmask; + } + return; // no need to go further } } -- 2.47.2