return ret;
}
-static bool getAuth(const ZoneName& name, uint16_t qtype, SOAData* soaData)
+static bool getAuth(const ZoneName& name, uint16_t qtype, SOAData* soaData, Netmask remote)
{
static LockGuarded<UeberBackend> s_ub;
{
auto ueback = s_ub.lock();
- return ueback->getAuth(name, qtype, soaData);
+ return ueback->getAuth(name, qtype, soaData, remote);
}
}
DNSName qname;
DNSZoneRecord zone_record;
DNSName zone;
+ Netmask remote;
} lua_record_ctx_t;
static thread_local unique_ptr<lua_record_ctx_t> s_lua_record_ctx;
try {
SOAData soaData;
- if (!getAuth(rec, qtype, &soaData)) {
+ if (!getAuth(rec, qtype, &soaData, s_lua_record_ctx->remote)) {
return ret;
}
s_lua_record_ctx->qname = query;
s_lua_record_ctx->zone_record = zone_record;
s_lua_record_ctx->zone = zone;
+ s_lua_record_ctx->remote = dnsp.getRealRemote();
lua.writeVariable("qname", query);
lua.writeVariable("zone", zone);
return true;
}
- if(!B.getAuth(ZoneName(state.target), pkt.qtype, &d_sd, true, &pkt)) {
+ if(!B.getAuth(ZoneName(state.target), pkt.qtype, &d_sd, pkt.getRealRemote(), true, &pkt)) {
DLOG(g_log<<Logger::Error<<"We have no authority over zone '"<<state.target<<"'"<<endl);
if (!retargeted) {
state.r->setA(false); // drop AA if we never had a SOA in the first place
{
// test getAuth() for DS
SOAData sd;
- BOOST_REQUIRE(ub.getAuth(ZoneName("powerdns.com."), QType::DS, &sd));
+ BOOST_REQUIRE(ub.getAuth(ZoneName("powerdns.com."), QType::DS, &sd, Netmask{}));
BOOST_CHECK_EQUAL(sd.zonename.toString(), "com.");
BOOST_CHECK_EQUAL(sd.domain_id, 1);
}
{
// test getAuth() for A
SOAData sd;
- BOOST_REQUIRE(ub.getAuth(ZoneName("powerdns.com."), QType::A, &sd));
+ BOOST_REQUIRE(ub.getAuth(ZoneName("powerdns.com."), QType::A, &sd, Netmask{}));
BOOST_CHECK_EQUAL(sd.zonename.toString(), "powerdns.com.");
BOOST_CHECK_EQUAL(sd.domain_id, 2);
}
// test getAuth()
SOAData sd;
- BOOST_REQUIRE(ub.getAuth(ZoneName("2.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa."), QType::PTR, &sd));
+ BOOST_REQUIRE(ub.getAuth(ZoneName("2.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa."), QType::PTR, &sd, Netmask{}));
BOOST_CHECK_EQUAL(sd.zonename.toString(), "d.0.1.0.0.2.ip6.arpa.");
BOOST_CHECK_EQUAL(sd.domain_id, 1);
return false;
}
-bool UeberBackend::getAuth(const ZoneName& target, const QType& qtype, SOAData* soaData, bool cachedOk, DNSPacket* pkt_p)
+bool UeberBackend::getAuth(const ZoneName& target, const QType& qtype, SOAData* soaData, Netmask remote, bool cachedOk, DNSPacket* pkt_p)
{
// A backend can respond to our authority request with the 'best' match it
// has. For example, when asked for a.b.c.example.com. it might respond with
ZoneName shorter(target);
vector<pair<size_t, SOAData>> bestMatches(backends.size(), pair(target.operator const DNSName&().wirelength() + 1, SOAData()));
- Netmask remote;
- if (pkt_p != nullptr) {
- remote = pkt_p->getRealRemote();
- }
std::string view{};
if (g_zoneCache.isEnabled()) {
Netmask _remote(remote);
void lookupEnd();
/** Determines if we are authoritative for a zone, and at what level */
- bool getAuth(const ZoneName& target, const QType& qtype, SOAData* soaData, bool cachedOk = true, DNSPacket* pkt_p = nullptr);
+ bool getAuth(const ZoneName& target, const QType& qtype, SOAData* soaData, Netmask remote, bool cachedOk = true, DNSPacket* pkt_p = nullptr);
/** Load SOA info from backends, ignoring the cache.*/
bool getSOAUncached(const ZoneName& domain, SOAData& soaData);
void getAllDomains(vector<DomainInfo>* domains, bool getSerial, bool include_disabled);