3
3
use bitcoin:: secp256k1:: { SecretKey , PublicKey } ;
4
4
5
5
use ln:: peers:: conduit:: Conduit ;
6
- use ln:: peers:: handler:: { ITransport , PayloadQueuer } ;
6
+ use ln:: peers:: handler:: { ITransport , PeerHandleError , PayloadQueuer } ;
7
7
use ln:: peers:: handshake:: PeerHandshake ;
8
- use ln:: wire;
9
- use ln:: wire:: Encode ;
8
+ use ln:: { wire, msgs } ;
9
+ use ln:: wire:: { Encode , Message } ;
10
10
11
11
use util:: ser:: { Writeable , VecWriter } ;
12
+ use util:: logger:: Logger ;
13
+ use std:: ops:: Deref ;
12
14
13
15
/// Interface used by Transport to interact with a handshake object
14
16
pub trait IPeerHandshake {
@@ -78,6 +80,68 @@ impl<PeerHandshakeImpl: IPeerHandshake> ITransport for Transport<PeerHandshakeIm
78
80
Ok ( ( ) )
79
81
}
80
82
83
+ fn drain_messages < L : Deref > ( & mut self , logger : L ) -> Result < Vec < Message > , PeerHandleError >
84
+ where L :: Target : Logger {
85
+
86
+ let mut received_messages = vec ! [ ] ;
87
+
88
+ match self . conduit {
89
+ None => { }
90
+ Some ( ref mut conduit) => {
91
+ // Using Iterators that can error requires special handling
92
+ // The item returned from next() has type Option<Result<Option<Vec>, String>>
93
+ // The Some wrapper is stripped for each item inside the loop
94
+ // There are 3 valid match cases:
95
+ // 1) Some(Ok(Some(msg_data))) => Indicates a valid decrypted msg accessed via msg_data
96
+ // 2) Some(Err(_)) => Indicates an error during decryption that should be handled
97
+ // 3) None -> Indicates there were no messages available to decrypt
98
+ // Invalid Cases
99
+ // 1) Some(Ok(None)) => Translated to None case above so users of iterators can stop correctly
100
+ for msg_data_result in & mut conduit. decryptor {
101
+ match msg_data_result {
102
+ Ok ( Some ( msg_data) ) => {
103
+ let mut reader = :: std:: io:: Cursor :: new ( & msg_data[ ..] ) ;
104
+ let message_result = wire:: read ( & mut reader) ;
105
+ let message = match message_result {
106
+ Ok ( x) => x,
107
+ Err ( e) => {
108
+ match e {
109
+ msgs:: DecodeError :: UnknownVersion => return Err ( PeerHandleError { no_connection_possible : false } ) ,
110
+ msgs:: DecodeError :: UnknownRequiredFeature => {
111
+ log_debug ! ( logger, "Got a channel/node announcement with an known required feature flag, you may want to update!" ) ;
112
+ continue ;
113
+ }
114
+ msgs:: DecodeError :: InvalidValue => {
115
+ log_debug ! ( logger, "Got an invalid value while deserializing message" ) ;
116
+ return Err ( PeerHandleError { no_connection_possible : false } ) ;
117
+ }
118
+ msgs:: DecodeError :: ShortRead => {
119
+ log_debug ! ( logger, "Deserialization failed due to shortness of message" ) ;
120
+ return Err ( PeerHandleError { no_connection_possible : false } ) ;
121
+ }
122
+ msgs:: DecodeError :: BadLengthDescriptor => return Err ( PeerHandleError { no_connection_possible : false } ) ,
123
+ msgs:: DecodeError :: Io ( _) => return Err ( PeerHandleError { no_connection_possible : false } ) ,
124
+ }
125
+ }
126
+ } ;
127
+
128
+ received_messages. push ( message) ;
129
+ } ,
130
+ Err ( e) => {
131
+ log_trace ! ( logger, "Message decryption failed due to: {}" , e) ;
132
+ return Err ( PeerHandleError { no_connection_possible : false } ) ;
133
+ }
134
+ Ok ( None ) => {
135
+ panic ! ( "Invalid behavior. Conduit iterator should never return this match." )
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+
142
+ Ok ( received_messages)
143
+ }
144
+
81
145
fn is_connected ( & self ) -> bool {
82
146
self . conduit . is_some ( )
83
147
}
@@ -102,6 +166,7 @@ mod tests {
102
166
use bitcoin:: secp256k1;
103
167
use bitcoin:: secp256k1:: key:: { PublicKey , SecretKey } ;
104
168
use ln:: msgs;
169
+ use util:: test_utils:: TestLogger ;
105
170
106
171
fn create_outbound_for_test < PeerHandshakeImpl : IPeerHandshake > ( ) -> Transport < PeerHandshakeImpl > {
107
172
let curve = secp256k1:: Secp256k1 :: new ( ) ;
@@ -254,4 +319,22 @@ mod tests {
254
319
255
320
assert_matches ! ( & spy[ ..] , [ _] ) ;
256
321
}
322
+
323
+ #[ test]
324
+ fn inbound_not_connected_empty ( ) {
325
+ let logger = TestLogger :: new ( ) ;
326
+ let mut transport = create_inbound_for_test :: < PeerHandshakeTestStubComplete > ( ) ;
327
+
328
+ let messages = transport. drain_messages ( & logger) . unwrap ( ) ;
329
+ assert_eq ! ( messages. len( ) , 0 ) ;
330
+ }
331
+
332
+ #[ test]
333
+ fn outbound_not_connected_empty ( ) {
334
+ let logger = TestLogger :: new ( ) ;
335
+ let mut transport = create_outbound_for_test :: < PeerHandshakeTestStubComplete > ( ) ;
336
+
337
+ let messages = transport. drain_messages ( & logger) . unwrap ( ) ;
338
+ assert_eq ! ( messages. len( ) , 0 ) ;
339
+ }
257
340
}
0 commit comments