From f91218c78d11fd738d995dba1fca3abe867a01a9 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 21 Nov 2022 13:27:30 -0500 Subject: [PATCH] safelog: implement Redactable for network addr types. --- crates/safelog/src/impls.rs | 72 +++++++++++++++++++++++++++++++++++++ crates/safelog/src/lib.rs | 1 + 2 files changed, 73 insertions(+) create mode 100644 crates/safelog/src/impls.rs diff --git a/crates/safelog/src/impls.rs b/crates/safelog/src/impls.rs new file mode 100644 index 000000000..ab8eb3a34 --- /dev/null +++ b/crates/safelog/src/impls.rs @@ -0,0 +1,72 @@ +//! Implement `Redactable` for various types. + +use super::Redactable; +use std::fmt::{self, Formatter}; + +// Network types. + +impl Redactable for std::net::Ipv4Addr { + fn display_redacted(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}.x.x.x", self.octets()[0]) + } + + fn debug_redacted(&self, f: &mut Formatter<'_>) -> fmt::Result { + self.display_redacted(f) + } +} + +impl Redactable for std::net::Ipv6Addr { + fn display_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:x}:x:x:…", self.segments()[0]) + } + + fn debug_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.display_redacted(f) + } +} + +impl Redactable for std::net::IpAddr { + fn display_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + std::net::IpAddr::V4(v4) => v4.display_redacted(f), + std::net::IpAddr::V6(v6) => v6.display_redacted(f), + } + } + + fn debug_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.display_redacted(f) + } +} + +impl Redactable for std::net::SocketAddrV4 { + fn display_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}:{}", self.ip().redacted(), self.port()) + } + + fn debug_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.display_redacted(f) + } +} + +impl Redactable for std::net::SocketAddrV6 { + fn display_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "[{}]:{}", self.ip().redacted(), self.port()) + } + + fn debug_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.display_redacted(f) + } +} + +impl Redactable for std::net::SocketAddr { + fn display_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + std::net::SocketAddr::V4(v4) => v4.display_redacted(f), + std::net::SocketAddr::V6(v6) => v6.display_redacted(f), + } + } + + fn debug_redacted(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.display_redacted(f) + } +} diff --git a/crates/safelog/src/lib.rs b/crates/safelog/src/lib.rs index 34018edde..05492b76d 100644 --- a/crates/safelog/src/lib.rs +++ b/crates/safelog/src/lib.rs @@ -45,6 +45,7 @@ use serde::{Deserialize, Serialize}; mod err; mod flags; +mod impls; pub use err::Error; pub use flags::{disable_safe_logging, enforce_safe_logging, with_safe_logging_suppressed, Guard};