From acd0a0693b2cc37d601707794002798ece09bb41 Mon Sep 17 00:00:00 2001 From: Larry <8cf5a83f590ec0955b11647d1c88f796a98e088c30a492c58e0e46c3026ae7a4@buzz.block.builderlab.xyz> Date: Wed, 12 Aug 2026 16:19:35 -0400 Subject: [PATCH] fix(acp): align edit target validation Signed-off-by: Larry <8cf5a83f590ec0955b11647d1c88f796a98e088c30a492c58e0e46c3026ae7a4@buzz.block.builderlab.xyz> --- crates/buzz-acp/src/queue.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/crates/buzz-acp/src/queue.rs b/crates/buzz-acp/src/queue.rs index 92a0df009b..0ca43537b1 100644 --- a/crates/buzz-acp/src/queue.rs +++ b/crates/buzz-acp/src/queue.rs @@ -1067,8 +1067,11 @@ pub fn edit_target_id(event: &Event) -> Option { .then(|| { event.tags.iter().find_map(|tag| { let parts = tag.as_slice(); - (parts.len() == 2 && parts.first().map(String::as_str) == Some("e")) - .then(|| parts[1].clone()) + (parts.first().map(String::as_str) == Some("e")) + .then(|| parts.get(1)) + .flatten() + .and_then(|target| nostr::EventId::from_hex(target).ok()) + .map(|target| target.to_hex()) }) }) .flatten() @@ -5620,6 +5623,21 @@ mod tests { } } + #[test] + fn edit_target_skips_malformed_e_tags_and_selects_first_valid_id() { + let valid_target = "ab".repeat(32); + let keys = Keys::generate(); + let event = EventBuilder::new(Kind::Custom(40003), "edited mention") + .tags([ + nostr::Tag::parse(["e", "not-an-event-id"]).unwrap(), + nostr::Tag::parse(["e", &valid_target]).unwrap(), + ]) + .sign_with_keys(&keys) + .unwrap(); + + assert_eq!(edit_target_id(&event), Some(valid_target)); + } + #[test] fn edit_of_top_level_anchors_original_message_in_rendered_prompt() { let original_id = "11".repeat(32);