Skip to content

Commit f0009db

Browse files
committed
utilize socketaddress for ipv4 and ipv6
1 parent 27b1584 commit f0009db

File tree

1 file changed

+35
-33
lines changed

1 file changed

+35
-33
lines changed

lightning/src/ln/msgs.rs

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ 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::events::{MessageSendEventsProvider, OnionMessageProvider};
4848
use crate::util::logger;
4949
use crate::util::ser::{LengthReadable, Readable, ReadableArgs, Writeable, Writer, WithoutLength, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname};
50+
use crate::util::base32;
5051

5152
use crate::ln::{PaymentPreimage, PaymentHash, PaymentSecret};
5253

@@ -661,42 +662,43 @@ impl Readable for NetAddress {
661662
}
662663
}
663664

664-
fn rem_first_and_last(value: &str) -> &str {
665-
let mut chars = value.chars();
666-
chars.next();
667-
chars.next_back();
668-
chars.as_str()
669-
}
670-
671665
impl FromStr for NetAddress {
672666
type Err = AddrParseError;
673667

674668
fn from_str(s: &str) -> Result<Self, Self::Err> {
675-
let trim_s_by_latest_colon = s.rfind(":").unwrap();
676-
let host = &s[..trim_s_by_latest_colon];
677-
let port: u16 = s[trim_s_by_latest_colon + 1..].parse().expect("Invalid port");
678-
if let Ok(addr) = host.parse::<Ipv4Addr>() {
679-
let addr = SocketAddrV4::new(addr, port);
680-
return Ok(NetAddress::IPv4 { addr: addr.ip().octets(), port });
681-
}
682-
if let Ok(addr) = rem_first_and_last(host).parse::<Ipv6Addr>() {
683-
let addr = SocketAddrV6::new(addr, port, 0, 0);
684-
return Ok(NetAddress::IPv6 { addr: addr.ip().octets(), port });
685-
};
686-
if host.ends_with(".onion") {
687-
let onion = host.split(".onion").collect::<Vec<&str>>()[0];
688-
let onion = base32::decode(base32::Alphabet::RFC4648 { padding: false }, &onion).expect("error in onion");
689-
let version = onion[0];
690-
let checksum = u16::from_be_bytes([onion[1], onion[2]]);
691-
let ed25519_pubkey = onion[3..35].try_into().expect("Invalid onion address");
692-
return Ok(NetAddress::OnionV3 { ed25519_pubkey, checksum, version, port });
669+
match SocketAddr::from_str(s) {
670+
Ok(addr) => {
671+
let port: u16 = addr.port();
672+
match addr {
673+
SocketAddr::V4(addr) => {
674+
let addr = addr.ip().to_string().parse::<Ipv4Addr>()?;
675+
return Ok(NetAddress::IPv4 { addr: addr.octets(), port });
676+
},
677+
SocketAddr::V6(addr) => {
678+
let addr = addr.ip().to_string().parse::<Ipv6Addr>()?;
679+
return Ok(NetAddress::IPv6 { addr: addr.octets(), port });
680+
},
681+
}
682+
},
683+
Err(e) => {
684+
let trimmed_input = s.rfind(":").expect("Invalid input, needs to include seperator \":\"");
685+
let host = &s[..trimmed_input];
686+
let port: u16 = s[trimmed_input + 1..].parse().expect("Invalid input, port needs to be u16");
687+
if host.ends_with(".onion") {
688+
let onion = host.split(".onion").collect::<Vec<&str>>()[0];
689+
let onion = base32::decode(base32::Alphabet::RFC4648 { padding: false }, &onion).expect("Error decoding onion address");
690+
let version = onion[0];
691+
let checksum = u16::from_be_bytes([onion[1], onion[2]]);
692+
let ed25519_pubkey = onion[3..35].try_into().expect("Invalid onion address");
693+
return Ok(NetAddress::OnionV3 { ed25519_pubkey, checksum, version, port });
694+
}
695+
696+
if let Ok(hostname) = Hostname::try_from(host.to_string()) {
697+
return Ok(NetAddress::Hostname { hostname, port });
698+
}
699+
return Err(e)
700+
},
693701
}
694-
695-
if let Ok(hostname) = Hostname::try_from(host.to_string()) {
696-
return Ok(NetAddress::Hostname { hostname, port });
697-
}
698-
699-
panic!("cant parse input");
700702
}
701703
}
702704

@@ -3183,6 +3185,6 @@ mod tests {
31833185
assert_eq!(ipv4_net_address, result_ipv4);
31843186
assert_eq!(ipv6_net_address, result_ipv6);
31853187
assert_eq!(hostname_net_address, result_hostname);
3186-
assert_eq!(onionv3_net_address, result_onionv3); // failing
3188+
assert_eq!(onionv3_net_address, result_onionv3);
31873189
}
31883190
}

0 commit comments

Comments
 (0)