|
|
@ -8,30 +8,31 @@ use hickory_proto::{ |
|
|
use std::{net::IpAddr, str::FromStr}; |
|
|
use std::{net::IpAddr, str::FromStr}; |
|
|
|
|
|
|
|
|
pub fn build_dns_response(mut request: Message, domain: &str, ip: IpAddr, ttl: u32) -> Result<Message, String> { |
|
|
pub fn build_dns_response(mut request: Message, domain: &str, ip: IpAddr, ttl: u32) -> Result<Message, String> { |
|
|
|
|
|
let name = Name::from_str(domain).map_err(|e| e.to_string())?; |
|
|
let record = match ip { |
|
|
let record = match ip { |
|
|
IpAddr::V4(ip) => Record::from_rdata(Name::from_str(domain)?, ttl, RData::A(A(ip))), |
|
|
IpAddr::V4(ip) => Record::from_rdata(name.clone(), ttl, RData::A(A(ip))), |
|
|
IpAddr::V6(ip) => Record::from_rdata(Name::from_str(domain)?, ttl, RData::AAAA(AAAA(ip))), |
|
|
IpAddr::V6(ip) => Record::from_rdata(name, ttl, RData::AAAA(AAAA(ip))), |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
// We must indicate that this message is a response. Otherwise, implementations may not
|
|
|
// We must indicate that this message is a response. Otherwise, implementations may not
|
|
|
// recognize it.
|
|
|
// recognize it.
|
|
|
request.set_message_type(MessageType::Response); |
|
|
request.metadata.message_type = MessageType::Response; |
|
|
|
|
|
|
|
|
request.add_answer(record); |
|
|
request.add_answer(record); |
|
|
Ok(request) |
|
|
Ok(request) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
pub fn remove_ipv6_entries(message: &mut Message) { |
|
|
pub fn remove_ipv6_entries(message: &mut Message) { |
|
|
message.answers_mut().retain(|answer| !matches!(answer.data(), RData::AAAA(_))); |
|
|
message.answers.retain(|answer| !matches!(&answer.data, RData::AAAA(_))); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result<IpAddr, String> { |
|
|
pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result<IpAddr, String> { |
|
|
if message.response_code() != ResponseCode::NoError { |
|
|
if message.metadata.response_code != ResponseCode::NoError { |
|
|
return Err(format!("{:?}", message.response_code())); |
|
|
return Err(format!("{:?}", message.metadata.response_code)); |
|
|
} |
|
|
} |
|
|
let mut cname = None; |
|
|
let mut cname = None; |
|
|
for answer in message.answers() { |
|
|
for answer in &message.answers { |
|
|
match answer.data() { |
|
|
match &answer.data { |
|
|
RData::A(addr) => { |
|
|
RData::A(addr) => { |
|
|
return Ok(IpAddr::V4((*addr).into())); |
|
|
return Ok(IpAddr::V4((*addr).into())); |
|
|
} |
|
|
} |
|
|
@ -47,11 +48,11 @@ pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result<IpAddr, Stri |
|
|
if let Some(cname) = cname { |
|
|
if let Some(cname) = cname { |
|
|
return Err(cname); |
|
|
return Err(cname); |
|
|
} |
|
|
} |
|
|
Err(format!("{:?}", message.answers())) |
|
|
Err(format!("{:?}", message.answers)) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
pub fn extract_domain_from_dns_message(message: &Message) -> Result<String, String> { |
|
|
pub fn extract_domain_from_dns_message(message: &Message) -> Result<String, String> { |
|
|
let query = message.queries().first().ok_or("DnsRequest no query body")?; |
|
|
let query = message.queries.first().ok_or("DnsRequest no query body")?; |
|
|
let name = query.name().to_string(); |
|
|
let name = query.name().to_string(); |
|
|
Ok(name) |
|
|
Ok(name) |
|
|
} |
|
|
} |
|
|
|