From 4d1ef05107c978c3634fb9485fc0ae139d9fde99 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 4 Mar 2026 15:26:33 +0100 Subject: [PATCH 1/5] silence more innocent websocket errors fixes #676 Signed-off-by: Robin Appelman --- src/connection.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/connection.rs b/src/connection.rs index e4cf55ae..91bdf564 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -226,6 +226,7 @@ pub async fn handle_user_socket( // hack while warp only has opaque error types match formatted.as_str() { "WebSocket protocol error: Connection reset without closing handshake" + | "Broken pipe (os error 32)" | "IO error: Connection reset by peer (os error 104)" => { log::debug!("websocket error: {e:#}") } From 0f14eaf78fd2a5ae1bd4b28788899cf2ade511fe Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 4 Mar 2026 15:36:34 +0100 Subject: [PATCH 2/5] fix: bind to ipv6 dualstack by default Signed-off-by: Robin Appelman --- src/config.rs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/config.rs b/src/config.rs index e3801958..d3862eb6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -20,7 +20,7 @@ use sqlx::any::AnyConnectOptions; use std::convert::{TryFrom, TryInto}; use std::env::var; use std::fmt::{Debug, Display, Formatter}; -use std::net::{IpAddr, Ipv4Addr, SocketAddr}; +use std::net::{IpAddr, Ipv6Addr, SocketAddr}; use std::path::{Path, PathBuf}; use std::str::FromStr; @@ -183,9 +183,7 @@ impl TryFrom for Config { let bind = match config.socket { Some(socket) => Bind::Unix(socket, socket_permissions), None => { - let ip = config - .bind - .unwrap_or_else(|| IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))); + let ip = config.bind.unwrap_or(IpAddr::V6(Ipv6Addr::UNSPECIFIED)); let port = config.port.unwrap_or(7867); Bind::Tcp((ip, port).into()) } @@ -194,9 +192,7 @@ impl TryFrom for Config { let metrics_bind = match (config.metrics_socket, config.metrics_port) { (Some(socket), _) => Some(Bind::Unix(socket, socket_permissions)), (None, Some(port)) => { - let ip = config - .bind - .unwrap_or_else(|| IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))); + let ip = config.bind.unwrap_or(IpAddr::V6(Ipv6Addr::UNSPECIFIED)); Some(Bind::Tcp((ip, port).into())) } _ => None, From 8c656b3a11a5d2140d962fab410e8ec27b25b850 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 4 Mar 2026 15:37:22 +0100 Subject: [PATCH 3/5] fix: trim incomming credentials Signed-off-by: Robin Appelman --- src/connection.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/connection.rs b/src/connection.rs index 91bdf564..2d458e94 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -263,11 +263,13 @@ async fn socket_auth( let username_msg = read_socket_auth_message(rx).await?; let username = username_msg .to_str() - .map_err(|_| AuthenticationError::InvalidMessage)?; + .map_err(|_| AuthenticationError::InvalidMessage)? + .trim(); let password_msg = read_socket_auth_message(rx).await?; let password = password_msg .to_str() - .map_err(|_| AuthenticationError::InvalidMessage)?; + .map_err(|_| AuthenticationError::InvalidMessage)? + .trim(); // cleanup all pre_auth tokens older than 15s let cutoff = Instant::now() - Duration::from_secs(15); From ce7c8ad3e8125963c3340e329396de78c0879d67 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 4 Mar 2026 15:39:36 +0100 Subject: [PATCH 4/5] chore: fix flake deprecation Signed-off-by: Robin Appelman --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index a8304ddf..4490d44f 100644 --- a/flake.nix +++ b/flake.nix @@ -27,7 +27,7 @@ }; lib = pkgs.lib; - hostTarget = pkgs.hostPlatform.config; + hostTarget = pkgs.stdenv.hostPlatform.config; targets = [ "x86_64-unknown-linux-musl" "i686-unknown-linux-musl" From ad218ca2e0a4e577c8a5e77821a227473cec5fdf Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 6 Mar 2026 13:26:17 +0100 Subject: [PATCH 5/5] config parser 0.15.2 Signed-off-by: Robin Appelman --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8dcc5c81..fea07642 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1520,9 +1520,9 @@ dependencies = [ [[package]] name = "nextcloud-config-parser" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a63b1374e3d837e53a783c0704013728ef392899f131b389cdda0ef922b945" +checksum = "7a285761c91b18426c4cadf66ffb77f8881ea5cb417d94bad384bcf85a9965de" dependencies = [ "form_urlencoded", "indexmap", diff --git a/Cargo.toml b/Cargo.toml index 8b88421b..61c273f8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ rand = { version = "0.8.5", features = ["small_rng"] } ahash = "0.8.12" flexi_logger = { version = "0.29.8", features = ["colors"] } tokio-stream = { version = "0.1.17", features = ["net"] } -nextcloud-config-parser = "0.15.1" +nextcloud-config-parser = "0.15.2" url = "2.5.4" clap = { version = "4.5.43", features = ["derive"] } sd-notify = { version = "0.4.5", optional = true }