Skip to content

Commit 41ef2e6

Browse files
jkczyzclaude
andcommitted
Report the sending peer in Event::OnionMessageIntercepted
When the OnionMessenger intercepts a message bound for an offline peer, it now reports which peer sent us the message to forward via a new `prev_node_id` field, so handlers can apply source-based policy when deciding whether to forward. The existing destination field is renamed `peer_node_id` -> `next_node_id` so the two node ids are unambiguous. `prev_node_id` is `None` when the forward is enqueued by a message handler (the BOLT 12 static-invoice-server flow), which isn't given the sending node; otherwise it is the node we received the message from. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 0c37f08 commit 41ef2e6

3 files changed

Lines changed: 25 additions & 11 deletions

File tree

lightning/src/events/mod.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,9 +1851,15 @@ pub enum Event {
18511851
///
18521852
/// [`OnionMessenger::new_with_offline_peer_interception`]: crate::onion_message::messenger::OnionMessenger::new_with_offline_peer_interception
18531853
OnionMessageIntercepted {
1854-
/// The node id of the offline peer.
1855-
peer_node_id: PublicKey,
1856-
/// The onion message intended to be forwarded to `peer_node_id`.
1854+
/// The node id of the peer that sent the message, if known.
1855+
///
1856+
/// This is `None` when the forward is enqueued by a message handler (e.g. the BOLT 12
1857+
/// static-invoice-server flow), which isn't given the sending node. Otherwise it is the
1858+
/// node we received the message from.
1859+
prev_node_id: Option<PublicKey>,
1860+
/// The node id of the offline peer we intended to forward the message to.
1861+
next_node_id: PublicKey,
1862+
/// The onion message intended to be forwarded to `next_node_id`.
18571863
message: msgs::OnionMessage,
18581864
},
18591865
/// Indicates that an onion message supporting peer has come online and any messages previously
@@ -2435,10 +2441,11 @@ impl Writeable for Event {
24352441
35u8.write(writer)?;
24362442
// Never write ConnectionNeeded events as buffered onion messages aren't serialized.
24372443
},
2438-
&Event::OnionMessageIntercepted { ref peer_node_id, ref message } => {
2444+
&Event::OnionMessageIntercepted { ref prev_node_id, ref next_node_id, ref message } => {
24392445
37u8.write(writer)?;
24402446
write_tlv_fields!(writer, {
2441-
(0, peer_node_id, required),
2447+
(0, next_node_id, required),
2448+
(1, prev_node_id, option),
24422449
(2, message, required),
24432450
});
24442451
},
@@ -3068,11 +3075,13 @@ impl MaybeReadable for Event {
30683075
37u8 => {
30693076
let mut f = || {
30703077
_init_and_read_len_prefixed_tlv_fields!(reader, {
3071-
(0, peer_node_id, required),
3078+
(0, next_node_id, required),
3079+
(1, prev_node_id, option),
30723080
(2, message, required),
30733081
});
30743082
Ok(Some(Event::OnionMessageIntercepted {
3075-
peer_node_id: peer_node_id.0.unwrap(),
3083+
prev_node_id,
3084+
next_node_id: next_node_id.0.unwrap(),
30763085
message: message.0.unwrap(),
30773086
}))
30783087
};

lightning/src/onion_message/functional_tests.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,8 +1144,9 @@ fn intercept_offline_peer_oms() {
11441144
let mut events = release_events(&nodes[1]);
11451145
assert_eq!(events.len(), 1);
11461146
let onion_message = match events.remove(0) {
1147-
Event::OnionMessageIntercepted { peer_node_id, message } => {
1148-
assert_eq!(peer_node_id, final_node_vec[0].node_id);
1147+
Event::OnionMessageIntercepted { prev_node_id, next_node_id, message } => {
1148+
assert_eq!(prev_node_id, Some(nodes[0].node_id));
1149+
assert_eq!(next_node_id, final_node_vec[0].node_id);
11491150
message
11501151
},
11511152
_ => panic!(),

lightning/src/onion_message/messenger.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1547,6 +1547,7 @@ impl<
15471547

15481548
let result = if is_forward {
15491549
self.enqueue_forwarded_onion_message(
1550+
None,
15501551
NextMessageHop::NodeId(first_node_id),
15511552
onion_message,
15521553
log_suffix,
@@ -1662,7 +1663,8 @@ impl<
16621663
}
16631664

16641665
fn enqueue_forwarded_onion_message(
1665-
&self, next_hop: NextMessageHop, onion_message: OnionMessage, log_suffix: fmt::Arguments,
1666+
&self, prev_node_id: Option<PublicKey>, next_hop: NextMessageHop,
1667+
onion_message: OnionMessage, log_suffix: fmt::Arguments,
16661668
) -> Result<(), SendError> {
16671669
let next_node_id = match next_hop {
16681670
NextMessageHop::NodeId(pubkey) => pubkey,
@@ -1712,7 +1714,8 @@ impl<
17121714
log_suffix
17131715
);
17141716
self.enqueue_intercepted_event(Event::OnionMessageIntercepted {
1715-
peer_node_id: next_node_id,
1717+
prev_node_id,
1718+
next_node_id,
17161719
message: onion_message,
17171720
});
17181721
Ok(())
@@ -2293,6 +2296,7 @@ impl<
22932296
},
22942297
Ok(PeeledOnion::Forward(next_hop, onion_message)) => {
22952298
let _ = self.enqueue_forwarded_onion_message(
2299+
Some(peer_node_id),
22962300
next_hop,
22972301
onion_message,
22982302
format_args!("when forwarding peeled onion message from {}", peer_node_id),

0 commit comments

Comments
 (0)