add /config endpoint, add docker proxy setup, and style chat box

This commit is contained in:
2025-07-13 19:33:55 -06:00
parent 74fe399cdc
commit 1793504467
12 changed files with 561 additions and 94 deletions
+44 -10
View File
@@ -4,10 +4,11 @@ use mumble_web2_common::GuiConfig;
use once_cell::sync::OnceCell;
use rcgen::date_time_ymd;
use salvo::conn::rustls::{Keycert, RustlsConfig};
use salvo::cors::{AllowOrigin, Cors};
use salvo::logging::Logger;
use salvo::prelude::*;
use salvo::proto::quic::BidiStream;
use serde::Deserialize;
use serde::{Deserialize, Serialize};
use std::net::{SocketAddr, ToSocketAddrs};
use std::path::PathBuf;
use std::sync::{Arc, Mutex};
@@ -106,13 +107,6 @@ async fn main() -> Result<()> {
info!("config\n{}", toml::to_string_pretty(&config.gui)?);
info!("gui config\n{}", serde_json::to_string_pretty(&config.gui)?);
// Server routing
let router = Router::new()
.get(serve_gui_index_html)
.push(Router::with_path("/proxy").goal(connect_proxy))
.push(Router::with_path("/<*+rest>").get(StaticDir::new(config.gui_path.clone())))
.hoop(Logger::new());
rustls::crypto::aws_lc_rs::default_provider()
.install_default()
.map_err(|e| anyhow!("could not install crypto provider {e:?}"))?;
@@ -155,6 +149,26 @@ async fn main() -> Result<()> {
};
let rustls_config = RustlsConfig::new(Keycert::new().cert(cert.as_slice()).key(key.as_slice()));
let config_craft = ConfigCraft {
client_config: MumbleClientConfig {
force_proxy: true,
proxy_url: "https://localhost:4433".to_string(),
cert_hash: config.gui.lock().unwrap().cert_hash.clone().unwrap(),
},
};
// Server routing
let router = Router::new()
.get(serve_gui_index_html)
.push(Router::with_path("/proxy").goal(connect_proxy))
.push(Router::with_path("/config").get(config_craft.get_config()))
.push(Router::with_path("/<*+rest>").get(StaticDir::new(config.gui_path.clone())))
.hoop(Logger::new());
let cors = Cors::new().allow_origin(AllowOrigin::any()).into_handler();
let service = Service::new(router).hoop(cors);
// Create http listeners
let http_listener = config.http_listen_address.map(TcpListener::new);
let https_listener =
@@ -165,17 +179,37 @@ async fn main() -> Result<()> {
match (http_listener, https_listener, http3_listener) {
(Some(a), b, c) => {
let accepter = a.join(b).join(c).bind().await;
Server::new(accepter).serve(router).await;
Server::new(accepter).serve(service).await;
}
(None, b, c) => {
let accepter = b.join(c).bind().await;
Server::new(accepter).serve(router).await;
Server::new(accepter).serve(service).await;
}
}
Ok(())
}
#[derive(Serialize, Clone)]
struct MumbleClientConfig {
force_proxy: bool,
proxy_url: String,
cert_hash: Vec<u8>,
}
#[derive(Clone)]
pub struct ConfigCraft {
client_config: MumbleClientConfig,
}
#[craft]
impl ConfigCraft {
#[craft(handler)]
async fn get_config(&self) -> Json<MumbleClientConfig> {
Json(self.client_config.clone())
}
}
#[handler]
#[instrument]
async fn connect_proxy(req: &mut Request, res: &mut Response) {