return haveSomething;
}
-
-/** returns 1 in case of a straight match, 2 in case of a wildcard CNAME (groan), 0 in case of no hit */
-int PacketHandler::doWildcardRecords(DNSPacket *p, DNSPacket *r, string &target)
-{
- DNSResourceRecord rr;
- bool found=false, retargeted=false;
-
- // try chopping off domains and look for wildcard matches
-
- // *.pietje.nl IN A 1.2.3.4
- // pietje.nl should now NOT match, but www.pietje.nl should
-
- string subdomain=target;
- string::size_type pos;
-
- while((pos=subdomain.find("."))!=string::npos) {
- subdomain=subdomain.substr(pos+1);
- // DLOG();
-
- string searchstr=string("*.")+subdomain;
-
- B.lookup(QType(QType::ANY), searchstr,p); // start our search at the backend
-
- while(B.get(rr)) { // read results
- if(retargeted)
- continue;
- found=true;
- if((p->qtype.getCode()==QType::ANY || rr.qtype==p->qtype) || rr.qtype.getCode()==QType::CNAME) {
- rr.qname=target;
-
- if(d_doFancyRecords && p->qtype.getCode()==QType::ANY && (rr.qtype.getCode()==QType::URL || rr.qtype.getCode()==QType::CURL)) {
- rr.content=::arg()["urlredirector"];
- rr.qtype=QType::A;
- }
-
- r->addRecord(rr); // and add
- if(rr.qtype.getCode()==QType::CNAME) {
- if(target==rr.content) {
- L<<Logger::Error<<"Ignoring wildcard CNAME '"<<rr.qname<<"' pointing at itself"<<endl;
- r->setRcode(RCode::ServFail);
- continue;
- }
-
- DLOG(L<<Logger::Error<<"Retargeting because of wildcard cname, from "<<target<<" to "<<rr.content<<endl);
-
- target=rr.content; // retarget
- retargeted=true;
- }
- }
- else if(d_doFancyRecords && ::arg().mustDo("wildcard-url") && p->qtype.getCode()==QType::A && rr.qtype.getName()=="URL") {
- rr.content=::arg()["urlredirector"];
- rr.qtype=QType::A;
- rr.qname=target;
-
- r->addRecord(rr);
- }
- }
- if(found) {
- DLOG(L<<"Wildcard match on '"<<string("*.")+subdomain<<"'"<<", retargeted="<<retargeted<<endl);
- return retargeted ? 2 : 1;
- }
- }
- DLOG(L<<"Returning no hit for '"<<string("*.")+subdomain<<"'"<<endl);
- return 0;
-}
-
/** dangling is declared true if we were unable to resolve everything */
int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, const SOAData& soadata)
{
int processNotify(DNSPacket *);
void addRootReferral(DNSPacket *r);
int makeCanonic(DNSPacket *p, DNSPacket *r, string &target);
- int doWildcardRecords(DNSPacket *p, DNSPacket *r, string &target);
int findMboxFW(DNSPacket *p, DNSPacket *r, string &target);
int findUrl(DNSPacket *p, DNSPacket *r, string &target);
int doFancyRecords(DNSPacket *p, DNSPacket *r, string &target);