99
1010//! Contains the main bLIP-51 / LSPS1 server object, [`LSPS1ServiceHandler`].
1111
12- use alloc:: string:: { String , ToString } ;
12+ use alloc:: string:: ToString ;
1313use alloc:: vec:: Vec ;
1414
1515use core:: future:: Future as StdFuture ;
@@ -24,6 +24,7 @@ use super::msgs::{
2424 LSPS1GetOrderRequest , LSPS1Message , LSPS1Options , LSPS1OrderId , LSPS1OrderParams ,
2525 LSPS1OrderState , LSPS1PaymentInfo , LSPS1Request , LSPS1Response ,
2626 LSPS1_CREATE_ORDER_REQUEST_ORDER_MISMATCH_ERROR_CODE ,
27+ LSPS1_CREATE_ORDER_REQUEST_UNRECOGNIZED_OR_STALE_TOKEN_ERROR_CODE ,
2728 LSPS1_GET_ORDER_REQUEST_ORDER_NOT_FOUND_ERROR_CODE ,
2829} ;
2930use super :: peer_state:: PeerState ;
@@ -56,8 +57,6 @@ use bitcoin::secp256k1::PublicKey;
5657/// Server-side configuration options for bLIP-51 / LSPS1 channel requests.
5758#[ derive( Clone , Debug ) ]
5859pub struct LSPS1ServiceConfig {
59- /// A token to be send with each channel request.
60- pub token : Option < String > ,
6160 /// The options supported by the LSP.
6261 pub supported_options : LSPS1Options ,
6362}
@@ -446,6 +445,42 @@ where
446445 Ok ( ( ) )
447446 }
448447
448+ /// Used by LSP to inform a client that an order was rejected because the used token was invalid.
449+ ///
450+ /// Should be called in response to receiving a [`LSPS1ServiceEvent::RequestForPaymentDetails`]
451+ /// event if the provided token is invalid.
452+ ///
453+ /// [`LSPS1ServiceEvent::RequestForPaymentDetails`]: crate::lsps1::event::LSPS1ServiceEvent::RequestForPaymentDetails
454+ pub fn invalid_token_provided (
455+ & self , counterparty_node_id : PublicKey , request_id : LSPSRequestId ,
456+ ) -> Result < ( ) , APIError > {
457+ let mut message_queue_notifier = self . pending_messages . notifier ( ) ;
458+
459+ match self . per_peer_state . read ( ) . unwrap ( ) . get ( & counterparty_node_id) {
460+ Some ( inner_state_lock) => {
461+ let mut peer_state_lock = inner_state_lock. lock ( ) . unwrap ( ) ;
462+ peer_state_lock. remove_request ( & request_id) . map_err ( |e| {
463+ debug_assert ! ( false , "Failed to send response due to: {}" , e) ;
464+ let err = format ! ( "Failed to send response due to: {}" , e) ;
465+ APIError :: APIMisuseError { err }
466+ } ) ?;
467+
468+ let response = LSPS1Response :: CreateOrderError ( LSPSResponseError {
469+ code : LSPS1_CREATE_ORDER_REQUEST_UNRECOGNIZED_OR_STALE_TOKEN_ERROR_CODE ,
470+ message : "An unrecognized or stale token was provided" . to_string ( ) ,
471+ data : None ,
472+ } ) ;
473+
474+ let msg = LSPS1Message :: Response ( request_id, response) . into ( ) ;
475+ message_queue_notifier. enqueue ( & counterparty_node_id, msg) ;
476+ Ok ( ( ) )
477+ } ,
478+ None => Err ( APIError :: APIMisuseError {
479+ err : format ! ( "No state for the counterparty exists: {}" , counterparty_node_id) ,
480+ } ) ,
481+ }
482+ }
483+
449484 fn handle_get_order_request (
450485 & self , request_id : LSPSRequestId , counterparty_node_id : & PublicKey ,
451486 params : LSPS1GetOrderRequest ,
@@ -637,6 +672,15 @@ where
637672 }
638673 }
639674
675+ /// Used by LSP to inform a client that an order was rejected because the used token was invalid.
676+ ///
677+ /// Wraps [`LSPS1ServiceHandler::invalid_token_provided`].
678+ pub fn invalid_token_provided (
679+ & self , counterparty_node_id : PublicKey , request_id : LSPSRequestId ,
680+ ) -> Result < ( ) , APIError > {
681+ self . inner . invalid_token_provided ( counterparty_node_id, request_id)
682+ }
683+
640684 /// Used by LSP to give details to client regarding the status of channel opening.
641685 ///
642686 /// Wraps [`LSPS1ServiceHandler::update_order_status`].
0 commit comments