From 8190a3a1b4541e86692d5e1210f955fc8c8351a8 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Tue, 4 Nov 2025 07:45:56 +0000 Subject: Fix audit system tag filtering and event validation - Changed from multi-letter custom tags to single-letter tags (g, r, c) for compatibility with Nostr Filter API - Added validation check in send_event() to detect relay rejections by checking output.success and output.failed - Improved connection stability with retry loop - Added debug output for troubleshooting query issues - All tests now pass: 12/12 unit tests, 6/6 integration tests - CLI verified working with Docker relay Fixes issues discovered during Path 1 integration testing. --- grasp-audit/src/audit.rs | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) (limited to 'grasp-audit/src/audit.rs') diff --git a/grasp-audit/src/audit.rs b/grasp-audit/src/audit.rs index 9efb61a..e902ace 100644 --- a/grasp-audit/src/audit.rs +++ b/grasp-audit/src/audit.rs @@ -63,17 +63,23 @@ impl AuditConfig { /// Get audit tags for an event pub fn audit_tags(&self) -> Vec { + use nostr_sdk::prelude::{Alphabet, SingleLetterTag}; + vec![ + // Use single-letter tags for filtering support + // "g" = grasp-audit marker Tag::custom( - TagKind::Custom(std::borrow::Cow::Borrowed("grasp-audit")), - vec!["true"] + TagKind::SingleLetter(SingleLetterTag::lowercase(Alphabet::G)), + vec!["grasp-audit"] ), + // "r" = audit run ID Tag::custom( - TagKind::Custom(std::borrow::Cow::Borrowed("audit-run-id")), + TagKind::SingleLetter(SingleLetterTag::lowercase(Alphabet::R)), vec![self.run_id.clone()] ), + // "c" = cleanup timestamp Tag::custom( - TagKind::Custom(std::borrow::Cow::Borrowed("audit-cleanup")), + TagKind::SingleLetter(SingleLetterTag::lowercase(Alphabet::C)), vec![self.cleanup_after.to_string()] ), ] @@ -146,24 +152,42 @@ mod tests { #[test] fn test_audit_tags() { + use nostr_sdk::prelude::{Alphabet, SingleLetterTag}; + let config = AuditConfig::ci(); let tags = config.audit_tags(); assert_eq!(tags.len(), 3); - // Check grasp-audit tag + let g_tag = SingleLetterTag::lowercase(Alphabet::G); + let r_tag = SingleLetterTag::lowercase(Alphabet::R); + let c_tag = SingleLetterTag::lowercase(Alphabet::C); + + // Check "g" tag (grasp-audit marker) assert!(tags.iter().any(|t| { - matches!(t.kind(), TagKind::Custom(k) if k == "grasp-audit") + if let TagKind::SingleLetter(letter) = t.kind() { + letter == g_tag + } else { + false + } })); - // Check audit-run-id tag + // Check "r" tag (audit run ID) assert!(tags.iter().any(|t| { - matches!(t.kind(), TagKind::Custom(k) if k == "audit-run-id") + if let TagKind::SingleLetter(letter) = t.kind() { + letter == r_tag + } else { + false + } })); - // Check audit-cleanup tag + // Check "c" tag (cleanup timestamp) assert!(tags.iter().any(|t| { - matches!(t.kind(), TagKind::Custom(k) if k == "audit-cleanup") + if let TagKind::SingleLetter(letter) = t.kind() { + letter == c_tag + } else { + false + } })); } -- cgit v1.2.3