Skip to main content

dnslib/core/dns/
settings.rs

1use serde_json::Value;
2
3use crate::core::{dns::service::SettingsRead, error::Result, redaction::redact_sensitive_fields};
4
5/// Get DNS server settings through a vendor-neutral settings reader.
6///
7/// # Errors
8///
9/// Returns any error reported by the selected DNS backend.
10pub async fn get_settings<C: SettingsRead + ?Sized>(client: &C) -> Result<Value> {
11    client.get_settings().await.map(redact_sensitive_fields)
12}
13
14/// Get DNS server settings without redacting sensitive fields.
15///
16/// Use only for explicit user-facing opt-in paths.
17///
18/// # Errors
19///
20/// Returns any error reported by the selected DNS backend.
21pub async fn get_settings_unredacted<C: SettingsRead + ?Sized>(client: &C) -> Result<Value> {
22    client.get_settings().await
23}
24
25#[cfg(test)]
26mod tests {
27    use serde_json::{Value, json};
28
29    use super::*;
30    use crate::core::{error::Result, redaction::REDACTED_MARKER};
31
32    struct FakeSettingsRead {
33        settings: Value,
34    }
35
36    impl SettingsRead for FakeSettingsRead {
37        async fn get_settings(&self) -> Result<Value> {
38            Ok(self.settings.clone())
39        }
40    }
41
42    #[tokio::test]
43    async fn get_settings_redacts_before_returning() {
44        let client = FakeSettingsRead {
45            settings: json!({
46                "version": "13.4.1",
47                "tsigKeys": [{ "sharedSecret": "actual-secret" }]
48            }),
49        };
50
51        let settings = get_settings(&client).await.unwrap();
52
53        assert_eq!(settings["version"], "13.4.1");
54        assert_eq!(settings["tsigKeys"][0]["sharedSecret"], REDACTED_MARKER);
55    }
56
57    #[tokio::test]
58    async fn get_settings_unredacted_preserves_secret_values() {
59        let client = FakeSettingsRead {
60            settings: json!({
61                "version": "13.4.1",
62                "tsigKeys": [{ "sharedSecret": "actual-secret" }]
63            }),
64        };
65
66        let settings = get_settings_unredacted(&client).await.unwrap();
67
68        assert_eq!(settings["version"], "13.4.1");
69        assert_eq!(settings["tsigKeys"][0]["sharedSecret"], "actual-secret");
70    }
71}