return ret;
}
+std::string DNSName::getRawLabel(unsigned int pos) const
+{
+ unsigned int currentPos = 0;
+ for(const unsigned char* p = (const unsigned char*) d_storage.c_str(); p < ((const unsigned char*) d_storage.c_str()) + d_storage.size() && *p; p+=*p+1, currentPos++) {
+ if (currentPos == pos) {
+ return std::string((const char*)p+1, (size_t)*p);
+ }
+ }
+
+ throw std::out_of_range("trying to get label at position "+std::to_string(pos)+" of a DNSName that only has "+std::to_string(currentPos)+" labels");
+}
bool DNSName::chopOff()
{
void appendRawLabel(const char* start, unsigned int length); //!< Append this unescaped label
void prependRawLabel(const std::string& str); //!< Prepend this unescaped label
std::vector<std::string> getRawLabels() const; //!< Individual raw unescaped labels
+ std::string getRawLabel(unsigned int pos) const; //!< Get the specified raw unescaped label
bool chopOff(); //!< Turn www.powerdns.com. into powerdns.com., returns false for .
DNSName makeRelative(const DNSName& zone) const;
DNSName makeLowerCase() const
static const DNSName drop("rpz-drop."), truncate("rpz-tcp-only."), noaction("rpz-passthru.");
static const DNSName rpzClientIP("rpz-client-ip"), rpzIP("rpz-ip"),
rpzNSDname("rpz-nsdname"), rpzNSIP("rpz-nsip.");
+ static const std::string rpzPrefix("rpz-");
DNSFilterEngine::Policy pol;
// cerr<<"Wants NOACTION for "<<dr.d_name<<": ";
pol.d_kind = DNSFilterEngine::PolicyKind::NoAction;
}
+ /* "The special RPZ encodings which are not to be taken as Local Data are
+ CNAMEs with targets that are:
+ + "." (NXDOMAIN action),
+ + "*." (NODATA action),
+ + a top level domain starting with "rpz-",
+ + a child of a top level domain starting with "rpz-".
+ */
+ else if(!crcTarget.empty() && !crcTarget.isRoot() && crcTarget.getRawLabel(crcTarget.countLabels() - 1).compare(0, rpzPrefix.length(), rpzPrefix) == 0) {
+ /* this is very likely an higher format number or a configuration error,
+ let's just ignore it. */
+ L<<Logger::Info<<"Discarding unsupported RPZ entry "<<crcTarget.toString()<<" for "<<dr.d_name<<endl;
+ return;
+ }
else {
pol.d_kind = DNSFilterEngine::PolicyKind::Custom;
pol.d_custom = dr.d_content;
}
// now to DO something with that
-
+
if(dr.d_name.isPartOf(rpzNSDname)) {
DNSName filt=dr.d_name.makeRelative(rpzNSDname);
if(addOrRemove)
BOOST_CHECK_EQUAL(sname.wirelength(), 19);
}
+BOOST_AUTO_TEST_CASE(test_getrawlabel) {
+ DNSName name("a.bb.ccc.dddd.");
+ BOOST_CHECK_EQUAL(name.getRawLabel(0), "a");
+ BOOST_CHECK_EQUAL(name.getRawLabel(1), "bb");
+ BOOST_CHECK_EQUAL(name.getRawLabel(2), "ccc");
+ BOOST_CHECK_EQUAL(name.getRawLabel(3), "dddd");
+ BOOST_CHECK_THROW(name.getRawLabel(name.countLabels()), std::out_of_range);
+}
BOOST_AUTO_TEST_SUITE_END()