|
| 1 | +//! DoS Protection Enforcement for LSP operations. |
| 2 | +//! |
| 3 | +//! This module provides mechanisms to prevent denial-of-service attacks |
| 4 | +//! when using the Lightning Service Provider (LSP) protocols. |
| 5 | +
|
| 6 | +#[cfg(lsps1_service)] |
| 7 | +use crate::lsps1::service::LSPS1ServiceHandler; |
| 8 | +use crate::lsps2::service::LSPS2ServiceHandler; |
| 9 | +use crate::lsps5::service::LSPS5ServiceHandler; |
| 10 | +use crate::utils::time::TimeProvider; |
| 11 | +use bitcoin::secp256k1::PublicKey; |
| 12 | +use core::ops::Deref; |
| 13 | +#[cfg(lsps1_service)] |
| 14 | +use lightning::chain::Filter; |
| 15 | +use lightning::ln::channelmanager::AChannelManager; |
| 16 | +#[cfg(lsps1_service)] |
| 17 | +use lightning::sign::EntropySource; |
| 18 | +use lightning::sign::NodeSigner; |
| 19 | + |
| 20 | +/// A trait for implementing Denial-of-Service (DoS) protection mechanisms for LSP services. |
| 21 | +pub trait DosProtectionEnforcer { |
| 22 | + /// Checks if the specified peer is currently engaged in an ongoing operation. |
| 23 | + /// |
| 24 | + /// Different LSP protocols have different definitions of "engagement": |
| 25 | + /// - **LSPS1**: Checks for active channel order requests |
| 26 | + /// - **LSPS2**: Checks for pending channel open requests |
| 27 | + /// - **LSPS5**: Checks for existing open channels with the client |
| 28 | + fn is_engaged(&self, counterparty_node_id: &PublicKey) -> bool; |
| 29 | +} |
| 30 | + |
| 31 | +#[cfg(lsps1_service)] |
| 32 | +impl<ES: Deref, CM: Deref + Clone, C: Deref> DosProtectionEnforcer |
| 33 | + for LSPS1ServiceHandler<ES, CM, C> |
| 34 | +where |
| 35 | + ES::Target: EntropySource, |
| 36 | + CM::Target: AChannelManager, |
| 37 | + C::Target: Filter, |
| 38 | +{ |
| 39 | + fn is_engaged(&self, counterparty_node_id: &PublicKey) -> bool { |
| 40 | + self.has_active_requests(counterparty_node_id) |
| 41 | + } |
| 42 | +} |
| 43 | + |
| 44 | +impl<CM: Deref> DosProtectionEnforcer for LSPS2ServiceHandler<CM> |
| 45 | +where |
| 46 | + CM::Target: AChannelManager, |
| 47 | +{ |
| 48 | + fn is_engaged(&self, counterparty_node_id: &PublicKey) -> bool { |
| 49 | + self.has_pending_channel_open_request(counterparty_node_id) |
| 50 | + } |
| 51 | +} |
| 52 | + |
| 53 | +impl<CM: Deref, NS: Deref, TP: Deref> DosProtectionEnforcer for LSPS5ServiceHandler<CM, NS, TP> |
| 54 | +where |
| 55 | + CM::Target: AChannelManager, |
| 56 | + TP::Target: TimeProvider, |
| 57 | + NS::Target: NodeSigner, |
| 58 | +{ |
| 59 | + fn is_engaged(&self, counterparty_node_id: &PublicKey) -> bool { |
| 60 | + self.client_has_open_channel(counterparty_node_id) |
| 61 | + } |
| 62 | +} |
0 commit comments