ssh_openpgp_auth/
dns.rs
1use std::net::SocketAddr;
4use std::str::FromStr;
5
6use hickory_client::rr::RData;
7use hickory_client::{
8 client::Client,
9 rr::{DNSClass, Name, RecordType},
10};
11
12pub fn dnssec_query(
13 nameserver: SocketAddr,
14 name: &str,
15) -> Result<impl Iterator<Item = String>, crate::Error> {
16 let client = hickory_client::client::SyncDnssecClient::new(
17 hickory_client::tcp::TcpClientConnection::new(nameserver)?,
18 )
19 .build();
20 let mut results = client
21 .query(&Name::from_str(name)?, DNSClass::IN, RecordType::TXT)?
22 .into_message();
23 Ok(results.take_answers().into_iter().flat_map(|answer| {
24 if let Some(RData::TXT(data)) = answer.data() {
25 let bytes = data
26 .txt_data()
27 .iter()
28 .fold(Vec::new(), |mut v: Vec<u8>, n| {
29 v.extend(&n[..]);
30 v
31 });
32 Some(String::from_utf8_lossy(&bytes).to_string())
33 } else {
34 None
35 }
36 }))
37}