network_hardening.rs (2796B)
1 use radroots_transport::{Target, TargetSet, source::FetchBounds}; 2 use radroots_transport_nostr::{ 3 RelayAccess, RelayEndpoint, RelayProfile, RelayProfileKind, RelayUrl, RelayUrlPolicy, 4 }; 5 6 const WORKSPACE_MANIFEST: &str = include_str!("../../../Cargo.toml"); 7 const RELAY_SOURCE: &str = include_str!("../src/relay.rs"); 8 const CLIENT_SOURCE: &str = include_str!("../src/client.rs"); 9 10 #[test] 11 fn tls_verification_and_pinned_dns_are_non_configurable_live_defaults() { 12 assert!(WORKSPACE_MANIFEST.contains("rustls-tls-webpki-roots")); 13 for required in [ 14 "client_async_with_config(", 15 "tokio_rustls::TlsConnector::from(Arc::new(tls_config))", 16 "roots.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned())", 17 ".with_no_client_auth()", 18 "rustls::pki_types::ServerName::try_from(", 19 "host.trim_matches(['[', ']']).to_owned()", 20 "crate::source_wire::MeteredIo::new(plaintext, ingress)", 21 ".max_message_size(Some(MAX_WIRE_MESSAGE_BYTES))", 22 ".max_frame_size(Some(MAX_WIRE_MESSAGE_BYTES))", 23 "validate_resolved_addresses(", 24 "connect_pinned(addresses.as_slice())", 25 "ConnectionMode::Direct", 26 ] { 27 assert!( 28 RELAY_SOURCE.contains(required), 29 "missing hardening witness `{required}`" 30 ); 31 } 32 for forbidden in [ 33 "danger_accept_invalid_certs", 34 "danger_accept_invalid_hostnames", 35 "NoCertificateVerification", 36 ] { 37 assert!(!RELAY_SOURCE.contains(forbidden)); 38 assert!(!CLIENT_SOURCE.contains(forbidden)); 39 } 40 41 assert!(RelayUrl::parse("ws://relay.example.com", RelayUrlPolicy::Public).is_err()); 42 assert!(RelayUrl::parse("wss://relay.example.com", RelayUrlPolicy::Public).is_ok()); 43 assert!(RelayUrl::parse("ws://127.0.0.1", RelayUrlPolicy::Local).is_ok()); 44 } 45 46 #[test] 47 fn page_and_target_limits_reject_oversized_requests() { 48 assert!(FetchBounds::new(1_001, u64::MAX).is_err()); 49 50 let targets = (0..=64) 51 .map(|index| Target::nostr_relay(format!("wss://r{index}.example.com")).expect("target")) 52 .collect::<Vec<_>>(); 53 assert!(TargetSet::new(targets).is_err()); 54 55 let relays = (0..=64) 56 .map(|index| { 57 RelayEndpoint::new( 58 format!("wss://r{index}.example.com"), 59 RelayUrlPolicy::Public, 60 RelayAccess::ReadWrite, 61 ) 62 .expect("relay endpoint") 63 }) 64 .collect::<Vec<_>>(); 65 assert!(RelayProfile::explicit(RelayProfileKind::Public, relays).is_err()); 66 } 67 68 #[test] 69 fn oversized_wire_payload_is_rejected_before_delivery() { 70 let oversized = "x".repeat(radroots_event_codec::decode::MAX_EVENT_JSON_BYTES + 1); 71 assert!(radroots_event_codec::decode::signed_event(oversized.as_str()).is_err()); 72 }