nomilo-archived/src/routes/zones.rs

45 lines
1.3 KiB
Rust

use rocket::http::Status;
use rocket_contrib::json::Json;
use trust_dns_client::client::ClientHandle;
use trust_dns_client::op::{DnsResponse, ResponseCode};
use trust_dns_client::rr::{DNSClass, RecordType};
use crate::models::dns;
use crate::models::errors::{ErrorResponse, make_500};
use crate::models::users::UserInfo;
#[get("/zones/<zone>/records")]
pub async fn get_zone_records(
mut client: dns::DnsClient,
user_info: Result<UserInfo, ErrorResponse>,
zone: dns::AbsoluteName
) -> Result<Json<Vec<dns::Record>>, ErrorResponse> {
println!("{:#?}", user_info?);
let response: DnsResponse = {
let query = client.query((*zone).clone(), DNSClass::IN, RecordType::AXFR);
query.await.map_err(make_500)?
};
if response.response_code() != ResponseCode::NoError {
return ErrorResponse::new(
Status::NotFound,
format!("zone {} could not be found", *zone)
).err()
}
let answers = response.answers();
let mut records: Vec<_> = answers.to_vec().into_iter()
.map(dns::Record::from)
.filter(|record| !matches!(record.rdata, dns::RData::NULL { .. } | dns::RData::DNSSEC(_)))
.collect();
// AXFR response ends with SOA, we remove it so it is not doubled in the response.
records.pop();
Ok(Json(records))
}