@@ -1858,6 +1858,9 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
18581858 // for now more than 10 paths likely carries too much one-path failure.
18591859 return Err ( PaymentSendFailure :: ParameterError ( APIError :: RouteError { err : "Sending over more than 10 paths is not currently supported" } ) ) ;
18601860 }
1861+ if payment_secret. is_none ( ) && route. paths . len ( ) > 1 {
1862+ return Err ( PaymentSendFailure :: ParameterError ( APIError :: APIMisuseError { err : "Payment secret is required for multi-path payments" . to_string ( ) } ) ) ;
1863+ }
18611864 let mut total_value = 0 ;
18621865 let our_node_id = self . get_our_node_id ( ) ;
18631866 let mut path_errs = Vec :: with_capacity ( route. paths . len ( ) ) ;
@@ -5164,11 +5167,13 @@ mod tests {
51645167 use bitcoin:: hashes:: sha256:: Hash as Sha256 ;
51655168 use core:: time:: Duration ;
51665169 use ln:: { PaymentPreimage , PaymentHash , PaymentSecret } ;
5170+ use ln:: channelmanager:: PaymentSendFailure ;
51675171 use ln:: features:: { InitFeatures , InvoiceFeatures } ;
51685172 use ln:: functional_test_utils:: * ;
51695173 use ln:: msgs;
51705174 use ln:: msgs:: ChannelMessageHandler ;
51715175 use routing:: router:: { get_keysend_route, get_route} ;
5176+ use util:: errors:: APIError ;
51725177 use util:: events:: { Event , MessageSendEvent , MessageSendEventsProvider } ;
51735178 use util:: test_utils;
51745179
@@ -5556,6 +5561,39 @@ mod tests {
55565561
55575562 nodes[ 1 ] . logger . assert_log_contains ( "lightning::ln::channelmanager" . to_string ( ) , "We don't support MPP keysend payments" . to_string ( ) , 1 ) ;
55585563 }
5564+
5565+ #[ test]
5566+ fn test_multi_hop_missing_secret ( ) {
5567+ let chanmon_cfgs = create_chanmon_cfgs ( 4 ) ;
5568+ let node_cfgs = create_node_cfgs ( 4 , & chanmon_cfgs) ;
5569+ let node_chanmgrs = create_node_chanmgrs ( 4 , & node_cfgs, & [ None , None , None , None ] ) ;
5570+ let nodes = create_network ( 4 , & node_cfgs, & node_chanmgrs) ;
5571+
5572+ let chan_1_id = create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 0 . contents . short_channel_id ;
5573+ let chan_2_id = create_announced_chan_between_nodes ( & nodes, 0 , 2 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 0 . contents . short_channel_id ;
5574+ let chan_3_id = create_announced_chan_between_nodes ( & nodes, 1 , 3 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 0 . contents . short_channel_id ;
5575+ let chan_4_id = create_announced_chan_between_nodes ( & nodes, 2 , 3 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) . 0 . contents . short_channel_id ;
5576+ let logger = test_utils:: TestLogger :: new ( ) ;
5577+
5578+ // Marshall an MPP route.
5579+ let ( _, payment_hash, _) = get_payment_preimage_hash ! ( & nodes[ 3 ] ) ;
5580+ let net_graph_msg_handler = & nodes[ 0 ] . net_graph_msg_handler ;
5581+ let mut route = get_route ( & nodes[ 0 ] . node . get_our_node_id ( ) , & net_graph_msg_handler. network_graph . read ( ) . unwrap ( ) , & nodes[ 3 ] . node . get_our_node_id ( ) , Some ( InvoiceFeatures :: known ( ) ) , None , & [ ] , 100000 , TEST_FINAL_CLTV , & logger) . unwrap ( ) ;
5582+ let path = route. paths [ 0 ] . clone ( ) ;
5583+ route. paths . push ( path) ;
5584+ route. paths [ 0 ] [ 0 ] . pubkey = nodes[ 1 ] . node . get_our_node_id ( ) ;
5585+ route. paths [ 0 ] [ 0 ] . short_channel_id = chan_1_id;
5586+ route. paths [ 0 ] [ 1 ] . short_channel_id = chan_3_id;
5587+ route. paths [ 1 ] [ 0 ] . pubkey = nodes[ 2 ] . node . get_our_node_id ( ) ;
5588+ route. paths [ 1 ] [ 0 ] . short_channel_id = chan_2_id;
5589+ route. paths [ 1 ] [ 1 ] . short_channel_id = chan_4_id;
5590+
5591+ match nodes[ 0 ] . node . send_payment_internal ( & route, payment_hash, & None , None ) . unwrap_err ( ) {
5592+ PaymentSendFailure :: ParameterError ( APIError :: APIMisuseError { ref err } ) => {
5593+ assert ! ( regex:: Regex :: new( r"Payment secret is required for multi-path payments" ) . unwrap( ) . is_match( err) ) } ,
5594+ _ => panic ! ( "unexpected error" )
5595+ }
5596+ }
55595597}
55605598
55615599#[ cfg( all( any( test, feature = "_test_utils" ) , feature = "unstable" ) ) ]
0 commit comments