diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2025-12-05 08:57:57 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2025-12-05 09:39:31 +0000 |
| commit | 83ede29fb2ce563fe53ee4dc62334c03c67026cb (patch) | |
| tree | 2138dcf47b9049cb0bb11805224a42b9261025c9 /src/nostr/builder.rs | |
| parent | dd403b17e7c74db9443d0891a9de1f0f0f9f89eb (diff) | |
sync fixes
Diffstat (limited to 'src/nostr/builder.rs')
| -rw-r--r-- | src/nostr/builder.rs | 41 |
1 files changed, 3 insertions, 38 deletions
diff --git a/src/nostr/builder.rs b/src/nostr/builder.rs index 732fd9d..2284c18 100644 --- a/src/nostr/builder.rs +++ b/src/nostr/builder.rs | |||
| @@ -19,7 +19,6 @@ use crate::nostr::policy::{ | |||
| 19 | AnnouncementPolicy, AnnouncementResult, PolicyContext, PrEventPolicy, RelatedEventPolicy, | 19 | AnnouncementPolicy, AnnouncementResult, PolicyContext, PrEventPolicy, RelatedEventPolicy, |
| 20 | ReferenceResult, StatePolicy, StateResult, | 20 | ReferenceResult, StatePolicy, StateResult, |
| 21 | }; | 21 | }; |
| 22 | use crate::sync::SYNC_SOURCE_ADDR; | ||
| 23 | 22 | ||
| 24 | /// Type alias for the shared database used by the relay | 23 | /// Type alias for the shared database used by the relay |
| 25 | pub type SharedDatabase = Arc<dyn NostrDatabase>; | 24 | pub type SharedDatabase = Arc<dyn NostrDatabase>; |
| @@ -69,39 +68,9 @@ impl Nip34WritePolicy { | |||
| 69 | } | 68 | } |
| 70 | 69 | ||
| 71 | /// Handle repository announcement event | 70 | /// Handle repository announcement event |
| 72 | /// | 71 | async fn handle_announcement(&self, event: &Event) -> PolicyResult { |
| 73 | /// # Arguments | ||
| 74 | /// * `event` - The announcement event to validate | ||
| 75 | /// * `from_sync` - Whether this event came from GRASP-02 sync (bypasses domain validation) | ||
| 76 | async fn handle_announcement(&self, event: &Event, from_sync: bool) -> PolicyResult { | ||
| 77 | let event_id_str = event.id.to_bech32().unwrap_or_else(|_| event.id.to_hex()); | 72 | let event_id_str = event.id.to_bech32().unwrap_or_else(|_| event.id.to_hex()); |
| 78 | 73 | ||
| 79 | // GRASP-02: Accept Layer 1 events from sync without domain validation | ||
| 80 | // This enables relay discovery chain - synced announcements are stored | ||
| 81 | // for relay URL extraction even if they don't list our domain | ||
| 82 | if from_sync { | ||
| 83 | // Still validate basic structure | ||
| 84 | match RepositoryAnnouncement::from_event(event.clone()) { | ||
| 85 | Ok(_announcement) => { | ||
| 86 | tracing::debug!( | ||
| 87 | "Accepted synced repository announcement: {} (domain validation bypassed)", | ||
| 88 | event_id_str | ||
| 89 | ); | ||
| 90 | // Don't create bare repository for external announcements | ||
| 91 | return PolicyResult::Accept; | ||
| 92 | } | ||
| 93 | Err(e) => { | ||
| 94 | tracing::warn!( | ||
| 95 | "Rejected malformed synced announcement {}: {}", | ||
| 96 | event_id_str, | ||
| 97 | e | ||
| 98 | ); | ||
| 99 | return PolicyResult::Reject(format!("Failed to parse announcement: {}", e)); | ||
| 100 | } | ||
| 101 | } | ||
| 102 | } | ||
| 103 | |||
| 104 | // Normal validation path - requires domain to be listed | ||
| 105 | match self.announcement_policy.validate(event).await { | 74 | match self.announcement_policy.validate(event).await { |
| 106 | AnnouncementResult::Accept => { | 75 | AnnouncementResult::Accept => { |
| 107 | // Parse announcement to get repository details | 76 | // Parse announcement to get repository details |
| @@ -287,15 +256,11 @@ impl WritePolicy for Nip34WritePolicy { | |||
| 287 | fn admit_event<'a>( | 256 | fn admit_event<'a>( |
| 288 | &'a self, | 257 | &'a self, |
| 289 | event: &'a nostr_relay_builder::prelude::Event, | 258 | event: &'a nostr_relay_builder::prelude::Event, |
| 290 | addr: &'a SocketAddr, | 259 | _addr: &'a SocketAddr, |
| 291 | ) -> BoxedFuture<'a, PolicyResult> { | 260 | ) -> BoxedFuture<'a, PolicyResult> { |
| 292 | Box::pin(async move { | 261 | Box::pin(async move { |
| 293 | // GRASP-02: Detect sync source for Layer 1 domain validation bypass | ||
| 294 | // Synced events use SYNC_SOURCE_ADDR (127.0.0.2:0) to identify them | ||
| 295 | let from_sync = *addr == SYNC_SOURCE_ADDR; | ||
| 296 | |||
| 297 | match event.kind.as_u16() { | 262 | match event.kind.as_u16() { |
| 298 | KIND_REPOSITORY_ANNOUNCEMENT => self.handle_announcement(event, from_sync).await, | 263 | KIND_REPOSITORY_ANNOUNCEMENT => self.handle_announcement(event).await, |
| 299 | KIND_REPOSITORY_STATE => self.handle_state(event).await, | 264 | KIND_REPOSITORY_STATE => self.handle_state(event).await, |
| 300 | KIND_PR | KIND_PR_UPDATE => self.handle_pr_event(event).await, | 265 | KIND_PR | KIND_PR_UPDATE => self.handle_pr_event(event).await, |
| 301 | _ => self.handle_related_event(event, "Event").await, | 266 | _ => self.handle_related_event(event, "Event").await, |