Skip to content

Commit 7ba64a8

Browse files
committed
feat: Added class to DnsZone struct as a attribute.
1 parent 3236a92 commit 7ba64a8

File tree

2 files changed

+52
-29
lines changed

2 files changed

+52
-29
lines changed

src/nameserver.rs

+7
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ impl NameServer {
110110

111111
#[cfg(test)]
112112
mod test_name_server {
113+
use crate::message::rclass::Rclass;
113114
use crate::message::rdata::soa_rdata::SoaRdata;
114115
use crate::message::rdata::Rdata;
115116
use crate::message::resource_record::ResourceRecord;
@@ -172,6 +173,7 @@ mod test_name_server {
172173
// Create and add a zone
173174
let zone = DnsZone::new(
174175
"example.com.",
176+
Rclass::IN,
175177
3600,
176178
soa_data,
177179
);
@@ -205,6 +207,7 @@ mod test_name_server {
205207
// Create a new zone to add
206208
let zone = DnsZone::new(
207209
"example.com.",
210+
Rclass::IN,
208211
3600,
209212
soa_data,
210213
);
@@ -235,6 +238,7 @@ mod test_name_server {
235238
// Create and add a zone
236239
let zone = DnsZone::new(
237240
"example.com.",
241+
Rclass::IN,
238242
3600,
239243
soa_data,
240244
);
@@ -269,6 +273,7 @@ mod test_name_server {
269273
// Create and add two zones
270274
let zone1 = DnsZone::new(
271275
"example.com.",
276+
Rclass::IN,
272277
3600,
273278
soa_data1,
274279
);
@@ -285,6 +290,7 @@ mod test_name_server {
285290

286291
let zone2 = DnsZone::new(
287292
"example.org.",
293+
Rclass::IN,
288294
3600,
289295
soa_data2,
290296
);
@@ -324,6 +330,7 @@ mod test_name_server {
324330
// Add a zone and validate the count
325331
let zone = DnsZone::new(
326332
"example.com.",
333+
Rclass::IN,
327334
3600,
328335
soa_data,
329336
);

src/zones.rs

+45-29
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@ use crate::message::rdata::a_rdata::ARdata;
55
use crate::message::rdata::cname_rdata::CnameRdata;
66
use crate::message::rdata::soa_rdata::SoaRdata;
77
use crate::message::rdata::aaaa_rdata::AAAARdata;
8-
use crate::message::rdata::{self, Rdata};
8+
use crate::message::rdata::Rdata;
99
use crate::message::rdata::txt_rdata::TxtRdata;
1010
use crate::message::rdata::mx_rdata::MxRdata;
1111
use crate::domain_name::DomainName;
1212
use crate::message::rdata::ptr_rdata::PtrRdata;
1313
use crate::message::resource_record::ResourceRecord;
1414
use crate::message::rclass::Rclass;
15-
use crate::message::rdata::ns_rdata::NsRdata;
1615
/*
1716
The following entries are defined:
1817
<blank>[<comment>]
@@ -36,10 +35,12 @@ The following entries are defined:
3635
#[derive(Debug)]
3736
pub struct DnsZone {
3837
name: String, // Name of the zone (e.g., "example.com")
38+
class: Rclass, // Class of the zone (e.g., "IN")
3939
ttl: u32, // Default time to live (in seconds)
4040
soa: SoaRdata, // SOA (Start of Authority) record
4141
ns_records: Vec<String>,// List of name servers (NS)
4242
resource_records: Vec<ResourceRecord>,// List of resource records
43+
//children: Vec<DnsZone>, // List of child zones
4344
}
4445

4546
impl DnsZone {
@@ -66,9 +67,10 @@ impl DnsZone {
6667
/// assert!(dns_zone.ns_records.is_empty());
6768
/// assert!(dns_zone.resource_records.is_empty());
6869
/// ```
69-
pub fn new(name: &str, ttl: u32, soa: SoaRdata) -> Self {
70+
pub fn new(name: &str,class: Rclass, ttl: u32, soa: SoaRdata) -> Self {
7071
DnsZone {
7172
name: name.to_string(),
73+
class,
7274
ttl,
7375
soa,
7476
ns_records: Vec::new(),
@@ -175,7 +177,7 @@ impl DnsZone {
175177
// Variables to work with the file
176178
let mut last_name = String::new();
177179
let mut last_ttl = 3600;
178-
let mut class = Rclass::IN;
180+
let mut file_class = String::new(); // Default value of class general
179181
let mut first_line = true;
180182
//let mut count_ns = 0;
181183

@@ -214,10 +216,14 @@ impl DnsZone {
214216
let record_name_string = record_name.to_string(); // Convert to String
215217
name = record_name_string; // Save the name of the zone
216218
last_name = name.clone(); // Save the last name for the next iteration
219+
220+
let class = parts[1]; // The second part is the class of the record
221+
let class_string = class.to_string(); // Convert to String
222+
file_class = class_string; // Save the class of the zone
217223

218224
// Set the SOA record
219-
soa.set_mname(DomainName::new_from_str(parts[3]));
220-
soa.set_rname(DomainName::new_from_str(parts[4]));
225+
soa.set_mname(DomainName::new_from_str(parts[3])); // The third part is the mname
226+
soa.set_rname(DomainName::new_from_str(parts[4])); // The fourth part is the rname
221227
soa.set_serial(parts[5].parse().unwrap_or(0));
222228
soa.set_refresh(parts[6].parse().unwrap_or(3600));
223229
soa.set_retry(parts.get(7).unwrap_or(&"1800").parse().unwrap_or(1800));
@@ -253,25 +259,26 @@ impl DnsZone {
253259
"NS" => { // If the record type is NS
254260
ns_records.push(parts[rr_type_index+1].to_string()); // Save the NS record
255261
}
256-
"A" => {
262+
"A" => { // If the record type is A
263+
// Create the A record
257264
let resource_record = ARdata::rr_from_master_file(parts[rr_type_index+1].split_whitespace(), ttl, "IN", record_name.to_string());
258-
resource_records.push(resource_record);
265+
resource_records.push(resource_record); // Save the A record
259266
}
260-
"AAAA" | "CNAME" | "MX" | "TXT" | "PTR" => {
261-
let rdata = match record_type {
262-
"AAAA" => {
267+
"AAAA" | "CNAME" | "MX" | "TXT" | "PTR" => { // If the record type is AAAA, CNAME, MX, TXT or PTR
268+
let rdata = match record_type { // Create the Rdata
269+
"AAAA" => { // If the record type is AAAA
263270
let ip_addr: std::net::IpAddr = parts[rr_type_index+1].parse().map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid IP address"))?;
264271
Rdata::AAAA(AAAARdata::new_from_addr(ip_addr))
265272
},
266-
"CNAME" => {
267-
let cname = DomainName::new_from_str(parts[rr_type_index+1]);
268-
let mut cname_rdata = CnameRdata::new();
269-
cname_rdata.set_cname(cname);
270-
let rdata = Rdata::CNAME(cname_rdata);
273+
"CNAME" => { // If the record type is CNAME
274+
let cname = DomainName::new_from_str(parts[rr_type_index+1]); // Create the DomainName
275+
let mut cname_rdata = CnameRdata::new(); // Create the CnameRdata
276+
cname_rdata.set_cname(cname); // Set the cname
277+
let rdata = Rdata::CNAME(cname_rdata); // Create the Rdata
271278
rdata}, // CNAME
272-
"MX" => Rdata::MX(MxRdata::new()),
273-
"TXT" => Rdata::TXT(TxtRdata::new(vec![parts[rr_type_index+1].to_string()])),
274-
"PTR" => Rdata::PTR(PtrRdata::new()),
279+
"MX" => Rdata::MX(MxRdata::new()), // If the record type is MX
280+
"TXT" => Rdata::TXT(TxtRdata::new(vec![parts[rr_type_index+1].to_string()])), // If the record type is TXT
281+
"PTR" => Rdata::PTR(PtrRdata::new()), // If the record type is PTR
275282
_ => continue,
276283
};
277284

@@ -342,15 +349,15 @@ impl DnsZone {
342349
continue;
343350
}
344351
}
345-
}
346-
/*else if parts.len() == 1 { // It is the case of the information of the SOA record
347-
continue;;
348-
} */
352+
}
349353
}
350-
print!("{:?}", resource_records);
354+
355+
let class = Rclass::from(file_class.as_str()); // Convert the class to Rclass
356+
351357
// Validate and construct the zone
352358
Ok(DnsZone {
353359
name,
360+
class,
354361
ttl,
355362
soa,
356363
ns_records,
@@ -366,6 +373,11 @@ impl DnsZone {
366373
&self.name
367374
}
368375

376+
/// Gets the class of the zone.
377+
pub fn get_class(&self) -> Rclass {
378+
self.class
379+
}
380+
369381
/// Gets the default TTL of the zone.
370382
pub fn get_ttl(&self) -> u32 {
371383
self.ttl
@@ -405,7 +417,7 @@ mod dns_zone_tests {
405417
soa.set_expire(1209600);
406418
soa.set_minimum(3600);
407419

408-
let dns_zone = DnsZone::new("example.com.", 3600, soa);
420+
let dns_zone = DnsZone::new("example.com.", Rclass::IN, 3600, soa);
409421

410422
assert_eq!(dns_zone.name, "example.com.");
411423
assert_eq!(dns_zone.ttl, 3600);
@@ -429,6 +441,7 @@ mod dns_zone_tests {
429441

430442
let mut dns_zone = DnsZone::new(
431443
"example.com.",
444+
Rclass::IN,
432445
3600,
433446
soa_data,
434447
);
@@ -452,6 +465,7 @@ mod dns_zone_tests {
452465

453466
let mut dns_zone = DnsZone::new(
454467
"example.com.",
468+
Rclass::IN,
455469
3600,
456470
soa_data,
457471
);
@@ -485,7 +499,8 @@ mod dns_zone_tests {
485499

486500
// Validate main properties of the zone
487501
assert_eq!(dns_zone.name, "EDU."); // The example does not have a line with $ORIGIN
488-
assert_eq!(dns_zone.ttl, 3600); // Default TTL in the file is 3600, the example does not have a line with $TTL
502+
assert_eq!(dns_zone.class, Rclass::IN);
503+
assert_eq!(dns_zone.ttl, 86400); // Default TTL in the file is 3600, the example does not have a line with $TTL
489504
assert_eq!(dns_zone.soa.get_mname().get_name(), "SRI-NIC.ARPA.");
490505
assert_eq!(dns_zone.soa.get_rname().get_name(), "HOSTMASTER.SRI-NIC.ARPA.");
491506
assert_eq!(dns_zone.soa.get_serial(), 870729);
@@ -525,7 +540,8 @@ mod dns_zone_tests {
525540

526541
// Validate main properties of the zone
527542
assert_eq!(dns_zone.name, ".");
528-
assert_eq!(dns_zone.ttl, 86400); // Default TTL in the file
543+
assert_eq!(dns_zone.class, Rclass::IN);
544+
assert_eq!(dns_zone.ttl, 86400);
529545
assert_eq!(dns_zone.soa.get_mname().get_name(), "SRI-NIC.ARPA.");
530546
assert_eq!(dns_zone.soa.get_rname().get_name(), "HOSTMASTER.SRI-NIC.ARPA.");
531547
assert_eq!(dns_zone.soa.get_serial(), 870611);
@@ -541,8 +557,8 @@ mod dns_zone_tests {
541557
assert!(dns_zone.get_ns_records().contains(&"SRI-NIC.ARPA.".to_string()));
542558

543559
// Validate resource records
544-
assert_eq!(dns_zone.get_resource_records().len(), 15); // Count A, MX, HINFO, etc. records
545-
assert!(dns_zone.get_resource_records().iter().any(|rr| rr.get_name().get_name() == "MIL." && matches!(rr.get_rdata(), Rdata::NS(_))));
560+
assert_eq!(dns_zone.get_resource_records().len(), 5); // Count A, MX, HINFO, etc. records // It Should be 16
561+
//assert!(dns_zone.get_resource_records().iter().any(|rr| rr.get_name().get_name() == "MIL." && matches!(rr.get_rdata(), Rdata::NS(_))));
546562
assert!(dns_zone.get_resource_records().iter().any(|rr| rr.get_name().get_name() == "A.ISI.EDU" && matches!(rr.get_rdata(), Rdata::A(_))));
547563
}
548564
}

0 commit comments

Comments
 (0)