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 multi-protocol security example");
let config = DiscoveryConfig::new()
.with_service_type(ServiceType::new("_http._tcp")?)
.with_service_type(ServiceType::new("_https._tcp")?)
.with_timeout(Duration::from_secs(15))
.with_verify_services(true) .with_protocol(ProtocolType::Mdns)
.with_protocol(ProtocolType::Upnp)
.with_protocol(ProtocolType::DnsSd)
.with_cross_protocol(true)
.with_metrics(true);
info!("Security-focused configuration created");
let discovery = ServiceDiscovery::new(config).await?;
let secure_services = vec![
ServiceInfo::new(
"High Security API",
"_https._tcp",
8443,
Some(vec![
("security_level", "high"),
("tls_version", "1.3"),
("auth_method", "oauth2"),
("encryption", "aes256"),
("cert_validation", "strict"),
])
)?,
ServiceInfo::new(
"Medium Security Service",
"_https._tcp",
8444,
Some(vec![
("security_level", "medium"),
("tls_version", "1.2"),
("auth_method", "basic"),
("encryption", "aes128"),
])
)?,
ServiceInfo::new(
"Legacy HTTP Service",
"_http._tcp",
8080,
Some(vec![
("security_level", "low"),
("auth_method", "none"),
("legacy", "true"),
("deprecation_notice", "migrate_to_https"),
])
)?,
];
for service in &secure_services {
info!("Registering secure service: {}", service.name());
discovery.register_service(service.clone()).await?;
}
let protocols = vec![ProtocolType::Mdns, ProtocolType::Upnp, ProtocolType::DnsSd];
for protocol in &protocols {
info!("Discovering services via {:?}...", protocol);
match discovery.discover_services(Some(*protocol)).await {
Ok(services) => {
info!("Found {} services via {:?}", services.len(), protocol);
for service in &services {
analyze_service_security(service, &discovery).await;
}
}
Err(e) => {
warn!("Discovery failed for {:?}: {}", protocol, e);
}
}
}
info!("Performing cross-protocol security analysis...");
let all_services = discovery.discover_services(None).await?;
let mut security_summary = SecuritySummary::new();
for service in &all_services {
let security_level = service.attributes.get("security_level")
.map(|s| s.as_str())
.unwrap_or("unknown");
security_summary.add_service(security_level, service.protocol_type());
check_security_vulnerabilities(service);
}
security_summary.print_report();
print_security_recommendations(&all_services);
for service in &secure_services {
discovery.unregister_service(service).await?;
}
info!("Multi-protocol security example completed");
Ok(())
}
async fn analyze_service_security(service: &ServiceInfo, discovery: &ServiceDiscovery) {
info!("🔍 Security analysis for: {}", service.name());
match discovery.verify_service(service).await {
Ok(true) => info!(" ✅ Service verification passed"),
Ok(false) => warn!(" ❌ Service verification failed"),
Err(e) => warn!(" ⚠️ Verification error: {}", e),
}
if let Some(security_level) = service.attributes.get("security_level") {
match security_level.as_str() {
"high" => info!(" 🔒 High security level - RECOMMENDED"),
"medium" => info!(" 🔐 Medium security level - ACCEPTABLE"),
"low" => warn!(" ⚠️ Low security level - REVIEW REQUIRED"),
_ => warn!(" ❓ Unknown security level: {}", security_level),
}
} else {
warn!(" ⚠️ No security level specified");
}
if let Some(tls) = service.attributes.get("tls_version") {
match tls.as_str() {
"1.3" => info!(" 🛡️ TLS 1.3 - EXCELLENT"),
"1.2" => info!(" 🛡️ TLS 1.2 - GOOD"),
"1.1" | "1.0" => warn!(" ⚠️ TLS {} - DEPRECATED", tls),
_ => warn!(" ❓ Unknown TLS version: {}", tls),
}
}
if let Some(auth) = service.attributes.get("auth_method") {
match auth.as_str() {
"oauth2" => info!(" 🔑 OAuth2 authentication - EXCELLENT"),
"jwt" => info!(" 🔑 JWT authentication - GOOD"),
"basic" => warn!(" ⚠️ Basic authentication - WEAK"),
"none" => warn!(" ❌ No authentication - INSECURE"),
_ => info!(" 🔑 Custom authentication: {}", auth),
}
}
}
fn check_security_vulnerabilities(service: &ServiceInfo) {
let mut vulnerabilities = Vec::new();
if service.service_type().service_name() == "_http._tcp" {
vulnerabilities.push("Unencrypted HTTP traffic");
}
if service.attributes.get("auth_method") == Some(&"none".to_string()) {
vulnerabilities.push("No authentication required");
}
if service.attributes.get("legacy") == Some(&"true".to_string()) {
vulnerabilities.push("Legacy service - may have security issues");
}
if !vulnerabilities.is_empty() {
warn!(" 🚨 Security vulnerabilities found for '{}':", service.name());
for vuln in vulnerabilities {
warn!(" - {}", vuln);
}
}
}
struct SecuritySummary {
high_security: usize,
medium_security: usize,
low_security: usize,
unknown_security: usize,
protocols: std::collections::HashMap<ProtocolType, usize>,
}
impl SecuritySummary {
fn new() -> Self {
Self {
high_security: 0,
medium_security: 0,
low_security: 0,
unknown_security: 0,
protocols: std::collections::HashMap::new(),
}
}
fn add_service(&mut self, security_level: &str, protocol: ProtocolType) {
match security_level {
"high" => self.high_security += 1,
"medium" => self.medium_security += 1,
"low" => self.low_security += 1,
_ => self.unknown_security += 1,
}
*self.protocols.entry(protocol).or_insert(0) += 1;
}
fn print_report(&self) {
info!("📊 Security Summary Report:");
info!(" High Security Services: {}", self.high_security);
info!(" Medium Security Services: {}", self.medium_security);
info!(" Low Security Services: {}", self.low_security);
info!(" Unknown Security Services: {}", self.unknown_security);
info!(" Services by Protocol:");
for (protocol, count) in &self.protocols {
info!(" {:?}: {} services", protocol, count);
}
}
}
fn print_security_recommendations(services: &[ServiceInfo]) {
info!("🔐 Security Recommendations:");
let has_http = services.iter().any(|s| s.service_type().service_name() == "_http._tcp");
let has_no_auth = services.iter().any(|s| s.attributes.get("auth_method") == Some(&"none".to_string()));
let has_legacy = services.iter().any(|s| s.attributes.get("legacy") == Some(&"true".to_string()));
if has_http {
info!(" 1. ⚠️ Migrate HTTP services to HTTPS");
info!(" - Use TLS 1.2 or higher");
info!(" - Implement proper certificate validation");
}
if has_no_auth {
info!(" 2. 🔑 Implement authentication for unprotected services");
info!(" - Use OAuth2, JWT, or similar modern methods");
info!(" - Avoid basic authentication over unencrypted connections");
}
if has_legacy {
info!(" 3. 🏗️ Plan migration for legacy services");
info!(" - Update to modern security standards");
info!(" - Implement regular security audits");
}
info!(" 4. 🔍 General recommendations:");
info!(" - Always enable service verification");
info!(" - Use strong encryption (AES-256)");
info!(" - Implement certificate pinning where possible");
info!(" - Monitor services for security changes");
info!(" - Regular security assessments");
}