@@ -40,12 +40,13 @@ use core::convert::TryFrom;
40
40
use core:: fmt;
41
41
use core:: fmt:: Debug ;
42
42
use core:: str:: FromStr ;
43
- use std:: net:: { AddrParseError , Ipv4Addr , SocketAddrV4 , SocketAddrV6 , Ipv6Addr } ;
43
+ use std:: net:: { AddrParseError , Ipv4Addr , Ipv6Addr , SocketAddr } ;
44
44
use crate :: io:: { self , Read } ;
45
45
use crate :: io_extras:: read_to_end;
46
46
47
47
use crate :: util:: events:: { MessageSendEventsProvider , OnionMessageProvider } ;
48
48
use crate :: util:: logger;
49
+ use crate :: util:: base32;
49
50
use crate :: util:: ser:: { LengthReadable , Readable , ReadableArgs , Writeable , Writer , FixedLengthReader , HighZeroBytesDroppedBigSize , Hostname } ;
50
51
51
52
use crate :: ln:: { PaymentPreimage , PaymentHash , PaymentSecret } ;
@@ -638,42 +639,43 @@ impl Readable for NetAddress {
638
639
}
639
640
}
640
641
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
-
648
642
impl FromStr for NetAddress {
649
643
type Err = AddrParseError ;
650
644
651
645
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
+ } ,
670
678
}
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" ) ;
677
679
}
678
680
}
679
681
@@ -3077,6 +3079,6 @@ mod tests {
3077
3079
assert_eq ! ( ipv4_net_address, result_ipv4) ;
3078
3080
assert_eq ! ( ipv6_net_address, result_ipv6) ;
3079
3081
assert_eq ! ( hostname_net_address, result_hostname) ;
3080
- assert_eq ! ( onionv3_net_address, result_onionv3) ; // failing
3082
+ assert_eq ! ( onionv3_net_address, result_onionv3) ;
3081
3083
}
3082
3084
}
0 commit comments