use auto_discovery::{
config::DiscoveryConfig,
service::ServiceInfo,
types::{ServiceType, ProtocolType},
ServiceDiscovery,
};
use std::time::Duration;
use tracing::{info, warn};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
info!("Starting security verification example");
let config = DiscoveryConfig::new()
.with_timeout(Duration::from_secs(15))
.with_verify_services(true) .with_service_type(ServiceType::new("_http._tcp")?)
.with_service_type(ServiceType::new("_https._tcp")?)
.with_protocol(ProtocolType::Mdns)
.with_protocol(ProtocolType::Upnp)
.with_metrics(true);
info!("Configuration created with security verification enabled");
let discovery = ServiceDiscovery::new(config).await?;
info!("Service discovery created with security features");
let secure_service = ServiceInfo::new(
"Secure Web API",
"_https._tcp",
8443,
Some(vec![
("version", "1.0"),
("security", "enabled"),
("tls", "1.3"),
("auth", "required"),
])
)?;
info!("Registering secure service: {}", secure_service.name());
discovery.register_service(secure_service.clone()).await?;
info!("Secure service registered successfully");
let regular_service = ServiceInfo::new(
"Regular Web Server",
"_http._tcp",
8080,
Some(vec![
("version", "1.0"),
("security", "basic"),
])
)?;
info!("Registering regular service: {}", regular_service.name());
discovery.register_service(regular_service.clone()).await?;
info!("Regular service registered successfully");
info!("Discovering services with verification...");
let services = discovery.discover_services(None).await?;
info!("Found {} services, verifying each one...", services.len());
for service in &services {
info!("Verifying service: {}", service.name());
match discovery.verify_service(service).await {
Ok(is_verified) => {
if is_verified {
info!("✅ Service '{}' is verified and trustworthy", service.name());
if let Some(security) = service.attributes.get("security") {
match security.as_str() {
"enabled" => info!(" 🔒 High security level detected"),
"basic" => info!(" 🔐 Basic security level detected"),
_ => info!(" ⚠️ Unknown security level: {}", security),
}
}
if let Some(tls) = service.attributes.get("tls") {
info!(" 🛡️ TLS version: {}", tls);
}
if let Some(auth) = service.attributes.get("auth") {
if auth == "required" {
info!(" 🔑 Authentication required");
}
}
} else {
warn!("❌ Service '{}' failed verification", service.name());
warn!(" This service may be unreachable or untrustworthy");
}
}
Err(e) => {
warn!("⚠️ Error verifying service '{}': {}", service.name(), e);
}
}
}
info!("Waiting 2 seconds before re-verification...");
tokio::time::sleep(Duration::from_secs(2)).await;
info!("Re-verifying services to check for changes...");
for service in &services {
match discovery.verify_service(service).await {
Ok(is_verified) => {
if is_verified {
info!("✅ Service '{}' re-verification successful", service.name());
} else {
warn!("❌ Service '{}' failed re-verification", service.name());
}
}
Err(e) => {
warn!("⚠️ Error during re-verification of '{}': {}", service.name(), e);
}
}
}
info!("Security recommendations:");
info!(" 1. Always enable service verification in production");
info!(" 2. Prefer services with TLS support");
info!(" 3. Check service attributes for security indicators");
info!(" 4. Regularly re-verify services in long-running applications");
info!(" 5. Monitor verification failures for potential security issues");
discovery.unregister_service(&secure_service).await?;
discovery.unregister_service(®ular_service).await?;
info!("Services unregistered");
Ok(())
}