From 9a5f3d738f37463ae02498d47b538348ae1c46d2 Mon Sep 17 00:00:00 2001 From: jackjohn7 Date: Tue, 19 Aug 2025 16:27:28 -0500 Subject: [PATCH] WIP: info leakage --- Cargo.lock | 1 + basalt-server-lib/Cargo.toml | 3 +- .../src/server/hooks/handlers.rs | 45 ++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 65981dc..a075b1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -528,6 +528,7 @@ dependencies = [ "bedrock", "chrono", "dashmap 6.1.0", + "deno_core", "derive_more", "directories", "erudite", diff --git a/basalt-server-lib/Cargo.toml b/basalt-server-lib/Cargo.toml index d632979..d7d84cc 100644 --- a/basalt-server-lib/Cargo.toml +++ b/basalt-server-lib/Cargo.toml @@ -7,7 +7,7 @@ rust-version.workspace = true [features] doc-gen = [] webhooks = ["dep:reqwest"] -scripting = ["dep:rustyscript"] +scripting = ["dep:rustyscript", "dep:deno_core"] full = ["webhooks", "scripting"] default = ["full", "doc-gen"] @@ -42,6 +42,7 @@ rustyscript = { git = "https://github.com/rscarson/rustyscript.git", branch = "m "http", ], optional = true } reqwest = { version = "0.11.0", features = ["json"], optional = true } +deno_core = { version = "0.340.0", optional = true } [dev-dependencies] async-tempfile = "0.6.0" diff --git a/basalt-server-lib/src/server/hooks/handlers.rs b/basalt-server-lib/src/server/hooks/handlers.rs index d5f0a2e..ec03de2 100644 --- a/basalt-server-lib/src/server/hooks/handlers.rs +++ b/basalt-server-lib/src/server/hooks/handlers.rs @@ -48,14 +48,57 @@ impl EventHookHandler { } mod evaluator { - use crate::server::{hooks::events::ServerEvent, AppState}; + use crate::{ + repositories::{self, users::Username}, + server::{hooks::events::ServerEvent, AppState}, + services::ws::{self, Broadcast, WebSocketSend}, + utils, + }; use anyhow::Context; + use deno_core::OpState; use rustyscript::{json_args, Module, Runtime, RuntimeOptions}; use std::{path::PathBuf, sync::Arc, time::Duration}; use tokio::sync::oneshot; use tracing::debug; + #[deno_core::op2(async)] + async fn op_announcement(op_state: &OpState, #[string] msg: String) -> bool { + let state = op_state.borrow::>().clone(); + let sql = state.db.read().await; + + let new = repositories::announcements::create_announcement( + &sql.db, + &Username("SYSTEM".to_owned()), + &msg, + ) + .await; + drop(sql); + let result = match new { + Ok(new) => { + state.websocket.broadcast(ws::WebSocketSend::Broadcast { + broadcast: ws::Broadcast::NewAnnouncement(new.clone()), + }); + if let Err(err) = (ServerEvent::OnAnnouncement { + announcer: Username("SYSTEM".into()), + announcement: msg, + time: utils::utc_now(), + } + .dispatch(state.clone())) + { + tracing::error!("Error dispatching announcement event: {:?}", err); + } + true + } + Err(err) => { + tracing::error!("Error getting announcements: {:?}", err); + false + } + }; + drop(state); + result + } + pub fn evaluate(event: ServerEvent, path: &PathBuf) -> anyhow::Result<()> { let main_module = Module::load(path).context("Failed to load provided module")?; let entrypoint = event.get_fn_name();