use std::time::Duration;
use zeroize::Zeroizing;
use crate::identity::PeerId;
use crate::method::TraversalKind;
#[derive(Clone)]
pub struct LocalIdentity {
pub cert_der: Vec<u8>,
pub key_der: Zeroizing<Vec<u8>>,
pub peer_id: PeerId,
}
impl LocalIdentity {
pub fn from_der(cert_der: Vec<u8>, key_der: Vec<u8>) -> Option<Self> {
let peer_id = crate::identity::peer_id_from_leaf_cert_der(&cert_der)?;
Some(LocalIdentity {
cert_der,
key_der: Zeroizing::new(key_der),
peer_id,
})
}
}
impl std::fmt::Debug for LocalIdentity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LocalIdentity")
.field("peer_id", &self.peer_id)
.field("cert_der", &format!("<{} bytes>", self.cert_der.len()))
.field("key_der", &"<redacted>")
.finish()
}
}
#[derive(Debug, Clone)]
pub struct NatConfig {
pub enabled_methods: Vec<TraversalKind>,
pub per_method_timeout: Duration,
pub relay_endpoint: String,
pub stun_server: Option<std::net::SocketAddr>,
}
pub const STUN_PORT: u16 = 3478;
impl Default for NatConfig {
fn default() -> Self {
NatConfig {
enabled_methods: vec![
TraversalKind::Direct,
TraversalKind::Upnp,
TraversalKind::NatPmp,
TraversalKind::Pcp,
TraversalKind::HolePunch,
TraversalKind::Relayed,
],
per_method_timeout: Duration::from_secs(5),
relay_endpoint: dig_constants::DIG_RELAY_URL.to_string(),
stun_server: None,
}
}
}
impl NatConfig {
pub fn builder() -> NatConfigBuilder {
NatConfigBuilder {
cfg: NatConfig::default(),
}
}
pub fn is_enabled(&self, kind: TraversalKind) -> bool {
self.enabled_methods.contains(&kind)
}
}
#[derive(Debug, Clone)]
pub struct NatConfigBuilder {
cfg: NatConfig,
}
impl NatConfigBuilder {
pub fn enabled_methods(mut self, methods: Vec<TraversalKind>) -> Self {
self.cfg.enabled_methods = methods;
self
}
pub fn disable(mut self, kind: TraversalKind) -> Self {
self.cfg.enabled_methods.retain(|k| *k != kind);
self
}
pub fn per_method_timeout(mut self, timeout: Duration) -> Self {
self.cfg.per_method_timeout = timeout;
self
}
pub fn relay_endpoint(mut self, endpoint: impl Into<String>) -> Self {
self.cfg.relay_endpoint = endpoint.into();
self
}
pub fn stun_server(mut self, addr: std::net::SocketAddr) -> Self {
self.cfg.stun_server = Some(addr);
self
}
pub fn build(self) -> NatConfig {
self.cfg
}
}