add /config endpoint, add docker proxy setup, and style chat box
This commit is contained in:
+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