diff options
author | Tyler Murphy <tylermurphy534@gmail.com> | 2023-03-06 18:50:08 -0500 |
---|---|---|
committer | Tyler Murphy <tylermurphy534@gmail.com> | 2023-03-06 18:50:08 -0500 |
commit | b1fb410affb7bcd2e714abac01d22c4a5332c344 (patch) | |
tree | 7ebb621ab9b73e3e1fbaeb0ef8c19abef95b7c9f /src/dns/packet | |
parent | finialize initial dns + caching (diff) | |
download | wrapper-b1fb410affb7bcd2e714abac01d22c4a5332c344.tar.gz wrapper-b1fb410affb7bcd2e714abac01d22c4a5332c344.tar.bz2 wrapper-b1fb410affb7bcd2e714abac01d22c4a5332c344.zip |
finish dns and start webserver
Diffstat (limited to '')
-rw-r--r-- | src/dns/packet/buffer.rs (renamed from src/packet/buffer.rs) | 51 | ||||
-rw-r--r-- | src/dns/packet/header.rs (renamed from src/packet/header.rs) | 3 | ||||
-rw-r--r-- | src/dns/packet/mod.rs (renamed from src/packet/mod.rs) | 4 | ||||
-rw-r--r-- | src/dns/packet/query.rs (renamed from src/packet/query.rs) | 27 | ||||
-rw-r--r-- | src/dns/packet/question.rs (renamed from src/packet/question.rs) | 0 | ||||
-rw-r--r-- | src/dns/packet/record.rs (renamed from src/packet/record.rs) | 82 | ||||
-rw-r--r-- | src/dns/packet/result.rs (renamed from src/packet/result.rs) | 0 |
7 files changed, 115 insertions, 52 deletions
diff --git a/src/packet/buffer.rs b/src/dns/packet/buffer.rs index 4ecc605..058156e 100644 --- a/src/packet/buffer.rs +++ b/src/dns/packet/buffer.rs @@ -1,4 +1,4 @@ -use super::Result; +use crate::Result; pub struct PacketBuffer { pub buf: Vec<u8>, @@ -9,19 +9,9 @@ pub struct PacketBuffer { impl PacketBuffer { pub fn new(buf: Vec<u8>) -> Self { Self { + size: buf.len(), buf, pos: 0, - size: 0, - } - } - - fn check(&mut self, pos: usize) { - if self.size < pos { - self.size = pos; - } - - if self.buf.len() <= self.size { - self.buf.resize(self.size + 1, 0x00); } } @@ -42,32 +32,25 @@ impl PacketBuffer { } pub fn read(&mut self) -> Result<u8> { - // if self.pos >= 512 { - // error!("Tried to read past end of buffer"); - // return Err("End of buffer".into()); - // } - self.check(self.pos); + if self.pos >= self.size { + return Err("Tried to read past end of buffer".into()); + } let res = self.buf[self.pos]; self.pos += 1; - Ok(res) } pub fn get(&mut self, pos: usize) -> Result<u8> { - // if pos >= 512 { - // error!("Tried to read past end of buffer"); - // return Err("End of buffer".into()); - // } - self.check(pos); + if pos >= self.size { + return Err("Tried to read past end of buffer".into()); + } Ok(self.buf[pos]) } pub fn get_range(&mut self, start: usize, len: usize) -> Result<&[u8]> { - // if start + len >= 512 { - // error!("Tried to read past end of buffer"); - // return Err("End of buffer".into()); - // } - self.check(start + len); + if start + len >= self.size { + return Err("Tried to read past end of buffer".into()); + } Ok(&self.buf[start..start + len]) } @@ -169,7 +152,13 @@ impl PacketBuffer { } pub fn write(&mut self, val: u8) -> Result<()> { - self.check(self.pos); + if self.size < self.pos { + self.size = self.pos; + } + + if self.buf.len() <= self.size { + self.buf.resize(self.size + 1, 0x00); + } self.buf[self.pos] = val; self.pos += 1; @@ -208,7 +197,9 @@ impl PacketBuffer { } } - self.write_u8(0)?; + if !qname.is_empty() { + self.write_u8(0)?; + } Ok(()) } diff --git a/src/packet/header.rs b/src/dns/packet/header.rs index a75f6ba..2355ecb 100644 --- a/src/packet/header.rs +++ b/src/dns/packet/header.rs @@ -1,4 +1,5 @@ -use super::{buffer::PacketBuffer, result::ResultCode, Result}; +use super::{buffer::PacketBuffer, result::ResultCode}; +use crate::Result; #[derive(Clone, Debug)] pub struct DnsHeader { diff --git a/src/packet/mod.rs b/src/dns/packet/mod.rs index 0b7cb7b..9873b94 100644 --- a/src/packet/mod.rs +++ b/src/dns/packet/mod.rs @@ -4,9 +4,7 @@ use self::{ buffer::PacketBuffer, header::DnsHeader, query::QueryType, question::DnsQuestion, record::DnsRecord, }; - -type Error = Box<dyn std::error::Error>; -pub type Result<T> = std::result::Result<T, Error>; +use crate::Result; pub mod buffer; pub mod header; diff --git a/src/packet/query.rs b/src/dns/packet/query.rs index cae6f09..732b9b2 100644 --- a/src/packet/query.rs +++ b/src/dns/packet/query.rs @@ -12,6 +12,8 @@ pub enum QueryType { SRV, // 33 OPT, // 41 CAA, // 257 + AR, // 1000 + AAAAR, // 1001 } impl QueryType { @@ -29,6 +31,8 @@ impl QueryType { Self::SRV => 33, Self::OPT => 41, Self::CAA => 257, + Self::AR => 1000, + Self::AAAAR => 1001, } } @@ -45,7 +49,30 @@ impl QueryType { 33 => Self::SRV, 41 => Self::OPT, 257 => Self::CAA, + 1000 => Self::AR, + 1001 => Self::AAAAR, _ => Self::UNKNOWN(num), } } + + pub fn allowed_actions(&self) -> (bool, bool) { + // 0. duplicates allowed + // 1. allowed to be created by database + match self { + QueryType::UNKNOWN(_) => (false, false), + QueryType::A => (true, true), + QueryType::NS => (false, true), + QueryType::CNAME => (false, true), + QueryType::SOA => (false, false), + QueryType::PTR => (false, true), + QueryType::MX => (false, true), + QueryType::TXT => (true, true), + QueryType::AAAA => (true, true), + QueryType::SRV => (false, true), + QueryType::OPT => (false, false), + QueryType::CAA => (false, true), + QueryType::AR => (false, true), + QueryType::AAAAR => (false, true), + } + } } diff --git a/src/packet/question.rs b/src/dns/packet/question.rs index 9042e1c..9042e1c 100644 --- a/src/packet/question.rs +++ b/src/dns/packet/question.rs diff --git a/src/packet/record.rs b/src/dns/packet/record.rs index c29dd8f..88008f0 100644 --- a/src/packet/record.rs +++ b/src/dns/packet/record.rs @@ -1,11 +1,12 @@ use std::net::{Ipv4Addr, Ipv6Addr}; +use rand::RngCore; +use serde::{Deserialize, Serialize}; use tracing::{trace, warn}; use super::{buffer::PacketBuffer, query::QueryType, Result}; -#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -#[allow(dead_code)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)] pub enum DnsRecord { UNKNOWN { domain: String, @@ -76,10 +77,17 @@ pub enum DnsRecord { value: String, ttl: u32, }, // 257 + AR { + domain: String, + ttl: u32, + }, + AAAAR { + domain: String, + ttl: u32, + }, } impl DnsRecord { - pub fn read(buffer: &mut PacketBuffer) -> Result<Self> { let mut domain = String::new(); buffer.read_qname(&mut domain)?; @@ -90,10 +98,10 @@ impl DnsRecord { let ttl = buffer.read_u32()?; let data_len = buffer.read_u16()?; - let header_pos = buffer.pos(); - trace!("Reading DNS Record TYPE: {:?}", qtype); + let header_pos = buffer.pos(); + match qtype { QueryType::A => { let raw_addr = buffer.read_u32()?; @@ -471,6 +479,29 @@ impl DnsRecord { let size = buffer.pos() - (pos + 2); buffer.set_u16(pos, size as u16)?; } + Self::AR { ref domain, ttl } => { + buffer.write_qname(domain)?; + buffer.write_u16(QueryType::A.to_num())?; + buffer.write_u16(1)?; + buffer.write_u32(ttl)?; + buffer.write_u16(4)?; + + let mut rand = rand::thread_rng(); + buffer.write_u32(rand.next_u32())?; + } + Self::AAAAR { ref domain, ttl } => { + buffer.write_qname(domain)?; + buffer.write_u16(QueryType::A.to_num())?; + buffer.write_u16(1)?; + buffer.write_u32(ttl)?; + buffer.write_u16(4)?; + + let mut rand = rand::thread_rng(); + buffer.write_u32(rand.next_u32())?; + buffer.write_u32(rand.next_u32())?; + buffer.write_u32(rand.next_u32())?; + buffer.write_u32(rand.next_u32())?; + } Self::UNKNOWN { .. } => { warn!("Skipping record: {self:?}"); } @@ -479,20 +510,35 @@ impl DnsRecord { Ok(buffer.pos() - start_pos) } + pub fn get_domain(&self) -> String { + self.get_shared_domain().0 + } + + pub fn get_qtype(&self) -> QueryType { + self.get_shared_domain().1 + } + pub fn get_ttl(&self) -> u32 { - match *self { - DnsRecord::UNKNOWN { .. } => 0, - DnsRecord::AAAA { ttl, .. } => ttl, - DnsRecord::A { ttl, .. } => ttl, - DnsRecord::NS { ttl, .. } => ttl, - DnsRecord::CNAME { ttl, .. } => ttl, - DnsRecord::SOA { ttl, .. } => ttl, - DnsRecord::PTR { ttl, .. } => ttl, - DnsRecord::MX { ttl, .. } => ttl, - DnsRecord::TXT { ttl, .. } => ttl, - DnsRecord::SRV { ttl, .. } => ttl, - DnsRecord::CAA { ttl, .. } => ttl, + self.get_shared_domain().2 + } + + fn get_shared_domain(&self) -> (String, QueryType, u32) { + match self { + DnsRecord::UNKNOWN { + domain, ttl, qtype, .. + } => (domain.clone(), QueryType::UNKNOWN(*qtype), *ttl), + DnsRecord::AAAA { domain, ttl, .. } => (domain.clone(), QueryType::AAAA, *ttl), + DnsRecord::A { domain, ttl, .. } => (domain.clone(), QueryType::A, *ttl), + DnsRecord::NS { domain, ttl, .. } => (domain.clone(), QueryType::NS, *ttl), + DnsRecord::CNAME { domain, ttl, .. } => (domain.clone(), QueryType::CNAME, *ttl), + DnsRecord::SOA { domain, ttl, .. } => (domain.clone(), QueryType::SOA, *ttl), + DnsRecord::PTR { domain, ttl, .. } => (domain.clone(), QueryType::PTR, *ttl), + DnsRecord::MX { domain, ttl, .. } => (domain.clone(), QueryType::MX, *ttl), + DnsRecord::TXT { domain, ttl, .. } => (domain.clone(), QueryType::TXT, *ttl), + DnsRecord::SRV { domain, ttl, .. } => (domain.clone(), QueryType::SRV, *ttl), + DnsRecord::CAA { domain, ttl, .. } => (domain.clone(), QueryType::CAA, *ttl), + DnsRecord::AR { domain, ttl, .. } => (domain.clone(), QueryType::AR, *ttl), + DnsRecord::AAAAR { domain, ttl, .. } => (domain.clone(), QueryType::AAAAR, *ttl), } } - } diff --git a/src/packet/result.rs b/src/dns/packet/result.rs index 41c8ba9..41c8ba9 100644 --- a/src/packet/result.rs +++ b/src/dns/packet/result.rs |