From 6a65c116ca0602b53f837cc86253de1d53fe992f Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Sat, 16 Mar 2024 13:28:30 +1300 Subject: [PATCH] Fix recent bug --- chorus-bin/src/main.rs | 13 +++++++++++-- chorus-bin/src/nostr.rs | 36 ++++++++++++++++++------------------ 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/chorus-bin/src/main.rs b/chorus-bin/src/main.rs index 168dbbe..18c7551 100644 --- a/chorus-bin/src/main.rs +++ b/chorus-bin/src/main.rs @@ -475,13 +475,22 @@ impl WebSocketService { .unwrap() .get_event_by_offset(new_event_offset)? { - let event_flags = nostr::event_flags(&event, &self.user); + let config = &*GLOBALS.config.read().await; + let event_flags = { + let user_keys_ref = &config.user_keys; + nostr::event_flags(&event, &self.user, user_keys_ref) + }; let authorized_user = nostr::authorized_user(&self.user).await; 'subs: for (subid, filters) in self.subscriptions.iter() { for filter in filters.iter() { if filter.as_filter()?.event_matches(&event)? - && nostr::screen_outgoing_event(&event, &event_flags, authorized_user) + && nostr::screen_outgoing_event( + &event, + &event_flags, + authorized_user, + config, + ) { let message = NostrReply::Event(subid, event); self.websocket diff --git a/chorus-bin/src/nostr.rs b/chorus-bin/src/nostr.rs index 54e6462..9816f4b 100644 --- a/chorus-bin/src/nostr.rs +++ b/chorus-bin/src/nostr.rs @@ -1,5 +1,6 @@ use crate::globals::GLOBALS; use crate::WebSocketService; +use chorus_lib::config::Config; use chorus_lib::error::{ChorusError, Error}; use chorus_lib::reply::{NostrReply, NostrReplyPrefix}; use chorus_lib::types::parse::json_escape::json_unescape; @@ -125,10 +126,14 @@ impl WebSocketService { // Serve events matching subscription { let mut events: Vec = Vec::new(); + + let config = GLOBALS.config.read().await; + let user_keys_ref = &config.user_keys; + for filter in filters.iter() { let screen = |event: &Event| { - let event_flags = event_flags(event, &user); - screen_outgoing_event(event, &event_flags, authorized_user) + let event_flags = event_flags(event, &user, user_keys_ref); + screen_outgoing_event(event, &event_flags, authorized_user, &config) }; let filter_events = GLOBALS .store @@ -231,7 +236,10 @@ impl WebSocketService { // Delineate the event back out of the session buffer let event = Event::delineate(&self.buffer)?; - let event_flags = event_flags(&event, &user); + let event_flags = { + let user_keys_ref = &*GLOBALS.config.read().await.user_keys; + event_flags(&event, &user, user_keys_ref) + }; if !event_flags.author_is_an_authorized_user || GLOBALS.config.read().await.verify_events { // Verify the event is valid (id is hash, signature is valid) @@ -451,6 +459,7 @@ pub fn screen_outgoing_event( event: &Event<'_>, event_flags: &EventFlags, authorized_user: bool, + config: &Config, ) -> bool { // Forbid if it is a private event (DM or GiftWrap) and theey are neither the recipient // nor the author @@ -459,17 +468,17 @@ pub fn screen_outgoing_event( } // Allow if an open relay - if GLOBALS.config.blocking_read().open_relay { + if config.open_relay { return true; } // Allow Relay Lists - if event.kind() == Kind(10002) && GLOBALS.config.blocking_read().serve_relay_lists { + if event.kind() == Kind(10002) && config.serve_relay_lists { return true; } // Allow if event kind ephemeral - if event.kind().is_ephemeral() && GLOBALS.config.blocking_read().serve_ephemeral { + if event.kind().is_ephemeral() && config.serve_ephemeral { return true; } @@ -501,12 +510,8 @@ pub struct EventFlags { pub tags_current_user: bool, } -pub fn event_flags(event: &Event<'_>, user: &Option) -> EventFlags { - let author_is_an_authorized_user = GLOBALS - .config - .blocking_read() - .user_keys - .contains(&event.pubkey()); +pub fn event_flags(event: &Event<'_>, user: &Option, user_keys: &[Pubkey]) -> EventFlags { + let author_is_an_authorized_user = user_keys.contains(&event.pubkey()); let author_is_current_user = match user { None => false, @@ -527,12 +532,7 @@ pub fn event_flags(event: &Event<'_>, user: &Option) -> EventFlags { } } - if GLOBALS - .config - .blocking_read() - .user_keys - .contains(&tagged_pk) - { + if user_keys.contains(&tagged_pk) { tags_an_authorized_user = true; } }