Fix: Tauri-Plugin-HTTP for Windows Auth Support (Major WIP)

This commit is contained in:
Youwes09
2026-04-05 04:14:33 -05:00
parent 6446a19b2d
commit d989b2d67e
12 changed files with 321 additions and 75 deletions
+119 -2
View File
@@ -425,7 +425,7 @@ dependencies = [
"bitflags 2.11.0",
"core-foundation 0.10.1",
"core-graphics-types",
"foreign-types",
"foreign-types 0.5.0",
"libc",
]
@@ -952,6 +952,15 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
[[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"
@@ -959,7 +968,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]]
@@ -973,6 +982,12 @@ dependencies = [
"syn 2.0.117",
]
[[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"
@@ -1005,6 +1020,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
dependencies = [
"futures-core",
"futures-sink",
]
[[package]]
@@ -1553,6 +1569,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",
"hyper-util",
"native-tls",
"tokio",
"tokio-native-tls",
"tower-service",
]
[[package]]
name = "hyper-util"
version = "0.1.20"
@@ -2122,6 +2154,7 @@ name = "moku"
version = "0.7.0"
dependencies = [
"dirs 5.0.1",
"reqwest 0.12.28",
"serde",
"serde_json",
"sysinfo 0.32.1",
@@ -2133,6 +2166,8 @@ dependencies = [
"tauri-plugin-process",
"tauri-plugin-shell",
"tauri-plugin-updater",
"tokio",
"urlencoding",
"walkdir",
]
@@ -2157,6 +2192,23 @@ dependencies = [
"windows-sys 0.60.2",
]
[[package]]
name = "native-tls"
version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2"
dependencies = [
"libc",
"log",
"openssl",
"openssl-probe",
"openssl-sys",
"schannel",
"security-framework",
"security-framework-sys",
"tempfile",
]
[[package]]
name = "ndk"
version = "0.9.0"
@@ -2493,12 +2545,50 @@ dependencies = [
"pathdiff",
]
[[package]]
name = "openssl"
version = "0.10.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf"
dependencies = [
"bitflags 2.11.0",
"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.117",
]
[[package]]
name = "openssl-probe"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"
[[package]]
name = "openssl-sys"
version = "0.9.112"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]]
name = "option-ext"
version = "0.2.0"
@@ -3281,17 +3371,21 @@ dependencies = [
"cookie",
"cookie_store 0.22.1",
"encoding_rs",
"futures-channel",
"futures-core",
"futures-util",
"h2",
"http",
"http-body",
"http-body-util",
"hyper",
"hyper-rustls",
"hyper-tls",
"hyper-util",
"js-sys",
"log",
"mime",
"native-tls",
"percent-encoding",
"pin-project-lite",
"quinn",
@@ -3302,6 +3396,7 @@ dependencies = [
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tokio-native-tls",
"tokio-rustls",
"tower",
"tower-http",
@@ -4740,6 +4835,16 @@ dependencies = [
"syn 2.0.117",
]
[[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.4"
@@ -5050,6 +5155,12 @@ dependencies = [
"serde_derive",
]
[[package]]
name = "urlencoding"
version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
[[package]]
name = "urlpattern"
version = "0.3.0"
@@ -5095,6 +5206,12 @@ dependencies = [
"wasm-bindgen",
]
[[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.1"
+3
View File
@@ -27,6 +27,9 @@ serde_json = "1"
walkdir = "2"
sysinfo = "0.32"
dirs = "5"
urlencoding = "2"
tokio = { version = "1", features = ["rt-multi-thread"] }
reqwest = { version = "0.12", features = ["blocking"] }
[profile.release]
codegen-units = 1
+17
View File
@@ -0,0 +1,17 @@
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "http-scope",
"description": "HTTP fetch scope",
"windows": ["main"],
"permissions": [
{
"identifier": "http:default",
"allow": [
{ "url": "http://*:*/*" },
{ "url": "https://*:*/*" },
{ "url": "http://*/*" },
{ "url": "https://*/*" }
]
}
]
}
+82
View File
@@ -11,6 +11,14 @@ use walkdir::WalkDir;
struct ServerState(Mutex<Option<CommandChild>>);
#[derive(Default, Clone)]
struct AuthCredentials {
user: String,
pass: String,
}
struct AuthState(Mutex<AuthCredentials>);
#[derive(Serialize)]
pub struct StorageInfo {
manga_bytes: u64,
@@ -569,6 +577,14 @@ fn restart_app(app: tauri::AppHandle) {
tauri::process::restart(&app.env());
}
#[tauri::command]
fn set_auth_credentials(app: tauri::AppHandle, user: String, pass: String) {
let state = app.state::<AuthState>();
let mut creds = state.0.lock().unwrap();
creds.user = user;
creds.pass = pass;
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
@@ -579,6 +595,71 @@ pub fn run() {
.plugin(tauri_plugin_process::init())
.plugin(tauri_plugin_updater::Builder::new().build())
.manage(ServerState(Mutex::new(None)))
.manage(AuthState(Mutex::new(AuthCredentials::default())))
.register_asynchronous_uri_scheme_protocol("moku", |ctx, request, responder| {
use tauri_plugin_http::reqwest;
// moku://proxy/<percent-encoded-absolute-url>
let raw_uri = request.uri().to_string();
let encoded = raw_uri
.split_once("://")
.and_then(|(_, rest)| rest.split_once('/'))
.map(|(_, after)| after.to_string())
.unwrap_or_default();
let target_url = match urlencoding::decode(&encoded) {
Ok(u) => u.into_owned(),
Err(_) => encoded,
};
eprintln!("[moku] target_url={:?}", target_url);
let auth_state = ctx.app_handle().state::<AuthState>();
let creds = auth_state.0.lock().unwrap().clone();
tokio::spawn(async move {
let result: Result<(Vec<u8>, String), String> = async {
let client = reqwest::Client::builder()
.build()
.map_err(|e| e.to_string())?;
let mut req = client.get(&target_url);
if !creds.user.is_empty() && !creds.pass.is_empty() {
req = req.basic_auth(&creds.user, Some(&creds.pass));
}
let resp = req.send().await.map_err(|e| e.to_string())?;
let content_type = resp
.headers()
.get(reqwest::header::CONTENT_TYPE)
.and_then(|v| v.to_str().ok())
.unwrap_or("image/jpeg")
.to_string();
let bytes = resp.bytes().await.map_err(|e| e.to_string())?;
Ok((bytes.to_vec(), content_type))
}.await;
match result {
Ok((bytes, content_type)) => {
responder.respond(
tauri::http::Response::builder()
.header("Content-Type", content_type)
.header("Access-Control-Allow-Origin", "*")
.body(bytes)
.unwrap_or_else(|_| tauri::http::Response::builder().status(500).body(vec![]).unwrap())
);
}
Err(e) => {
eprintln!("[moku] error: {}", e);
responder.respond(
tauri::http::Response::builder()
.status(502)
.body(vec![])
.unwrap()
);
}
}
});
})
.invoke_handler(tauri::generate_handler![
get_storage_info,
get_default_downloads_path,
@@ -591,6 +672,7 @@ pub fn run() {
list_releases,
download_and_install_update,
restart_app,
set_auth_credentials,
])
.setup(|_app| Ok(()))
.on_window_event(|window, event| {