1 // This file (rust-bridge-in.rs) is included into lib.rs inside the bridge module
3 * Implement non-generated structs that need to be handled by Serde and CXX
6 // A single forward zone
7 #[derive(Deserialize, Serialize, Debug, PartialEq)]
8 #[serde(deny_unknown_fields)]
9 pub struct ForwardZone {
10 #[serde(default, skip_serializing_if = "crate::is_default")]
12 #[serde(default, skip_serializing_if = "crate::is_default")]
13 forwarders: Vec<String>,
14 #[serde(default, skip_serializing_if = "crate::is_default")]
16 #[serde(default, skip_serializing_if = "crate::is_default")]
21 #[derive(Deserialize, Serialize, Debug, PartialEq)]
22 #[serde(deny_unknown_fields)]
24 #[serde(default, skip_serializing_if = "crate::is_default")]
26 #[serde(default, skip_serializing_if = "crate::is_default")]
30 // A single trust anchor
31 #[derive(Deserialize, Serialize, Debug, PartialEq)]
32 #[serde(deny_unknown_fields)]
33 pub struct TrustAnchor {
34 #[serde(default, skip_serializing_if = "crate::is_default")]
36 #[serde(default, skip_serializing_if = "crate::is_default")]
37 dsrecords: Vec<String>,
40 // A single negative trust anchor
41 #[derive(Deserialize, Serialize, Debug, PartialEq)]
42 #[serde(deny_unknown_fields)]
43 pub struct NegativeTrustAnchor {
44 #[serde(default, skip_serializing_if = "crate::is_default")]
46 #[serde(default, skip_serializing_if = "crate::is_default")]
50 // A protobuf logging server
51 #[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
52 #[serde(deny_unknown_fields)]
53 pub struct ProtobufServer {
54 #[serde(default, skip_serializing_if = "crate::is_default")]
56 #[serde(default = "crate::U64::<2>::value", skip_serializing_if = "crate::U64::<2>::is_equal")]
58 #[serde(default = "crate::U64::<100>::value", skip_serializing_if = "crate::U64::<100>::is_equal")]
59 maxQueuedEntries: u64,
60 #[serde(default = "crate::U64::<1>::value", skip_serializing_if = "crate::U64::<1>::is_equal")]
61 reconnectWaitTime: u64,
62 #[serde(default, skip_serializing_if = "crate::is_default")]
64 #[serde(default, skip_serializing_if = "crate::is_default")]
66 #[serde(default = "crate::Bool::<true>::value", skip_serializing_if = "crate::if_true")]
68 #[serde(default = "crate::Bool::<true>::value", skip_serializing_if = "crate::if_true")]
70 #[serde(default = "crate::def_pb_export_qtypes", skip_serializing_if = "crate::default_value_equal_pb_export_qtypes")]
71 exportTypes: Vec<String>,
72 #[serde(default, skip_serializing_if = "crate::is_default")]
76 // A dnstap logging server
77 #[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
78 #[serde(deny_unknown_fields)]
79 pub struct DNSTapFrameStreamServer {
80 #[serde(default, skip_serializing_if = "crate::is_default")]
82 #[serde(default = "crate::Bool::<true>::value", skip_serializing_if = "crate::if_true")]
84 #[serde(default = "crate::Bool::<true>::value", skip_serializing_if = "crate::if_true")]
86 #[serde(default, skip_serializing_if = "crate::is_default")]
88 #[serde(default, skip_serializing_if = "crate::is_default")]
90 #[serde(default, skip_serializing_if = "crate::is_default")]
92 #[serde(default, skip_serializing_if = "crate::is_default")]
94 #[serde(default, skip_serializing_if = "crate::is_default")]
95 queueNotifyThreshold: u64,
96 #[serde(default, skip_serializing_if = "crate::is_default")]
100 // A dnstap logging NOD server
101 #[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
102 #[serde(deny_unknown_fields)]
103 pub struct DNSTapNODFrameStreamServer {
104 #[serde(default, skip_serializing_if = "crate::is_default")]
105 servers: Vec<String>,
106 #[serde(default = "crate::Bool::<true>::value", skip_serializing_if = "crate::if_true")]
108 #[serde(default, skip_serializing_if = "crate::is_default")]
110 #[serde(default, skip_serializing_if = "crate::is_default")]
112 #[serde(default, skip_serializing_if = "crate::is_default")]
114 #[serde(default, skip_serializing_if = "crate::is_default")]
116 #[serde(default, skip_serializing_if = "crate::is_default")]
117 outputQueueSize: u64,
118 #[serde(default, skip_serializing_if = "crate::is_default")]
119 queueNotifyThreshold: u64,
120 #[serde(default, skip_serializing_if = "crate::is_default")]
124 #[derive(Default, Deserialize, Serialize, Clone, Debug, PartialEq)]
125 #[serde(deny_unknown_fields)]
126 pub struct TSIGTriplet {
127 #[serde(default, skip_serializing_if = "crate::is_default")]
129 #[serde(default, skip_serializing_if = "crate::is_default")]
131 #[serde(default, skip_serializing_if = "crate::is_default")]
135 #[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
136 #[serde(deny_unknown_fields)]
138 #[serde(default, skip_serializing_if = "crate::is_default")]
140 #[serde(default, skip_serializing_if = "crate::is_default")]
141 addresses: Vec<String>,
142 #[serde(default, skip_serializing_if = "crate::is_default")]
144 #[serde(default, skip_serializing_if = "crate::is_default")]
146 #[serde(default = "crate::Bool::<true>::value", skip_serializing_if = "crate::if_true")]
147 defpolOverrideLocalData: bool,
148 #[serde(default = "crate::U32::<{u32::MAX}>::value", skip_serializing_if = "crate::U32::<{u32::MAX}>::is_equal")]
150 #[serde(default = "crate::U32::<{u32::MAX}>::value", skip_serializing_if = "crate::U32::<{u32::MAX}>::is_equal")]
151 extendedErrorCode: u32,
152 #[serde(default, skip_serializing_if = "crate::is_default")]
153 extendedErrorExtra: String,
154 #[serde(default, skip_serializing_if = "crate::is_default")]
156 #[serde(default, skip_serializing_if = "crate::is_default")]
157 ignoreDuplicates: bool,
158 #[serde(default = "crate::U32::<{u32::MAX}>::value", skip_serializing_if = "crate::U32::<{u32::MAX}>::is_equal")]
160 #[serde(default, skip_serializing_if = "crate::is_default")]
162 #[serde(default, skip_serializing_if = "crate::is_default")]
164 #[serde(default = "crate::Bool::<true>::value", skip_serializing_if = "crate::if_true")]
165 overridesGettag: bool,
166 #[serde(default, skip_serializing_if = "crate::is_default")]
168 #[serde(default, skip_serializing_if = "crate::is_default")]
170 #[serde(default, skip_serializing_if = "crate::is_default")]
172 #[serde(default, skip_serializing_if = "crate::is_default")]
173 maxReceivedMBytes: u32,
174 #[serde(default, skip_serializing_if = "crate::is_default")]
175 localAddress: String,
176 #[serde(default = "crate::U32::<20>::value", skip_serializing_if = "crate::U32::<20>::is_equal")]
178 #[serde(default, skip_serializing_if = "crate::is_default")]
180 #[serde(default, skip_serializing_if = "crate::is_default")]
184 #[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
185 #[serde(deny_unknown_fields)]
186 pub struct ZoneToCache {
187 #[serde(default, skip_serializing_if = "crate::is_default")]
189 #[serde(default, skip_serializing_if = "crate::is_default")]
191 #[serde(default, skip_serializing_if = "crate::is_default")]
192 sources: Vec<String>,
193 #[serde(default = "crate::U64::<20>::value", skip_serializing_if = "crate::U64::<20>::is_equal")]
195 #[serde(default, skip_serializing_if = "crate::is_default")]
197 #[serde(default = "crate::U64::<86400>::value", skip_serializing_if = "crate::U64::<86400>::is_equal")]
199 #[serde(default = "crate::U64::<60>::value", skip_serializing_if = "crate::U64::<60>::is_equal")]
200 retryOnErrorPeriod: u64,
201 #[serde(default, skip_serializing_if = "crate::is_default")]
202 maxReceivedMBytes: u64,
203 #[serde(default, skip_serializing_if = "crate::is_default")]
204 localAddress: String,
205 #[serde(default = "crate::def_ztc_validate", skip_serializing_if = "crate::def_value_equals_ztc_validate")]
207 #[serde(default = "crate::def_ztc_validate", skip_serializing_if = "crate::def_value_equals_ztc_validate")]
211 #[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
212 #[serde(deny_unknown_fields)]
213 pub struct SubnetOrder {
214 #[serde(default, skip_serializing_if = "crate::is_default")]
216 #[serde(default, skip_serializing_if = "crate::is_default")]
220 #[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
221 #[serde(deny_unknown_fields)]
222 pub struct SortList {
223 #[serde(default, skip_serializing_if = "crate::is_default")]
225 #[serde(default, skip_serializing_if = "crate::is_default")]
226 subnets: Vec<SubnetOrder>,
229 #[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
230 #[serde(deny_unknown_fields)]
231 pub struct AllowedAdditionalQType {
232 #[serde(default, skip_serializing_if = "crate::is_default")]
234 #[serde(default, skip_serializing_if = "crate::is_default")]
235 targets: Vec<String>,
236 #[serde(default = "crate::def_additional_mode", skip_serializing_if = "crate::default_value_equals_additional_mode")]
240 #[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
241 #[serde(deny_unknown_fields)]
242 pub struct ProxyMapping {
243 #[serde(default, skip_serializing_if = "crate::is_default")]
245 #[serde(default, skip_serializing_if = "crate::is_default")]
247 #[serde(default, skip_serializing_if = "crate::is_default")]
248 domains: Vec<String>,
251 // A struct holding both a vector of forward zones and a vector o auth zones, used by REST API code
252 #[derive(Deserialize, Serialize, Debug, PartialEq)]
253 #[serde(deny_unknown_fields)]
254 pub struct ApiZones {
255 #[serde(default, skip_serializing_if = "crate::is_default")]
256 auth_zones: Vec<AuthZone>,
257 #[serde(default, skip_serializing_if = "crate::is_default")]
258 forward_zones: Vec<ForwardZone>,
261 // Two structs used to generated YAML based on a vector of name to value mappings
262 // Cannot use Enum as CXX has only very basic Enum support
268 vec_string_val: Vec<String>,
269 vec_forwardzone_val: Vec<ForwardZone>,
270 vec_authzone_val: Vec<AuthZone>,
271 vec_trustanchor_val: Vec<TrustAnchor>,
272 vec_negativetrustanchor_val: Vec<NegativeTrustAnchor>,
273 vec_protobufserver_val: Vec<ProtobufServer>,
274 vec_dnstap_framestream_server_val: Vec<DNSTapFrameStreamServer>,
275 vec_dnstap_nod_framestream_server_val: Vec<DNSTapNODFrameStreamServer>,
276 vec_rpz_val: Vec<RPZ>,
277 vec_sortlist_val: Vec<SortList>,
278 vec_zonetocache_val: Vec<ZoneToCache>,
279 vec_allowedadditionalqtype_val: Vec<AllowedAdditionalQType>,
280 vec_proxymapping_val: Vec<ProxyMapping>,
293 * Functions callable from C++
296 // Parse a string representing YAML text and produce the corresponding data structure known to Serde
297 // The settings that can be stored in individual files get their own parse function
298 // Main recursor settings
299 fn parse_yaml_string(str: &str) -> Result<Recursorsettings>;
300 // Allow from sequence
301 fn parse_yaml_string_to_allow_from(str: &str) -> Result<Vec<String>>;
302 // Forward zones sequence
303 fn parse_yaml_string_to_forward_zones(str: &str) -> Result<Vec<ForwardZone>>;
304 // Allow notify for sequence
305 fn parse_yaml_string_to_allow_notify_for(str: &str) -> Result<Vec<String>>;
307 fn parse_yaml_string_to_api_zones(str: &str) -> Result<ApiZones>;
309 // Prdoduce a YAML formatted string given a data structure known to Serde
310 fn to_yaml_string(self: &Recursorsettings) -> Result<String>;
311 // When doing a conversion of old-style to YAML style we use a vector of OldStyle structs
312 fn map_to_yaml_string(map: &Vec<OldStyle>) -> Result<String>;
313 fn forward_zones_to_yaml_string(vec: &Vec<ForwardZone>) -> Result<String>;
314 fn allow_from_to_yaml_string(vec: &Vec<String>) -> Result<String>;
315 fn allow_from_to_yaml_string_incoming(key: &String, filekey: &String, vec: &Vec<String>) -> Result<String>;
316 fn allow_for_to_yaml_string(vec: &Vec<String>) -> Result<String>;
318 // Merge a string representing YAML settings into a existing setttings struct
319 fn merge(lhs: &mut Recursorsettings, rhs: &str) -> Result<()>;
321 // Validate the sections inside the main settings struct, sections themselves will valdiate their fields
322 fn validate(self: &Recursorsettings) -> Result<()>;
323 // The validate function below are "hand-crafted" as their structs are not generated
324 fn validate(self: &AuthZone, field: &str) -> Result<()>;
325 fn validate(self: &ForwardZone, field: &str) -> Result<()>;
326 fn validate(self: &TrustAnchor, field: &str) -> Result<()>;
327 fn validate(self: &NegativeTrustAnchor, field: &str) -> Result<()>;
328 fn validate(self: &ApiZones, field: &str) -> Result<()>;
330 // Helper functions to call the proper validate function on vectors of various kinds
331 fn validate_auth_zones(field: &str, vec: &Vec<AuthZone>) -> Result<()>;
332 fn validate_forward_zones(field: &str, vec: &Vec<ForwardZone>) -> Result<()>;
333 fn validate_allow_for(field: &str, vec: &Vec<String>) -> Result<()>;
334 fn validate_allow_notify_for(field: &str, vec: &Vec<String>) -> Result<()>;
335 fn validate_allow_from(field: &str, vec: &Vec<String>) -> Result<()>;
337 // The functions to maintain REST API managed zones
338 fn api_read_zones(path: &str) -> Result<UniquePtr<ApiZones>>;
339 fn api_add_auth_zone(file: &str, authzone: AuthZone) -> Result<()>;
340 fn api_add_forward_zone(file: &str, forwardzone: ForwardZone) -> Result<()>;
341 fn api_add_forward_zones(file: &str, forwardzones: &mut Vec<ForwardZone>) -> Result<()>;
342 fn validate_trustanchors(field: &str, vec: &Vec<TrustAnchor>) -> Result<()>;
343 fn validate_negativetrustanchors(field: &str, vec: &Vec<NegativeTrustAnchor>) -> Result<()>;
344 fn api_delete_zone(file: &str, zone: &str) -> Result<()>;
347 unsafe extern "C++" {
348 include!("bridge.hh");
349 fn qTypeStringToCode(name: &str) -> u16;
350 fn isValidHostname(name: &str) -> bool;