From 3919eb46fda7ddafdb69bffe50f36bab24a608fc Mon Sep 17 00:00:00 2001 From: Alex Emmet <111742636+Alex-Emmet@users.noreply.github.com> Date: Sun, 19 Jul 2026 19:36:17 +0200 Subject: [PATCH] [Fix] Wasm & Webserver --- crypto/Cargo.toml | 2 ++ crypto/src/lib.rs | 3 +++ mtp-webserver/src/transport.rs | 21 ++++++++++++++++++--- package.json | 1 + 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/crypto/Cargo.toml b/crypto/Cargo.toml index c55176e..d61c03e 100644 --- a/crypto/Cargo.toml +++ b/crypto/Cargo.toml @@ -27,6 +27,8 @@ serde = { version = "1", optional = true, features = ["derive"] } rcgen = { version = "0.14", optional = true } time = { version = "0.3", optional = true } tokio = { version = "1", features = ["macros", "rt"], optional = true } + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] rustls = "0.23.41" [features] diff --git a/crypto/src/lib.rs b/crypto/src/lib.rs index 43ab5a4..7e67f82 100644 --- a/crypto/src/lib.rs +++ b/crypto/src/lib.rs @@ -3,8 +3,10 @@ pub mod auth; pub mod error; pub mod keypair; +#[cfg(not(target_arch = "wasm32"))] use std::sync::Once; +#[cfg(not(target_arch = "wasm32"))] static CRYPTO_INIT: Once = Once::new(); #[cfg(feature = "sha2")] @@ -70,6 +72,7 @@ pub use enc::EncryptionType; /// /// Rustls only accepts one process-wide default provider. Calling this helper /// from every TLS entry point makes that initialization idempotent. +#[cfg(not(target_arch = "wasm32"))] pub fn ensure_crypto_provider() { CRYPTO_INIT.call_once(|| { let _ = rustls::crypto::aws_lc_rs::default_provider().install_default(); diff --git a/mtp-webserver/src/transport.rs b/mtp-webserver/src/transport.rs index c320295..84c6172 100644 --- a/mtp-webserver/src/transport.rs +++ b/mtp-webserver/src/transport.rs @@ -277,7 +277,7 @@ async fn accept_web_connection_inner( if send_pongs { receiver.respond_to_pings(sender.clone()).await; } - let connection = mtp_host::MTPConnection::from_transport_parts( + let connection: WebMTPConnection = mtp_host::MTPConnection::from_transport_parts( negotiated, codec, sender, @@ -401,7 +401,22 @@ async fn accept_web_connection_inner( .map_err(AcceptError::Send)?; tracing::debug!(elapsed = ?send_challenge_started.elapsed(), "web authentication handshake: send challenge"); let receive_proof_started = Instant::now(); - let proof = connection.receive().await.map_err(AcceptError::Receive)?; + let proof = { + #[cfg(feature = "pipes")] + { + connection.receive().await.map_err(AcceptError::Receive)? + } + #[cfg(not(feature = "pipes"))] + { + let mut proof = connection + .receiver + .receive() + .await + .map_err(AcceptError::Receive)?; + proof.set_type_map(connection.codec.type_map()); + proof + } + }; tracing::debug!(elapsed = ?receive_proof_started.elapsed(), "web authentication handshake: receive client proof"); if Some(proof.get_type()) != mtp_codec::CommunicationType::ChallengeResponse.try_to_id(&tm) { @@ -410,7 +425,7 @@ async fn accept_web_connection_inner( )); } let nonce = match proof.get_data(DataType::ClientNonce) { - DataValue::UnsignedNumber(n) => *n, + DataValue::UnsignedNumber(n) => n.to_owned(), _ => { return Err(AcceptError::AuthenticationFailed( "missing client nonce".into(), diff --git a/package.json b/package.json index 019cef4..99c4db2 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "wasm/.cargo/", "wasm/Cargo.toml", "wasm/src/", + "wasm/pkg/", "tsconfig.json" ], "scripts": {