summaryrefslogtreecommitdiff
path: root/src/dns/packet
diff options
context:
space:
mode:
authorTyler Murphy <tylermurphy534@gmail.com>2023-03-06 18:50:08 -0500
committerTyler Murphy <tylermurphy534@gmail.com>2023-03-06 18:50:08 -0500
commitb1fb410affb7bcd2e714abac01d22c4a5332c344 (patch)
tree7ebb621ab9b73e3e1fbaeb0ef8c19abef95b7c9f /src/dns/packet
parentfinialize initial dns + caching (diff)
downloadwrapper-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