func_t d_func;
};
-typedef boost::variant<string,vector<pair<int, string>>, std::shared_ptr<DNSRule> > luadnsrule_t;
-
std::shared_ptr<DNSRule> makeRule(const luadnsrule_t& var)
{
- if(auto src = boost::get<std::shared_ptr<DNSRule>>(&var))
- return *src;
-
+ if (var.type() == typeid(std::shared_ptr<DNSRule>))
+ return *boost::get<std::shared_ptr<DNSRule>>(&var);
+
SuffixMatchNode smn;
NetmaskGroup nmg;
-
auto add=[&](string src) {
try {
nmg.addMask(src); // need to try mask first, all masks are domain names!
smn.add(DNSName(src));
}
};
- if(auto src = boost::get<string>(&var))
- add(*src);
- else {
- for(auto& a : boost::get<vector<pair<int, string>>>(var)) {
+
+ if (var.type() == typeid(string))
+ add(*boost::get<string>(&var));
+
+ else if (var.type() == typeid(vector<pair<int, string>>))
+ for(const auto& a : *boost::get<vector<pair<int, string>>>(&var))
add(a.second);
- }
- }
+
+ else if (var.type() == typeid(DNSName))
+ smn.add(*boost::get<DNSName>(&var));
+
+ else if (var.type() == typeid(vector<pair<int, DNSName>>))
+ for(const auto& a : *boost::get<vector<pair<int, DNSName>>>(&var))
+ smn.add(a.second);
+
if(nmg.empty())
return std::make_shared<SuffixMatchNodeRule>(smn);
else
*/
#pragma once
-typedef boost::variant<string,vector<pair<int, string>>, std::shared_ptr<DNSRule> > luadnsrule_t;
+typedef boost::variant<string, vector<pair<int, string>>, std::shared_ptr<DNSRule>, DNSName, vector<pair<int, DNSName> > > luadnsrule_t;
std::shared_ptr<DNSRule> makeRule(const luadnsrule_t& var);
mySMN:add(newDNSName("nameAndQtype.tests.powerdns.com."))
addAction(AndRule{SuffixMatchNodeRule(mySMN), QTypeRule("TXT")}, RCodeAction(dnsdist.NOTIMP))
addAction(makeRule("drop.test.powerdns.com."), DropAction())
+ addAction(newDNSName("dnsname.addaction.powerdns.com."), RCodeAction(dnsdist.REFUSED))
+ addAction({newDNSName("dnsname-table1.addaction.powerdns.com."), newDNSName("dnsname-table2.addaction.powerdns.com.")}, RCodeAction(dnsdist.REFUSED))
block=newDNSName("powerdns.org.")
function blockFilter(dq)
if(dq.qname:isPartOf(block))
self.assertEquals(query, receivedQuery)
self.assertEquals(receivedResponse, None)
+ def testAddActionDNSName(self):
+ """
+ Basics: test if addAction accepts a DNSName
+ """
+ name = 'dnsname.addaction.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ expectedResponse = dns.message.make_response(query)
+ expectedResponse.set_rcode(dns.rcode.REFUSED)
+
+ (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False)
+ self.assertEquals(receivedResponse, expectedResponse)
+
+ def testAddActionDNSNames(self):
+ """
+ Basics: test if addAction accepts a table of DNSNames
+ """
+ for name in ['dnsname-table{}.addaction.powerdns.com.'.format(i) for i in range(1,2)]:
+ query = dns.message.make_query(name, 'A', 'IN')
+ expectedResponse = dns.message.make_response(query)
+ expectedResponse.set_rcode(dns.rcode.REFUSED)
+
+ (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False)
+ self.assertEquals(receivedResponse, expectedResponse)
if __name__ == '__main__':
unittest.main()