Skip to content

Commit 7045b82

Browse files
committed
impl Display for SocketAddress
1 parent 22a0bfc commit 7045b82

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;
@@ -4066,32 +4096,41 @@ mod tests {
40664096
#[test]
40674097
#[cfg(feature = "std")]
40684098
fn test_socket_address_from_str() {
4069-
assert_eq!(SocketAddress::TcpIpV4 {
4099+
let tcpip_v4 = SocketAddress::TcpIpV4 {
40704100
addr: Ipv4Addr::new(127, 0, 0, 1).octets(),
40714101
port: 1234,
4072-
}, SocketAddress::from_str("127.0.0.1:1234").unwrap());
4102+
};
4103+
assert_eq!(tcpip_v4, SocketAddress::from_str("127.0.0.1:1234").unwrap());
4104+
assert_eq!(tcpip_v4, SocketAddress::from_str(&tcpip_v4.to_string()).unwrap());
40734105

4074-
assert_eq!(SocketAddress::TcpIpV6 {
4106+
let tcpip_v6 = SocketAddress::TcpIpV6 {
40754107
addr: Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1).octets(),
40764108
port: 1234,
4077-
}, SocketAddress::from_str("[0:0:0:0:0:0:0:1]:1234").unwrap());
4078-
assert_eq!(
4079-
SocketAddress::Hostname {
4109+
};
4110+
assert_eq!(tcpip_v6, SocketAddress::from_str("[0:0:0:0:0:0:0:1]:1234").unwrap());
4111+
assert_eq!(tcpip_v6, SocketAddress::from_str(&tcpip_v6.to_string()).unwrap());
4112+
4113+
let hostname = SocketAddress::Hostname {
40804114
hostname: Hostname::try_from("lightning-node.mydomain.com".to_string()).unwrap(),
40814115
port: 1234,
4082-
}, SocketAddress::from_str("lightning-node.mydomain.com:1234").unwrap());
4083-
assert_eq!(
4084-
SocketAddress::Hostname {
4085-
hostname: Hostname::try_from("example.com".to_string()).unwrap(),
4086-
port: 1234,
4087-
}, SocketAddress::from_str("example.com:1234").unwrap());
4088-
assert_eq!(SocketAddress::OnionV3 {
4116+
};
4117+
assert_eq!(hostname, SocketAddress::from_str("lightning-node.mydomain.com:1234").unwrap());
4118+
assert_eq!(hostname, SocketAddress::from_str(&hostname.to_string()).unwrap());
4119+
4120+
let onion_v2 = SocketAddress::OnionV2 ([40, 4, 64, 185, 202, 19, 162, 75, 90, 200, 38, 7],);
4121+
assert_eq!("OnionV2([40, 4, 64, 185, 202, 19, 162, 75, 90, 200, 38, 7])", &onion_v2.to_string());
4122+
assert_eq!(Err(SocketAddressParseError::InvalidOnionV3), SocketAddress::from_str("FACEBOOKCOREWWWI.onion:9735"));
4123+
4124+
let onion_v3 = SocketAddress::OnionV3 {
40894125
ed25519_pubkey: [37, 24, 75, 5, 25, 73, 117, 194, 139, 102, 182, 107, 4, 105, 247, 246, 85,
40904126
111, 177, 172, 49, 137, 167, 155, 64, 221, 163, 47, 31, 33, 71, 3],
40914127
checksum: 48326,
40924128
version: 121,
40934129
port: 1234
4094-
}, SocketAddress::from_str("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion:1234").unwrap());
4130+
};
4131+
assert_eq!(onion_v3, SocketAddress::from_str("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion:1234").unwrap());
4132+
assert_eq!(onion_v3, SocketAddress::from_str(&onion_v3.to_string()).unwrap());
4133+
40954134
assert_eq!(Err(SocketAddressParseError::InvalidOnionV3), SocketAddress::from_str("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6.onion:1234"));
40964135
assert_eq!(Err(SocketAddressParseError::InvalidInput), SocketAddress::from_str("127.0.0.1@1234"));
40974136
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)