]> granicus.if.org Git - pdns/commitdiff
Add interpolation support for content
authorAki Tuomi <cmouse@cmouse.fi>
Fri, 27 Nov 2015 09:44:42 +0000 (11:44 +0200)
committerAki Tuomi <cmouse@cmouse.fi>
Fri, 27 Nov 2015 09:44:42 +0000 (11:44 +0200)
modules/geoipbackend/geoipbackend.cc

index ef37d5c8633b5e4e57a338f5223ab23c6b23fa47..cb193cd7c88f47beb37795b65db25ee538b31824 100644 (file)
@@ -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
     }
   }