diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2025-12-01 11:56:49 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2025-12-01 11:58:34 +0000 |
| commit | 7a78815e29b01c83f3d0ec195ba717a2eba8cd37 (patch) | |
| tree | 4c5ccd9b812f1d1d75ed218501192ddc5459fd12 /grasp-audit/src/client.rs | |
| parent | e6ceab90de1acad154624022a6036efac18abab6 (diff) | |
reject push when refs/nostr/<event-id> doesnt match known event and delete incorrect ref on event receive
Diffstat (limited to 'grasp-audit/src/client.rs')
| -rw-r--r-- | grasp-audit/src/client.rs | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/grasp-audit/src/client.rs b/grasp-audit/src/client.rs index ed76a34..e4e9f07 100644 --- a/grasp-audit/src/client.rs +++ b/grasp-audit/src/client.rs | |||
| @@ -129,7 +129,9 @@ impl AuditClient { | |||
| 129 | /// Get the relay URL | 129 | /// Get the relay URL |
| 130 | pub async fn relay_url(&self) -> Result<String> { | 130 | pub async fn relay_url(&self) -> Result<String> { |
| 131 | let relays = self.client.relays().await; | 131 | let relays = self.client.relays().await; |
| 132 | let relay = relays.values().next() | 132 | let relay = relays |
| 133 | .values() | ||
| 134 | .next() | ||
| 133 | .ok_or_else(|| anyhow!("No relays configured"))?; | 135 | .ok_or_else(|| anyhow!("No relays configured"))?; |
| 134 | Ok(relay.url().to_string()) | 136 | Ok(relay.url().to_string()) |
| 135 | } | 137 | } |
| @@ -522,12 +524,14 @@ mod tests { | |||
| 522 | let keys = Keys::generate(); | 524 | let keys = Keys::generate(); |
| 523 | let maintainer_keys = Keys::generate(); | 525 | let maintainer_keys = Keys::generate(); |
| 524 | let recursive_maintainer_keys = Keys::generate(); | 526 | let recursive_maintainer_keys = Keys::generate(); |
| 527 | let pr_author_keys = Keys::generate(); | ||
| 525 | let client = AuditClient { | 528 | let client = AuditClient { |
| 526 | client: Client::new(keys.clone()), | 529 | client: Client::new(keys.clone()), |
| 527 | config: config.clone(), | 530 | config: config.clone(), |
| 528 | keys: keys.clone(), | 531 | keys: keys.clone(), |
| 529 | maintainer_keys, | 532 | maintainer_keys, |
| 530 | recursive_maintainer_keys, | 533 | recursive_maintainer_keys, |
| 534 | pr_author_keys, | ||
| 531 | fixture_cache: Arc::new(Mutex::new(HashMap::new())), | 535 | fixture_cache: Arc::new(Mutex::new(HashMap::new())), |
| 532 | }; | 536 | }; |
| 533 | 537 | ||
| @@ -543,12 +547,14 @@ mod tests { | |||
| 543 | let keys = Keys::generate(); | 547 | let keys = Keys::generate(); |
| 544 | let maintainer_keys = Keys::generate(); | 548 | let maintainer_keys = Keys::generate(); |
| 545 | let recursive_maintainer_keys = Keys::generate(); | 549 | let recursive_maintainer_keys = Keys::generate(); |
| 550 | let pr_author_keys = Keys::generate(); | ||
| 546 | let client = AuditClient { | 551 | let client = AuditClient { |
| 547 | client: Client::new(keys.clone()), | 552 | client: Client::new(keys.clone()), |
| 548 | config: config.clone(), | 553 | config: config.clone(), |
| 549 | keys: keys.clone(), | 554 | keys: keys.clone(), |
| 550 | maintainer_keys, | 555 | maintainer_keys, |
| 551 | recursive_maintainer_keys, | 556 | recursive_maintainer_keys, |
| 557 | pr_author_keys, | ||
| 552 | fixture_cache: Arc::new(Mutex::new(HashMap::new())), | 558 | fixture_cache: Arc::new(Mutex::new(HashMap::new())), |
| 553 | }; | 559 | }; |
| 554 | 560 | ||
| @@ -610,13 +616,10 @@ mod tests { | |||
| 610 | // Note: We can't test create_repo_announcement_with_maintainers directly in unit tests | 616 | // Note: We can't test create_repo_announcement_with_maintainers directly in unit tests |
| 611 | // because it requires a connected relay. Instead, we test the underlying event building | 617 | // because it requires a connected relay. Instead, we test the underlying event building |
| 612 | // with maintainers tag to verify the tag format is correct. | 618 | // with maintainers tag to verify the tag format is correct. |
| 613 | 619 | ||
| 614 | // Build an event with maintainers tag directly to test the tag format | 620 | // Build an event with maintainers tag directly to test the tag format |
| 615 | let event = client | 621 | let event = client |
| 616 | .event_builder( | 622 | .event_builder(Kind::GitRepoAnnouncement, "Test repository") |
| 617 | Kind::GitRepoAnnouncement, | ||
| 618 | "Test repository", | ||
| 619 | ) | ||
| 620 | .tag(Tag::identifier("test-repo")) | 623 | .tag(Tag::identifier("test-repo")) |
| 621 | .tag(Tag::custom( | 624 | .tag(Tag::custom( |
| 622 | TagKind::custom("maintainers"), | 625 | TagKind::custom("maintainers"), |
| @@ -639,10 +642,14 @@ mod tests { | |||
| 639 | // Verify the tag contains the maintainer pubkeys | 642 | // Verify the tag contains the maintainer pubkeys |
| 640 | let tag = maintainers_tag.unwrap(); | 643 | let tag = maintainers_tag.unwrap(); |
| 641 | let tag_vec: Vec<String> = tag.clone().to_vec(); | 644 | let tag_vec: Vec<String> = tag.clone().to_vec(); |
| 642 | 645 | ||
| 643 | // First element is "maintainers", rest are the pubkeys | 646 | // First element is "maintainers", rest are the pubkeys |
| 644 | assert_eq!(tag_vec[0], "maintainers"); | 647 | assert_eq!(tag_vec[0], "maintainers"); |
| 645 | assert_eq!(tag_vec.len(), 3, "Expected 3 elements: tag name + 2 pubkeys"); | 648 | assert_eq!( |
| 649 | tag_vec.len(), | ||
| 650 | 3, | ||
| 651 | "Expected 3 elements: tag name + 2 pubkeys" | ||
| 652 | ); | ||
| 646 | assert_eq!(tag_vec[1], maintainer_pubkeys[0]); | 653 | assert_eq!(tag_vec[1], maintainer_pubkeys[0]); |
| 647 | assert_eq!(tag_vec[2], maintainer_pubkeys[1]); | 654 | assert_eq!(tag_vec[2], maintainer_pubkeys[1]); |
| 648 | } | 655 | } |