upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src/nostr/relay.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-11-04 14:33:18 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-11-04 14:33:18 +0000
commitc2c0cdba4af434043f3fa707231d8f5a7e3fd882 (patch)
tree02adae65fba476e5fcdf1fadcd0ce9efa4f1fbcd /src/nostr/relay.rs
parent4d89f4537c325f60571cc6339df0708ee8161514 (diff)
add announcement tests
Diffstat (limited to 'src/nostr/relay.rs')
-rw-r--r--src/nostr/relay.rs32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/nostr/relay.rs b/src/nostr/relay.rs
index 5af9b04..1033b5b 100644
--- a/src/nostr/relay.rs
+++ b/src/nostr/relay.rs
@@ -1,6 +1,6 @@
1use anyhow::Result; 1use anyhow::Result;
2use futures_util::{SinkExt, StreamExt}; 2use futures_util::{SinkExt, StreamExt};
3use nostr_sdk::{Event, EventId, Filter}; 3use nostr_sdk::{Event, EventId, Filter, Kind};
4use serde_json::{json, Value}; 4use serde_json::{json, Value};
5use std::collections::HashMap; 5use std::collections::HashMap;
6use std::net::SocketAddr; 6use std::net::SocketAddr;
@@ -11,6 +11,7 @@ use tokio_tungstenite::{accept_async, tungstenite::Message};
11use tracing::{debug, error, info, warn}; 11use tracing::{debug, error, info, warn};
12 12
13use crate::config::Config; 13use crate::config::Config;
14use crate::nostr::events::{validate_announcement, validate_state, KIND_REPOSITORY_ANNOUNCEMENT, KIND_REPOSITORY_STATE};
14use crate::storage::Storage; 15use crate::storage::Storage;
15 16
16type Subscriptions = Arc<RwLock<HashMap<String, Vec<Filter>>>>; 17type Subscriptions = Arc<RwLock<HashMap<String, Vec<Filter>>>>;
@@ -140,6 +141,35 @@ async fn handle_event(arr: &[Value], storage: &Storage) -> Result<Vec<Value>> {
140 return Ok(vec![json!(["OK", event_id.to_hex(), true, "duplicate: event already exists"])]); 141 return Ok(vec![json!(["OK", event_id.to_hex(), true, "duplicate: event already exists"])]);
141 } 142 }
142 143
144 // Validate repository announcements (kind 30617)
145 if event.kind == Kind::from(KIND_REPOSITORY_ANNOUNCEMENT) {
146 // Get domain from storage config
147 let domain = storage.get_domain();
148
149 match validate_announcement(&event, &domain) {
150 Ok(()) => {
151 info!("✅ Valid repository announcement: {} ({})", event_id, event.kind);
152 }
153 Err(e) => {
154 warn!("❌ Invalid repository announcement: {}", e);
155 return Ok(vec![json!(["OK", event_id.to_hex(), false, format!("invalid: {}", e)])]);
156 }
157 }
158 }
159
160 // Validate repository state announcements (kind 30618)
161 if event.kind == Kind::from(KIND_REPOSITORY_STATE) {
162 match validate_state(&event) {
163 Ok(()) => {
164 info!("✅ Valid repository state: {} ({})", event_id, event.kind);
165 }
166 Err(e) => {
167 warn!("❌ Invalid repository state: {}", e);
168 return Ok(vec![json!(["OK", event_id.to_hex(), false, format!("invalid: {}", e)])]);
169 }
170 }
171 }
172
143 // Store the event 173 // Store the event
144 storage.store_event(event.clone()).await?; 174 storage.store_event(event.clone()).await?;
145 175