3 #include "rec-protobuf.hh"
6 void RecProtoBufMessage::setNOD(bool nod
)
9 d_message
.set_newlyobserveddomain(nod
);
10 #endif /* HAVE_PROTOBUF */
13 void RecProtoBufMessage::clearUDR()
16 auto response
= d_message
.mutable_response();
17 const int count
= response
->rrs_size();
18 for (int idx
= 0; idx
< count
; idx
++) {
19 auto rr
= response
->mutable_rrs(idx
);
22 #endif /* HAVE_PROTOBUF */
24 #endif /* NOD_ENABLED */
27 void RecProtoBufMessage::addRR(const DNSRecord
& record
, const std::set
<uint16_t>& exportTypes
, bool udr
)
29 void RecProtoBufMessage::addRR(const DNSRecord
& record
, const std::set
<uint16_t>& exportTypes
)
30 #endif /* NOD_ENABLED */
33 PBDNSMessage_DNSResponse
* response
= d_message
.mutable_response();
38 if (record
.d_place
!= DNSResourceRecord::ANSWER
|| record
.d_class
!= QClass::IN
) {
42 if (exportTypes
.count(record
.d_type
) == 0) {
46 PBDNSMessage_DNSResponse_DNSRR
* pbRR
= response
->add_rrs();
51 pbRR
->set_name(record
.d_name
.toString());
52 pbRR
->set_type(record
.d_type
);
53 pbRR
->set_class_(record
.d_class
);
54 pbRR
->set_ttl(record
.d_ttl
);
59 switch(record
.d_type
) {
62 const auto& content
= dynamic_cast<const ARecordContent
&>(*(record
.d_content
));
63 ComboAddress data
= content
.getCA();
64 pbRR
->set_rdata(&data
.sin4
.sin_addr
.s_addr
, sizeof(data
.sin4
.sin_addr
.s_addr
));
69 const auto& content
= dynamic_cast<const AAAARecordContent
&>(*(record
.d_content
));
70 ComboAddress data
= content
.getCA();
71 pbRR
->set_rdata(&data
.sin6
.sin6_addr
.s6_addr
, sizeof(data
.sin6
.sin6_addr
.s6_addr
));
76 const auto& content
= dynamic_cast<const CNAMERecordContent
&>(*(record
.d_content
));
77 pbRR
->set_rdata(content
.getTarget().toString());
82 const auto& content
= dynamic_cast<const TXTRecordContent
&>(*(record
.d_content
));
83 pbRR
->set_rdata(content
.d_text
);
88 const auto& content
= dynamic_cast<const NSRecordContent
&>(*(record
.d_content
));
89 pbRR
->set_rdata(content
.getNS().toString());
94 const auto& content
= dynamic_cast<const PTRRecordContent
&>(*(record
.d_content
));
95 pbRR
->set_rdata(content
.getContent().toString());
100 const auto& content
= dynamic_cast<const MXRecordContent
&>(*(record
.d_content
));
101 pbRR
->set_rdata(content
.d_mxname
.toString());
106 const auto& content
= dynamic_cast<const SPFRecordContent
&>(*(record
.d_content
));
107 pbRR
->set_rdata(content
.getText());
112 const auto& content
= dynamic_cast<const SRVRecordContent
&>(*(record
.d_content
));
113 pbRR
->set_rdata(content
.d_target
.toString());
119 #endif /* HAVE_PROTOBUF */
122 void RecProtoBufMessage::addRRs(const std::vector
<DNSRecord
>& records
, const std::set
<uint16_t>& exportTypes
)
124 for (const auto& record
: records
) {
125 addRR(record
, exportTypes
);
129 void RecProtoBufMessage::setAppliedPolicy(const std::string
& policy
)
132 PBDNSMessage_DNSResponse
* response
= d_message
.mutable_response();
133 if (response
&& !policy
.empty()) {
134 response
->set_appliedpolicy(policy
);
136 #endif /* HAVE_PROTOBUF */
139 void RecProtoBufMessage::setAppliedPolicyType(const DNSFilterEngine::PolicyType
& type
)
142 PBDNSMessage_DNSResponse
* response
= d_message
.mutable_response();
145 case DNSFilterEngine::PolicyType::None
:
146 response
->set_appliedpolicytype(PBDNSMessage_PolicyType_UNKNOWN
);
148 case DNSFilterEngine::PolicyType::QName
:
149 response
->set_appliedpolicytype(PBDNSMessage_PolicyType_QNAME
);
151 case DNSFilterEngine::PolicyType::ClientIP
:
152 response
->set_appliedpolicytype(PBDNSMessage_PolicyType_CLIENTIP
);
154 case DNSFilterEngine::PolicyType::ResponseIP
:
155 response
->set_appliedpolicytype(PBDNSMessage_PolicyType_RESPONSEIP
);
157 case DNSFilterEngine::PolicyType::NSDName
:
158 response
->set_appliedpolicytype(PBDNSMessage_PolicyType_NSDNAME
);
160 case DNSFilterEngine::PolicyType::NSIP
:
161 response
->set_appliedpolicytype(PBDNSMessage_PolicyType_NSIP
);
164 throw std::runtime_error("Unsupported protobuf policy type");
167 #endif /* HAVE_PROTOBUF */
170 void RecProtoBufMessage::setPolicyTags(const std::vector
<std::string
>& policyTags
)
173 PBDNSMessage_DNSResponse
* response
= d_message
.mutable_response();
175 for (const auto& tag
: policyTags
) {
176 response
->add_tags(tag
);
179 #endif /* HAVE_PROTOBUF */
182 void RecProtoBufMessage::addPolicyTag(const std::string
& policyTag
)
185 PBDNSMessage_DNSResponse
* response
= d_message
.mutable_response();
187 response
->add_tags(policyTag
);
192 void RecProtoBufMessage::removePolicyTag(const std::string
& policyTag
)
195 PBDNSMessage_DNSResponse
* response
= d_message
.mutable_response();
197 const int count
= response
->tags_size();
199 for (int idx
= 0; idx
< count
; ++idx
) {
200 auto tagp
= response
->mutable_tags(idx
);
201 if (tagp
->compare(policyTag
) == 0) {
205 response
->mutable_tags()->SwapElements(idx
, keep
);
210 response
->mutable_tags()->DeleteSubrange(keep
, count
- keep
);
215 std::string
RecProtoBufMessage::getAppliedPolicy() const
219 const PBDNSMessage_DNSResponse
& response
= d_message
.response();
220 result
= response
.appliedpolicy();
221 #endif /* HAVE_PROTOBUF */
225 std::vector
<std::string
> RecProtoBufMessage::getPolicyTags() const
227 std::vector
<std::string
> result
;
229 const PBDNSMessage_DNSResponse
& response
= d_message
.response();
230 const int count
= response
.tags_size();
231 for (int idx
= 0; idx
< count
; idx
++) {
232 result
.push_back(response
.tags(idx
));
234 #endif /* HAVE_PROTOBUF */