From b087ad47ecdf7bfad35258887a472ec537073f5c Mon Sep 17 00:00:00 2001 From: Kay Date: Sat, 8 Feb 2025 13:17:29 +0000 Subject: [PATCH 1/2] nip-86: implement updates. --- src/lib.rs | 34 ++++++++++++++++++++++++++++++++++ src/web/management/auth.rs | 9 ++------- src/web/management/mod.rs | 38 +++++++++++++++++++++----------------- 3 files changed, 57 insertions(+), 24 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c90416d..447a2c8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,6 +27,7 @@ use hyper_tungstenite::tungstenite; use hyper_tungstenite::{HyperWebsocket, WebSocketStream}; use hyper_util::rt::TokioIo; use neg_storage::NegentropyStorageVector; +use parking_lot::RwLock; use pocket_db::Store; use pocket_types::{Id, OwnedFilter, Pubkey}; use speedy::{Readable, Writable}; @@ -832,3 +833,36 @@ pub fn dump_pubkey_approvals(store: &Store) -> Result, Error } Ok(output) } + +// Marks a pubkey as moderator for nip-86 +pub fn mark_pubkey_as_moderator(pubkey: Pubkey, _: Vec) -> Result<(), Error> { + GLOBALS + .config + .write() + .moderator_hex_keys + .push(pubkey.as_hex_string()?); + GLOBALS.config.write().moderator_keys.push(pubkey); + + Ok(()) +} + +// Clears a pubkey as moderator for nip-86 +pub fn clear_pubkey_as_moderator(pubkey: Pubkey, _: Vec) -> Result<(), Error> { + GLOBALS + .config + .write() + .moderator_hex_keys + .retain(|x| *x != pubkey.as_hex_string().unwrap()); + GLOBALS + .config + .write() + .moderator_keys + .retain(|x| *x != pubkey); + + Ok(()) +} + +// Fetch a pubkey access to nip-86 moderation +pub fn get_pubkey_as_moderator(pubkey: Pubkey, _: Vec) -> bool { + GLOBALS.config.read().moderator_keys.contains(&pubkey) +} diff --git a/src/web/management/auth.rs b/src/web/management/auth.rs index a15c091..7a8d9cf 100644 --- a/src/web/management/auth.rs +++ b/src/web/management/auth.rs @@ -5,7 +5,7 @@ use http::header::AUTHORIZATION; use http_body_util::BodyExt; use hyper::body::Incoming; use hyper::Request; -use pocket_types::Event; +use pocket_types::{Event, Pubkey}; use secp256k1::hashes::{sha256, Hash}; use serde_json::Value; @@ -56,12 +56,7 @@ pub async fn check_auth(request: Request) -> Result { } // Nostr event must be signed by a moderator - if !GLOBALS - .config - .read() - .moderator_keys - .contains(&event.pubkey()) - { + if crate::get_pubkey_as_moderator(event.pubkey(), vec![]) { return s_err("Authorization failed as user is not a moderator"); } diff --git a/src/web/management/mod.rs b/src/web/management/mod.rs index 25dff20..05e5ded 100644 --- a/src/web/management/mod.rs +++ b/src/web/management/mod.rs @@ -97,6 +97,8 @@ pub fn handle_inner(command: Value) -> Result, Error> { match &*method { "supportedmethods" => Ok(Some(json!({ "result": [ + "grantadmin", + "revokeadmin", "allowevent", "allowpubkey", "banevent", @@ -106,8 +108,7 @@ pub fn handle_inner(command: Value) -> Result, Error> { "listbannedevents", "listbannedpubkeys", "supportedmethods", - "numconnections", - "uptime" + "stats" ] }))), @@ -211,24 +212,27 @@ pub fn handle_inner(command: Value) -> Result, Error> { "unblockip" => Err(ChorusError::NotImplemented.into()), "listblockedips" => Err(ChorusError::NotImplemented.into()), - // Config - "changerelayname" => Err(ChorusError::NotImplemented.into()), - "changerelaydescription" => Err(ChorusError::NotImplemented.into()), - "changerelayicon" => Err(ChorusError::NotImplemented.into()), - // System - "numconnections" => { - let num = &GLOBALS.num_connections; - Ok(Some(json!({ - "result": num, - }))) + "stats" => Ok(Some(json!({ + "result": { + "uptime": GLOBALS.start_time.elapsed().as_secs(), + "num_connections": &GLOBALS.num_connections, + "bytes_received": &GLOBALS.bytes_inbound, + "bytes_sent": &GLOBALS.bytes_outbound, + }, + }))), + + // Moderation + "grantadmin" => { + let pubkey = get_pubkey_param(obj)?; + crate::mark_pubkey_as_moderator(pubkey, vec![])?; + Ok(None) } - "uptime" => { - let uptime_in_secs = GLOBALS.start_time.elapsed().as_secs(); - Ok(Some(json!({ - "result": uptime_in_secs, - }))) + "revokeadmin" => { + let pubkey = get_pubkey_param(obj)?; + crate::clear_pubkey_as_moderator(pubkey, vec![])?; + Ok(None) } _ => Err(ChorusError::NotImplemented.into()), From e0eb0d6933e63e640c979ebac743ab188aa9ccc7 Mon Sep 17 00:00:00 2001 From: Kay Date: Sat, 8 Feb 2025 13:29:42 +0000 Subject: [PATCH 2/2] nip-86: implement updates. --- src/lib.rs | 1 - src/web/management/auth.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 447a2c8..82f8196 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,7 +27,6 @@ use hyper_tungstenite::tungstenite; use hyper_tungstenite::{HyperWebsocket, WebSocketStream}; use hyper_util::rt::TokioIo; use neg_storage::NegentropyStorageVector; -use parking_lot::RwLock; use pocket_db::Store; use pocket_types::{Id, OwnedFilter, Pubkey}; use speedy::{Readable, Writable}; diff --git a/src/web/management/auth.rs b/src/web/management/auth.rs index 7a8d9cf..382aba4 100644 --- a/src/web/management/auth.rs +++ b/src/web/management/auth.rs @@ -5,7 +5,7 @@ use http::header::AUTHORIZATION; use http_body_util::BodyExt; use hyper::body::Incoming; use hyper::Request; -use pocket_types::{Event, Pubkey}; +use pocket_types::Event; use secp256k1::hashes::{sha256, Hash}; use serde_json::Value;