From 776dc8fe7a265634f7a1250ff25dd0c63c174385 Mon Sep 17 00:00:00 2001 From: DecDuck Date: Mon, 4 Aug 2025 15:01:44 +1000 Subject: [PATCH] Fixes reqwest client setup, #87 (#107) --- drop-base | 2 +- src-tauri/Cargo.lock | 149 +++++++++++++++++++++- src-tauri/Cargo.toml | 2 +- src-tauri/src/process/process_handlers.rs | 1 + src-tauri/src/remote/commands.rs | 14 +- src-tauri/src/remote/utils.rs | 39 ++++-- 6 files changed, 185 insertions(+), 22 deletions(-) diff --git a/drop-base b/drop-base index 26698e5..04125e8 160000 --- a/drop-base +++ b/drop-base @@ -1 +1 @@ -Subproject commit 26698e5b069d463b9a02a3dd61e4888d28fa9f88 +Subproject commit 04125e89bef517411e103cdabcfa64a1bb563423 diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 5c74d4f..a94b80e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -898,7 +898,7 @@ dependencies = [ "bitflags 2.9.1", "core-foundation 0.10.1", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -1586,6 +1586,15 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1593,7 +1602,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -1607,6 +1616,12 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -2362,6 +2377,22 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.6.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" version = "0.1.13" @@ -3050,6 +3081,23 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "native_model" version = "0.6.1" @@ -3468,6 +3516,50 @@ dependencies = [ "pathdiff", ] +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -4306,11 +4398,13 @@ dependencies = [ "http-body-util", "hyper 1.6.0", "hyper-rustls", + "hyper-tls", "hyper-util", "ipnet", "js-sys", "log", "mime", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", @@ -4322,6 +4416,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.2", "tokio", + "tokio-native-tls", "tokio-rustls", "tokio-util", "tower", @@ -4600,6 +4695,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "schemars" version = "0.8.22" @@ -4633,6 +4737,29 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "selectors" version = "0.24.0" @@ -5002,7 +5129,7 @@ dependencies = [ "bytemuck", "cfg_aliases", "core-graphics", - "foreign-types", + "foreign-types 0.5.0", "js-sys", "log", "objc2 0.5.2", @@ -5860,6 +5987,16 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.26.2" @@ -6271,6 +6408,12 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.2.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 93db550..c32e7dc 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -104,7 +104,7 @@ features = ["other_errors"] # You can also use "yaml_enc" or "bin_enc" [dependencies.reqwest] version = "0.12" default-features = false -features = ["json", "http2", "blocking", "rustls-tls-webpki-roots"] +features = ["json", "http2", "blocking", "rustls-tls", "native-tls-alpn", "rustls-tls-webpki-roots"] [dependencies.serde] version = "1" diff --git a/src-tauri/src/process/process_handlers.rs b/src-tauri/src/process/process_handlers.rs index e11f612..03699fa 100644 --- a/src-tauri/src/process/process_handlers.rs +++ b/src-tauri/src/process/process_handlers.rs @@ -88,6 +88,7 @@ impl ProcessHandler for AsahiMuvmLauncher { } #[allow(unreachable_code)] + #[allow(unused_variables)] fn valid_for_platform(&self, _db: &Database, state: &AppState, _target: &Platform) -> bool { #[cfg(not(target_os = "linux"))] return false; diff --git a/src-tauri/src/remote/commands.rs b/src-tauri/src/remote/commands.rs index 7b1bd6e..15c80cd 100644 --- a/src-tauri/src/remote/commands.rs +++ b/src-tauri/src/remote/commands.rs @@ -8,7 +8,11 @@ use tauri::{AppHandle, Emitter, Manager}; use url::Url; use crate::{ - database::db::{borrow_db_checked, borrow_db_mut_checked}, error::remote_access_error::RemoteAccessError, remote::{auth::generate_authorization_header, requests::make_request, utils::DROP_CLIENT_SYNC}, AppState, AppStatus + database::db::{borrow_db_checked, borrow_db_mut_checked}, error::remote_access_error::RemoteAccessError, remote::{ + auth::generate_authorization_header, + requests::make_request, + utils::{DROP_CLIENT_SYNC, DROP_CLIENT_WS_CLIENT}, + }, AppState, AppStatus }; use super::{ @@ -18,11 +22,11 @@ use super::{ }; #[tauri::command] -pub fn use_remote( +pub async fn use_remote( url: String, state: tauri::State<'_, Mutex>>, ) -> Result<(), RemoteAccessError> { - use_remote_logic(url, state) + use_remote_logic(url, state).await } #[tauri::command] @@ -120,10 +124,12 @@ pub fn auth_initiate_code(app: AppHandle) -> Result { let code = auth_initiate_logic("code".to_string())?; let header_code = code.clone(); + println!("using code: {} to sign in", code); + tauri::async_runtime::spawn(async move { let load = async || -> Result<(), RemoteAccessError> { let ws_url = base_url.join("/api/v1/client/auth/code/ws")?; - let response = reqwest::Client::default() + let response = DROP_CLIENT_WS_CLIENT .get(ws_url) .header("Authorization", header_code) .upgrade() diff --git a/src-tauri/src/remote/utils.rs b/src-tauri/src/remote/utils.rs index 591da9a..87de927 100644 --- a/src-tauri/src/remote/utils.rs +++ b/src-tauri/src/remote/utils.rs @@ -2,6 +2,7 @@ use std::{ fs::{self, File}, io::Read, sync::{LazyLock, Mutex}, + time::Duration, }; use log::{debug, info, warn}; @@ -21,8 +22,10 @@ struct DropHealthcheck { app_name: String, } +static DROP_CERT_BUNDLE: LazyLock> = LazyLock::new(fetch_certificates); pub static DROP_CLIENT_SYNC: LazyLock = LazyLock::new(get_client_sync); pub static DROP_CLIENT_ASYNC: LazyLock = LazyLock::new(get_client_async); +pub static DROP_CLIENT_WS_CLIENT: LazyLock = LazyLock::new(get_client_ws); fn fetch_certificates() -> Vec { let certificate_dir = DATA_ROOT_DIR.join("certificates"); @@ -58,24 +61,30 @@ fn fetch_certificates() -> Vec { pub fn get_client_sync() -> reqwest::blocking::Client { let mut client = reqwest::blocking::ClientBuilder::new(); - - let certs = fetch_certificates(); - for cert in certs { - client = client.add_root_certificate(cert); + + for cert in DROP_CERT_BUNDLE.iter() { + client = client.add_root_certificate(cert.clone()); } - client.build().unwrap() + client.use_rustls_tls().build().unwrap() } pub fn get_client_async() -> reqwest::Client { let mut client = reqwest::ClientBuilder::new(); - let certs = fetch_certificates(); - for cert in certs { - client = client.add_root_certificate(cert); + for cert in DROP_CERT_BUNDLE.iter() { + client = client.add_root_certificate(cert.clone()); } - client.build().unwrap() + client.use_rustls_tls().build().unwrap() +} +pub fn get_client_ws() -> reqwest::Client { + let mut client = reqwest::ClientBuilder::new(); + + for cert in DROP_CERT_BUNDLE.iter() { + client = client.add_root_certificate(cert.clone()); + } + client.use_rustls_tls().http1_only().build().unwrap() } -pub fn use_remote_logic( +pub async fn use_remote_logic( url: String, state: tauri::State<'_, Mutex>>, ) -> Result<(), RemoteAccessError> { @@ -84,10 +93,14 @@ pub fn use_remote_logic( // Test Drop url let test_endpoint = base_url.join("/api/v1")?; - let client = DROP_CLIENT_SYNC.clone(); - let response = client.get(test_endpoint.to_string()).send()?; + let client = DROP_CLIENT_ASYNC.clone(); + let response = client + .get(test_endpoint.to_string()) + .timeout(Duration::from_secs(3)) + .send() + .await?; - let result: DropHealthcheck = response.json()?; + let result: DropHealthcheck = response.json().await?; if result.app_name != "Drop" { warn!("user entered drop endpoint that connected, but wasn't identified as Drop");