Skip to content

Commit e0c7e55

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` for messages we forward on behalf of another node (the BOLT 12 static-invoice-server flow), where the sending peer is not plumbed through to OffersMessageHandler. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 0c37f08 commit e0c7e55

3 files changed

Lines changed: 24 additions & 11 deletions

File tree

lightning/src/events/mod.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,9 +1851,14 @@ 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 us the onion message we're forwarding, if known.
1855+
///
1856+
/// This is `None` for messages we forward on behalf of another node — e.g. as part of
1857+
/// the BOLT 12 static-invoice-server flow — where the sending peer is not tracked.
1858+
prev_node_id: Option<PublicKey>,
1859+
/// The node id of the offline peer we intended to forward the message to.
1860+
next_node_id: PublicKey,
1861+
/// The onion message intended to be forwarded to `next_node_id`.
18571862
message: msgs::OnionMessage,
18581863
},
18591864
/// Indicates that an onion message supporting peer has come online and any messages previously
@@ -2435,10 +2440,11 @@ impl Writeable for Event {
24352440
35u8.write(writer)?;
24362441
// Never write ConnectionNeeded events as buffered onion messages aren't serialized.
24372442
},
2438-
&Event::OnionMessageIntercepted { ref peer_node_id, ref message } => {
2443+
&Event::OnionMessageIntercepted { ref prev_node_id, ref next_node_id, ref message } => {
24392444
37u8.write(writer)?;
24402445
write_tlv_fields!(writer, {
2441-
(0, peer_node_id, required),
2446+
(0, next_node_id, required),
2447+
(1, prev_node_id, option),
24422448
(2, message, required),
24432449
});
24442450
},
@@ -3068,11 +3074,13 @@ impl MaybeReadable for Event {
30683074
37u8 => {
30693075
let mut f = || {
30703076
_init_and_read_len_prefixed_tlv_fields!(reader, {
3071-
(0, peer_node_id, required),
3077+
(0, next_node_id, required),
3078+
(1, prev_node_id, option),
30723079
(2, message, required),
30733080
});
30743081
Ok(Some(Event::OnionMessageIntercepted {
3075-
peer_node_id: peer_node_id.0.unwrap(),
3082+
prev_node_id,
3083+
next_node_id: next_node_id.0.unwrap(),
30763084
message: message.0.unwrap(),
30773085
}))
30783086
};

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)