#[cfg(feature = "fuzz")]
pub mod config {
pub mod parser;
}
#[cfg(feature = "fuzz")]
pub mod hsm;
#[cfg(any(test, feature = "fuzz"))]
pub fn parse_dns_bytes(data: &[u8]) -> Option<()> {
use hickory_proto::serialize::binary::BinDecodable;
hickory_proto::op::Message::from_bytes(data).ok().map(|_| ())
}
#[cfg(feature = "fuzz")]
pub fn parse_config_str(s: &str) -> Option<()> {
crate::config::parser::parse_str(s).ok().map(|_| ())
}
#[cfg(any(test, feature = "fuzz"))]
pub fn fuzz_validate_dns_name(name: &str) -> bool {
let n = name.trim_end_matches('.');
if n.is_empty() || n.len() > 253 {
return false;
}
for label in n.split('.') {
if label.is_empty() || label.len() > 63 {
return false;
}
if label.starts_with('-') || label.ends_with('-') {
return false;
}
if !label.bytes().all(|b| b.is_ascii_alphanumeric() || b == b'-' || b == b'_') {
return false;
}
}
true
}
#[cfg(feature = "fuzz")]
pub mod api_fuzz {
use serde::Deserialize;
#[derive(Debug, Deserialize)]
pub struct AddDnsRequest {
pub name: String,
#[serde(rename = "type")]
pub entry_type: Option<String>,
#[serde(default = "default_ttl")]
pub ttl: i64,
pub value: Option<String>,
pub priority: Option<u16>,
pub weight: Option<u16>,
pub port: Option<u16>,
pub flags: Option<u8>,
pub tag: Option<String>,
pub order: Option<u16>,
pub preference_naptr: Option<u16>,
pub flags_naptr: Option<String>,
pub services: Option<String>,
pub regexp: Option<String>,
pub replacement: Option<String>,
pub algorithm: Option<u8>,
pub fp_type: Option<u8>,
pub fingerprint: Option<String>,
pub cert_usage: Option<u8>,
pub selector: Option<u8>,
pub matching_type: Option<u8>,
pub cert_data: Option<String>,
pub description: Option<String>,
}
fn default_ttl() -> i64 { 3600 }
#[derive(Debug, Deserialize)]
pub struct AddFeedRequest {
pub name: String,
pub url: String,
pub format: Option<String>,
pub action: Option<String>,
pub description: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct AddBlacklistRequest {
pub domain: String,
pub action: Option<String>,
pub description: Option<String>,
}
}