From 51f05593ac41b7e66a63ecfe19a38567b8aa49a0 Mon Sep 17 00:00:00 2001 From: Sam Warfield Date: Sat, 10 Jan 2026 17:29:49 -0700 Subject: [PATCH] Refactor ProxyOverides to be optional --- common/src/lib.rs | 5 ++--- gui/src/app.rs | 30 ++++++++++++++++++------------ gui/src/imp/desktop.rs | 8 ++------ gui/src/imp/web.rs | 8 ++++---- proxy/src/main.rs | 14 +++++++------- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/common/src/lib.rs b/common/src/lib.rs index 97fbbf7..dbb4f3a 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -2,9 +2,8 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Deserialize, Serialize, Default)] pub struct ProxyOverides { - pub proxy_url: Option, - pub cert_hash: Option>, - pub any_server: bool, + pub proxy_url: String, + pub cert_hash: Vec, } #[derive(Debug, Clone, Deserialize, Serialize, Default)] diff --git a/gui/src/app.rs b/gui/src/app.rs index aa362da..c581ab0 100644 --- a/gui/src/app.rs +++ b/gui/src/app.rs @@ -309,7 +309,7 @@ pub fn ChatView() -> Element { } #[component] -pub fn ControlView(config: Resource) -> Element { +pub fn ControlView(config: Resource>) -> Element { let net: Coroutine = use_coroutine_handle(); let status = &STATE.status; let server = STATE.server.read(); @@ -331,7 +331,8 @@ pub fn ControlView(config: Resource) -> Element { let proxy_url = config .read_unchecked() .as_ref() - .and_then(|gui_config| gui_config.proxy_url.clone()); + .and_then(|opt| opt.as_ref()) + .map(|gui_config| gui_config.proxy_url.clone()); let connecting_color = "yellow"; let connected_color = "oklch(0.55 0.1184 141.35)"; @@ -508,7 +509,7 @@ pub fn ControlView(config: Resource) -> Element { } #[component] -pub fn ServerView(config: Resource) -> Element { +pub fn ServerView(config: Resource>) -> Element { let net: Coroutine = use_coroutine_handle(); let server = STATE.server.read(); let Some(&UserState { @@ -546,7 +547,7 @@ pub fn ServerView(config: Resource) -> Element { } #[component] -pub fn LoginView(config: Resource) -> Element { +pub fn LoginView(config: Resource>) -> Element { let net: Coroutine = use_coroutine_handle(); let last_status = use_signal(|| None::>); @@ -564,7 +565,8 @@ pub fn LoginView(config: Resource) -> Element { addr.clone() } else { config() - .and_then(|c| c.proxy_url.clone()) + .flatten() + .map(|c| c.proxy_url.clone()) .unwrap_or_default() } }); @@ -575,13 +577,13 @@ pub fn LoginView(config: Resource) -> Element { let do_connect = move |_| { //let _ = set_default_username(&username.read()); let _ = imp::set_default_username(&username.read()); - if config.read().as_ref().is_some_and(|cfg| cfg.any_server) { + if config.read().as_ref().is_some_and(|opt| opt.is_none()) { imp::set_default_server(&address.read()); } net.send(Connect { address: address.read().clone(), username: username.read().clone(), - config: config.read().clone().unwrap_or_default(), + config: config.read().clone().flatten().unwrap_or_default(), }) }; let status = &STATE.status; @@ -626,7 +628,7 @@ pub fn LoginView(config: Resource) -> Element { None => rsx!(), } } - if config.read().as_ref().is_some_and(|cfg| cfg.any_server) { + if config.read().as_ref().is_some_and(|opt| opt.is_none()) { div { label { for: "address-entry", @@ -725,7 +727,7 @@ pub fn app() -> Element { let config = use_resource(|| async move { match imp::load_proxy_overides().await { Ok(config) => config, - Err(_) => ProxyOverides::default(), + Err(_) => None, } }); @@ -734,9 +736,13 @@ pub fn app() -> Element { document::Link{ rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" } document::Link{ rel: "stylesheet", href: STYLE } - match *STATE.status.read() { - Connected => rsx!(ServerView { config }), - _ => rsx!(LoginView { config }), + if config.read().is_none() { + div { class: "loading", "Loading..." } + } else { + match *STATE.status.read() { + Connected => rsx!(ServerView { config }), + _ => rsx!(LoginView { config }), + } } ) } diff --git a/gui/src/imp/desktop.rs b/gui/src/imp/desktop.rs index f3caa3f..0997b8e 100644 --- a/gui/src/imp/desktop.rs +++ b/gui/src/imp/desktop.rs @@ -366,12 +366,8 @@ pub fn load_server_url() -> Option { config.get("server").cloned() } -pub async fn load_proxy_overides() -> color_eyre::Result { - Ok(ProxyOverides { - proxy_url: None, - cert_hash: None, - any_server: true, - }) +pub async fn load_proxy_overides() -> color_eyre::Result> { + Ok(None) } pub async fn get_status(client: &reqwest::Client) -> color_eyre::Result { diff --git a/gui/src/imp/web.rs b/gui/src/imp/web.rs index 6bbff66..c2c14fa 100644 --- a/gui/src/imp/web.rs +++ b/gui/src/imp/web.rs @@ -342,8 +342,8 @@ pub async fn network_connect( ) .ey()?; - if let Some(server_hash) = &gui_config.cert_hash { - let hash = web_sys::js_sys::Uint8Array::from(server_hash.as_slice()); + if !gui_config.cert_hash.is_empty() { + let hash = web_sys::js_sys::Uint8Array::from(gui_config.cert_hash.as_slice()); web_sys::js_sys::Reflect::set(&object, &"value".into(), &hash).ey()?; } @@ -422,7 +422,7 @@ pub fn absolute_url(path: &str) -> Result { Ok(Url::parse(&location.href().ey()?)?.join(path)?) } -pub async fn load_proxy_overides() -> color_eyre::Result { +pub async fn load_proxy_overides() -> color_eyre::Result> { let config_url = match option_env!("MUMBLE_WEB2_GUI_CONFIG_URL") { Some(url) => Url::parse(url)?, None => absolute_url("config")?, @@ -434,7 +434,7 @@ pub async fn load_proxy_overides() -> color_eyre::Result { .json::() .await?; - Ok(config) + Ok(Some(config)) } pub async fn get_status(client: &reqwest::Client) -> color_eyre::Result { diff --git a/proxy/src/main.rs b/proxy/src/main.rs index a65c86f..42acc99 100644 --- a/proxy/src/main.rs +++ b/proxy/src/main.rs @@ -78,12 +78,12 @@ async fn main() -> Result<()> { .map_err(|e| anyhow!("could not install crypto provider {e:?}"))?; let mut client_config = ProxyOverides { - proxy_url: match &server_config.proxy_url { - Some(url) => Some(url.to_string()), - None => None, - }, - cert_hash: None, - any_server: false, + proxy_url: server_config + .proxy_url + .as_ref() + .map(|url| url.to_string()) + .unwrap_or_default(), + cert_hash: Vec::new(), }; let (cert, key) = match (&server_config.cert_path, &server_config.key_path) { @@ -102,7 +102,7 @@ async fn main() -> Result<()> { let cert = cert_params.self_signed(&key_pair)?; let hash = hmac_sha256::Hash::hash(cert.der().as_ref()); - client_config.cert_hash = Some(hash.into()); + client_config.cert_hash = hash.into(); (cert.pem().into(), key_pair.serialize_pem().into()) }