diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2025-11-04 14:33:18 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2025-11-04 14:33:18 +0000 |
| commit | c2c0cdba4af434043f3fa707231d8f5a7e3fd882 (patch) | |
| tree | 02adae65fba476e5fcdf1fadcd0ce9efa4f1fbcd /src/nostr/relay.rs | |
| parent | 4d89f4537c325f60571cc6339df0708ee8161514 (diff) | |
add announcement tests
Diffstat (limited to 'src/nostr/relay.rs')
| -rw-r--r-- | src/nostr/relay.rs | 32 |
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 @@ | |||
| 1 | use anyhow::Result; | 1 | use anyhow::Result; |
| 2 | use futures_util::{SinkExt, StreamExt}; | 2 | use futures_util::{SinkExt, StreamExt}; |
| 3 | use nostr_sdk::{Event, EventId, Filter}; | 3 | use nostr_sdk::{Event, EventId, Filter, Kind}; |
| 4 | use serde_json::{json, Value}; | 4 | use serde_json::{json, Value}; |
| 5 | use std::collections::HashMap; | 5 | use std::collections::HashMap; |
| 6 | use std::net::SocketAddr; | 6 | use std::net::SocketAddr; |
| @@ -11,6 +11,7 @@ use tokio_tungstenite::{accept_async, tungstenite::Message}; | |||
| 11 | use tracing::{debug, error, info, warn}; | 11 | use tracing::{debug, error, info, warn}; |
| 12 | 12 | ||
| 13 | use crate::config::Config; | 13 | use crate::config::Config; |
| 14 | use crate::nostr::events::{validate_announcement, validate_state, KIND_REPOSITORY_ANNOUNCEMENT, KIND_REPOSITORY_STATE}; | ||
| 14 | use crate::storage::Storage; | 15 | use crate::storage::Storage; |
| 15 | 16 | ||
| 16 | type Subscriptions = Arc<RwLock<HashMap<String, Vec<Filter>>>>; | 17 | type 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 | ||