pols.erase(nm);
return true;
}
+
+DNSRecord DNSFilterEngine::Policy::getCustomRecord(const DNSName& qname) const
+{
+ if (d_kind != PolicyKind::Custom) {
+ throw std::runtime_error("Asking for a custom record from a filtering policy of a non-custom type");
+ }
+
+ DNSRecord result;
+ result.d_name = qname;
+ result.d_type = d_custom->getType();
+ result.d_ttl = d_ttl;
+ result.d_class = QClass::IN;
+ result.d_place = DNSResourceRecord::ANSWER;
+ result.d_content = d_custom;
+
+ if (result.d_type == QType::CNAME) {
+ const auto content = std::dynamic_pointer_cast<CNAMERecordContent>(d_custom);
+ if (content) {
+ DNSName target = content->getTarget();
+ if (target.isWildcard()) {
+ target.chopOff();
+ result.d_content = std::make_shared<CNAMERecordContent>(qname + target);
+ }
+ }
+ }
+
+ return result;
+}
{
return d_kind == rhs.d_kind; // XXX check d_custom too!
}
+ DNSRecord getCustomRecord(const DNSName& qname) const;
PolicyKind d_kind;
std::shared_ptr<DNSRecordContent> d_custom;
std::shared_ptr<std::string> d_name;
case DNSFilterEngine::PolicyKind::Custom:
g_stats.policyResults[appliedPolicy.d_kind]++;
res=RCode::NoError;
- spoofed.d_name=dc->d_mdp.d_qname;
- spoofed.d_type=appliedPolicy.d_custom->getType();
- spoofed.d_ttl = appliedPolicy.d_ttl;
- spoofed.d_class = 1;
- spoofed.d_content = appliedPolicy.d_custom;
- spoofed.d_place = DNSResourceRecord::ANSWER;
+ spoofed=appliedPolicy.getCustomRecord(dc->d_mdp.d_qname);
ret.push_back(spoofed);
handleRPZCustom(spoofed, QType(dc->d_mdp.d_qtype), sr, res, ret);
goto haveAnswer;
case DNSFilterEngine::PolicyKind::Custom:
ret.clear();
res=RCode::NoError;
- spoofed.d_name=dc->d_mdp.d_qname;
- spoofed.d_type=appliedPolicy.d_custom->getType();
- spoofed.d_ttl = appliedPolicy.d_ttl;
- spoofed.d_class = 1;
- spoofed.d_content = appliedPolicy.d_custom;
- spoofed.d_place = DNSResourceRecord::ANSWER;
+ spoofed=appliedPolicy.getCustomRecord(dc->d_mdp.d_qname);
ret.push_back(spoofed);
handleRPZCustom(spoofed, QType(dc->d_mdp.d_qtype), sr, res, ret);
goto haveAnswer;
case DNSFilterEngine::PolicyKind::Custom:
ret.clear();
res=RCode::NoError;
- spoofed.d_name=dc->d_mdp.d_qname;
- spoofed.d_type=appliedPolicy.d_custom->getType();
- spoofed.d_ttl = appliedPolicy.d_ttl;
- spoofed.d_class = 1;
- spoofed.d_content = appliedPolicy.d_custom;
- spoofed.d_place = DNSResourceRecord::ANSWER;
+ spoofed=appliedPolicy.getCustomRecord(dc->d_mdp.d_qname);
ret.push_back(spoofed);
handleRPZCustom(spoofed, QType(dc->d_mdp.d_qtype), sr, res, ret);
goto haveAnswer;
$SDIG $nameserver 5301 unsupported2.example.net a recurse 2>&1
echo "==> not-rpz.example.net is _not_ an RPZ target and should be processed"
$SDIG $nameserver 5301 not-rpz.example.net a recurse 2>&1
+echo "==> echo-me.wildcard-target.example.net is an RPZ wildcard target"
+$SDIG $nameserver 5301 echo-me.wildcard-target.example.net a recurse 2>&1
Reply to question for qname='not-rpz.example.net.', qtype=A
Rcode: 3 (Non-Existent domain), RD: 1, QR: 1, TC: 0, AA: 0, opcode: 0
0 not-rpz.example.net. IN CNAME 5 rpz-not.com.
+==> echo-me.wildcard-target.example.net is an RPZ wildcard target
+Reply to question for qname='echo-me.wildcard-target.example.net.', qtype=A
+Rcode: 3 (Non-Existent domain), RD: 1, QR: 1, TC: 0, AA: 0, opcode: 0
+0 echo-me.wildcard-target.example.net. IN CNAME 7200 echo-me.wildcard-target.example.net.walled-garden.example.net.
www3.example.net CNAME www4.example.net. ; Local-Data Action (to be changed in preresolve)
www5.example.net A 192.0.2.15 ; Override www5.example.net.
trillian.example.net CNAME . ; NXDOMAIN on apex, allows all sub-names (#4086)
+*.wildcard-target.example.net CNAME *.walled-garden.example.net. ; Special form of Local Data: a CNAME RR with a wildcarded target name
32.4.2.0.192.rpz-ip CNAME rpz-drop. ; www4.example.net resolves to 192.0.2.4, drop A responses with that IP