@ -826,6 +826,33 @@ static u8 *convert_failcode(const tal_t *ctx,
}
}
}
}
static void
htlc_accepted_hook_try_resolve ( struct htlc_accepted_hook_payload * request ,
struct preimage * payment_preimage )
{
struct sha256 payment_hash ;
struct htlc_in * hin = request - > hin ;
u8 * unknown_details ;
/* Verify that the provided secret hashes to what we need. */
sha256 ( & payment_hash , payment_preimage , sizeof ( struct preimage ) ) ;
if ( ! sha256_eq ( & payment_hash , & hin - > payment_hash ) ) {
log_broken (
request - > channel - > log ,
" Plugin returned a preimage (sha256(%s) = %s) that doesn't "
" match the HTLC hash (%s) it tries to resolve. " ,
type_to_string ( tmpctx , struct preimage , payment_preimage ) ,
type_to_string ( tmpctx , struct sha256 , & payment_hash ) ,
type_to_string ( tmpctx , struct sha256 , & hin - > payment_hash ) ) ;
unknown_details = tal_arr ( NULL , u8 , 0 ) ;
towire_u16 ( & unknown_details , 0x400f ) ;
local_fail_in_htlc ( hin , take ( unknown_details ) ) ;
} else {
fulfill_htlc ( hin , payment_preimage ) ;
}
}
/**
/**
* Callback when a plugin answers to the htlc_accepted hook
* Callback when a plugin answers to the htlc_accepted hook
*/
*/
@ -893,7 +920,7 @@ static bool htlc_accepted_hook_deserialize(struct htlc_accepted_hook_payload *re
if ( ! json_to_preimage ( buffer , paykeytok , & payment_preimage ) )
if ( ! json_to_preimage ( buffer , paykeytok , & payment_preimage ) )
fatal ( " Plugin specified an invalid 'payment_key': %s " ,
fatal ( " Plugin specified an invalid 'payment_key': %s " ,
json_tok_full ( buffer , resulttok ) ) ;
json_tok_full ( buffer , resulttok ) ) ;
fulfill_htlc ( hin , & payment_preimage ) ;
htlc_accepted_hook_try_resolve ( request , & payment_preimage ) ;
return false ;
return false ;
} else {
} else {
fatal ( " Plugin responded with an unknown result to the "
fatal ( " Plugin responded with an unknown result to the "