upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/grasp-audit/src/audit.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-11-04 07:45:56 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-11-04 07:45:56 +0000
commit8190a3a1b4541e86692d5e1210f955fc8c8351a8 (patch)
treec6353e2d4756b96f08bf64de7bc66a903cbf392f /grasp-audit/src/audit.rs
parentc92faa11d669832e9339d8f7707220ff44553008 (diff)
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.
Diffstat (limited to 'grasp-audit/src/audit.rs')
-rw-r--r--grasp-audit/src/audit.rs44
1 files changed, 34 insertions, 10 deletions
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 {
63 63
64 /// Get audit tags for an event 64 /// Get audit tags for an event
65 pub fn audit_tags(&self) -> Vec<Tag> { 65 pub fn audit_tags(&self) -> Vec<Tag> {
66 use nostr_sdk::prelude::{Alphabet, SingleLetterTag};
67
66 vec![ 68 vec![
69 // Use single-letter tags for filtering support
70 // "g" = grasp-audit marker
67 Tag::custom( 71 Tag::custom(
68 TagKind::Custom(std::borrow::Cow::Borrowed("grasp-audit")), 72 TagKind::SingleLetter(SingleLetterTag::lowercase(Alphabet::G)),
69 vec!["true"] 73 vec!["grasp-audit"]
70 ), 74 ),
75 // "r" = audit run ID
71 Tag::custom( 76 Tag::custom(
72 TagKind::Custom(std::borrow::Cow::Borrowed("audit-run-id")), 77 TagKind::SingleLetter(SingleLetterTag::lowercase(Alphabet::R)),
73 vec![self.run_id.clone()] 78 vec![self.run_id.clone()]
74 ), 79 ),
80 // "c" = cleanup timestamp
75 Tag::custom( 81 Tag::custom(
76 TagKind::Custom(std::borrow::Cow::Borrowed("audit-cleanup")), 82 TagKind::SingleLetter(SingleLetterTag::lowercase(Alphabet::C)),
77 vec![self.cleanup_after.to_string()] 83 vec![self.cleanup_after.to_string()]
78 ), 84 ),
79 ] 85 ]
@@ -146,24 +152,42 @@ mod tests {
146 152
147 #[test] 153 #[test]
148 fn test_audit_tags() { 154 fn test_audit_tags() {
155 use nostr_sdk::prelude::{Alphabet, SingleLetterTag};
156
149 let config = AuditConfig::ci(); 157 let config = AuditConfig::ci();
150 let tags = config.audit_tags(); 158 let tags = config.audit_tags();
151 159
152 assert_eq!(tags.len(), 3); 160 assert_eq!(tags.len(), 3);
153 161
154 // Check grasp-audit tag 162 let g_tag = SingleLetterTag::lowercase(Alphabet::G);
163 let r_tag = SingleLetterTag::lowercase(Alphabet::R);
164 let c_tag = SingleLetterTag::lowercase(Alphabet::C);
165
166 // Check "g" tag (grasp-audit marker)
155 assert!(tags.iter().any(|t| { 167 assert!(tags.iter().any(|t| {
156 matches!(t.kind(), TagKind::Custom(k) if k == "grasp-audit") 168 if let TagKind::SingleLetter(letter) = t.kind() {
169 letter == g_tag
170 } else {
171 false
172 }
157 })); 173 }));
158 174
159 // Check audit-run-id tag 175 // Check "r" tag (audit run ID)
160 assert!(tags.iter().any(|t| { 176 assert!(tags.iter().any(|t| {
161 matches!(t.kind(), TagKind::Custom(k) if k == "audit-run-id") 177 if let TagKind::SingleLetter(letter) = t.kind() {
178 letter == r_tag
179 } else {
180 false
181 }
162 })); 182 }));
163 183
164 // Check audit-cleanup tag 184 // Check "c" tag (cleanup timestamp)
165 assert!(tags.iter().any(|t| { 185 assert!(tags.iter().any(|t| {
166 matches!(t.kind(), TagKind::Custom(k) if k == "audit-cleanup") 186 if let TagKind::SingleLetter(letter) = t.kind() {
187 letter == c_tag
188 } else {
189 false
190 }
167 })); 191 }));
168 } 192 }
169 193