upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src/nostr/builder.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-12-05 08:57:57 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-12-05 09:39:31 +0000
commit83ede29fb2ce563fe53ee4dc62334c03c67026cb (patch)
tree2138dcf47b9049cb0bb11805224a42b9261025c9 /src/nostr/builder.rs
parentdd403b17e7c74db9443d0891a9de1f0f0f9f89eb (diff)
sync fixes
Diffstat (limited to 'src/nostr/builder.rs')
-rw-r--r--src/nostr/builder.rs41
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};
22use 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
25pub type SharedDatabase = Arc<dyn NostrDatabase>; 24pub 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,