From: Devdas Bhagat Date: Fri, 6 Dec 2013 11:18:17 +0000 (+0100) Subject: Add support for id.server requests following RFC 4892 X-Git-Tag: rec-3.6.0-rc1~284^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8ca1a435231ddfcf9ce5ee2dbb92073afb31fd05;p=thirdparty%2Fpdns.git Add support for id.server requests following RFC 4892 --- diff --git a/pdns/common_startup.cc b/pdns/common_startup.cc index 1a2227d878..a66a5fb0e7 100644 --- a/pdns/common_startup.cc +++ b/pdns/common_startup.cc @@ -122,7 +122,7 @@ void declareArguments() ::arg().set("negquery-cache-ttl","Seconds to store negative query results in the QueryCache")="60"; ::arg().set("query-cache-ttl","Seconds to store query results in the QueryCache")="20"; ::arg().set("soa-minimum-ttl","Default SOA minimum ttl")="3600"; - ::arg().set("server-id", "Returned when queried for 'server.id' TXT or NSID, defaults to hostname")=""; + ::arg().set("server-id", "Returned when queried for 'server.id' TXT or NSID, defaults to hostname - valid options: anonymous, disabled or custom")=""); ::arg().set("soa-refresh-default","Default SOA refresh")="10800"; ::arg().set("soa-retry-default","Default SOA retry")="3600"; ::arg().set("soa-expire-default","Default SOA expire")="604800"; diff --git a/pdns/dnspacket.cc b/pdns/dnspacket.cc index 0d2e0008b3..242eab94ca 100644 --- a/pdns/dnspacket.cc +++ b/pdns/dnspacket.cc @@ -286,7 +286,10 @@ void DNSPacket::wrapup() DNSPacketWriter::optvect_t opts; if(d_wantsnsid) { - opts.push_back(make_pair(3, ::arg()["server-id"])); + const static string mode_server_id=::arg()["server-id"]; + if(mode_server_id != "anonymous" && mode_server_id != "disabled") { + opts.push_back(make_pair(3, mode_server_id)); + } } if(!d_ednsping.empty()) { diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 1d54bcbf32..471e2e0a41 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -261,20 +261,39 @@ int PacketHandler::doVersionRequest(DNSPacket *p, DNSPacket *r, string &target) { DNSResourceRecord rr; - if(p->qclass == QClass::CHAOS && p->qtype.getCode()==QType::TXT && target=="version.bind") {// TXT + if(p->qclass == QClass::CHAOS && p->qtype.getCode()==QType::TXT && + (target == "version.bind") || (target == "id.server") || (target == "version.pdns") ) {// TXT // modes: anonymous, powerdns only, full, spoofed - const static string mode=::arg()["version-string"]; - - if(mode.empty() || mode=="full") - rr.content=fullVersionString(); - else if(mode=="anonymous") { - r->setRcode(RCode::ServFail); - return 1; + + static string mode; + if (target == "id.server") { + mode=::arg()["server-id"]; + + if (mode == "anonymous") { + r->setRcode(RCode::ServFail); + return 1; + } + else if (mode == "disabled") { + return 0; + } + else + rr.content=mode; + } // We were asked for a version, not RFC 4892 id.server + else { + mode=::arg()["version-string"]; + + if(mode.empty() || mode=="full") + rr.content=fullVersionString(); + else if(mode=="anonymous") { + r->setRcode(RCode::ServFail); + return 1; + } + else if(mode=="powerdns") { + rr.content="Served by PowerDNS - http://www.powerdns.com"; + } + else + rr.content=mode; } - else if(mode=="powerdns") - rr.content="Served by PowerDNS - http://www.powerdns.com"; - else - rr.content=mode; rr.ttl=5; rr.qname=target; diff --git a/pdns/pdns.conf-dist b/pdns/pdns.conf-dist index 4490949d4c..355d3a0580 100644 --- a/pdns/pdns.conf-dist +++ b/pdns/pdns.conf-dist @@ -325,7 +325,7 @@ # send-root-referral=no ################################# -# server-id Returned when queried for 'server.id' TXT or NSID, defaults to hostname +# server-id Returned when queried for 'server.id' TXT or NSID, defaults to hostname - valid options: anonymous, disabled or custom # # server-id=