@@ -5,6 +5,7 @@ use r2d2::Pool;
55use tokio:: { sync:: mpsc:: Sender , time:: Instant } ;
66
77use bitcoincore_rpc:: bitcoin:: absolute:: { Height , LockTime } ;
8+ use std:: str:: FromStr ;
89use tracing:: info;
910
1011use super :: rpc:: BitcoinRpc ;
@@ -38,7 +39,7 @@ pub async fn run(
3839 continue ;
3940 }
4041
41- if tx. output . len ( ) < 2 {
42+ if tx. output . len ( ) < 2 || tx . output . len ( ) > 5 {
4243 continue ;
4344 }
4445
@@ -96,13 +97,23 @@ fn extract_onion_address_from_script(script: &[u8]) -> Option<String> {
9697
9798 let data = & script[ data_start..data_start + data_len] ;
9899 let decoded = String :: from_utf8 ( data. to_vec ( ) ) . ok ( ) ?;
100+
101+ #[ cfg( not( feature = "integration-test" ) ) ]
99102 if is_valid_onion_address ( & decoded) {
100103 Some ( decoded)
101104 } else {
102105 None
103106 }
107+
108+ #[ cfg( feature = "integration-test" ) ]
109+ if is_valid_address ( & decoded) {
110+ Some ( decoded)
111+ } else {
112+ None
113+ }
104114}
105115
116+ #[ cfg( not( feature = "integration-test" ) ) ]
106117fn is_valid_onion_address ( s : & str ) -> bool {
107118 let parts: Vec < & str > = s. split ( ':' ) . collect ( ) ;
108119 if parts. len ( ) != 2 {
@@ -115,3 +126,61 @@ fn is_valid_onion_address(s: &str) -> bool {
115126 }
116127 matches ! ( port. parse:: <u16 >( ) , Ok ( p) if p > 0 )
117128}
129+
130+ #[ cfg( feature = "integration-test" ) ]
131+ fn is_valid_address ( s : & str ) -> bool {
132+ let parts: Vec < & str > = s. split ( ':' ) . collect ( ) ;
133+ if parts. len ( ) != 2 {
134+ return false ;
135+ }
136+
137+ let ip = parts[ 0 ] ;
138+ let port = parts[ 1 ] ;
139+
140+ if std:: net:: Ipv4Addr :: from_str ( ip) . is_err ( ) {
141+ return false ;
142+ }
143+
144+ matches ! ( port. parse:: <u16 >( ) , Ok ( p) if p > 0 )
145+ }
146+
147+ #[ cfg( not( feature = "integration-test" ) ) ]
148+ #[ cfg( test) ]
149+ mod tests_onion {
150+ use super :: * ;
151+
152+ #[ test]
153+ fn test_valid_onion_address ( ) {
154+ assert ! ( is_valid_onion_address( "example.onion:1234" ) ) ;
155+ assert ! ( is_valid_onion_address( "abc1234567890def.onion:65535" ) ) ;
156+ }
157+
158+ #[ test]
159+ fn test_invalid_onion_address ( ) {
160+ assert ! ( !is_valid_onion_address( "example.com:1234" ) ) ;
161+ assert ! ( !is_valid_onion_address( "example.onion:0" ) ) ;
162+ assert ! ( !is_valid_onion_address( "example.onion" ) ) ;
163+ assert ! ( !is_valid_onion_address( "127.0.0.1:8080" ) ) ;
164+ }
165+ }
166+
167+ #[ cfg( feature = "integration-test" ) ]
168+ #[ cfg( test) ]
169+ mod tests_ipv4 {
170+ use super :: * ;
171+
172+ #[ test]
173+ fn test_valid_ipv4_address ( ) {
174+ assert ! ( is_valid_address( "127.0.0.1:8080" ) ) ;
175+ assert ! ( is_valid_address( "192.168.1.1:65535" ) ) ;
176+ }
177+
178+ #[ test]
179+ fn test_invalid_ipv4_address ( ) {
180+ assert ! ( !is_valid_address( "example.onion:1234" ) ) ;
181+ assert ! ( !is_valid_address( "256.0.0.1:8080" ) ) ;
182+ assert ! ( !is_valid_address( "127.0.0.1:0" ) ) ;
183+ assert ! ( !is_valid_address( "127.0.0.1" ) ) ;
184+ assert ! ( !is_valid_address( "::1:8080" ) ) ;
185+ }
186+ }
0 commit comments