Skip to content

Commit 5148642

Browse files
fixup: only apply DoS protections for state allocating operations.
don't ignore all messages from the peer on lsps5. just the state allocating ones
1 parent 4c1b4a1 commit 5148642

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

lightning-liquidity/src/lsps5/msgs.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,12 @@ pub enum LSPS5Request {
640640
RemoveWebhook(RemoveWebhookRequest),
641641
}
642642

643+
impl LSPS5Request {
644+
pub(crate) fn is_state_allocating(&self) -> bool {
645+
matches!(self, LSPS5Request::SetWebhook(_))
646+
}
647+
}
648+
643649
/// An LSPS5 protocol response.
644650
#[derive(Clone, Debug, PartialEq, Eq)]
645651
pub enum LSPS5Response {

lightning-liquidity/src/manager.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -565,36 +565,38 @@ where
565565
},
566566
}
567567
},
568-
LSPSMessage::LSPS5(msg @ LSPS5Message::Request(..)) => {
568+
LSPSMessage::LSPS5(ref msg @ LSPS5Message::Request(_, ref req)) => {
569569
match &self.lsps5_service_handler {
570570
Some(lsps5_service_handler) => {
571-
let lsps2_has_active_requests = self
572-
.lsps2_service_handler
573-
.as_ref()
574-
.map_or(false, |h| h.has_active_requests(sender_node_id));
575-
#[cfg(lsps1_service)]
576-
let lsps1_has_active_requests = self
577-
.lsps1_service_handler
578-
.as_ref()
579-
.map_or(false, |h| h.has_active_requests(sender_node_id));
580-
#[cfg(not(lsps1_service))]
581-
let lsps1_has_active_requests = false;
582-
583-
if !lsps5_service_handler.can_accept_request(
584-
sender_node_id,
585-
lsps2_has_active_requests,
586-
lsps1_has_active_requests,
587-
) {
588-
return Err(LightningError {
589-
err: format!(
590-
"Rejecting LSPS5 request from {:?} without prior activity (requires open channel or active LSPS1 or LSPS2 flow)",
591-
sender_node_id
592-
),
593-
action: ErrorAction::IgnoreAndLog(Level::Debug),
594-
});
571+
if req.is_state_allocating() {
572+
let lsps2_has_active_requests = self
573+
.lsps2_service_handler
574+
.as_ref()
575+
.map_or(false, |h| h.has_active_requests(sender_node_id));
576+
#[cfg(lsps1_service)]
577+
let lsps1_has_active_requests = self
578+
.lsps1_service_handler
579+
.as_ref()
580+
.map_or(false, |h| h.has_active_requests(sender_node_id));
581+
#[cfg(not(lsps1_service))]
582+
let lsps1_has_active_requests = false;
583+
584+
if !lsps5_service_handler.can_accept_request(
585+
sender_node_id,
586+
lsps2_has_active_requests,
587+
lsps1_has_active_requests,
588+
) {
589+
return Err(LightningError {
590+
err: format!(
591+
"Rejecting LSPS5 request from {:?} without prior activity (requires open channel or active LSPS1 or LSPS2 flow)",
592+
sender_node_id
593+
),
594+
action: ErrorAction::IgnoreAndLog(Level::Debug),
595+
});
596+
}
595597
}
596598

597-
lsps5_service_handler.handle_message(msg, sender_node_id)?;
599+
lsps5_service_handler.handle_message(msg.clone(), sender_node_id)?;
598600
},
599601
None => {
600602
return Err(LightningError { err: format!("Received LSPS5 request message without LSPS5 service handler configured. From node = {:?}", sender_node_id), action: ErrorAction::IgnoreAndLog(Level::Debug)});

0 commit comments

Comments
 (0)