Skip to content

Commit b9670ae

Browse files
committed
utilize socketaddress for ipv4 and ipv6
1 parent 786e6e4 commit b9670ae

File tree

1 file changed

+35
-33
lines changed

1 file changed

+35
-33
lines changed

lightning/src/ln/msgs.rs

+35-33
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,13 @@ use core::convert::TryFrom;
4040
use core::fmt;
4141
use core::fmt::Debug;
4242
use core::str::FromStr;
43-
use std::net::{AddrParseError, Ipv4Addr, SocketAddrV4, SocketAddrV6, Ipv6Addr};
43+
use std::net::{AddrParseError, Ipv4Addr, Ipv6Addr, SocketAddr};
4444
use crate::io::{self, Read};
4545
use crate::io_extras::read_to_end;
4646

4747
use crate::util::events::{MessageSendEventsProvider, OnionMessageProvider};
4848
use crate::util::logger;
49+
use crate::util::base32;
4950
use crate::util::ser::{LengthReadable, Readable, ReadableArgs, Writeable, Writer, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname};
5051

5152
use crate::ln::{PaymentPreimage, PaymentHash, PaymentSecret};
@@ -638,42 +639,43 @@ impl Readable for NetAddress {
638639
}
639640
}
640641

641-
fn rem_first_and_last(value: &str) -> &str {
642-
let mut chars = value.chars();
643-
chars.next();
644-
chars.next_back();
645-
chars.as_str()
646-
}
647-
648642
impl FromStr for NetAddress {
649643
type Err = AddrParseError;
650644

651645
fn from_str(s: &str) -> Result<Self, Self::Err> {
652-
let trim_s_by_latest_colon = s.rfind(":").unwrap();
653-
let host = &s[..trim_s_by_latest_colon];
654-
let port: u16 = s[trim_s_by_latest_colon + 1..].parse().expect("Invalid port");
655-
if let Ok(addr) = host.parse::<Ipv4Addr>() {
656-
let addr = SocketAddrV4::new(addr, port);
657-
return Ok(NetAddress::IPv4 { addr: addr.ip().octets(), port });
658-
}
659-
if let Ok(addr) = rem_first_and_last(host).parse::<Ipv6Addr>() {
660-
let addr = SocketAddrV6::new(addr, port, 0, 0);
661-
return Ok(NetAddress::IPv6 { addr: addr.ip().octets(), port });
662-
};
663-
if host.ends_with(".onion") {
664-
let onion = host.split(".onion").collect::<Vec<&str>>()[0];
665-
let onion = base32::decode(base32::Alphabet::RFC4648 { padding: false }, &onion).expect("error in onion");
666-
let version = onion[0];
667-
let checksum = u16::from_be_bytes([onion[1], onion[2]]);
668-
let ed25519_pubkey = onion[3..35].try_into().expect("Invalid onion address");
669-
return Ok(NetAddress::OnionV3 { ed25519_pubkey, checksum, version, port });
646+
match SocketAddr::from_str(s) {
647+
Ok(addr) => {
648+
let port: u16 = addr.port();
649+
match addr {
650+
SocketAddr::V4(addr) => {
651+
let addr = addr.ip().to_string().parse::<Ipv4Addr>()?;
652+
return Ok(NetAddress::IPv4 { addr: addr.octets(), port });
653+
},
654+
SocketAddr::V6(addr) => {
655+
let addr = addr.ip().to_string().parse::<Ipv6Addr>()?;
656+
return Ok(NetAddress::IPv6 { addr: addr.octets(), port });
657+
},
658+
}
659+
},
660+
Err(e) => {
661+
let trimmed_input = s.rfind(":").expect("Invalid input, needs to include seperator \":\"");
662+
let host = &s[..trimmed_input];
663+
let port: u16 = s[trimmed_input + 1..].parse().expect("Invalid input, port needs to be u16");
664+
if host.ends_with(".onion") {
665+
let onion = host.split(".onion").collect::<Vec<&str>>()[0];
666+
let onion = base32::decode(base32::Alphabet::RFC4648 { padding: false }, &onion).expect("Error decoding onion address");
667+
let version = onion[0];
668+
let checksum = u16::from_be_bytes([onion[1], onion[2]]);
669+
let ed25519_pubkey = onion[3..35].try_into().expect("Invalid onion address");
670+
return Ok(NetAddress::OnionV3 { ed25519_pubkey, checksum, version, port });
671+
}
672+
673+
if let Ok(hostname) = Hostname::try_from(host.to_string()) {
674+
return Ok(NetAddress::Hostname { hostname, port });
675+
}
676+
return Err(e)
677+
},
670678
}
671-
672-
if let Ok(hostname) = Hostname::try_from(host.to_string()) {
673-
return Ok(NetAddress::Hostname { hostname, port });
674-
}
675-
676-
panic!("cant parse input");
677679
}
678680
}
679681

@@ -3077,6 +3079,6 @@ mod tests {
30773079
assert_eq!(ipv4_net_address, result_ipv4);
30783080
assert_eq!(ipv6_net_address, result_ipv6);
30793081
assert_eq!(hostname_net_address, result_hostname);
3080-
assert_eq!(onionv3_net_address, result_onionv3); // failing
3082+
assert_eq!(onionv3_net_address, result_onionv3);
30813083
}
30823084
}

0 commit comments

Comments
 (0)