ssh_openpgp_auth/
dns.rs

1// SPDX-FileCopyrightText: 2023 Wiktor Kwapisiewicz <wiktor@metacode.biz>
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3use 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}