diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 25ac9f4c..3bfc6f52 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -36,6 +36,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", + "getrandom 0.2.11", "once_cell", "version_check", "zerocopy", @@ -335,6 +336,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom 0.2.11", + "instant", + "rand 0.8.5", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -1913,6 +1925,23 @@ dependencies = [ "tower-layer", ] +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "webpki-roots", +] + [[package]] name = "hyper-timeout" version = "0.4.1" @@ -2252,6 +2281,7 @@ dependencies = [ "kubeforward", "log", "openssl", + "openssl-probe", "rusqlite", "serde", "serde_json", @@ -2291,6 +2321,7 @@ dependencies = [ "http-body", "hyper", "hyper-openssl", + "hyper-rustls", "hyper-timeout", "jsonpath_lib", "k8s-openapi", @@ -2299,6 +2330,8 @@ dependencies = [ "pem", "pin-project", "rand 0.8.5", + "rustls", + "rustls-pemfile", "secrecy", "serde", "serde_json", @@ -2321,6 +2354,7 @@ dependencies = [ "chrono", "form_urlencoded", "http", + "json-patch", "k8s-openapi", "once_cell", "serde", @@ -2328,6 +2362,32 @@ dependencies = [ "thiserror", ] +[[package]] +name = "kube-runtime" +version = "0.85.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381224caa8a6fc16f8251cf1fd6d8678cdf5366f33000a923e4c54192e4b25b5" +dependencies = [ + "ahash", + "async-trait", + "backoff", + "derivative", + "futures", + "hashbrown 0.14.3", + "json-patch", + "k8s-openapi", + "kube-client", + "parking_lot", + "pin-project", + "serde", + "serde_json", + "smallvec", + "thiserror", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "kubeforward" version = "0.1.0" @@ -2336,15 +2396,20 @@ dependencies = [ "env_logger 0.9.3", "futures", "hyper", + "hyper-rustls", "k8s-openapi", "kube", + "kube-runtime", "lazy_static", "log", + "rand 0.8.5", + "reqwest", "serde", "serde_json", "tauri", "tokio", "tokio-stream", + "tower", "tracing", ] @@ -3651,6 +3716,7 @@ dependencies = [ "http", "http-body", "hyper", + "hyper-rustls", "hyper-tls", "ipnet", "js-sys", @@ -3660,12 +3726,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "system-configuration", "tokio", "tokio-native-tls", + "tokio-rustls", "tokio-util", "tower-service", "url", @@ -3673,6 +3742,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", + "webpki-roots", "winreg 0.50.0", ] @@ -3700,6 +3770,20 @@ dependencies = [ "windows 0.37.0", ] +[[package]] +name = "ring" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom 0.2.11", + "libc", + "spin", + "untrusted", + "windows-sys 0.48.0", +] + [[package]] name = "rulinalg" version = "0.4.2" @@ -3766,6 +3850,49 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.21.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.5", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rusttype" version = "0.9.3" @@ -3824,6 +3951,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "secrecy" version = "0.8.0" @@ -4159,6 +4296,12 @@ dependencies = [ "system-deps 5.0.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -4794,6 +4937,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.14" @@ -4827,6 +4980,7 @@ dependencies = [ "futures-core", "futures-sink", "pin-project-lite", + "slab", "tokio", "tracing", ] @@ -5110,6 +5264,12 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.0" @@ -5417,6 +5577,12 @@ dependencies = [ "system-deps 6.2.0", ] +[[package]] +name = "webpki-roots" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" + [[package]] name = "webview2-com" version = "0.19.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index e4135815..b688dff8 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -23,6 +23,7 @@ rusqlite = { version = "0.30.0", features = ["bundled"] } window-shadows = "0.2.2" dirs = "5.0.1" kubeforward = { path = "./utils/kubeforward" } +openssl-probe = "0.1.5" hyper = { version = "0.14.27", features = [ "client", "http1", "http2", "tcp", "stream" ] } log = "0.4" diff --git a/src-tauri/utils/kubeforward/Cargo.toml b/src-tauri/utils/kubeforward/Cargo.toml index 70c1e1d8..9d6cdaf2 100644 --- a/src-tauri/utils/kubeforward/Cargo.toml +++ b/src-tauri/utils/kubeforward/Cargo.toml @@ -8,7 +8,8 @@ edition = "2021" [dependencies] tauri = { version = "1.5", features = [ "api-all", "macos-private-api", "system-tray"] } -kube = { version = "0.85.0", features = [ "ws" ] } +reqwest = { version = "0.11", features = ["json", "rustls-tls"] } +kube = { version = "0.85.0", features = ["client", "config", "rustls-tls", "ws"] } k8s-openapi = { version = "0.19.0", default-features = false, features = ["v1_20"] } tokio = { version = "1.32.0", features = [ "full" ] } tokio-stream = { version = "0.1.14", features = ["net"] } @@ -21,6 +22,12 @@ lazy_static = "1.4.0" serde = { version = "1.0", features = ["derive"] } log = "0.4" env_logger = "0.9" +rand = "0.8.4" +kube-runtime = "0.85.0" +tower = "0.4.11" + +hyper-rustls = { version = "0.24", features = ["webpki-roots"] } + [dev-dependencies] tracing-subscriber = { version = "0.3.17", features = [ "env-filter" ] } diff --git a/src-tauri/utils/kubeforward/src/kubecontext.rs b/src-tauri/utils/kubeforward/src/kubecontext.rs index db7b579c..0ab322f1 100644 --- a/src-tauri/utils/kubeforward/src/kubecontext.rs +++ b/src-tauri/utils/kubeforward/src/kubecontext.rs @@ -1,30 +1,45 @@ -use anyhow::Result; +use anyhow::{Context, Result}; use k8s_openapi::{ api::core::v1::{Namespace, Service}, apimachinery::pkg::util::intstr::IntOrString, }; use crate::vx::Pod; +use tower::ServiceBuilder; use kube::{ api::{Api, ListParams}, + client::ConfigExt, config::{Config, KubeConfigOptions, Kubeconfig}, Client, ResourceExt, }; use serde::Serialize; pub async fn create_client_with_specific_context(context_name: &str) -> Result { - let config_options = KubeConfigOptions { - context: Some(context_name.to_owned()), // Add the context name to the options - ..Default::default() - }; - - // Here is where you need to make the change - let config = Config::from_kubeconfig(&config_options).await?; - let client = Client::try_from(config)?; // use try_from instead of from + let kubeconfig = Kubeconfig::read().context("Failed to read kubeconfig")?; + + let config = Config::from_custom_kubeconfig( + kubeconfig, + &KubeConfigOptions { + context: Some(context_name.to_owned()), + ..Default::default() + }, + ) + .await + .context("Failed to create configuration from kubeconfig")?; + + let https_connector = config + .rustls_https_connector() + .context("Failed to create Rustls HTTPS connector")?; + let service = ServiceBuilder::new() + .layer(config.base_uri_layer()) + .option_layer(config.auth_layer()?) + .service(hyper::Client::builder().build(https_connector)); + + let client = Client::new(service, config.default_namespace); + Ok(client) } - #[derive(Serialize)] pub struct KubeContextInfo { pub name: String,