Skip to content

Commit 4c465f3

Browse files
committed
impl Display for SocketAddress
1 parent 6fff3e5 commit 4c465f3

File tree

2 files changed

+60
-14
lines changed

2 files changed

+60
-14
lines changed

lightning/src/ln/msgs.rs

+53-14
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ use core::fmt::Debug;
4646
use core::ops::Deref;
4747
#[cfg(feature = "std")]
4848
use core::str::FromStr;
49+
use core::fmt::Display;
4950
use crate::io::{self, Cursor, Read};
5051
use crate::io_extras::read_to_end;
5152

@@ -984,6 +985,35 @@ pub fn parse_onion_address(host: &str, port: u16) -> Result<SocketAddress, Socke
984985
}
985986
}
986987

988+
impl Display for SocketAddress {
989+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
990+
match self {
991+
SocketAddress::TcpIpV4{addr, port} => write!(
992+
f, "{}.{}.{}.{}:{}", addr[0], addr[1], addr[2], addr[3], port)?,
993+
SocketAddress::TcpIpV6{addr, port} => write!(
994+
f,
995+
"[{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}]:{}",
996+
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15], port
997+
)?,
998+
SocketAddress::OnionV2(bytes) => write!(f, "OnionV2({:?})", bytes)?,
999+
SocketAddress::OnionV3 {
1000+
ed25519_pubkey,
1001+
checksum,
1002+
version,
1003+
port,
1004+
} => {
1005+
let [first_checksum_flag, second_checksum_flag] = checksum.to_be_bytes();
1006+
let mut addr = vec![*version, first_checksum_flag, second_checksum_flag];
1007+
addr.extend_from_slice(ed25519_pubkey);
1008+
let onion = base32::Alphabet::RFC4648 { padding: false }.encode(&addr);
1009+
write!(f, "{}.onion:{}", onion, port)?
1010+
},
1011+
SocketAddress::Hostname { hostname, port } => write!(f, "{}:{}", hostname, port)?,
1012+
}
1013+
Ok(())
1014+
}
1015+
}
1016+
9871017
#[cfg(feature = "std")]
9881018
impl FromStr for SocketAddress {
9891019
type Err = SocketAddressParseError;
@@ -4071,32 +4101,41 @@ mod tests {
40714101
#[test]
40724102
#[cfg(feature = "std")]
40734103
fn test_socket_address_from_str() {
4074-
assert_eq!(SocketAddress::TcpIpV4 {
4104+
let tcpip_v4 = SocketAddress::TcpIpV4 {
40754105
addr: Ipv4Addr::new(127, 0, 0, 1).octets(),
40764106
port: 1234,
4077-
}, SocketAddress::from_str("127.0.0.1:1234").unwrap());
4107+
};
4108+
assert_eq!(tcpip_v4, SocketAddress::from_str("127.0.0.1:1234").unwrap());
4109+
assert_eq!(tcpip_v4, SocketAddress::from_str(&tcpip_v4.to_string()).unwrap());
40784110

4079-
assert_eq!(SocketAddress::TcpIpV6 {
4111+
let tcpip_v6 = SocketAddress::TcpIpV6 {
40804112
addr: Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1).octets(),
40814113
port: 1234,
4082-
}, SocketAddress::from_str("[0:0:0:0:0:0:0:1]:1234").unwrap());
4083-
assert_eq!(
4084-
SocketAddress::Hostname {
4114+
};
4115+
assert_eq!(tcpip_v6, SocketAddress::from_str("[0:0:0:0:0:0:0:1]:1234").unwrap());
4116+
assert_eq!(tcpip_v6, SocketAddress::from_str(&tcpip_v6.to_string()).unwrap());
4117+
4118+
let hostname = SocketAddress::Hostname {
40854119
hostname: Hostname::try_from("lightning-node.mydomain.com".to_string()).unwrap(),
40864120
port: 1234,
4087-
}, SocketAddress::from_str("lightning-node.mydomain.com:1234").unwrap());
4088-
assert_eq!(
4089-
SocketAddress::Hostname {
4090-
hostname: Hostname::try_from("example.com".to_string()).unwrap(),
4091-
port: 1234,
4092-
}, SocketAddress::from_str("example.com:1234").unwrap());
4093-
assert_eq!(SocketAddress::OnionV3 {
4121+
};
4122+
assert_eq!(hostname, SocketAddress::from_str("lightning-node.mydomain.com:1234").unwrap());
4123+
assert_eq!(hostname, SocketAddress::from_str(&hostname.to_string()).unwrap());
4124+
4125+
let onion_v2 = SocketAddress::OnionV2 ([40, 4, 64, 185, 202, 19, 162, 75, 90, 200, 38, 7],);
4126+
assert_eq!("OnionV2([40, 4, 64, 185, 202, 19, 162, 75, 90, 200, 38, 7])", &onion_v2.to_string());
4127+
assert_eq!(Err(SocketAddressParseError::InvalidOnionV3), SocketAddress::from_str("FACEBOOKCOREWWWI.onion:9735"));
4128+
4129+
let onion_v3 = SocketAddress::OnionV3 {
40944130
ed25519_pubkey: [37, 24, 75, 5, 25, 73, 117, 194, 139, 102, 182, 107, 4, 105, 247, 246, 85,
40954131
111, 177, 172, 49, 137, 167, 155, 64, 221, 163, 47, 31, 33, 71, 3],
40964132
checksum: 48326,
40974133
version: 121,
40984134
port: 1234
4099-
}, SocketAddress::from_str("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion:1234").unwrap());
4135+
};
4136+
assert_eq!(onion_v3, SocketAddress::from_str("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion:1234").unwrap());
4137+
assert_eq!(onion_v3, SocketAddress::from_str(&onion_v3.to_string()).unwrap());
4138+
41004139
assert_eq!(Err(SocketAddressParseError::InvalidOnionV3), SocketAddress::from_str("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6.onion:1234"));
41014140
assert_eq!(Err(SocketAddressParseError::InvalidInput), SocketAddress::from_str("127.0.0.1@1234"));
41024141
assert_eq!(Err(SocketAddressParseError::InvalidInput), "".parse::<SocketAddress>());

lightning/src/util/ser.rs

+7
Original file line numberDiff line numberDiff line change
@@ -1297,6 +1297,13 @@ impl Hostname {
12971297
(&self.0).len() as u8
12981298
}
12991299
}
1300+
1301+
impl core::fmt::Display for Hostname {
1302+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1303+
write!(f, "{}", self.0)?;
1304+
Ok(())
1305+
}
1306+
}
13001307
impl Deref for Hostname {
13011308
type Target = String;
13021309

0 commit comments

Comments
 (0)