Skip to content

Commit

Permalink
Fix: NXDOMAIN only when domain does not exist
Browse files Browse the repository at this point in the history
  • Loading branch information
xerbalind committed Oct 29, 2024
1 parent 9c3d152 commit a4bf483
Showing 1 changed file with 37 additions and 32 deletions.
69 changes: 37 additions & 32 deletions zns-daemon/src/handlers/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,29 @@ impl ResponseHandler for QueryHandler {
match answers {
Ok(mut rrs) => {
if rrs.is_empty() {
rrs.extend(try_wildcard(question, connection)?);
if rrs.is_empty() {
if question.qtype == Type::Type(RRType::SOA)
&& Config::get().default_soa
{
rrs.extend([get_soa(&question.qname)?])
} else {
return Err(ZNSError::NXDomain {
domain: question.qname.to_string(),
qtype: question.qtype.clone(),
});
}
let domain_records = get_from_database(
&question.qname,
None,
question.qclass.clone(),
connection,
)?;

if domain_records.is_empty() && !question.qname.is_empty() {
rrs.extend(try_wildcard(question, connection)?);
}

if rrs.is_empty()
&& question.qtype == Type::Type(RRType::SOA)
&& Config::get().default_soa
{
rrs.extend([get_soa(&question.qname)?])
}

if rrs.is_empty() && domain_records.is_empty() {
return Err(ZNSError::NXDomain {
domain: question.qname.to_string(),
qtype: question.qtype.clone(),
});
}
}
response.header.ancount += rrs.len() as u16;
Expand All @@ -65,26 +76,20 @@ impl ResponseHandler for QueryHandler {
}

fn try_wildcard(question: &Question, connection: &mut PgConnection) -> Result<Vec<RR>, ZNSError> {
let records = get_from_database(&question.qname, None, question.qclass.clone(), connection)?;

if !records.is_empty() || question.qname.as_slice().is_empty() {
Ok(vec![])
} else {
let qname = question.qname.clone().to_vec();
qname.to_vec()[0] = String::from("*");
Ok(get_from_database(
&qname.into(),
Some(question.qtype.clone()),
question.qclass.clone(),
connection,
)?
.into_iter()
.map(|mut rr| {
rr.name.clone_from(&question.qname);
rr
})
.collect())
}
let qname = question.qname.clone().to_vec();
qname.to_vec()[0] = String::from("*");
Ok(get_from_database(
&qname.into(),
Some(question.qtype.clone()),
question.qclass.clone(),
connection,
)?
.into_iter()
.map(|mut rr| {
rr.name.clone_from(&question.qname);
rr
})
.collect())
}

fn get_soa(name: &LabelString) -> Result<RR, ZNSError> {
Expand Down

0 comments on commit a4bf483

Please sign in to comment.