add /config endpoint, add docker proxy setup, and style chat box
This commit is contained in:
+9
-1
@@ -13,7 +13,15 @@ toml = "0.8.19"
|
||||
tracing = { version = "0.1.40", features = ["async-await"] }
|
||||
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
||||
mumble-web2-common = { workspace = true }
|
||||
salvo = { version = "0.74.2", features = ["quinn", "eyre", "rustls", "serve-static", "logging"] }
|
||||
salvo = { version = "0.74.2", features = [
|
||||
"quinn",
|
||||
"eyre",
|
||||
"rustls",
|
||||
"serve-static",
|
||||
"logging",
|
||||
"craft",
|
||||
"cors",
|
||||
] }
|
||||
once_cell = "1.20.2"
|
||||
rustls = { version = "^0.23", features = ["aws_lc_rs"] }
|
||||
rcgen = "0.13.2"
|
||||
|
||||
+44
-10
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user