diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2025-11-04 07:45:56 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2025-11-04 07:45:56 +0000 |
| commit | 8190a3a1b4541e86692d5e1210f955fc8c8351a8 (patch) | |
| tree | c6353e2d4756b96f08bf64de7bc66a903cbf392f /grasp-audit/src/audit.rs | |
| parent | c92faa11d669832e9339d8f7707220ff44553008 (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.rs | 44 |
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 | ||