From 8d2d180398a15b8aeb45200bf01583bc0a85894b Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Wed, 24 Sep 2025 01:55:11 -0700 Subject: [PATCH] deploy 2.0.0-dev-8 --- Cargo.lock | 99 +++++++++++++++---- Cargo.toml | 2 +- bin/core/Cargo.toml | 1 - bin/core/src/api/write/build.rs | 4 +- bin/core/src/cloud/aws/ec2.rs | 4 +- bin/core/src/connection/client.rs | 18 +--- bin/core/src/connection/mod.rs | 24 ++--- bin/core/src/connection/server.rs | 11 ++- bin/core/src/helpers/builder.rs | 8 +- bin/core/src/helpers/mod.rs | 4 +- bin/core/src/resource/server.rs | 4 +- bin/periphery/Cargo.toml | 1 - bin/periphery/src/config.rs | 4 +- bin/periphery/src/connection/client.rs | 74 ++++++-------- bin/periphery/src/connection/mod.rs | 35 +++---- bin/periphery/src/connection/server.rs | 22 +++-- bin/periphery/src/main.rs | 2 +- client/core/rs/src/entities/builder.rs | 45 ++++----- .../core/rs/src/entities/config/periphery.rs | 11 +-- client/core/rs/src/entities/server.rs | 14 +-- client/core/ts/src/types.ts | 25 ++--- frontend/public/client/types.d.ts | 25 ++--- .../components/resources/builder/config.tsx | 28 +++--- .../components/resources/server/config.tsx | 14 +-- lib/transport/Cargo.toml | 3 +- lib/transport/src/auth.rs | 68 +++++++++---- 26 files changed, 312 insertions(+), 238 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b9cc2f67..8a55aa7fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -296,9 +296,9 @@ dependencies = [ [[package]] name = "aws-sdk-ec2" -version = "1.169.0" +version = "1.170.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59150a709c121fb7caffe6c4303d7c5f4d802a35d320f7df1a86abcb7a5e4d66" +checksum = "1c2d25783bbe5577c6b67cb019e3890174fedc4ee436bbb7cc0256ccbeebfd63" dependencies = [ "aws-credential-types", "aws-runtime", @@ -341,9 +341,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.85.0" +version = "1.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e05f33b6c9026fecfe9b3b6740f34d41bc6ff641a6a32dabaab60209245b75" +checksum = "9d1cc7fb324aa12eb4404210e6381195c5b5e9d52c2682384f295f38716dd3c7" dependencies = [ "aws-credential-types", "aws-runtime", @@ -948,6 +948,7 @@ name = "cache" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -973,6 +974,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "tokio", @@ -1172,6 +1176,7 @@ name = "command" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -1197,6 +1202,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "komodo_client", "run_command", @@ -1230,6 +1238,7 @@ name = "config" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -1255,6 +1264,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "colored", "indexmap 2.11.4", @@ -1547,6 +1559,7 @@ name = "database" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -1572,6 +1585,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "async-compression", @@ -1887,6 +1903,7 @@ name = "environment" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -1912,6 +1929,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "formatting", @@ -1929,6 +1949,7 @@ name = "environment_file" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -1954,6 +1975,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "thiserror 2.0.16", ] @@ -2057,6 +2081,7 @@ name = "formatting" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -2082,6 +2107,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "serror", ] @@ -2261,6 +2289,7 @@ name = "git" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -2286,6 +2315,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "cache", @@ -2893,6 +2925,7 @@ name = "interpolate" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -2918,6 +2951,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "komodo_client", @@ -3056,6 +3092,7 @@ name = "komodo_cli" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -3081,6 +3118,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "chrono", @@ -3114,6 +3154,7 @@ name = "komodo_client" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -3139,6 +3180,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "async_timing_util", @@ -3182,6 +3226,7 @@ name = "komodo_core" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -3207,6 +3252,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "arc-swap", @@ -3272,7 +3320,6 @@ dependencies = [ "tracing", "transport", "typeshare", - "url", "urlencoding", "uuid", "wildcard", @@ -3288,6 +3335,7 @@ name = "komodo_periphery" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -3313,6 +3361,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "arc-swap", @@ -3356,7 +3407,6 @@ dependencies = [ "tokio-util", "tracing", "transport", - "url", "urlencoding", "uuid", ] @@ -3372,18 +3422,18 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.175" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.3", + "windows-link 0.2.0", ] [[package]] @@ -3445,6 +3495,7 @@ name = "logger" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -3470,6 +3521,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "komodo_client", @@ -3741,7 +3795,7 @@ dependencies = [ [[package]] name = "noise" -version = "2.0.0-dev-7" +version = "2.0.0-dev-8" dependencies = [ "anyhow", "base64 0.22.1", @@ -4247,6 +4301,7 @@ name = "periphery_client" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -4272,6 +4327,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "komodo_client", "resolver_api", @@ -4826,6 +4884,7 @@ name = "response" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD version = "1.19.5" ======= version = "2.0.0-dev-0" @@ -4851,6 +4910,9 @@ version = "2.0.0-dev-6" ======= version = "2.0.0-dev-7" >>>>>>> fc28dbeb (deploy 2.0.0-dev-7) +======= +version = "2.0.0-dev-8" +>>>>>>> 0779afdc (deploy 2.0.0-dev-8) dependencies = [ "anyhow", "axum", @@ -5014,7 +5076,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.4.0", + "security-framework 3.5.0", ] [[package]] @@ -5185,9 +5247,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" +checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" dependencies = [ "bitflags 2.9.4", "core-foundation 0.10.1", @@ -5397,9 +5459,9 @@ dependencies = [ [[package]] name = "serial2" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349bb79c63bd2690fe4ca8ef7072a6d9ca36b3a1687a08393e733ea56d573911" +checksum = "8cc76fa68e25e771492ca1e3c53d447ef0be3093e05cd3b47f4b712ba10c6f3c" dependencies = [ "cfg-if", "libc", @@ -6198,7 +6260,7 @@ dependencies = [ [[package]] name = "transport" -version = "2.0.0-dev-7" +version = "2.0.0-dev-8" dependencies = [ "anyhow", "axum", @@ -6214,6 +6276,7 @@ dependencies = [ "tokio", "tokio-tungstenite 0.27.0", "tracing", + "url", "uuid", ] diff --git a/Cargo.toml b/Cargo.toml index 9a3d21d66..41c6786d6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ ] [workspace.package] -version = "2.0.0-dev-7" +version = "2.0.0-dev-8" edition = "2024" authors = ["mbecker20 "] license = "GPL-3.0-or-later" diff --git a/bin/core/Cargo.toml b/bin/core/Cargo.toml index 6a298ac11..abb9493a3 100644 --- a/bin/core/Cargo.toml +++ b/bin/core/Cargo.toml @@ -84,4 +84,3 @@ rand.workspace = true hmac.workspace = true sha2.workspace = true hex.workspace = true -url.workspace = true \ No newline at end of file diff --git a/bin/core/src/api/write/build.rs b/bin/core/src/api/write/build.rs index 950779994..0998392bd 100644 --- a/bin/core/src/api/write/build.rs +++ b/bin/core/src/api/write/build.rs @@ -436,8 +436,8 @@ async fn get_on_host_periphery( ObjectId::new().to_hex(), PeripheryConnectionArgs { address: &config.address, - private_key: &config.private_key, - expected_public_key: &config.public_key, + core_private_key: &config.core_private_key, + periphery_public_key: &config.periphery_public_key, }, ) .await?; diff --git a/bin/core/src/cloud/aws/ec2.rs b/bin/core/src/cloud/aws/ec2.rs index a28e6e4e0..5c7500e5d 100644 --- a/bin/core/src/cloud/aws/ec2.rs +++ b/bin/core/src/cloud/aws/ec2.rs @@ -84,8 +84,8 @@ pub async fn launch_ec2_instance( assign_public_ip, use_public_ip, user_data, - private_key: _, - public_key: _, + core_private_key: _, + periphery_public_key: _, port: _, use_https: _, git_providers: _, diff --git a/bin/core/src/connection/client.rs b/bin/core/src/connection/client.rs index bea1899b7..c64cceb65 100644 --- a/bin/core/src/connection/client.rs +++ b/bin/core/src/connection/client.rs @@ -6,7 +6,7 @@ use periphery_client::CONNECTION_RETRY_SECONDS; use rustls::{ClientConfig, client::danger::ServerCertVerifier}; use tokio_tungstenite::Connector; use transport::{ - auth::{ClientLoginFlow, ConnectionIdentifiers}, + auth::{AddressConnectionIdentifiers, ClientLoginFlow}, fix_ws_address, websocket::tungstenite::TungsteniteWebsocket, }; @@ -29,13 +29,8 @@ impl PeripheryConnectionArgs<'_> { let address = fix_ws_address(self.address); - let url = ::url::Url::parse(&address) - .context("Failed to parse server address")?; - let mut host = url.host().context("url has no host")?.to_string(); - if let Some(port) = url.port() { - host.push(':'); - host.push_str(&port.to_string()); - } + let identifiers = + AddressConnectionIdentifiers::extract(&address)?; let (connection, mut write_receiver) = periphery_connections().insert(server_id, self).await; @@ -65,11 +60,8 @@ impl PeripheryConnectionArgs<'_> { let handler = super::WebsocketHandler { socket, - connection_identifiers: ConnectionIdentifiers { - host: host.as_bytes(), - accept: accept.as_bytes(), - query: &[], - }, + connection_identifiers: identifiers + .build(accept.as_bytes(), &[]), write_receiver: &mut write_receiver, connection: &connection, }; diff --git a/bin/core/src/connection/mod.rs b/bin/core/src/connection/mod.rs index c3b77fc45..8b31c8d25 100644 --- a/bin/core/src/connection/mod.rs +++ b/bin/core/src/connection/mod.rs @@ -46,17 +46,17 @@ impl WebsocketHandler<'_, W> { connection, } = self; - let private_key = if connection.private_key.is_empty() { + let private_key = if connection.core_private_key.is_empty() { &core_config().private_key } else { - &connection.private_key + &connection.core_private_key }; let expected_public_key = if !connection - .expected_public_key + .periphery_public_key .is_empty() { - Some(connection.expected_public_key.as_str()) + Some(connection.periphery_public_key.as_str()) } else if connection.address.is_empty() { // Only force periphery public key for Periphery -> Core connections Some( @@ -221,15 +221,15 @@ impl PeripheryConnections { #[derive(Clone, Copy)] pub struct PeripheryConnectionArgs<'a> { pub address: &'a str, - pub private_key: &'a str, - pub expected_public_key: &'a str, + pub core_private_key: &'a str, + pub periphery_public_key: &'a str, } impl PeripheryConnectionArgs<'_> { pub fn matches(&self, connection: &PeripheryConnection) -> bool { self.address == connection.address - && self.private_key == connection.private_key - && self.expected_public_key == connection.expected_public_key + && self.core_private_key == connection.core_private_key + && self.periphery_public_key == connection.periphery_public_key } } @@ -239,10 +239,10 @@ pub struct PeripheryConnection { /// Inbound connections have this as empty string pub address: String, /// The private key to use, or empty for core private key - pub private_key: String, + pub core_private_key: String, /// The public key to expect Periphery to have. /// Required non-empty for inbound connection. - pub expected_public_key: String, + pub periphery_public_key: String, /// Whether Periphery is currently connected. pub connected: AtomicBool, /// Stores latest connection error @@ -266,8 +266,8 @@ impl PeripheryConnection { ( PeripheryConnection { address: args.address.to_string(), - private_key: args.private_key.to_string(), - expected_public_key: args.expected_public_key.to_string(), + core_private_key: args.core_private_key.to_string(), + periphery_public_key: args.periphery_public_key.to_string(), sender, channels, connected: AtomicBool::new(false), diff --git a/bin/core/src/connection/server.rs b/bin/core/src/connection/server.rs index 75ed1654f..9cc29cd82 100644 --- a/bin/core/src/connection/server.rs +++ b/bin/core/src/connection/server.rs @@ -8,7 +8,7 @@ use komodo_client::entities::server::Server; use serror::{AddStatusCode, AddStatusCodeError}; use transport::{ PeripheryConnectionQuery, - auth::{ServerHeaderIdentifiers, ServerLoginFlow}, + auth::{HeaderConnectionIdentifiers, ServerLoginFlow}, websocket::axum::AxumWebsocket, }; @@ -23,8 +23,9 @@ pub async fn handler( mut headers: HeaderMap, ws: WebSocketUpgrade, ) -> serror::Result { - let identifiers = ServerHeaderIdentifiers::extract(&mut headers) - .status_code(StatusCode::UNAUTHORIZED)?; + let identifiers = + HeaderConnectionIdentifiers::extract(&mut headers) + .status_code(StatusCode::UNAUTHORIZED)?; let server = crate::resource::get::(&_server) .await @@ -60,8 +61,8 @@ pub async fn handler( server.id.clone(), PeripheryConnectionArgs { address: "", - private_key: &server.config.private_key, - expected_public_key: &server.config.public_key, + core_private_key: &server.config.core_private_key, + periphery_public_key: &server.config.periphery_public_key, }, ) .await; diff --git a/bin/core/src/helpers/builder.rs b/bin/core/src/helpers/builder.rs index f6d3e77f8..99c9d0116 100644 --- a/bin/core/src/helpers/builder.rs +++ b/bin/core/src/helpers/builder.rs @@ -52,8 +52,8 @@ pub async fn get_builder_periphery( ObjectId::new().to_hex(), PeripheryConnectionArgs { address: &config.address, - private_key: &config.private_key, - expected_public_key: &config.public_key, + core_private_key: &config.core_private_key, + periphery_public_key: &config.periphery_public_key, }, ) .await?; @@ -113,8 +113,8 @@ async fn get_aws_builder( ObjectId::new().to_hex(), PeripheryConnectionArgs { address: &periphery_address, - private_key: &config.private_key, - expected_public_key: &config.public_key, + core_private_key: &config.core_private_key, + periphery_public_key: &config.periphery_public_key, }, ) .await?; diff --git a/bin/core/src/helpers/mod.rs b/bin/core/src/helpers/mod.rs index fd0070ad5..b3d14aa2a 100644 --- a/bin/core/src/helpers/mod.rs +++ b/bin/core/src/helpers/mod.rs @@ -196,8 +196,8 @@ pub async fn periphery_client( server.id.clone(), PeripheryConnectionArgs { address: &server.config.address, - private_key: &server.config.private_key, - expected_public_key: &server.config.public_key, + core_private_key: &server.config.core_private_key, + periphery_public_key: &server.config.periphery_public_key, }, ) .await diff --git a/bin/core/src/resource/server.rs b/bin/core/src/resource/server.rs index 2fd0bfcfa..3147d7ff5 100644 --- a/bin/core/src/resource/server.rs +++ b/bin/core/src/resource/server.rs @@ -157,8 +157,8 @@ impl super::KomodoResource for Server { updated.id.clone(), PeripheryConnectionArgs { address: &updated.config.address, - private_key: &updated.config.private_key, - expected_public_key: &updated.config.public_key, + core_private_key: &updated.config.core_private_key, + periphery_public_key: &updated.config.periphery_public_key, }, ) .await; diff --git a/bin/periphery/Cargo.toml b/bin/periphery/Cargo.toml index ec0bd060e..34baa8f2a 100644 --- a/bin/periphery/Cargo.toml +++ b/bin/periphery/Cargo.toml @@ -61,4 +61,3 @@ axum.workspace = true clap.workspace = true envy.workspace = true uuid.workspace = true -url.workspace = true \ No newline at end of file diff --git a/bin/periphery/src/config.rs b/bin/periphery/src/config.rs index 9f212c1ce..00e8b678e 100644 --- a/bin/periphery/src/config.rs +++ b/bin/periphery/src/config.rs @@ -74,7 +74,9 @@ pub fn periphery_config() -> &'static PeripheryConfig { core_public_key: env .periphery_core_public_key .or(config.core_public_key), - core_host: env.periphery_core_host.or(config.core_host), + core_address: env + .periphery_core_address + .or(config.core_address), connect_as: env.periphery_connect_as.or(config.connect_as), port: env.periphery_port.unwrap_or(config.port), bind_ip: env.periphery_bind_ip.unwrap_or(config.bind_ip), diff --git a/bin/periphery/src/connection/client.rs b/bin/periphery/src/connection/client.rs index c5e696b1d..d4c32337b 100644 --- a/bin/periphery/src/connection/client.rs +++ b/bin/periphery/src/connection/client.rs @@ -4,16 +4,15 @@ use anyhow::Context; use axum::http::HeaderValue; use periphery_client::CONNECTION_RETRY_SECONDS; use transport::{ - auth::{ClientLoginFlow, ConnectionIdentifiers}, + auth::{AddressConnectionIdentifiers, ClientLoginFlow}, fix_ws_address, websocket::tungstenite::TungsteniteWebsocket, }; -use url::Url; use crate::connection::ws_receiver; pub async fn handler( - core_host: &str, + address: &str, connect_as: &str, ) -> anyhow::Result<()> { if let Err(e) = @@ -27,41 +26,34 @@ pub async fn handler( .try_lock() .context("Websocket handler called more than once.")?; - let core_host = fix_ws_address(core_host); - let core_endpoint = format!( - "{core_host}/ws/periphery?server={}", - urlencoding::encode(connect_as) - ); - let url = - Url::parse(&core_endpoint).context("Failed to parse ws url")?; - let host: Vec = - url.host().context("Url has no host")?.to_string().into(); - let query = url.query().context("Url has no query")?.as_bytes(); + let address = fix_ws_address(address); + let identifiers = AddressConnectionIdentifiers::extract(&address)?; + let query = format!("server={}", urlencoding::encode(connect_as)); + let endpoint = format!("{address}/ws/periphery?{query}"); - info!("Initiating outbound connection to {url}"); + info!("Initiating outbound connection to {endpoint}"); let mut already_logged_connection_error = false; let mut already_logged_login_error = false; loop { - let (socket, accept) = - match connect_websocket(&core_endpoint).await { - Ok(res) => res, - Err(e) => { - if !already_logged_connection_error { - warn!("{e:#}"); - already_logged_connection_error = true; - // If error transitions from login to connection, - // set to false to see login error after reconnect. - already_logged_login_error = false; - } - tokio::time::sleep(Duration::from_secs( - CONNECTION_RETRY_SECONDS, - )) - .await; - continue; + let (socket, accept) = match connect_websocket(&endpoint).await { + Ok(res) => res, + Err(e) => { + if !already_logged_connection_error { + warn!("{e:#}"); + already_logged_connection_error = true; + // If error transitions from login to connection, + // set to false to see login error after reconnect. + already_logged_login_error = false; } - }; + tokio::time::sleep(Duration::from_secs( + CONNECTION_RETRY_SECONDS, + )) + .await; + continue; + } + }; already_logged_connection_error = false; @@ -69,20 +61,14 @@ pub async fn handler( info!("Connected to core connection websocket"); } - let connection_identifiers = ConnectionIdentifiers { - host: &host, - accept: accept.as_bytes(), - query, - }; - - let handler = super::WebsocketHandler { + let mut handler = super::WebsocketHandler { socket, - connection_identifiers, + connection_identifiers: identifiers + .build(accept.as_bytes(), query.as_bytes()), write_receiver: &mut write_receiver, - on_login_success: || already_logged_login_error = false, }; - if let Err(e) = handler.handle::().await { + if let Err(e) = handler.login::().await { if !already_logged_login_error { warn!("Failed to login | {e:#}"); already_logged_login_error = true; @@ -92,7 +78,11 @@ pub async fn handler( )) .await; continue; - }; + } + + already_logged_login_error = false; + + handler.handle().await } } diff --git a/bin/periphery/src/connection/mod.rs b/bin/periphery/src/connection/mod.rs index ed90e0e81..6e5c5125d 100644 --- a/bin/periphery/src/connection/mod.rs +++ b/bin/periphery/src/connection/mod.rs @@ -58,35 +58,28 @@ pub fn init_response_channel() { .expect("response_receiver initialized more than once"); } -pub struct WebsocketHandler<'a, W, S> { +pub struct WebsocketHandler<'a, W> { pub socket: W, pub connection_identifiers: ConnectionIdentifiers<'a>, pub write_receiver: &'a mut BufferedReceiver, - pub on_login_success: S, } -impl WebsocketHandler<'_, W, S> { - async fn handle(self) -> anyhow::Result<()> { - let WebsocketHandler { - mut socket, - connection_identifiers, - write_receiver, - mut on_login_success, - } = self; - +impl WebsocketHandler<'_, W> { + async fn login(&mut self) -> anyhow::Result<()> { L::login( - &mut socket, - connection_identifiers, + &mut self.socket, + self.connection_identifiers, &periphery_config().private_key, &CorePublicKeyValidator, ) - .await?; - on_login_success(); + .await + } + async fn handle(self) { let config = periphery_config(); info!( "Logged in to Core connection websocket{}", - if config.core_host.is_some() + if config.core_address.is_some() && let Some(connect_as) = &config.connect_as { format!(" as Server {connect_as}") @@ -95,11 +88,11 @@ impl WebsocketHandler<'_, W, S> { } ); - let (mut ws_write, mut ws_read) = socket.split(); + let (mut ws_write, mut ws_read) = self.socket.split(); let forward_writes = async { loop { - let msg = match write_receiver.recv().await { + let msg = match self.write_receiver.recv().await { // Sender Dropped (shouldn't happen, it is static). None => break, // This has to copy the bytes to follow ownership rules. @@ -108,7 +101,7 @@ impl WebsocketHandler<'_, W, S> { match ws_write.send(msg).await { // Clears the stored message from receiver buffer. // TODO: Move after response ack. - Ok(_) => write_receiver.clear_buffer(), + Ok(_) => self.write_receiver.clear_buffer(), Err(e) => { warn!("Failed to send response | {e:?}"); let _ = ws_write.close(None).await; @@ -143,9 +136,7 @@ impl WebsocketHandler<'_, W, S> { tokio::select! { _ = forward_writes => {}, _ = handle_reads => {}, - }; - - Ok(()) + } } } diff --git a/bin/periphery/src/connection/server.rs b/bin/periphery/src/connection/server.rs index 20607a70c..ea65ae0a2 100644 --- a/bin/periphery/src/connection/server.rs +++ b/bin/periphery/src/connection/server.rs @@ -20,7 +20,7 @@ use axum::{ use axum_server::tls_rustls::RustlsConfig; use serror::{AddStatusCode, AddStatusCodeError}; use transport::{ - auth::{ServerHeaderIdentifiers, ServerLoginFlow}, + auth::{HeaderConnectionIdentifiers, ServerLoginFlow}, websocket::axum::AxumWebsocket, }; @@ -78,26 +78,30 @@ async fn handler( .try_lock() .status_code(StatusCode::FORBIDDEN)?; - let identifiers = ServerHeaderIdentifiers::extract(&mut headers) - .status_code(StatusCode::UNAUTHORIZED)?; + let identifiers = + HeaderConnectionIdentifiers::extract(&mut headers) + .status_code(StatusCode::UNAUTHORIZED)?; Ok(ws.on_upgrade(|socket| async move { - let handler = super::WebsocketHandler { + let mut handler = super::WebsocketHandler { socket: AxumWebsocket(socket), connection_identifiers: identifiers.build(&[]), write_receiver: &mut write_receiver, - on_login_success: || { - already_logged_login_error() - .store(false, atomic::Ordering::Relaxed); - }, }; - if let Err(e) = handler.handle::().await { + + if let Err(e) = handler.login::().await { let already_logged = already_logged_login_error(); if !already_logged.load(atomic::Ordering::Relaxed) { warn!("Core failed to login to connection | {e:#}"); already_logged.store(true, atomic::Ordering::Relaxed); } + return; } + + already_logged_login_error() + .store(false, atomic::Ordering::Relaxed); + + handler.handle().await })) } diff --git a/bin/periphery/src/main.rs b/bin/periphery/src/main.rs index b7931acdd..93d7f400a 100644 --- a/bin/periphery/src/main.rs +++ b/bin/periphery/src/main.rs @@ -32,7 +32,7 @@ async fn app() -> anyhow::Result<()> { docker::stats::spawn_polling_thread(); connection::init_response_channel(); - match (&config.core_host, &config.connect_as) { + match (&config.core_address, &config.connect_as) { (Some(core_host), Some(connect_as)) => { connection::client::handler(core_host, connect_as).await } diff --git a/client/core/rs/src/entities/builder.rs b/client/core/rs/src/entities/builder.rs index 175f7238e..0cee5d0a5 100644 --- a/client/core/rs/src/entities/builder.rs +++ b/client/core/rs/src/entities/builder.rs @@ -247,12 +247,12 @@ impl MergePartial for BuilderConfig { BuilderConfig::Url(config) => { let config = UrlBuilderConfig { address: partial.address.unwrap_or(config.address), - private_key: partial - .private_key - .unwrap_or(config.private_key), - public_key: partial - .public_key - .unwrap_or(config.public_key), + core_private_key: partial + .core_private_key + .unwrap_or(config.core_private_key), + periphery_public_key: partial + .periphery_public_key + .unwrap_or(config.periphery_public_key), }; BuilderConfig::Url(config) } @@ -291,12 +291,12 @@ impl MergePartial for BuilderConfig { .unwrap_or(config.use_public_ip), port: partial.port.unwrap_or(config.port), use_https: partial.use_https.unwrap_or(config.use_https), - private_key: partial - .private_key - .unwrap_or(config.private_key), - public_key: partial - .public_key - .unwrap_or(config.public_key), + core_private_key: partial + .core_private_key + .unwrap_or(config.core_private_key), + periphery_public_key: partial + .periphery_public_key + .unwrap_or(config.periphery_public_key), user_data: partial.user_data.unwrap_or(config.user_data), git_providers: partial .git_providers @@ -326,13 +326,14 @@ pub struct UrlBuilderConfig { /// The address of the Periphery agent #[serde(default = "default_address")] pub address: String, - /// A custom private key to use. Otherwise, use the default private key. + /// A custom private key to use to authenticate with the Periphery agent. + /// Otherwise, use the default Core private key. #[serde(default)] - pub private_key: String, + pub core_private_key: String, /// An expected public key associated with Periphery private key. /// If empty, doesn't validate Periphery public key. #[serde(default)] - pub public_key: String, + pub periphery_public_key: String, } fn default_address() -> String { @@ -343,8 +344,8 @@ impl Default for UrlBuilderConfig { fn default() -> Self { Self { address: default_address(), - private_key: Default::default(), - public_key: Default::default(), + core_private_key: Default::default(), + periphery_public_key: Default::default(), } } } @@ -455,14 +456,14 @@ pub struct AwsBuilderConfig { #[builder(default)] pub user_data: String, - /// A custom private key to use to authenticate with agent. + /// A custom private key to use to authenticate with the Periphery agent. /// Otherwise, use the default Core private key. #[serde(default)] - pub private_key: String, + pub core_private_key: String, /// An expected public key associated with Periphery private key. /// If empty, doesn't validate Periphery public key. #[serde(default)] - pub public_key: String, + pub periphery_public_key: String, /// Which git providers are available on the AMI #[serde(default)] @@ -497,8 +498,8 @@ impl Default for AwsBuilderConfig { assign_public_ip: Default::default(), use_public_ip: Default::default(), user_data: Default::default(), - private_key: Default::default(), - public_key: Default::default(), + core_private_key: Default::default(), + periphery_public_key: Default::default(), git_providers: Default::default(), docker_registries: Default::default(), secrets: Default::default(), diff --git a/client/core/rs/src/entities/config/periphery.rs b/client/core/rs/src/entities/config/periphery.rs index 7ceaf20c9..e7a648a06 100644 --- a/client/core/rs/src/entities/config/periphery.rs +++ b/client/core/rs/src/entities/config/periphery.rs @@ -127,8 +127,8 @@ pub struct Env { pub periphery_private_key_file: Option, /// Override `core_public_key` pub periphery_core_public_key: Option, - /// Override `core_host` - pub periphery_core_host: Option, + /// Override `core_address` + pub periphery_core_address: Option, /// Override `connect_as` pub periphery_connect_as: Option, /// Override `port` @@ -204,10 +204,9 @@ pub struct PeripheryConfig { // ============================ /// Address of Komodo Core when connecting outbound #[serde(skip_serializing_if = "Option::is_none")] - pub core_host: Option, + pub core_address: Option, /// Server name / id to connect as - /// TODO: explore using device identifier like MAC #[serde(skip_serializing_if = "Option::is_none")] pub connect_as: Option, @@ -376,7 +375,7 @@ impl Default for PeripheryConfig { Self { private_key: default_private_key(), core_public_key: None, - core_host: None, + core_address: None, connect_as: None, port: default_periphery_port(), bind_ip: default_periphery_bind_ip(), @@ -410,7 +409,7 @@ impl PeripheryConfig { PeripheryConfig { private_key: empty_or_redacted(&self.private_key), core_public_key: self.core_public_key.clone(), - core_host: self.core_host.clone(), + core_address: self.core_address.clone(), connect_as: self.connect_as.clone(), port: self.port, bind_ip: self.bind_ip.clone(), diff --git a/client/core/rs/src/entities/server.rs b/client/core/rs/src/entities/server.rs index 06192bea3..3b77774ef 100644 --- a/client/core/rs/src/entities/server.rs +++ b/client/core/rs/src/entities/server.rs @@ -91,18 +91,18 @@ pub struct ServerConfig { pub enabled: bool, /// An optional override private key to use - /// to authenticate with periphery agent. + /// to authenticate with Periphery agent. /// If this is empty, will use private key in core config. #[serde(default)] #[builder(default)] - pub private_key: String, + pub core_private_key: String, - /// The accepted public key associated with + /// The expected public key associated with /// private key of the periphery agent. - /// If this is empty, will not validate the Periphery public key. + /// If this is empty, falls back to 'periphery_public_key' #[serde(default)] #[builder(default)] - pub public_key: String, + pub periphery_public_key: String, /// Sometimes the system stats reports a mount path that is not desired. /// Use this field to filter it out from the report. @@ -271,8 +271,8 @@ impl Default for ServerConfig { send_disk_alerts: default_send_alerts(), send_version_mismatch_alerts: default_send_alerts(), region: Default::default(), - private_key: Default::default(), - public_key: Default::default(), + core_private_key: Default::default(), + periphery_public_key: Default::default(), cpu_warning: default_cpu_warning(), cpu_critical: default_cpu_critical(), mem_warning: default_mem_warning(), diff --git a/client/core/ts/src/types.ts b/client/core/ts/src/types.ts index 9bc2979f5..13c5b0289 100644 --- a/client/core/ts/src/types.ts +++ b/client/core/ts/src/types.ts @@ -2017,16 +2017,16 @@ export interface ServerConfig { enabled: boolean; /** * An optional override private key to use - * to authenticate with periphery agent. + * to authenticate with Periphery agent. * If this is empty, will use private key in core config. */ - private_key?: string; + core_private_key?: string; /** - * The accepted public key associated with + * The expected public key associated with * private key of the periphery agent. - * If this is empty, will not validate the Periphery public key. + * If this is empty, falls back to 'periphery_public_key' */ - public_key?: string; + periphery_public_key?: string; /** * Sometimes the system stats reports a mount path that is not desired. * Use this field to filter it out from the report. @@ -4213,15 +4213,15 @@ export interface AwsBuilderConfig { /** The user data to deploy the instance with. */ user_data?: string; /** - * A custom private key to use to authenticate with agent. + * A custom private key to use to authenticate with the Periphery agent. * Otherwise, use the default Core private key. */ - private_key?: string; + core_private_key?: string; /** * An expected public key associated with Periphery private key. * If empty, doesn't validate Periphery public key. */ - public_key?: string; + periphery_public_key?: string; /** Which git providers are available on the AMI */ git_providers?: GitProvider[]; /** Which docker registries are available on the AMI. */ @@ -8451,13 +8451,16 @@ export interface UpdateVariableValue { export interface UrlBuilderConfig { /** The address of the Periphery agent */ address: string; - /** A custom private key to use. Otherwise, use the default private key. */ - private_key?: string; + /** + * A custom private key to use to authenticate with the Periphery agent. + * Otherwise, use the default Core private key. + */ + core_private_key?: string; /** * An expected public key associated with Periphery private key. * If empty, doesn't validate Periphery public key. */ - public_key?: string; + periphery_public_key?: string; } /** Update dockerfile contents in Files on Server or Git Repo mode. Response: [Update]. */ diff --git a/frontend/public/client/types.d.ts b/frontend/public/client/types.d.ts index d7117c6f2..93fdb4521 100644 --- a/frontend/public/client/types.d.ts +++ b/frontend/public/client/types.d.ts @@ -2149,16 +2149,16 @@ export interface ServerConfig { enabled: boolean; /** * An optional override private key to use - * to authenticate with periphery agent. + * to authenticate with Periphery agent. * If this is empty, will use private key in core config. */ - private_key?: string; + core_private_key?: string; /** - * The accepted public key associated with + * The expected public key associated with * private key of the periphery agent. - * If this is empty, will not validate the Periphery public key. + * If this is empty, falls back to 'periphery_public_key' */ - public_key?: string; + periphery_public_key?: string; /** * Sometimes the system stats reports a mount path that is not desired. * Use this field to filter it out from the report. @@ -4120,15 +4120,15 @@ export interface AwsBuilderConfig { /** The user data to deploy the instance with. */ user_data?: string; /** - * A custom private key to use to authenticate with agent. + * A custom private key to use to authenticate with the Periphery agent. * Otherwise, use the default Core private key. */ - private_key?: string; + core_private_key?: string; /** * An expected public key associated with Periphery private key. * If empty, doesn't validate Periphery public key. */ - public_key?: string; + periphery_public_key?: string; /** Which git providers are available on the AMI */ git_providers?: GitProvider[]; /** Which docker registries are available on the AMI. */ @@ -7988,13 +7988,16 @@ export interface UpdateVariableValue { export interface UrlBuilderConfig { /** The address of the Periphery agent */ address: string; - /** A custom private key to use. Otherwise, use the default private key. */ - private_key?: string; + /** + * A custom private key to use to authenticate with the Periphery agent. + * Otherwise, use the default Core private key. + */ + core_private_key?: string; /** * An expected public key associated with Periphery private key. * If empty, doesn't validate Periphery public key. */ - public_key?: string; + periphery_public_key?: string; } /** Update dockerfile contents in Files on Server or Git Repo mode. Response: [Update]. */ export interface WriteBuildFileContents { diff --git a/frontend/src/components/resources/builder/config.tsx b/frontend/src/components/resources/builder/config.tsx index a8336dc90..eeb9ba783 100644 --- a/frontend/src/components/resources/builder/config.tsx +++ b/frontend/src/components/resources/builder/config.tsx @@ -135,18 +135,18 @@ const AwsBuilderConfig = ({ id }: { id: string }) => { label: "Auth", labelHidden: true, components: { - public_key: { - label: "Periphery Public Key", - description: - "If provided, the associated private key must be set as Periphery 'private_key'. For Periphery -> Core connection, either this or using 'periphery_public_key' in Core config is required for Periphery to be able to connect.", - placeholder: "custom-public-key", - }, - private_key: { + core_private_key: { label: "Core Private Key", description: "Optional. A custom private key used to authenticate Periphery connection. The associated public key must match Periphery 'core_public_key'. If not provided, will use 'private_key' in Core config. Max length of 32 characters.", placeholder: "custom-private-key", }, + periphery_public_key: { + label: "Periphery Public Key", + description: + "If provided, the associated private key must be set as Periphery 'private_key'. For Periphery -> Core connection, either this or using 'periphery_public_key' in Core config is required for Periphery to be able to connect.", + placeholder: "custom-public-key", + }, }, }, { @@ -353,18 +353,18 @@ const UrlBuilderConfig = ({ id }: { id: string }) => { label: "Auth", labelHidden: true, components: { - public_key: { - label: "Periphery Public Key", - description: - "If provided, the associated private key must be set as Periphery 'private_key'. For Periphery -> Core connection, either this or using 'periphery_public_key' in Core config is required for Periphery to be able to connect.", - placeholder: "custom-public-key", - }, - private_key: { + core_private_key: { label: "Core Private Key", description: "Optional. A custom private key used to authenticate Periphery connection. The associated public key must match Periphery 'core_public_key'. If not provided, will use 'private_key' in Core config. Max length of 32 characters.", placeholder: "custom-private-key", }, + periphery_public_key: { + label: "Periphery Public Key", + description: + "If provided, the associated private key must be set as Periphery 'private_key'. For Periphery -> Core connection, either this or using 'periphery_public_key' in Core config is required for Periphery to be able to connect.", + placeholder: "custom-public-key", + }, }, }, ], diff --git a/frontend/src/components/resources/server/config.tsx b/frontend/src/components/resources/server/config.tsx index 0e1c45ecb..2d02520a7 100644 --- a/frontend/src/components/resources/server/config.tsx +++ b/frontend/src/components/resources/server/config.tsx @@ -63,18 +63,18 @@ export const ServerConfig = ({ label: "Auth", labelHidden: true, components: { - public_key: { - label: "Periphery Public Key", - description: - "If provided, the associated private key must be set as Periphery 'private_key'. For Periphery -> Core connection, either this or using 'periphery_public_key' in Core config is required for Periphery to be able to connect.", - placeholder: "custom-public-key", - }, - private_key: { + core_private_key: { label: "Core Private Key", description: "Optional. A custom private key used to authenticate Periphery connection. The associated public key must match Periphery 'core_public_key'. If not provided, will use 'private_key' in Core config. Max length of 32 characters.", placeholder: "custom-private-key", }, + periphery_public_key: { + label: "Periphery Public Key", + description: + "If provided, the associated private key must be set as Periphery 'private_key'. For Periphery -> Core connection, either this or using 'periphery_public_key' in Core config is required for Periphery to be able to connect.", + placeholder: "custom-public-key", + }, }, }, { diff --git a/lib/transport/Cargo.toml b/lib/transport/Cargo.toml index 098ecfd46..5e0aefa0a 100644 --- a/lib/transport/Cargo.toml +++ b/lib/transport/Cargo.toml @@ -23,4 +23,5 @@ axum.workspace = true rand.workspace = true sha1.workspace = true sha2.workspace = true -uuid.workspace = true \ No newline at end of file +uuid.workspace = true +url.workspace = true \ No newline at end of file diff --git a/lib/transport/src/auth.rs b/lib/transport/src/auth.rs index bfcdb6087..4ec3eed7b 100644 --- a/lib/transport/src/auth.rs +++ b/lib/transport/src/auth.rs @@ -18,15 +18,6 @@ use tracing::warn; use crate::{MessageState, websocket::Websocket}; -pub struct ConnectionIdentifiers<'a> { - /// Server hostname - pub host: &'a [u8], - /// Query: 'server=' - pub query: &'a [u8], - /// Sec-Websocket-Accept, unique for each connection - pub accept: &'a [u8], -} - pub trait PublicKeyValidator { fn validate(&self, public_key: String) -> anyhow::Result<()>; } @@ -259,6 +250,16 @@ fn nonce() -> [u8; 32] { out } +#[derive(Clone, Copy)] +pub struct ConnectionIdentifiers<'a> { + /// Server hostname + pub host: &'a [u8], + /// Query: 'server=' + pub query: &'a [u8], + /// Sec-Websocket-Accept, unique for each connection + pub accept: &'a [u8], +} + impl ConnectionIdentifiers<'_> { /// nonce: Server computed random connection nonce, sent to client before auth handshake pub fn hash(&self, nonce: &[u8]) -> [u8; 32] { @@ -275,17 +276,46 @@ impl ConnectionIdentifiers<'_> { } } -/// Used to extract owned connection identifier -/// in server side connection handler. -pub struct ServerHeaderIdentifiers { - pub host: HeaderValue, - pub accept: String, +pub struct AddressConnectionIdentifiers { + host: String, } -impl ServerHeaderIdentifiers { +impl AddressConnectionIdentifiers { + pub fn extract(address: &str) -> anyhow::Result { + let url = ::url::Url::parse(&address) + .context("Failed to parse server address")?; + let mut host = url.host().context("url has no host")?.to_string(); + if let Some(port) = url.port() { + host.push(':'); + host.push_str(&port.to_string()); + }; + Ok(Self { host }) + } + + pub fn build<'a>( + &'a self, + accept: &'a [u8], + query: &'a [u8], + ) -> ConnectionIdentifiers<'a> { + ConnectionIdentifiers { + host: self.host.as_bytes(), + query, + accept, + } + } +} + +/// Used to extract owned connection identifier +/// in server side connection handler. +pub struct HeaderConnectionIdentifiers { + host: HeaderValue, + accept: String, +} + +impl HeaderConnectionIdentifiers { pub fn extract( headers: &mut HeaderMap, - ) -> anyhow::Result { + ) -> anyhow::Result { let host = headers .remove("x-forwarded-host") .or(headers.remove("host")) @@ -294,7 +324,7 @@ impl ServerHeaderIdentifiers { .remove("sec-websocket-key") .context("Headers do not contain Sec-Websocket-Key")?; let accept = compute_accept(key.as_bytes()); - Ok(ServerHeaderIdentifiers { host, accept }) + Ok(HeaderConnectionIdentifiers { host, accept }) } pub fn build<'a>( @@ -309,10 +339,6 @@ impl ServerHeaderIdentifiers { } } -// pub fn extract_server_identifiers(headers: &mut HeaderMap) -> anyhow::Result<(Head)> { - -// } - pub fn compute_accept(sec_websocket_key: &[u8]) -> String { // This is standard GUID to compute Sec-Websocket-Accept const GUID: &[u8] = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11";