@@ -108,15 +108,16 @@ enum InitSyncTracker{
108
108
}
109
109
110
110
enum PeerState {
111
- Authenticating ( PeerHandshake ) ,
111
+ Handshake ( PeerHandshake ) ,
112
112
Connected ( Conduit ) ,
113
113
}
114
114
115
115
impl PeerState {
116
116
fn is_ready_for_encryption ( & self ) -> bool {
117
- match self {
118
- & PeerState :: Connected ( _) => true ,
119
- _ => false
117
+ if let & PeerState :: Connected ( _) = self {
118
+ true
119
+ } else {
120
+ false
120
121
}
121
122
}
122
123
}
@@ -282,7 +283,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
282
283
283
284
let mut peers = self . peers . lock ( ) . unwrap ( ) ;
284
285
if peers. peers . insert ( descriptor, Peer {
285
- encryptor : PeerState :: Authenticating ( handshake) ,
286
+ encryptor : PeerState :: Handshake ( handshake) ,
286
287
outbound : true ,
287
288
their_node_id : Some ( their_node_id. clone ( ) ) ,
288
289
their_features : None ,
@@ -317,7 +318,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
317
318
318
319
let mut peers = self . peers . lock ( ) . unwrap ( ) ;
319
320
if peers. peers . insert ( descriptor, Peer {
320
- encryptor : PeerState :: Authenticating ( handshake) ,
321
+ encryptor : PeerState :: Handshake ( handshake) ,
321
322
outbound : false ,
322
323
their_node_id : None ,
323
324
their_features : None ,
@@ -468,9 +469,9 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
468
469
let mut conduit_option = None ;
469
470
let mut remote_pubkey_option = None ;
470
471
471
- if let & mut PeerState :: Authenticating ( ref mut handshake) = & mut peer. encryptor {
472
+ if let & mut PeerState :: Handshake ( ref mut handshake) = & mut peer. encryptor {
472
473
let ( response, conduit, remote_pubkey) = handshake. process_act ( & peer. pending_read_buffer , None ) . unwrap ( ) ;
473
- peer. pending_read_buffer = Vec :: new ( ) ; // empty the pending read buffer
474
+ peer. pending_read_buffer . drain ( .. ) ; // we read it all
474
475
475
476
if let Some ( key) = remote_pubkey {
476
477
remote_pubkey_option = Some ( key) ;
@@ -489,6 +490,19 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
489
490
if let Some ( conduit) = conduit_option {
490
491
// Rust 1.22 does not allow assignment in a borrowed context, even if mutable
491
492
peer. encryptor = PeerState :: Connected ( conduit) ;
493
+
494
+ // the handshake has finished, so one way or another, we now have their node id
495
+ match peers. node_id_to_descriptor . entry ( peer. their_node_id . unwrap ( ) ) {
496
+ hash_map:: Entry :: Occupied ( _) => {
497
+ log_trace ! ( self , "Got second connection with {}, closing" , log_pubkey!( peer. their_node_id. unwrap( ) ) ) ;
498
+ peer. their_node_id = None ; // Unset so that we don't generate a peer_disconnected event
499
+ return Err ( PeerHandleError { no_connection_possible : false } )
500
+ } ,
501
+ hash_map:: Entry :: Vacant ( entry) => {
502
+ log_trace ! ( self , "Finished noise handshake for connection with {}" , log_pubkey!( peer. their_node_id. unwrap( ) ) ) ;
503
+ entry. insert ( peer_descriptor. clone ( ) )
504
+ } ,
505
+ } ;
492
506
}
493
507
494
508
if let & mut PeerState :: Connected ( ref mut conduit) = & mut peer. encryptor {
@@ -530,12 +544,18 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
530
544
}
531
545
}
532
546
533
- let message_option = conduit. decrypt_single_message ( Some ( & peer. pending_read_buffer ) ) ;
534
- let msg_data = if let Some ( message) = message_option {
535
- message
536
- } else {
547
+ let next_message_result = conduit. decrypt ( & peer. pending_read_buffer ) ;
548
+
549
+ let offset = next_message_result. 1 ;
550
+ if offset == 0 {
551
+ // nothing got read
537
552
break ;
538
- } ;
553
+ } else {
554
+ peer. pending_read_buffer . drain ( 0 ..offset) ;
555
+ }
556
+
557
+ // something got read, so we definitely have a message
558
+ let msg_data = next_message_result. 0 . unwrap ( ) ;
539
559
540
560
let mut reader = :: std:: io:: Cursor :: new ( & msg_data[ ..] ) ;
541
561
let message_result = wire:: read ( & mut reader) ;
0 commit comments