@@ -19,16 +19,15 @@ use crate::lsps1::service::{LSPS1ServiceConfig, LSPS1ServiceHandler};
19
19
use crate :: lsps2:: client:: { LSPS2ClientConfig , LSPS2ClientHandler } ;
20
20
use crate :: lsps2:: msgs:: LSPS2Message ;
21
21
use crate :: lsps2:: service:: { LSPS2ServiceConfig , LSPS2ServiceHandler } ;
22
- use crate :: prelude:: { HashMap , ToString , Vec } ;
22
+ use crate :: prelude:: { HashMap , HashSet , ToString , Vec } ;
23
23
use crate :: sync:: { Arc , Mutex , RwLock } ;
24
24
25
25
use lightning:: chain:: { self , BestBlock , Confirm , Filter , Listen } ;
26
26
use lightning:: ln:: channelmanager:: { AChannelManager , ChainParameters } ;
27
27
use lightning:: ln:: features:: { InitFeatures , NodeFeatures } ;
28
- use lightning:: ln:: msgs:: { ErrorAction , ErrorMessage , LightningError } ;
28
+ use lightning:: ln:: msgs:: { ErrorAction , LightningError } ;
29
29
use lightning:: ln:: peer_handler:: CustomMessageHandler ;
30
30
use lightning:: ln:: wire:: CustomMessageReader ;
31
- use lightning:: ln:: ChannelId ;
32
31
use lightning:: sign:: EntropySource ;
33
32
use lightning:: util:: logger:: Level ;
34
33
use lightning:: util:: ser:: Readable ;
94
93
pending_messages : Arc < MessageQueue > ,
95
94
pending_events : Arc < EventQueue > ,
96
95
request_id_to_method_map : Mutex < HashMap < RequestId , LSPSMethod > > ,
96
+ // We ignore peers if they send us bogus data.
97
+ ignored_peers : RwLock < HashSet < PublicKey > > ,
97
98
lsps0_client_handler : LSPS0ClientHandler < ES > ,
98
99
lsps0_service_handler : Option < LSPS0ServiceHandler > ,
99
100
#[ cfg( lsps1) ]
@@ -126,6 +127,7 @@ where
126
127
where {
127
128
let pending_messages = Arc :: new ( MessageQueue :: new ( ) ) ;
128
129
let pending_events = Arc :: new ( EventQueue :: new ( ) ) ;
130
+ let ignored_peers = RwLock :: new ( HashSet :: new ( ) ) ;
129
131
130
132
let lsps0_client_handler = LSPS0ClientHandler :: new (
131
133
entropy_source. clone ( ) ,
@@ -192,6 +194,7 @@ where {
192
194
pending_messages,
193
195
pending_events,
194
196
request_id_to_method_map : Mutex :: new ( HashMap :: new ( ) ) ,
197
+ ignored_peers,
195
198
lsps0_client_handler,
196
199
lsps0_service_handler,
197
200
#[ cfg( lsps1) ]
@@ -480,6 +483,16 @@ where
480
483
fn handle_custom_message (
481
484
& self , msg : Self :: CustomMessage , sender_node_id : & PublicKey ,
482
485
) -> Result < ( ) , lightning:: ln:: msgs:: LightningError > {
486
+ {
487
+ if self . ignored_peers . read ( ) . unwrap ( ) . contains ( & sender_node_id) {
488
+ let err = format ! ( "Ignoring message from peer {}." , sender_node_id) ;
489
+ return Err ( LightningError {
490
+ err,
491
+ action : ErrorAction :: IgnoreAndLog ( Level :: Trace ) ,
492
+ } ) ;
493
+ }
494
+ }
495
+
483
496
let message = {
484
497
{
485
498
let mut request_id_to_method_map = self . request_id_to_method_map . lock ( ) . unwrap ( ) ;
@@ -493,10 +506,12 @@ where
493
506
} ;
494
507
495
508
self . pending_messages . enqueue ( sender_node_id, LSPSMessage :: Invalid ( error) ) ;
496
- let err = format ! ( "Failed to deserialize invalid LSPS message." ) ;
497
- let err_msg =
498
- Some ( ErrorMessage { channel_id : ChannelId ( [ 0 ; 32 ] ) , data : err. clone ( ) } ) ;
499
- LightningError { err, action : ErrorAction :: DisconnectPeer { msg : err_msg } }
509
+ self . ignored_peers . write ( ) . unwrap ( ) . insert ( * sender_node_id) ;
510
+ let err = format ! (
511
+ "Failed to deserialize invalid LSPS message. Ignoring peer {} from now on." ,
512
+ sender_node_id
513
+ ) ;
514
+ LightningError { err, action : ErrorAction :: IgnoreAndLog ( Level :: Info ) }
500
515
} ) ?
501
516
} ;
502
517
0 commit comments